该面经来自深蓝学院用户投稿,作者为东北大学自动化专业硕士。
作者年秋招情况:投递的岗位包括决策规划,规划控制和控制岗位。本人累计投递70家自动驾驶公司,最终收获10多家公司的笔试或面试反馈。最终拿到的offer包括主机厂、新势力、自动驾驶公司等。整体上偏向决策或规划岗位。
整体节奏
研一主要学习了深度学习、强化学习和多伦多大学的自动驾驶课程,以及自动驾驶仿真平台CARLA;研二上学期学习了C++和leetcode相关知识,以及深蓝学院、百度的公开课,10月开始学习C++知识,断断续续的看代码随想录的笔记,对于学习的过程中要记好笔记,掌握一题多解,比如对于树的题目而言,不仅学习递归的解法也要掌握迭代的解法。
第二年(研二下学期)3月份开始高强度刷题,持续到6月份,累计刷题+保持手感,每天都要花时间写题目,不然手生疏的话再捡回来就比较困难了。
在6月份到9月份期间,面试的同时,也要复习并且刷一些常见的题目,这个阶段是提前批阶段,不需要笔试,一般直接进入面试环节,每次面试后及时复盘,整理面试的问题和答案,方便后续总结提升自己。
在9月份到10月份,开始了正式批环节。由于提前批面了一些公司,经验更加丰富,面试的时候相对会更加顺利,一些公司还需要做笔试,笔试包括计算机基础知识和稍微困难的编程题目,因此还需要继续刷题保持手感。
在10月份后基本上到了谈薪的环节,可以拿已有的offer和其他公司讨论,争取拿到满意的薪资。
秋招的基础知识准备
C++
通过如黑马课程等了解基本概念,掌握基本的C++知识,并且在学习的过程中要多敲代码,比如继承多态的写法,各种STL容器的用法等等,可能面试的时候也会写简单的结构。而对于应付面试来说,还需要理解的记忆一些常见八股文,基本是面试的必考环节,常考的如虚函数、智能指针、多态等知识,如果背的不够的话,很可能回答的时候漏掉一些关键的知识点,导致面试官认为你的基础掌握不够扎实,因此只有背的足够多才能在面试中从容的面对。
leetcode
手撕代码比较关键,代码的难度一般不高,基本属于hot里的题目,算法岗位的话动态规划、深度优先搜索和广度优先搜索的题目比较多,而对于自动驾驶而言,图的相关题目也需要重点掌握,整体上建议题量在+即可,另外对于常见的困难题也应当非常熟悉,比如接雨水、N皇后等。
另外还需要学会在本地IDE中编写代码,能够自己定义如链表、树等结构体,并且写测试案例通过测试,自己定义数组、建立一个树并且赋值,也会定义一些图的结构,了解邻接表、邻接矩阵等,并且能够很快的debug代码,在本地中快速调试并运行成功。
规划控制理论
由于投递的岗位以规划为主,这里主要学习了PID和LQR等知识,需要有一些PID调参的经验,如PID各自的作用以及PID如何调参才能满足预期的控制功能,了解增量式PID和位置式PID的区别。这部分更强调实践的内容,最好要手动编写一部分代码,并且在一些仿真平台做尝试来实践一下,可以选择CARLA或者CarSim等。
优化
规划岗位对优化有一定的要求,可以看一些最优化的课程,了解常见的QP方法,并且也需要用代码来实现求解,学会调用一些求解器的库函数。对凸优化的一些基本概念应该了解,此外凸优化和矩阵分析联系也比较密切,比如正定矩阵等,需要有一定了解。
深度学习
基于深度学习的预测或者决策方法对深度学习基础有一定要求,需要掌握卷积的计算、梯度下降的方法和区别、手撕一些深度学习的公式。对于预测而言的话,又需要了解预测的常见指标,包括ADE和FDE等,以及每个指标是如何计算的,在实践中这些指标的数值大小是多少。
实践
(1)多参加自动驾驶相关比赛,如果是规划控制岗位,多一些基于规则的方法规划算法编写和控制经验。这部分主要有轨迹预测的比赛和规划控制的比赛,需要自己多