記錄自己秋招的整個經歷 (目標: 自動駕駛決策規划控制算法工程師)
======================
自己只是國內普通的985,專業是機械電子,本科取得了還不錯的成績保研到上交,但是一意孤行去到了德國的TU Darmstatdt。沒有大廠實習也沒有頂會(小菜雞一枚),因此秋招之前其實抱着試試的心態,春招再來。再者秋招恰好和畢設撞在了一起,所以每天分配一半一半的時間給畢設和准備秋招。畢設剛好適合規划控制相關的,因此算是有一個相對契合的項目經驗。具體做的准備如下:
1. Leetcode 刷題
按照一個大佬的網站刷題,秋招前后總共刷了大概200題 (實習的時候一些前輩和我說最好能夠刷到400),而且最好能夠過兩遍以上。第一遍刷的時候主要在熟悉題型,按照題型來刷,如果想了幾分鍾沒有頭緒就嘗試看懂主要方法的思路,並且自己碼一遍;第二遍刷的時候要盡可能自己做出來,最好能掌握不同的方法,對於陌生的題目和題型最好能多做一兩遍加強印象。面試或者筆試前,我會大致腦袋里按這個過一遍:
常見排序算法,常用數據結構,復雜度,暴力解法,鏈表,哈希表,雙指針,二分法,滑動窗口,二叉樹(前序中序后序,遞歸和迭代,層序遍歷,棧和隊列),動態規划(01背包,完全背包,打家劫舍,股票,子序列,回文串),回溯(組合,排列,子集),貪心(覆蓋范圍)
2. C++ 基礎
由於自己的 C++ 代碼能力其實比較薄弱,所以在刷題的時候 python 和 C++ 都得碼一次。其次,從開始准備秋招到結束依次看了 C++菜鳥教程、清華鄭莉老師_C++語言程序設計基礎、侯捷_C++面向對象高級開發、侯捷_C++ STL源碼剖析、侯捷_C++標准1114,期間如果碰到不會的或者不熟悉的就查閱 cppreference.com 或者一些博客,以及 C++ primer 書籍。
3. 計算機基礎等八股文
由於非科班出生,對於計算機基礎等八股文自己主要是找一些針對常見面試的文檔進行補缺補漏,目前也還在學習,之后有所收獲的話會更新學習進程。
4. 相關項目
在碩士階段,主要是做了一個和機器學習相關的小實習、加入了一個自動駕駛小組了解了感知相關任務、一個和機器人強化學習相關的小項目以及和移動機器人運動規划相關的畢設。我們學校機械專業主要還是偏向傳統機械,所以自己接觸的項目很雜,其實項目的實際深度都非常非常的淺,也沒有很好的論文輸出,但也算是讓自己對相關的一些算法有了了解,加之自己對規划控制很感興趣,因此對決策(決策樹、MDP)、規划(LQR、MPC、MPPI)有一定的了解。機器學習和深度學習算法方面主要熟悉一下常見的算法(MLP、SVM、KNN、Yolo系列、DQN等)。關於面試的話,一定要對自己的項目足夠熟悉,理清項目的難點和項目實際要解決的問題以及最終是否解決了或者如何解決的。
由於在提前批的時候還沒准備好,所以錯過了很多提前批的機會,后面發現應該好好利用提前批的機會。
主要投的是初創公司,有一些投遞過后無音訊的,也有不少筆試之后無音訊的,總共參加過面試的有:
文遠知行、華為、百度、毫末智行、元戎啟行、小鵬、銳明科技、Momenta、地平線
==============================================================
文遠知行(數據分析崗, offer)
一面
- 給定一個數組,對這個數組進行排序去重
- 查看當前目錄下的文件 ls
- 講文件從A拷貝到B cp A B
- 移動 mv A B
- 查看文件里面某個字符 grep
- 數據結構: 數組和鏈表有什么不同?查詢和插入的復雜度?
- 機器學習項目
二面
- 2 道代碼題,匹配括號和找不同的index
- 自動駕駛感知一般是怎么做行人識別的?
- QT里面數據是怎么傳輸的?
- 機器學習項目
三面
- 簡單的求路徑的題目,即給定一個矩陣,1表示起點,2表示終點,3代表障礙物,0代表可行域,(可用dp或者dfs求解)
- 項目
四面
- 介紹下畢設
- Adda的任務遇到什么困難沒有?
- 公司有具體的培養政策,會針對某一塊的數據工作
華為(測試崗, offer)
由於當時投的是技術研究崗,但華為hr當時只讓我面測試崗位,所以筆試題目是三道編程題,做的一般但是應該是過了基本線 (編程的通過標准是100分就行,解決測試選擇題,通過線是60分)。面試的時候都是測試的面試官,所以面試的內容偏測試方向,兩天內就面完了三面。
- 如何去評價感知的結果?precision, recall, 准確率,mAP多少,有多少個類別?
- 用了ROS的什么功能?有什么缺點?
- 測試流程?講講對單元測試、白盒測試、黑盒測試的理解
- 出了一道簡單的測試流程題目,畫出流程圖即可
- 畢設項目
百度(PnC, offer)
- QP, 如果約束條件是二次方程,還是凸函數嗎?
- A* 和 RRT 的區別? A* 能找到最短路徑嗎?如果啟發函數不同,路徑還一樣嗎?
- 代碼題1: 一個 DFS的題目, 中等難度
- 代碼題2: 給定一系列的點,求其擬合直線
- 代碼題3: 力扣153
- 詳細的畢設介紹
/* 代碼題1 */
//求 最長的通路的長度(最多有多少個0相連) #include <queue> bool is_valid(int a, int b, vector<vector<int>>& grid_map) { int nr = grid_map.size(); int nc = grid-map[0].size(); return 0 < a && a < nr && 0 < b && b < nc; } int find_land(vector<vector<int>>& grid_map) { int result = 0; int nr = grid_map.size(); int nc = grid_map[0].size(); queue<pair<int, int>> neighbors; for (int i = 0; i < nr; i++) { // 遍歷整個地圖 for (int j = 0; j < nc; j++) { if (grid_map[i][j] == 0) { // 搜索鄰居 neighbors.push_back(make_pair(i, j)); while (!neighbors.empty()) { int ans = 1; x, y = neighbors.pop(); for (int p = -1; p < 2; p += 2) { for (int q = -1; q < 2; q += 2) { int cur_a = x + p, cur_b = y + q; if (is_valid(cur_a, cur_b, grid_map) && grid_map[cur_a][cur_b] == 0) { neighbors.push_back(make_pair(cur_a, cur_b)); ans += 1; } } } result = result < ans ? ans: result; } } } } return result; };
毫末智行(PnC, Offer)
兩次面試主要是問了畢設的項目和強化學習相關的知識,記得寫了一個Leetcode中等難度的題目,還問了 python 裝飾器和 C++ 智能指針
元戎啟行(PnC,二面掛)
一面
- 主要介紹畢設
- 軌跡預測有做過嗎?
- 代碼題目: 廣度優先搜索
二面(代碼面)
- 快速冪 -> 遞歸, 需要考慮數據是否溢出
- 關於馬爾可夫性的題目
- 投骰子, 每個面都能朝上一次的總共投擲次數的期望: dp[i] = i/N * dp[i] + (N-i)/N * dp[i+1] + 1
小鵬(軟件測試,offer)
一面
- Hiwi項目介紹, 怎么確定評判標准的0.01? 遇見了什么困難?為什么認為你可以完成這個項目?
- aDDa介紹,模型訓練完以后,和testdrive在識別上有什么區別?
- 整車網絡了解嗎?CAN
- 測試開發工程師方向
二面
- Hiwi介紹, 做了什么數據處理?怎么選擇模型?
- IP1介紹, 如何選取到最優抓取點?
- ADP介紹, 幀率?
- aDDa介紹,
- 問了意向工作地點
銳明科技(感知算法,一面掛)
- 講一下 NMS(非極大值抑制)
- 如何做交叉數據及訓練的? Focal loss 是什么?
- 詳細把yolo的每一個模塊搞懂
- IOU怎么算的?
- Yolo里 有幾種loss?
- 蟻群算法了解碼?不了解...
- 數據增強的方式有哪幾種?
蠻投一下感知,問題對CV的人應該不難,發現自己太菜了...不過也提醒自己要專注規控的面試。
Momenta(PnC, offer)
一面
- 講一下用過了什么規划算法? A*, rrt, rrt*, 各自的優劣?
- 講一下你對EM planner 和 lattice planner 的理解, 各自的適用場景?
- 控制方面有接觸過嗎? PID、LQR 和 MPC
- 機器學習算法用過哪些? MLP, KNN, 決策樹
- 強化學習用過哪些? DQN
- C++ 引用和指針的區別?
- C++ 的多態指的是什么?有幾種?
二面
- 代碼題1:力扣簡單難度
- 代碼題2: 最長的回文子串
- 講一下畢設如何做的的規划控制
- rrt 和 rrt* 有什么區別
- 機器人位姿優化有涉及什么強化學習?
三面
- 主要介紹畢設項目,針對性的提問
- 反問需要補充的規划知識
地平線(PnC, offer)
一面
- KNN 和 K均值的區別, 機器學習項目的輸入輸出是什么?
- 目標檢測用了哪些模型?
- 代碼:矩陣乘法
- 熵是什么? 用過什么分類算法?決策樹, 不同類型決策樹模型的區別?
二面
- 代碼: 二叉樹是否鏡像 (層序遍歷)
- 代碼: 兩個有序數組,大小為N,找到第K個元素 (二分法)
- 基於rule-based / RL 以及 神經網絡的決策規划各自的優缺點
- 畢設:規划的輸入是什么?是否有動態障礙物的信息
- 如果沒有軌跡預測的信息,要怎么做決策規划?
- 為什么想來我們公司?
三面
- 代碼題1:已知lnx+x^2 =0 在(0,1)范圍內有唯一解,用數值方法求解,精度0.0001
- 項目: 介紹下畢設,以及在PID中如何選擇Kp和Kv的?
- EM planner了解嗎?QP了解嗎?用過什么優化算法?多次曲線?貝塞爾曲線?
### 代碼題1
# 已知lnx+x^2 =0 在(0,1)范圍內有唯一解,用數值方法求解,精度0.0001 ##采用解法為牛頓迭代法 import math x = 0.5 def func(x): # 函數方程 y = math.log(x) + x ** 2 # 搜一下ln return y def dot_y(x): # 求導數 dy = 1/x + 2 * x return dy def find(x): diff=1 while diff > 0.0001: y = func(x) dy = dot_y(x) new_x = -y * 1./dy + x # 先求出切線方程再令y == 0; new_y = func(new_x) diff = abs(new_y - 0) x = new_x return x result = find(x) print(result)
四面
- 介紹畢設
- 基於rule-based 和 learning-based 的方法,了解多少
- 對自己今后的發展有什么規划
- 德國生活和中國有什么不一樣
- 代碼: 寫一個01隨機生成器, 再完成 1-N 隨機生成器 (可參考 1到N的等概率生成器)
=================================================
總的來說,秋招真的是出乎自己意料的拿到了幾個滿意的offer,由於自己沒有很好的實習經歷,而且代碼能力和身邊同學以及前輩們還有很大的差距,學歷也非頂尖,所以已經非常滿意現在能拿到的offer了。在簡短的實習過后,覺得實習對於鍛煉自身的多方面能力都很有效,后悔之前自己太懶,在國內沒有把握機會去實習,建議最好能去自己未來打算發展的崗位實習,多和前輩們交流,吸收一些經驗。記得看侯捷老師的視頻時,他偶爾說到 "革命尚未結束,同志仍需努力"。作為一個PnC beginner,還有非常非常多的基礎知識和技能需要補充,拿到offer只是革命的第一步,真正的挑戰還沒到來。Fangen wir an!