2019-2020北美機器人/無人車軟體工程師正職求職經歷分享

B02 盧廉晰 Joseph Lu
(原文轉載自Medium: https://reurl.cc/yE0oAl)


雖然在大二轉至機械系,但臉書封面至今仍放著與土木系籃的合影

背景

目前人在加拿大Montreal,現職為Algolux的Software Engineer — Robotics, 工作將近滿一年。2017臺大機械學士,大學時期幾乎沒有程式語言經歷 (大一Java成績C+,大四修過一點點Matlab),畢業後擔任Aeolus Robotics的機構工程師將近一年。2018原申請上UCSD ME碩士後轉UCSD ECE-Intelligent System, Robotics and Control碩士,赴美國前只會一點點Python,不會C++,因此第一年找實習幾乎處處碰壁,最後再沒有找到美國實習的情況下,幸運的到蘇州PlusAI暑期實習三個月,主要工作為Lidar相關的Localization and Mapping。於2019年十月開始找北美工作,主要求職方向為Robotics, SLAM, Computer Vision,實習/正職,美國/加拿大,都有面試經驗。

求職公司簡介

主要投遞履歷的公司包括檯面上較有規模的無人車公司 (Waymo, Tesla, Nuro, DiDiLabs, Magna, Motional, Lucid Motors, Algolux)、無人卡車公司 (Tusimple, PlusAI, Inceptio, Kodiak Robotics, Torc Robotics)、運輸/倉儲機器人(Postmates, Vecna Robotics)、農業機器人 (Blue River Technology)、Lidar研發 (Aeva, Quanergy)、無人車Simulation (Applied Intuition),還有不知道怎麼歸類但也是相關職位的Amazon (Amazon, Lab126)。

面試結果

從2019十月開始求職,一路至五月拿到Offer,以下是我面試的結果。

人資輪失敗:  Postmates

OA失敗Tusimple, DiDiLabs

技術電面失敗Kodiak Robotics (一輪)、Tesla (一輪)、Blue River Technology (Intern,一輪)、Nuro (二輪)、DJI (Intern,三輪)

COVID-19職位取消/Onsite 取消Waymo (Trucking)、Magna、Torc Robotics (收到OA職位取消) / Amazon

Onsite/Virtual Onsite失敗PlusAI、Applied Intuition、Quanergy、Aeva (面完後職位取消)、Aptiv-Hyundai (現Motional)、Amazon Lab126

Offer: Inceptio (Intern)、Vecna Robotics、Algolux (加拿大)

中途放棄: Waymo (Perception)、Lucid Motors

Decision: Algolux

求職經驗與建議:

履歷投遞

由於這方面的職缺不像純Software Engineer一樣成千上萬,我大概投遞的履歷應該只有50個職缺左右,大部分都是海投,反而內推的Apple、Facebook都完全沒用,總共有進入Hiring process的職位超過20個。在這方面我會建議履歷上的Project一定要跟職位的Job Description完全符合,基本上我投遞的職缺都是幾乎完全符合的,然後寫一封比較制式的Cover letter,其實只要海投就拿得到面試了。

面試安排

通常會分成以下幾個部分:

人資Introductory Call

通常是一個15~30分鐘的一通電話,這輪的形式比較不像一個面試(雖然我在這被淘汰過),基本上會是人資在進行整個面試流程前的一個公司/職位介紹,詢問面試者對職位的意願興趣,確認面試者的簽證身份狀態,還有介紹整個公司的Hiring Process。以個人的經驗來說,我覺得這一輪面試者需要展現出對公司及職位的興趣,適時的在人資介紹的過程中提出一些問題展現興趣,例如:對Team的組成、Onboard Training、未來是否Sponsor簽證、Mentor制度等,以上都是很好的問題可以讓人資感受到面試者對此職位的興趣,但切記不要插嘴,等人資介紹一個段落再進行提問。

Online Assessment

這部分也是大家俗稱的OA,人資通常會發一個連結裡面有程式的考題,需要在指定的日期前完成繳交,並且在解題的過程中會有時間的限制 (大約1~2hr)。建議大家可以先上網找找 (如: 一畝三分地) 有沒有同樣寫過這個公司的OA的求職者的經驗分享再來完成OA,能有一些心理準備總是比較好的。

電話技術面試

通常視公司Hiring Process的而定,會有一到三輪的電話技術面試,或是使用一些開會軟體如: Zoom, Google meet等等,每一輪時間大概在45~90分鐘。主要分兩類: Coding以及履歷。在Coding的面試中,通常會直接給面試者一個線上的Coderpad,在面試的時間內完成面試官指定的問題,藉此去衡量一個面試者的程式能力,將腦中的邏輯轉換成實際的程式碼的能力。而在履歷的部分,面試官通常會透過詢問履歷上的工作經驗或Project,藉此跟面試者進行技術討論,來了解面試者對技術的熟悉程度,甚至從這些Project再延伸出一些真正工作上會遇到的問題,來看面試者對這些問題的態度,以及有沒有能力在未來真正去解決這些問題。

回家作業Project

少部分的公司會出一份類似作業的Project請面試者於幾天內完成繳交,這部分就比較沒有一個制式的模式,我拿過一個Project是Robot Kidnapping的問題,需要親自寫出一個Localization演算法來計算出Robot的位置,而我用的就是傳統的Particle Filter去解決。(這是我現在的公司,我主管出的作業)

Onsite/Virtual Onsite面試

通過了前面所有的面試之後,公司會邀請面試者到公司進行一個半天 (也有聽過一天的) 的Onsite面試。主要是跟未來組內的主管/同事們見面,甚至有可能會有VP、CTO或CEO等更高層級的人來進行面試。視公司流程通常4~6輪不等,有的公司會請面試者先做一個一小時的Presentation (分為深入單一技術廣泛經歷兩種,我都有遇過)。與電話面試不同的部分就是,通常會有幾輪有白板題的部分,內容包括系統設計,Robotics演算法推導或是Coding題都有可能會遇到,最好能找個地方練習寫白板字,才不會寫得很醜。而其他非白板提的部分與電話面試就大同小異,只是這些面試官多半是你未來的同事,在衡量面試者的時候不完全以技術方面做評分,而是會有一些Behavior Question的部分去衡量這個面試者適不適合一起工作。

然後在時辰安排的部分,其實一間公司的面試流程還蠻長的,可能兩週到一個月都有可能,但在安排Onsite時間的時候,我建議不要拖太久,最好一個禮拜內,我第一次拿到Amazon的Onsite之後,排在兩個禮拜後,結果在面試前一天人資打來取消,因為或許在這中間,他們已經面試到適合的人了,就有可能會把面試者已經約好的Onsite面試取消,這點需要稍微注意。

程式能力

對於這些機器人/無人車方向的公司來說, C++是一個必須要會的語言,而在一些快速的Prototyping方面也會要求需要會Python。在這些面試中,當然有大家所謂刷題的部分,難度大概在Leetcode Easy/Medium (只有Waymo的人資跟我說他們會考Hard題),我個人其實也沒刷那麼多題 (大概130左右,畢竟我真的很討厭刷題),但就足以應付幾乎所有Leetcode考題的面試了,這方面就不分享太多。另外在C++的OOP觀念上也需要特別去準備,一些常考的觀念像class, virtaul function, const, static等等也都會被問,建議 (我朋友也這樣建議) 可以去買How to Program C++這本書來看。但撇除Leetcode跟C++的觀念之外,有些公司會出一些結合Robotics知識來出一些Coding考題,懶惰一點的面試官就是把Leetcode的題目包裝成Robotics的考題,有些勤勞一點的就是自己出題,以下提供一些經驗分享:

  1. Applied Intuition的CEO面試,他請我用C++實現一個Car Simulator,給了我一些車子的基本特性,我需要自己推導出車子的Motion Model,並且以嚴謹的C++ OOD的形式完成,模擬出車子會出現碰撞的時間。
  2. Motional的Localization team主管面試,他請我用Newton-Raphson Approximation的方法去寫出一個求出power(x,n)的函式。
  3. Motional的Senior工程師面試,他將無人車的Sensor配置,問我用哪種資料結構儲存最好 (Tree),Tree的節點如何設計,最後寫一個BFS去搜尋Sensor的位置 (比較像Leetcode的變形)。
  4. Tesla的State Estimation工程師面試,手刻Convolution,並進行優化,另外一題是給出一堆2D點,先用RANSAC剔除Outliers,再近似出直線方程式。

這些是比較特別有記憶點的考題,當然這些考的就完全不是你會不會刷題了,而是純粹的考你Robotics的背景數學知識,實際轉換成程式碼,甚至要求以OOD的形式整個完成,而不是單單寫一個function就結束。這些考題真的很靈活,除了刷題練練手之外,還是好好把Robotics的一些相關知識學好比較重要。

Robotics背景知識:

這部分從上面延伸,如果是跟我一樣的方向的人,一些傳統Robotics State Estimation的方法推導以及優缺點的比較一定要會,我在白板題遇過,如: EKF, UKF, Particle Filter,再來就是Optimzation-based的方法,如: Gaussian-Newton, Lavenberg-Marquardt, Gradient Descent,這些方法的優缺點都是一些SLAM方向必須要掌握的知識。還有基本的Rotation Representations的轉換,Lie Algebra也需要具備。另外就是傳統的CV的一些背景知識,如Monocular, Stereo的一些Image Geometry也非常重要,這些知識除了從課堂上學習以外,也建議可以去看高翔博士的SLAM十四講,非常受用。另外再提供一個增強Background Knowledge的方法,就是可以每天撥一些時間去看一些領域內很經典的論文,從理論配合著程式碼一起看,長期下來也能有很大的進步,在找工作的期間花了時間去看了VINS-MONO這篇經典的論文,裡面的邏輯在面試中也是非常的有用。最後,我建議Robotics方向的學弟妹最好能夠進入實驗室裡跟著老師或博士生做Project,進實驗室做Project,除了能夠給自己一個看Paper的動力外,讓自己的技術更加深化,老師能給的Connection資源也是非常的難得,也可以在履歷上放上Project讓履歷更好看,好處真的很多,我想這是我比較後悔當初沒有去做的事情了。

溝通能力:

另外一個在面試中我覺得很重要的東西是溝通的能力,在這些面試中,其實往往會遇到不知道如何給出解法的問題,Coding題目沒有想法,或是一些Open Question,這些問題常常沒有一個標準答案。在這種時候,面試官其實是在模擬一個真正一起工作的情境 (我想這也是可以解釋Waymo Leetcode會考Hard題的原因),看看面試者的反應如何。就我現在工作Project而言,的確常常會遇到一些讓人不知如何解決的問題,因此遇到這種狀況,最重要的是你能不能跟面試官討論出一個正確的並有機會解決這個問題的方向。或許在這個問題上,你可以直接跟面試官要一些Hint,適時的丟出一些關鍵字,讓面試官去引導你,有了一些Hint後,你也可以有一些Feedback,有一些你的想法,說白了其實不是面試,而是技術討論 (這是我PlusAI實習的主管給我的觀念)。在這個技術討論的過程中,有來有往,就算沒有真正的去解出問題,但也是一步步在接近完成解法,其實就是表現很好的一場面試了。畢竟,沒有人會想跟一個不願意一起討論的工程師一起工作,因此我覺得溝通能力不管在Coding面試或背景知識面試,都是非常重要的,必須展現出你有潛力成為很一個很好溝通願意跟人合作的工程師。

心態:

最後一個我覺得最重要的,這也是我在這一年工作中學習到的。在去年12月左右,我開始加入我們組內的Hiring Process幫忙進行了一些Coding的面試。其實平常大家工作都非常繁忙,在這個過程中,抽一個小時去面試求職者,其實是一件蠻奢侈的事情,換個角度想,既然花了一個小時,我當然也會希望這個求職者能夠順利被錄取,趕快進來公司幫忙,來分擔我的工作量,而不是為了考倒他,去浪費我這一個小時的工作時間。在面試者卡關的情況下,我更想要去看他願不願意跟我溝通跟我要Hint,相同地,我也非常的願意幫助他。因此在求職者面試的時候,應該要抱持一個對方其實也很想要錄取我的心態,而更心平氣和地去展現自己所擁有的經驗與技術,而不是去緊張接下來遇到的問題會不會被考倒,會不會回答得讓人不滿意,有了這樣的心態,面試的表現肯定會更加進步。這是我在這次求職過程中做得最不好,也最後悔的部分了。

心態調整的另外一個部分,就是同儕間比較競爭的壓力,求職的這段期間,一定會遇到很多同樣出國唸書的朋友們同時也在找工作。過程中,一定會聽到誰誰誰拿了一個大公司的Offer,或是誰誰誰拿了哪家公司的面試,然後自己可能還處在一個什麼都沒有的狀態。人難免都會產生比較的心理,這時候一定會有一種覺得自己是不是不夠好的想法,造成一個負面的情緒,進而影響自己找工作的節奏,晚上的時間可能也會睡不好。這些雖然無可避免,也一定會接收到這些訊息,但重要的是,要相信自己在做的努力,絕對是未來的養分。或許現在不夠好,但經過長時間的累積,總有一天會被老天眷顧,相信老天所有的安排就是最好的安排。我自己在第一年找美國實習的時候也面試了十間左右美國的公司,最後全部沒錄取,第二年找正職,也是一路面試將近八個月的時間才有辦法找到一份還可以的工作,過程中肯定辛苦,但是要持續不斷的自我肯定,在每一次面試中取得進步,總有一天一定會成功!

結語:

最後我選擇了遠在加拿大Montreal的一家無人車公司Algolux,這家公司是視覺Perception起家,特色在可以保證Perception的Robustness以及在各種困難情況下 (雪天,霧天,雨天等) 都能有很好的表現。會選這家公司而沒留在美國的原因很簡單,主要是加拿大相比於美國的移民政策友善很多吸引了我,另外也是因為美國的Offer並沒有達到我的預期,當然未來有機會還是會想要回去美國工作看看,不過就邊做邊看了。

或許以結果來看,我不是最優秀的,不是最幸運的,但兩年內從一個幾乎不會寫程式的機構工程師,到最後可以成功轉職進入無人車的世界,對我的人生旅程來說是一段很棒的人生體驗。只要想要轉職,真的永遠都不會嫌晚,當然找到工作只是起點,學海無涯,必須不斷持續的學習,未來才有辦法到更好的地方。最後再次感謝一路扶持的家人朋友,各種心靈雞湯的夥伴們,工作將近滿一年才把這篇去年就應該分享的文章生出來,期待對之後想走類似方向的學弟妹能有幫助!

a