数据来源:真实面经整理 | 版本:final
一、公司画像 & 校招节奏
小鹏汽车(XPENG)成立于,总部广州,港股、美股两地上市。创始人何小鹏此前是UC浏览器联合创始人,在移动互联网赚到第一桶金之后,全身心转战小鹏。这个背景很重要:他不是传统汽车人,是互联网人——所以小鹏从一开始就把软件和智能放在核心位置,而不是硬件制造。
核心业务有三块:整车制造、智能驾驶(XNGP)、智能座舱。其中智能驾驶是小鹏最引以为傲的核心竞争力。,小鹏推出了XNGP全场景智能辅助驾驶,是国内最早落地"不依赖高精地图"城市NOA的车企之一。技术架构上,小鹏走纯视觉路线,基于BEV(Bird's Eye View)+ Transformer,技术对标的正是特斯拉FSD。
员工规模约1.5万人,软件和算法人员占比较高。,小鹏的智驾研发团队在全集团薪资体系里属于最高档,这从侧面说明了公司对这个方向的重视程度。
主要校招方向:
| 方向 | 技术侧重 | 代表岗位 |
|---|---|---|
| 感知算法工程师 | C++/Python,BEV感知,深度学习 | 目标检测、语义分割、多传感器融合 |
| 自动驾驶系统工程师 | C++,实时系统,系统架构 | 规划控制、系统集成、车端软件 |
| 后端工程师 | C++/Go,分布式系统 | 数据平台、训练平台、仿真系统 |
| 数据工程师 | Python/Spark,数据处理 | 数据采集、标注、闭环系统 |
校招节奏(参考):
| 阶段 | 时间 | 关键点 |
|---|---|---|
| 暑期实习 | 开始内推,6-实习 | 转正率高,是最佳通道 |
| 秋招网申 | 下旬- | 官网投递,简历突出智驾相关项目 |
| 笔试 | C++/算法题, | |
| 技术面 | 2-3轮技术面 + 1轮HR面 | |
| Offer | 薪资对标头部互联网,智驾方向待遇更好 |
一个值得提前想清楚的问题:小鹏是车企,不是纯互联网公司。你写的代码最终要跑在一辆时速100公里的车上,实时性、安全性都是硬约束。如果你对"自动驾驶落地"这件事本身感兴趣,小鹏是个很好的选择。如果只是把它当做一份互联网工作,反而会在面试里显得格格不入。
二、岗位JD解析:技术要求拆解
小鹏的岗位JD和其他大厂有一个明显差异:对工程实战经验的要求写得非常具体,而不是泛泛的"熟悉XX技术"。这背后的原因是:智驾研发对技术栈有高度定制化需求,面试官想要的是能快速上手的人,不是需要从头培训的人。
感知算法工程师
| 能力维度 | JD要求 | 真实考察重心 | 备考权重 |
|---|---|---|---|
| C++编程 | 熟练掌握C++ | 智能指针、多线程、STL容器,必须能当场写代码 | ⭐⭐⭐⭐⭐ |
| 深度学习 | 深度学习基础 | Transformer原理、BN层推理行为、卷积计算,几乎每轮必问 | ⭐⭐⭐⭐⭐ |
| BEV感知 | BEV相关经验 | BEVDet/BEVFusion原理,纯视觉方案为何优于多雷达 | ⭐⭐⭐⭐⭐ |
| Python | Python开发 | 训练脚本、数据处理,要求比C++低但也必须会 | ⭐⭐⭐⭐ |
| 目标检测 | 检测算法经验 | YOLO/DETR原理,2D到3D检测的扩展 | ⭐⭐⭐⭐ |
| 数学基础 | 线性代数/概率 | 矩阵运算、贝叶斯基础,笔试必考 | ⭐⭐⭐ |
自动驾驶系统工程师(C++方向)
| 能力维度 | JD要求 | 真实考察重心 | 备考权重 |
|---|---|---|---|
| C++系统编程 | 深入掌握C++ | 内存管理、多线程并发、性能优化,比感知岗要求更严格 | ⭐⭐⭐⭐⭐ |
| 操作系统 | Linux系统 | 进程/线程区别(高频必考)、IPC机制、内核基础 | ⭐⭐⭐⭐⭐ |
| 网络通信 | RPC/协议 | gRPC vs HTTP、protobuf使用注意事项,车内服务通信 | ⭐⭐⭐⭐⭐ |
| 数据库 | 存储选型 | Redis vs MySQL适用场景,分布式系统基础 | ⭐⭐⭐⭐ |
| 算法 | LeetCode | Medium难度为主,重视代码质量 | ⭐⭐⭐⭐ |
一个需要强调的点:系统工程师方向的面试,工程实战类考点(protobuf/gRPC/Redis)的权重和算法题权重大致相当。很多人只刷LeetCode,结果被protobuf注意事项这种"日常工程问题"卡住,非常可惜。
三、LeetCode高频题Top 20(真实面经数据)
小鹏面试算法题的风格是:Medium为主,难度适中,但要求用C++写出正确、可运行的代码。面试官不接受"大概思路是这样"或者Python伪代码。
第一梯队(必刷,基本每次必考)
| 题目 | 考察频率 | 小鹏考察重点 |
|---|---|---|
| No.206 反转链表 | ⭐⭐⭐⭐⭐ | C++指针操作,迭代+递归两种,都得会 |
| No.102 二叉树层序遍历 | ⭐⭐⭐⭐⭐ | BFS基础,手写队列 |
| 快速排序(手撕) | ⭐⭐⭐⭐⭐ | C++完整实现,partition逻辑要清晰 |
| No.215 数组中的第K大元素 | ⭐⭐⭐⭐ | 快速选择 or 小顶堆,两种都要掌握 |
| No.53 最大子数组和 | ⭐⭐⭐⭐ | DP基础,能写出O(n)解法 |
第二梯队(高频,认真准备)
| 题目 | 考察频率 | 备注 |
|---|---|---|
| No.21 合并两个有序链表 | ⭐⭐⭐⭐ | 链表基础,递归+迭代都要会 |
| No.236 二叉树最近公共祖先 | ⭐⭐⭐ | 递归理解,不只是背答案 |
| No.15 三数之和 | ⭐⭐⭐ | 排序+双指针,边界条件容易出错 |
| No.239 滑动窗口最大值 | ⭐⭐⭐ | 单调双端队列(deque),经典题 |
| No.62 不同路径 | ⭐⭐⭐ | DP基础,最简单的二维DP |
| No.200 岛屿数量 | ⭐⭐⭐ | DFS/BFS两种,C++实现 |
| No.25 K个一组翻转链表 | ⭐⭐ | 链表操作进阶,边界难处理 |
| No.146 LRU缓存 | ⭐⭐ | HashMap + 双向链表,工程感强 |
| No.42 接雨水 | ⭐⭐ | 单调栈 or 双指针,经典Hard |
| No.141 环形链表 | ⭐⭐ | 快慢指针,入门经典 |
第三梯队(中频,有时间就刷)
| 题目 | 方向 |
|---|---|
| No.207 课程表 | 拓扑排序,有向图基础 |
| No.300 最长递增子序列 | DP + 二分优化 |
| No.76 最小覆盖子串 | 滑动窗口进阶 |
| No.56 合并区间 | 排序后贪心 |
| No.23 合并K个排序链表 | 优先队列(priority_queue)用法 |
刷题策略: - 第一梯队5题:必须能闭眼写出正确C++代码,不是背题,是理解后手写 - 第二梯队10题:各刷2-3遍,把思路讲清楚的能力比写出来更重要 - 第三梯队:按时间余量酌情准备
四、技术面试考点
工程实战类(系统方向高频)
这是小鹏和其他互联网公司差异最大的地方。因为小鹏内部大量使用protobuf + gRPC做车端和云端服务通信,面试官会直接问你在实际项目里用过什么、踩过什么坑。
考点1:protobuf两个使用注意事项
这道题在小鹏系统方向的面经里出现频率极高,几乎是固定考点。
-
optional字段处理:proto3中默认所有标量字段都是optional的,但它们在未设置时会返回默认值(0或空字符串),而不是null。如果你需要区分"字段未设置"和"字段值为0"这两种情况,必须使用
has_xxx()方法判断,或者用google.protobuf.wrappers.Int32Value这类wrapper类型。这个坑不少人在实际开发中踩过。 -
版本兼容性:修改proto文件时,字段编号(field number)一旦分配出去就不能改变,也不能删除旧字段(只能用
reserved或加[deprecated=true]注释)。新增字段要使用新的编号。否则老版本的客户端和新版本的服务端之间就会出现序列化/反序列化错误。
考点2:Redis vs MySQL的应用场景
这是分布式系统方向的基础题,小鹏面试里作为热身题或者追问题出现。
| 维度 | Redis | MySQL |
|---|---|---|
| 数据结构 | String/Hash/List/Set/ZSet,专为特定场景优化 | 关系型,支持复杂查询和Join |
| 性能 | 内存操作,10万+ QPS | 磁盘操作,000 QPS |
| 持久化 | RDB/AOF,但数据可接受少量丢失 | ACID事务,数据不会丢 |
| 适用场景 | Session/Token、排行榜(ZSet)、计数器、分布式锁、缓存热点数据 | 用户表、订单表、需要事务的操作、复杂报表查询 |
一句话判断准则:对丢数据敏感的,用MySQL;对速度敏感的,用Redis;两者经常组合使用(MySQL持久化 + Redis缓存)。
考点3:HTTP vs gRPC
小鹏内部服务通信大量使用gRPC,面试官很自然地会问你理解不理解两者的区别。
- HTTP/REST:基于HTTP/1.1,文本协议(JSON/XML),可读性强,调试方便,生态广泛。适合对外开放的API,浏览器可以直接访问。
- gRPC:基于HTTP/2 + Protocol Buffers,二进制协议,性能显著更好(延迟低、带宽占用小),支持双向流式传输,自带强类型接口定义(.proto文件)。适合微服务之间的内部通信,特别是延迟敏感的场景。
在车载场景下,gRPC还有一个优势:强类型的proto定义能减少接口错误,在多团队协作的大型系统里这很重要。
操作系统专项(全方向必考)
考点4:Linux进程与线程的区别(三个维度)
这道题在小鹏几乎每场面试都会出现,要能从三个维度清晰展开,而不是只说"进程有独立地址空间、线程共享"。
资源维度: - 进程:独立的虚拟地址空间、独立的文件描述符表、独立的堆、独立的信号处理表 - 线程:共享所属进程的地址空间和资源,只有独立的栈和寄存器组
切换开销维度: - 进程切换:需要切换页表(触发TLB全量刷新),内核栈切换,开销大(微秒级) - 线程切换:共享同一页表,只需保存/恢复寄存器和栈指针,开销小(纳秒级)
通信方式维度: - 进程间通信(IPC):管道、命名管道、消息队列、共享内存、信号、Socket——各有使用场景 - 线程间通信:直接读写共享内存,但需要通过mutex/semaphore/condition_variable协调,否则出现数据竞争
考点5:线程的三种实现方式
这道题很多人知道"用户态线程"和"内核态线程",但第三种(M:N模型)以及它在Go里的应用,是拉开差距的点。
-
用户态线程(协程):线程管理完全在用户空间,内核不感知。切换速度极快(不需要系统调用),但单个协程阻塞时会阻塞整个进程,无法利用多核。Python的asyncio就是这个思路。
-
内核态线程(现代Linux默认):每个线程都对应一个内核调度实体(KSE),内核直接管理线程调度。可以真正并行(多核),但创建和切换开销较大。Java的Thread、C++的
std::thread都对应这种方式。 -
混合方式(M:N模型):M个用户态线程对应N个内核线程(M > N)。Go的goroutine就是这种模型(GMP调度器)。可以同时享受快速切换(用户态调度器)和多核并行(绑定多个内核线程)的优势。这是Go在并发性能上超越传统线程的根本原因。
面试官如果问到Go相关,可以顺势展开讲GMP模型——G(goroutine)、M(OS线程)、P(逻辑处理器)三者的关系。这是加分项。
考点6:线程底层实现原理
Linux中线程本质上是轻量级进程(LWP,Light Weight Process),通过clone()系统调用创建。clone()和fork()的区别在于:fork()创建的子进程拥有独立的地址空间,而clone()可以通过参数控制哪些资源与父进程共享。创建线程时,传入CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND等标志,使得新进程和父进程共享地址空间和文件描述符。
这解释了为什么ps aux命令能同时看到进程和线程——在Linux内核里,它们都是调度实体(task_struct),只是共享资源的程度不同。
C++专项(全方向必考)
内存管理:
- RAII原则:资源获取即初始化,析构函数自动释放,是C++资源管理的基本哲学
- unique_ptr vs shared_ptr:独占所有权 vs 引用计数共享所有权;unique_ptr零开销,移动语义转让所有权;shared_ptr有原子计数开销,循环引用要用weak_ptr打破
- 常见坑:shared_ptr不能管理同一个裸指针创建多个shared_ptr(double free问题)
多线程:
- std::mutex + std::lock_guard:基本互斥,RAII风格自动解锁
- std::condition_variable:生产者-消费者模式的标准解法
- std::atomic:对简单类型的无锁操作,比mutex开销小,但仅适合简单场景
- 死锁四个必要条件:互斥、持有等待、不可剥夺、循环等待;预防方法:固定加锁顺序、超时锁、trylock
智能驾驶技术基础(感知方向必考)
BEV感知: - 为什么BEV(鸟瞰图)比前视图更适合自动驾驶:统一坐标系(多相机视角可融合)、消除透视畸变(距离感更准)、易于与激光雷达点云融合 - 小鹏XNGP采用纯视觉BEV方案:多摄像头图像通过视角变换(IPM或学习型LSS方法)投影到BEV平面 - BEVFusion扩展:摄像头BEV特征 + LiDAR点云特征在BEV空间融合,提升检测精度
Transformer在感知中的应用:
- Self-Attention机制:Attention(Q,K,V) = softmax(QK^T/√d_k)V,能捕获远距离依赖关系,这是CNN不擅长的
- 为什么除以√d_k:防止维度增大时点积过大,导致softmax梯度消失
- DETR:第一个端到端目标检测Transformer,去掉了Anchor和NMS后处理,小鹏感知算法组常问
五、面经规律总结
面试风格:工程实战 + OS基础双轨制
小鹏技术面有一个非常明显的规律:每个问题都有延伸。
系统方向的面试官喜欢从一个实际场景出发——比如"你们系统里服务间通信用什么协议"——然后一路追问到底层实现原理。这不是为了为难你,而是在验证你是真的用过、真的理解,还是只是背了个答案。
五个高频追问链
追问链1:gRPC / protobuf追问链 "你用过protobuf吗?" → "optional字段有什么注意事项?" → "proto3和proto2有什么区别?" → "修改proto文件如何保持版本兼容?"
追问链2:进程线程追问链 "进程和线程有什么区别?" → "线程切换的开销为什么比进程小?" → "Go的goroutine是哪种线程模型?" → "GMP调度器里G/M/P分别代表什么?"
追问链3:Redis选型追问链 "什么情况下用Redis,什么情况下用MySQL?" → "Redis是单线程的,为什么性能还那么高?" → "Redis的持久化方式有哪些,RDB和AOF的区别?" → "分布式锁用Redis怎么实现,有什么问题?"
追问链4:BEV感知追问链 "介绍一下BEV感知" → "为什么BEV比前视图更适合自动驾驶?" → "纯视觉方案和激光雷达方案的优劣?" → "小鹏XNGP为什么选择纯视觉路线?"
追问链5:C++内存追问链 "unique_ptr和shared_ptr有什么区别?" → "shared_ptr的引用计数是如何实现的?" → "循环引用问题怎么解决?" → "手写一个简单的shared_ptr实现思路?"
笔试特点
- 题型:编程题2-3道(C++为主)+ 选择题/填空题(OS/网络/数据库基础)
- 时间:
- 编程题难度:Medium为主,有时候有一道Easy做热身
- 基础题:涵盖Linux进程/线程、TCP/IP基础、数据库选型,不难但要真正掌握
- 注意:C++题不能用Python代替,这是和很多纯互联网公司不一样的地方
需要避开的误区
误区1:忽视OS基础 进程线程区别是每场必考,很多候选人能背出"进程有独立地址空间",却说不清楚切换开销为什么不同、线程底层怎么实现的。背答案和真理解,面试官三句话就能区分。
误区2:只知道Redis能用,不知道为什么 "Redis高性能"——为什么高性能?单线程 + IO多路复用 + 内存操作,缺一不可。面试官追问一层,很多人就卡住了。
误区3:gRPC/protobuf只停留在"听说过" 小鹏技术栈里大量使用这两个,如果只是听说过、没真正用过,最好提前把protobuf的注意事项(optional字段、版本兼容)和gRPC的流式模式搞清楚,否则被追问会很被动。
误区4:只了解2D检测,不了解自动驾驶背景 感知算法岗一定会问自动驾驶的业务背景:BEV是什么、为什么用BEV、纯视觉和激光雷达的区别。提前了解小鹏XNGP的技术路线,能让面试聊得更深入。
校招节奏
总体原则
小鹏智驾方向的备考,不能只刷LeetCode。系统工程类考点(protobuf/gRPC/Redis/MySQL选型)和OS基础(进程线程)加起来的权重,和算法题差不多。要合理分配。
| 阶段 | 时间 | 重点内容 | 每日投入 |
|---|---|---|---|
| C++基础巩固 | 内存管理(RAII/智能指针)、多线程(mutex/atomic)、STL | ||
| Linux进程/线程 | 进程vs线程三维度、IPC机制、clone()底层原理、Go的GMP | ||
| 系统编程专项 | protobuf注意事项、gRPC vs HTTP、Redis vs MySQL选型 | ||
| 自动驾驶基础 | BEV感知原理、XNGP技术栈、纯视觉方案优劣、Transformer基础 | ||
| 算法 + 冲刺 | LeetCode Top 20(C++)、面经整理、模拟面试 |
每阶段详细任务
:C++基础巩固
- 智能指针:unique_ptr的移动语义,shared_ptr的引用计数实现(用一个ControlBlock管理),weak_ptr打破循环引用
- 多线程:生产者-消费者模式的标准实现(mutex + condition_variable),std::atomic的基本使用
- STL:std::deque(单调队列题用到)、std::priority_queue(堆的用法)、迭代器失效规则
- 验收标准:能手写线程安全的有界队列(producer-consumer),能解释unique_ptr和shared_ptr的底层区别
:Linux进程/线程
- 三维度区别:资源/切换开销/通信方式,每个维度能展开两三句话
- IPC机制:管道(匿名/命名)、消息队列、共享内存(最快)、信号量、Socket(最通用)
- 线程底层:clone()系统调用,LWP概念,task_struct结构体
- Go的GMP:goroutine是M:N模型,G绑定到P,P绑定到M(OS线程),调度器在用户空间
- 验收标准:能画出GMP调度模型,能解释线程切换为什么比进程切换快
:系统编程专项 - protobuf:proto3的optional字段坑(has_xxx方法),版本兼容规则(字段编号不能复用) - gRPC:4种通信模式(Unary/Server Streaming/Client Streaming/Bidirectional Streaming),为什么比HTTP性能好 - Redis选型:5种数据结构和对应使用场景,持久化(RDB vs AOF),分布式锁的实现和问题 - MySQL选型:什么情况必须用MySQL(ACID事务、复杂Join查询、数据不能丢) - 验收标准:能清楚说出protobuf两个注意事项,能判断给定场景该用Redis还是MySQL
:自动驾驶基础 - BEV感知:为什么需要BEV(3个理由)、LSS(Lift-Splat-Shoot)方法的基本思路 - 纯视觉方案:小鹏的选择,优势(成本低、数据丰富)和挑战(深度估计难) - Transformer在感知里的应用:DETR的端到端思路,BEVFormer的基本结构 - XNGP简介:不依赖高精地图的城市NOA,大量依赖实时感知和在线建图 - 验收标准:能解释"小鹏为什么选纯视觉路线",能说出BEV感知的3个优势
:算法 + 冲刺 - LeetCode第一梯队5题:反转链表/层序遍历/快速排序/第K大元素/最大子数组和,用C++各写3遍 - 第二梯队:按时间余量各刷一遍,重点理解思路和边界 - 面经整理:重点看小鹏系统方向的近期面经,关注新出现的考点 - 模拟面试:把5个追问链各对自己讲一遍,感受自己哪个地方会卡住 - 验收标准:能在内写出正确的快速排序(包括边界处理),能流畅讲完进程线程追问链
最低备考标准(入场门槛)
- [ ] 进程线程区别:三个维度(资源/切换/通信)能清楚展开,不只是背一句话
- [ ] protobuf注意事项:optional字段的has_xxx问题 + 版本兼容字段编号规则,两条都能说清楚
- [ ] Redis vs MySQL:给定场景能快速判断该用哪个,并说出理由
- [ ] BEV感知基础:能解释为什么BEV比前视图更适合自动驾驶(3个理由)
- [ ] C++ LeetCode:反转链表 + 快速排序能用C++闭眼写出正确代码
达不到这5条,去面小鹏系统/感知方向的成功率会很低。这不是高标准,是基准线。
备考资源推荐
- C++:《Effective Modern C++》(Scott Meyers),第4章智能指针和第7章并发必读
- Linux基础:《深入理解Linux内核》不用全读,进程/线程相关章节翻一下
- 分布式系统:《Redis设计与实现》(黄健宏),数据结构和持久化部分
- 自动驾驶:BEVFusion论文Abstract+Method,BEVFormer论文Introduction;看论文的目的不是精读,是了解基本架构和动机
- Go GMP:搜索"Go GMP调度器详解",有很多质量不错的中文博文
📚 你可能还需要这些
同类智能驾驶公司备考
如果你在同时投智驾赛道的其他公司: - 📌 地平线校招备考攻略(芯片侧,BPU部署,技术栈和小鹏差异大) - 📌 理想汽车校招备考攻略(智驾 + 智能座舱,算法要求相近)
大厂系统方向备考
系统工程类考点(OS/网络/分布式)在多个公司通用: - 📌 字节跳动后端开发备考攻略(OS基础考察深度相当) - 📌 腾讯后端开发备考攻略(C++方向,风格类似)
算法基础
- 📌 大厂C++技术面试常问题(涵盖内存/多线程/STL)
- 📌 大厂笔试面试八股文-算法-数组常考题(快速补基础)
💡 关注我,备考少走弯路
我会持续分享: - ✅ 大厂高频题整理(按公司、岗位、技术方向精准分类) - ✅ 最新面经汇总(校招季第一时间更新,届持续跟进) - ✅ 面试考点深度解析(不只是"怎么答",还有"为什么这么考") - ✅ 内推信息(智驾赛道各公司内推,不定期发布)
这篇攻略整理了大量真实面经,花了不少时间。如果对你有帮助: - 👍 点个"赞"和"在看",让更多备考的同学看到 - 💬 评论区聊聊你的备考进度,或者分享你碰到的考点 - 🔄 转发给同样在投智驾岗位的朋友
有问题随时留言,看到就回!
数据来源: - 面试考点来源于-小鹏汽车技术面真实面经整理 - 岗位JD信息来源于小鹏官方招聘平台 - LeetCode题目频率基于多份真实面经交叉统计 - 技术背景信息来源于小鹏官方技术博客及公开资料