2018年那会儿,智能驾驶这四个字在出行行业里几乎就是“高薪”和“技术壁垒”的代名词。滴滴那年的校园招聘内推里,智能驾驶研发工程师这个岗位的笔试,绝对是不少想进自动驾驶圈子同学的第一个硬门槛。我当时身边有不少朋友投了这个岗位,自己也完整跟了一遍笔试准备的过程,对这套考察体系的思路印象很深。
这篇文章我想换个角度来聊——不谈那些零零散散的“真题回忆”,而是把“智能驾驶研发工程师笔试”当成一个系统来拆:出题人到底在考什么、每个模块背后的专业逻辑是什么、你在考场上怎么分配时间才能把已有水平全部兑现出来。适合正在准备自动驾驶方向校招的同学,也适合刚入门想了解这个岗位技术栈的朋友。
1. 智能驾驶研发工程师笔试:先看清岗位再谈刷题
1.1 从岗位职责反推考点,先搞懂出题人的逻辑
很多人备考的思路是“什么热门刷什么”,深度学习火了刷检测,SLAM火了刷SLAM,结果上了考场发现题目分布和想象中完全不一样。这个问题的根源在于没有站在岗位的角度去反推笔试设计。
智能驾驶研发工程师在2018年前后这个时间点,是出行平台为了构建自动驾驶能力而重点招聘的一类人才。这个岗位的职责不是单一的,它横跨感知、定位、规划、控制、系统集成几个大模块。所以笔试的出题逻辑天然就是“一专多能”:你可以在某个方向上有深入的理解,但基础能力不能有明显短板。
从出题人的角度看,笔试要解决的核心问题是:在海量简历中筛出“具备自动驾驶研发底层素质”的候选人。这个素质包含三层——第一层是编程功底,能不能把想法高效地写成代码;第二层是算法理解,尤其是几何、状态估计、机器学习相关的数学基础;第三层是工程意识,对传感器、坐标系、实时性这些工程细节有没有概念。
所以那份笔试卷子,表面上是一道道题目,本质上是一个能力扫描仪。这也是为什么我建议所有准备这个方向的同学,别急着刷题,先把岗位描述里的每个关键词列出来,逐个问自己“如果我是出题人,我会怎么考这个点”,这种逆向思维比盲目刷题高效得多。
1.2 智能驾驶笔试的典型模块和出题惯性
按照我当时对多家公司智能驾驶岗位笔试的观察,这类笔试通常可以分为几个固定模块,滴滴的题目在结构上也比较接近这个框架。
第一个模块是专业基础选择题/填空题,覆盖C++语言细节、数据结构复杂度、概率统计、线性代数。第二个模块是编程题,通常两到三道,难度从中等到偏难,重点考察动态规划、图论、滑动窗口、二分答案这些经典算法思想。第三个模块是算法/系统设计题,用文字描述一个贴近自动驾驶场景的问题,让你给出方案——比如如何设计一个目标追踪模块、如何融合相机和激光雷达数据、如何优化某个计算瓶颈。
还有一个容易被忽略的隐性模块:数学推导。有些题目会以选择题形式出现,但背后需要你对坐标变换矩阵、卡尔曼滤波更新公式、最小二乘解的形式有清晰的记忆。我当时见过不少同学算法题写得很好,结果在“用公式表达一个旋转矩阵”这种基础题上翻车,非常可惜。
出题惯性上,智能驾驶方向的笔试会比通用后端岗位更看重“几何直觉”和“物理意义”。同样考动态规划,通用岗可能考背包,智能驾驶岗可能把同一个思想包装成“路径规划中的资源分配”;同样考图论,通用岗可能考最短路径模板,智能驾驶岗可能问你“如何在地图网格上做覆盖搜索”。理解了这个惯性,你就知道复习的时候应该多做什么样的思维转换。
2. 笔试核心知识模块:四个板块逐一攻克
2.1 编程基础与算法:绕不开的硬门槛
不论你投的是哪个方向的技术岗,编程能力一定是笔试的第一关。智能驾驶研发工程师的编程题,从语言选择上通常只给C++和Python两个选项,个别时候会允许Java,但C++始终是优先推荐。
为什么推荐C++?因为自动驾驶的工程落地几乎绕不开C++。感知、定位、规划模块的高性能代码,嵌入式控制器上的核心逻辑,都是C++写的。笔试里用C++作答,至少说明你具备阅读和编写这类代码的基础能力。
算法准备的重心,我建议按优先级排序。动态规划是绝对的核心——很多看起来复杂的场景题,剥开外壳都是线性DP或者区间DP;其次是图和树的搜索,BFS/DFS、拓扑排序、最短路径需要手到擒来;然后是滑动窗口和双指针,这两类题在工程中的映射是“传感器数据流上的滑窗处理”,出题人很喜欢把它们包装成流式数据场景。
准备方法上,我不推荐按题号刷几千道题。更高效的方式是“题型归纳法”:每做一道题,问自己三个问题——这道题属于什么范式?有没有做过同范式的其他题?如果换个背景(比如从数组变成传感器序列)还能不能识别出来?这个方法对于应对智能驾驶方向的场景化编程题特别有用,因为出题人一定会把算法包装在具体场景里。
2.2 感知算法:从经典CV到深度学习,一个都不能漏
感知模块是智能驾驶笔试的重头戏,也是区分“真正想做自动驾驶的人”和“泛泛了解人工智能的人”的关键板块。
经典图像处理和计算机视觉的内容,在笔试中出现频率很高。图像滤波、边缘检测、特征点提取与匹配(SIFT、ORB这些)、光流法、背景建模,这些是感知算法的地基。笔试很少会让你从零推导SIFT的完整流程,但会考你特征匹配中的RANSAC原理、图像金字塔的作用、非极大值抑制(NMS)的动机——这些细节恰恰是很多“调包侠”的知识盲区。
深度学习相关的考点则集中在目标检测、语义分割、目标跟踪几个方向。目标检测几乎是必考:两阶段和单阶段检测器的区别、Anchor机制的作用、IoU和mAP的计算方式、损失函数里分类和回归分支怎么平衡。语义分割则会涉及FCN、U-Net这类经典结构的设计动机。跟踪方向需要理解匈牙利匹配、卡尔曼滤波在轨迹关联中的角色。
这里我特别想提醒一个点:笔试中的深度学习题,很少直接问“背一个网络结构”,更多是给你一个具体问题,让你分析某个设计是否合理。比如“把YOLO的检测头从单尺度改成FPN多尺度,对性能有什么影响”。这种题考察的是你对技术演进逻辑的理解,而不是背参数的能力。准备时多问“为什么要这么设计”,比记住结构本身更重要。
2.3 定位建图与规划控制:理解自动驾驶的“大脑回路”
如果说感知是智能驾驶的眼睛,那么定位、建图、规划、控制就是它的小脑和大脑。这一整块是智能驾驶研发岗区别于通用AI岗的特色内容,也是很多人复习时最没底的部分。
定位模块的考点集中在几个方向:GPS/IMU/里程计的基础原理和误差模型、卡尔曼滤波及其扩展(EKF、UKF)的适用场景、多传感器融合的基本架构(松耦合vs紧耦合)、高精度地图在定位中的作用。你会发现这些考点的共性都是“不确定性处理”——怎么在噪声中估计自己在哪里,是定位问题的核心哲学。
建图(SLAM)部分,如果笔试涉及,通常会考察前端配准(ICP、NDT)和后端优化(图优化、回环检测)的基本概念,以及一些经典框架的优劣势讨论。对于2018年这个时间点,视觉SLAM和激光SLAM的对比也是热门出题方向。
规划与控制模块的考点则更加“算法化”。路径规划中的A*、RRT、Dijkstra是笔试常客,轨迹规划可能涉及多项式曲线拟合、贝塞尔曲线、样条曲线的基本概念。控制部分更偏概念——PID控制器的参数整定逻辑、MPC的基本原理和它相对PID的优势,这些理解到“能用一句话说清楚核心思想”的程度就够应对选择题和简答题了。
学习这一块时我有个很深的体会:与其死记硬背每个算法的步骤,不如先把“自动驾驶系统从传感器数据到车辆控制指令的完整链路”画一遍,理解每个模块的输入输出是什么、上下游依赖是什么。脑中有了这张全局图,很多独立的考点会自动串起来,记忆负担会小很多。
2.4 数学基础与工程素养:容易被忽视的隐形考点
智能驾驶笔试里有一类题目,不会单独成为一个大模块,但会“埋伏”在各个题目里——这就是数学基础和工程素养。它们最容易被忽视,也最容易成为拉开差距的地方。
线性代数的考察集中在矩阵运算、坐标变换、特征值分解、奇异值分解。坐标系变换在智能驾驶里是家常便饭:相机坐标系、雷达坐标系、车辆坐标系、世界坐标系之间的转换,本质就是旋转矩阵和平移向量的组合。你必须对“外参标定是干什么的”“为什么要做刚体变换”有直觉,而不只是会背公式。
概率统计的考察集中在高斯分布、最大似然估计、贝叶斯公式、最小二乘法。这些知识点会出现在感知、定位、融合的很多场景里。比如“用一个高斯分布建模某个测量的噪声,怎么求参数”这种题,本质上就是最大似然估计。再比如“两个传感器对同一目标分别给出测量,怎么融合”这个经典问题,最优答案往往就是贝叶斯框架下的加权平均。
工程素养的考察则更“软”。笔试可能出现关于ROS通信机制的选择题——话题和服务有什么区别;也可能出现关于嵌入式环境资源限制的简答题——为什么模型要量化。这些题没有固定的复习提纲,全靠平时积累。我建议准备期间多看看自动驾驶技术团队的工程博客,特别是那些讲系统架构、数据流、性能优化的文章,对培养工程直觉有帮助。
3. 笔试实战策略:时间分配与答题技巧
3.1 拿到试卷后的三分钟决策,决定你整场的心态
笔试时间通常紧张,尤其是既有选择题又有编程题还有设计题的混合卷。很多人一上来就从第一道选择题开始按顺序做,结果到编程题的时候时间已经不够用了,这是最典型的策略失误。
我的建议是,拿到试卷先别动笔,用三分钟把整张卷子快速浏览一遍。目的有三个:第一,确认题型分布和分值权重;第二,标记出自己最有把握的题目;第三,识别出可能耗时的大题,估算每道题的时间预算。
时间分配的总原则是“先拿确定性分数,再攻坚难题”。选择题和填空题虽然单题分值不高,但它们是你最有把握的部分,应该快速而准确地拿下。编程题通常分值最高,建议留出至少一半的时间来处理。设计题如果写不完完整方案,至少把框架和关键词写出来,拿部分分。
我见过有些同学在选择题上反复纠结,一题耗时五分钟,最后编程题草草提交。这种本末倒置的做法非常可惜。选择题不会做就标记跳过,整张卷子做完一轮后如果有时间再回头思考,这个习惯在限定时间的笔试中特别重要。
3.2 编程题的AC方法论:从读题到提交的完整流程
编程题是笔试的大头,也是最容易因为细节失分的地方。我总结了几个实战中验证过的步骤,可以帮你稳定地拿到尽可能多的分数。
第一步是读题时划出关键约束。数据范围决定了算法复杂度要求,输入输出格式决定了代码的边界处理。比如题目给出的数组长度是10^5还是10^9,直接决定了你该用O(n log n)还是O(n)的算法。很多同学不是不会做,而是没注意数据范围,用了过慢的算法导致超时,这就很冤了。
第二步是先想清楚再写代码。在草稿纸上画出状态转移方程、递推关系或者遍历顺序,确认样例输入能跑通逻辑,再开始写。动笔写代码前思路越清晰,写出来的代码越简洁,调试时间越短。
第三步是小数据量自测。提交前至少构造一个极简输入、一个边界输入(比如空数组、单元素、最大数值)来自测,这一步能避免大量因为下标越界、空指针、整数溢出导致的低级错误。
第四步是代码风格。虽然笔试评测主要是看结果,但如果你的代码结构清晰、变量命名有意义,万一需要人工review,观感会好很多。更重要的是,清晰的代码能让你在调试时更快定位问题。
3.3 主观设计题的回答框架:让面试官看到你的系统思维
笔试里的主观设计题是最像“工作场景”的题目——它没有唯一答案,但可以通过回答框架体现你的专业素养。这类题通常描述一个自动驾驶中的具体问题,比如“如何设计一个城市道路场景下的前方车辆检测与追踪模块”,然后让你给出方案。
我的建议是严格按照“模块拆解→数据流→关键技术选型→评估方法”这个框架来答。
模块拆解部分,把问题分解成输入、处理流程、输出。具体到车辆检测追踪问题,输入是环视相机或前向相机的图像序列,处理流程包含目标检测、特征提取、帧间关联、状态估计,输出是车辆列表及运动状态。
数据流部分,说明每个子模块的输入输出如何衔接。检测模块输出bounding box,特征提取模块输出外观特征,关联模块用IoU+外观特征做匹配,状态估计用卡尔曼滤波器平滑车辆位置和速度。
关键技术选型部分,说明你用什么方法实现每个步骤,以及为什么选它。比如检测用YOLO因为速度够快,关联用匈牙利算法解决匹配问题,状态估计用恒速度模型(CV model)做预测。
评估方法部分,给出精度指标和效率指标:mAP或mOTA衡量检测和追踪精度,帧率(FPS)和延迟(latency)衡量实时性。
这个框架的好处是,即使你的方案不是最优的,面试官也能看出你有完整的系统思考能力——而这恰恰是智能驾驶研发工程师最需要的素质之一。
4. 备考避坑经验:这些失分点我见得最多
4.1 只会调包不理解原理,是最大的隐患
备考过程中我最常看到的一个问题,是很多同学对深度学习框架和开源库用得非常熟练,但被问到底层原理时却答不上来。比如Loss里为什么要加正则项、BatchNorm在推理时用的是什么统计量、RoI Pooling和RoI Align的区别在哪里。
这类问题在笔试中经常以“技术辨析”的形式出现,用以区分“用过”和“懂”的人。出题人很清楚,一个只会调包的同学在真实工作中很难独立解决新问题。所以我的建议是,在准备深度学习基础的时候,别满足于“会跑通”,要追问每一步的数学形式和物理含义,把经典论文的核心公式亲手推导一遍。
深入理解原理还有一个实际收益:即使笔试遇到没见过的开放式问题,你也能从第一性原理出发推导出合理方案,而不是只能等一个熟悉的题目。
4.2 忽略“传感器物理约束”,方案再好也落不了地
智能驾驶的很多问题,本质上都是带物理约束的问题。比如车辆运动受限于动力学特性,传感器受限于量程、噪声和失效模式,计算平台受限于算力和功耗。
笔试题目里那些看起来“只要用深度学习就能解决”的问题,其实背后都藏着物理约束。例如,目标检测的输入图像分辨率受限于相机硬件和算力;激光雷达点云在雨雾天气下会退化,这时候单纯靠激光的感知方案就会失效。
我的建议是,准备笔试的同时,多积累一些传感器的基础知识——相机的内参外参标定、激光雷达的工作原理和点云特性、IMU的漂移特性、GPS的多路径效应。这些知识不仅帮助你在选择题上拿分,更能让你在设计题中体现出“工程落地意识”,这是区分普通答题者和有潜力工程师的重要信号。
4.3 眼高手低,推导“会了”但计算“错了”
还有一类失分很隐蔽:有些同学看答案觉得“我会了”,但自己动手算的时候错误百出。比如坐标系变换矩阵的手算、卡尔曼滤波更新方程的数代、匈牙利算法在小规模样例上的手工推演,一做就错。
原因很简单:看答案是被动接收,动手算才是主动建构。我对备考的建议是,凡是涉及公式推导的考点,一定要亲手在纸上完整推导至少三遍,直到不需要看任何参考资料就能独立完成。
更进一步,把常用的数学工具练到“肌肉记忆”的程度。比如旋转矩阵在不同轴上的形式、四元数到旋转矩阵的转换公式、状态转移矩阵F和观测矩阵H在常见模型下的具体形式,这些基础公式如果能在考场上条件反射地写出来,你的答题速度会明显提升。
4.4 只刷题不构体系,遇到新场景就懵
最后一个常见问题是知识点碎片化。有些同学刷了很多题、背了很多知识点,但都是一个个孤立的信息岛。笔试一旦出现综合性强、需要跨模块知识的题目,就不知道从何下手了。
典型例子是“融合视觉和激光雷达做目标检测”这类题目。它同时涉及传感器特性、数据表示、融合策略、深度学习、评估体系,至少横跨三个知识模块。如果平时没有系统性梳理过这些知识之间的联系,很难在短时间内组织出好答案。
打破碎片化的方法,是一边复习一边画技术地图:以“一辆自动驾驶汽车从感知输入到控制输出的完整链路”为主干,把每个关键技术点挂在对应的位置上。这个地图不是给别人看的,而是用来检验自己的知识结构是否完整。当你能不看资料、凭记忆画出这张地图并解释每个节点之间的关联时,你的准备工作才算真正到位了。
5. 从笔试到面试:考完之后的进阶路线
5.1 笔试只是起点,面试更看重“深挖”能力
笔试这张卷子,更多是在验证你是否具备“入行资格”——基础扎实、技术面广、有一定工程直觉。但到了面试环节,考察方式会从“面广”切换成“挖深”。简历上的任何一段经历、任何一个提到的算法,都可能被面试官追问到底层细节。
所以我建议,笔试结束后不要松懈,立刻把精力转到“深挖”模式。选择一两个你最有把握的方向(比如目标检测,或者多传感器融合定位),把相关的经典论文精读几遍,尤其吃透它们的动机、方法、实验设计和局限性。
经常被追问的问题包括:“你提到用过卡尔曼滤波,那如果系统模型是非线性的,你怎么处理?”、“你训练目标检测模型的时候,正负样本是怎么定义的?怎么解决正负样本不均衡?”、“如果你是实时系统的工程师,模型推理速度不达标,你会从哪些角度优化?”这些问题都需要在掌握原理的基础上灵活应变。
5.2 动手做一个完整的小项目,胜过空谈十篇论文
说实话,校招笔试和面试能覆盖的内容是有限的,真正让你在候选人中脱颖而出的,往往是亲手做过的项目经验。如果你现在还有时间,我非常建议动手完成一个端到端的小项目,哪怕规模很小。
比如,用开源数据集训练一个目标检测模型,然后部署到ROS节点上,接上一个话题发布检测结果;或者,在给定传感器数据上实现一个基于卡尔曼滤波的融合定位模块,跑通并评估精度。这类项目做的过程中,你会真实遇到数据标注质量、模型过拟合、推理延迟、坐标变换错误等一堆工程问题,而解决这些问题的经验,恰恰是笔试和面试中最能体现差异化的谈资。
从准备笔试的角度看,动手项目还有一个直接好处:很多笔试题目的场景,其实就是你在项目中遇到的问题。你亲手解决过一次,考场上再遇到时,你的回答会比其他没有实战经验的人更有细节、更有底气。
5.3 心态与信息战:校招也是一场持久战
最后想聊聊一个很多人忽视的点:心态和信息搜集能力。智能驾驶方向的校招准备周期长、知识面广,很容易在准备过程中产生“我是不是缺了很多东西”的焦虑。这种焦虑的解法不是无限扩大复习范围,而是把有限的时间聚焦在高频考点和技术主线上。
信息搜集方面,多关注目标公司技术团队的公开分享、技术博客、开源项目,这些信息能帮你把握团队的技术倾向。比如有的团队更偏感知方向,有的团队在规划控制上有深厚积累。如果你能判断出出题团队的技术侧重,复习时的精力分配会更有针对性。
我自己见过很多笔试分数不错但败在心态上的同学——遇到没见过的题目就慌,或者因为前面选择题不确定而影响了编程题的发挥。准备到后面,其实每个人都知道60%到70%的内容,差距往往在执行力、时间管理能力和面对陌生问题的冷静程度上。你可以把每一次模拟笔试都当作真实考试,练节奏、练取舍、练心态,这本身就是备考的一部分。