数据来源:真实面经整理 | 版本: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题目频率基于多份真实面经交叉统计 - 技术背景信息来源于小鹏官方技术博客及公开资料