Tesla 挖角與面試心得分享

因緣際會下本貓貓工程師被挖去了Tesla面試一番,順便來分享一下怎麼拿到Offer的吧。

Tesla 挖角與面試心得分享
本文純屬個人經驗,可能與其他職位面試流程不完全相同。並且因為有簽訂保密合約,我不方便在文章中透露任何被面試過的題目。
本文主要是以被面試者的角度分享 Tesla 的面試流程,以及我認為值得提及的事項。
撰寫文章時已經確定拿到 Offer 了但是還沒決定是否跳槽,並且因為是在疫情期間所以都是透過視訊面試的。
如果有任何關於面試有關的事情沒有在文章內提及,歡迎留言或私訊我。

挖角

終於知道為什麼 Tesla 對我有種莫名的吸引力了!
[1] Senior Software Engineer資深工程師。
[2] Refresher RSU,上市公司給予員工的獎勵之一,公司的股票。這和公司給的年終獎金是不一樣的。
[3] LinkedIn 領英,美國的求職類社交媒體網站。
[4] Tesla 特斯拉,美國最大的電動車公司。
[5] 說自己腦熱因為以前Google 有找我時,我才剛入職第一份工作一年,所以連回都沒有回。

事情是這樣子發生的,首先我很喜歡我現在的公司,工作挺輕鬆的,薪資據我了解應該算平均以上嗎?,老闆對我多有提拔,而且估計明年就要升上 Senior Software Engineer[1] 了。但美中不足的是每一年都有拿到 Refresher RSU[2] 的我今年並沒有拿到。可能是疫情的關係也可能是表現得不夠好嗎?,反正就是沒拿到。在某一天我和老闆的一對一後,因為日期已經超過我每年收到股票通知的月份了,我確信了今年沒有拿到 refresher 的事實。本來以為老闆打電話過來是要通知收到獎勵的我,當下百般不理解為何今年沒能分到股票,於是就打開了塵封已久的郵件挖角資料夾看了看有哪些公司找過我。後來在打開 LinkedIn[3] 時,看到 Tesla[4] 一天前發來的挖角信息,一時腦熱[5] 就回了。於是我開始了與特斯拉的一系列的對談與面試。

完全不同的職位

[6] SRE,全名是 Site Reliability Engineering 網站可靠性工程,是 Google 提倡的系統管理實踐之道、指導思想,這個名詞同時也是 軟體工程師 (Software Engineer) 的角色,可以類比於傳統的維運工程師或系統工程師,但是 SRE 是用 計算機科學軟體工程 手段,實踐 大型系統維運分散式系統 的設計與開發。 想知道更多可以看看這篇文章
[7] Backend Engineer 後端工程師,想知道更多可以看看這篇文章來了解各種軟體工程師得差別。
[8] Golang,一個 Google 在 2009 年開源的程式語言。
[9] MOS Manufacturing Operating System,特斯拉工廠的軟件操作系統等等。

特斯拉找我的職位與我目前的工作方向有著本質上的不同。我當時的職位是類似於 SRE[6] 的工程師,但是在和他們的人事部網路面談時,他說說適合給我的職缺有兩至三個,可是都是以 Backend Engineer[7] 為主的。我當時雖然很想問他們明明我簡歷上唯一沒有強調的就是 Backend Engineer 的經歷,和這幾個職缺有直接關聯的就只有 Golang[8] 的經驗而已,但還是隱忍著沒問了,畢竟想想換個跑道也不是什麼大問題。
在後來的面試裡才知道 Tesla 幫我安排的職位是他們在 Fremont 工廠的 MOS 相關工作。單就後面了解到的工作內容而論,聽起來還算挺有趣的。工作上會用到較為常見的 Tech Stack 大致上有 Golang、Kafka/RabbitMQ、Redis、Angular、MySQL、Kubernete & Container、還有一大堆,這裡就不一一說明了。

面試流程和準備 Interview Process &Prep

Three businesswomen

我因為只是一時衝動回覆挖角信的,所以是抱著試水溫的心態來面多這一場面試,並沒有花太多時間來準備面試相關的東西。當然如果最後薪資很不錯的話就另當別論了😎!
所以這裡分享的是一般來說該要準備 以及面試後認為如果有事先準備 會更好的東西。

1 - Interview with HR 人事部面試

內容

首先是第一次和人事部的面談,一般來說能走到這一步代表你已經在千百人之中脫穎而出了!因為無論是自己投的簡歷或是像這次我一樣直接收到挖角信,人事部在聯絡申請者之前都至少看過了幾千幾百個不同的簡歷了。所以在收到聯絡時你可以大致認為自己的簡歷和經歷已經得到了基本的認可,至少是符合工作需求的最低門檻了。

準備

這一輪只需要準備簡單的幾樣東西就好:
一些問題來了解自己要找的或被挖角的工作是在做什麼
一個簡單的自我介紹讓對方知道你大致的經歷和目前的工作
如果和我一樣是拿 H1-B 工作簽證或其他身份的人要事先了解申請公司在這方面的事項

實際面試

這一輪面試大概是最為輕鬆的一輪吧!主要在於了解申請者的基本訊息以及工作期望等等。大致上是以聊天的形式帶過,不會超過 30 分鐘。在面試過程中會順便安排下一輪面試等相關事項。可以事先問問面試的流程,我當時沒想太多所以沒問流程,好讓後面的面試過程有驚喜連連的感覺。

2 - Coding Interview 編程面試

內容

接著是 Coding Interview,這一輪面試根據每間公司,有可能是與公司資深工程師 的面對面編碼考題,也可能是直接透過線上編程考試 的方式,像是 Codility 或是 HackerRank等等。這類的面試一般來說可以刷掉大多數的面試者,因為這類考題考驗的是一個人的基本編程能力和邏輯性。雖然這類演算法考試常被人說是平日最不會碰到的東西,但是較大的科技公司一般還是會經過這個流程。無論是線上編程考試 或是面對面考試,主要都為依據正確性 以及程式的效率 來評分。

準備

[9] 如果平日要工作,一天能做個 3 道題就已經不可思議了!
[10] The Best Engineer Is A Lazy Engineer,最好工程师總是懒惰的。因為他們懶惰的人會發明工具讓自己的生活更輕鬆啊!

正常來說這些考題是可以透過訓練來提高的,我同事們都稱之為刷題!刷題的網站有很多,在美國最有名的刷題網站叫做 LeetCode,相信是軟體工程師的人都多少有聽過。這些考題說難不難說簡單也不簡單,遇到相性好的題目就是順順的帶過,遇到相性不好的即便再簡單也會有頭腦打結的時後。但根據同事以及朋友所說,如果刷個 3-500 題[9]再去考試的話一般來說三題會中一題相似的,運氣好的話有時可以碰到兩題。

The Best Engineer Is A Lazy Engineer[10]

雖然說刷題是絕對有實質性的幫助的,可我這人懶啊...我個人沒有刷題的習慣,面試也是抱著較平常的心態,所以沒有特別準備這些東西直接硬上才是我的王道!撇開這些胡扯廢話,保持平常心面試時不要因為緊張而導致腦子僵硬對我來說就是最好的準備了。

實際面試

[11] pseudo code 偽代碼,非正式的代碼。面試時有些考官會同意讓你寫 pseudo code,只要邏輯對了就好,不需要實際運行。
[12] Norah Jones 美國歌手,著名音樂有 Come away with me等等。我記得ˊ這是當時客廳播的音樂。

我這一輪面試是透過線上編程考試,好處是不會有一個人出題並且盯著我看,壞處是不能寫 psuedo code[11] 。總共有三題共 100 分鐘,我首先看了一下三個題目的長度,順序是簡單到困難。每一題有給三個基本的測試用數據,實際評分時可能會跑數十個測試。面試前我有被問要用哪個編程語言來做題,個人覺得用 Python 寫會比較輕鬆一點,但因為工作需求是 Golang,所以為了展示我在 Golang 上的能力,我選了 Golang!
因為當時 SRE 職位上的關係,我大概有 4 個月沒寫過任何代碼了... 考試前除了心態上的準備以外全數空空,所以當下是邊查 Golang 文檔複習邊寫。這導致我光是第一題花了 40 分鐘左右,而且 3 個基本測試錯中錯了 1 個... 當時心裡想著「情況不樂觀啊~」,不過因為我到 35 分鐘時才發現我算法的絲路錯了,但又腦子打結無法想到更好的辦法,於是就直接開始了第二題。第二、第三題雖然比較難,但是我做得很順,所以共花了 50 分鐘就寫完了。剩下的時間我正要用來回頭看第一題,客廳的音樂突然響起了。本來是想去請室友先關掉音樂讓我好好思考剩下最後的 10 分鐘,但又想著反正就是一個不是太重要的面試,隨它去吧!於是我就在 Norah Jones[12] 的洗禮下度過了最後的時間,重點是最後還是沒做出第一題 😂。

總結

考完後會跑一些測試,大概 10 分鐘內就得到結果了。第三題的效率不算分,因為難度較高所以不考慮效率。我當時的評分如下:

題目 Correctness 正確率 Performance 效率 總評分
1 66% 12% 35%
2 100% 100% 100%
3 100% N/A 100%

考前記得先看看考試用語言的語法喔!
話說第一題其實網路上刷題會遇到!

3 - Technical Interview 專業面試

內容

這是第一次與公司的工程師面試,一般來說會遇到 1-3 個工程師。大多數會問一些較為技術性的問題包括線上面對面編程。這一輪通常是透過視訊的方式來完成的,屬於倒數第二輪,並且稍微有一點難度。

準備

[13] 意外,一般同一個申請人不會在兩輪面試中遇到同一個面試官。

這一輪面試根據申請職位不同所需樣準備的內容不能。但我推薦做以下準備,首先是把先前的面試題目再了解一遍,把錯得題搞懂。我在幫別人面試時如果因為意外[13]再不同輪遇到同一個申請人,我通常會問他上次答錯的題目或把體目難度加深一格層次。我因為當過幾次面試官,所以認為有很大的機率會被拿答錯的題開刀,也基於第一題沒做出來心裡癢癢的,於是在上一輪面試一結束時就重新思考把第一題做出來了。心態上來說,如果一個工程師有問題時沒有想要思索答案的求知慾,那必然是一個容易被淘汰的要素。
在那之後可以閱讀一些 Design Pattern 和 System Design 的基本概念,另外準備一些問題來反問你的面試官讓他們對你留下更深的印象。

實際面試

我運氣挺好的,在這一輪只有一個資深工程師來面試我,印象中這輪面試為時一小時而已。果不其然,上來就被要求把第一題做出來。因為事前已經想通了,所以很快就做了出來。後面就是一些技術性的問題,根據自己知道的回答就好,當遇到不知道的就說不知道,不然若是說不清楚,會讓面試官以為自己在觀念上有錯誤等等。這輪面試還算順利,在最後我問了面試官許多問題,因為我大概能看出他的資歷只比我高上一些而已,所以在各種技術上涉略的並不是很廣。這時若時問面試官一些較為熟悉的領域的問題,就能展現出自己在個人領域上的專業性,畢竟對方並不是太了解全方面。我因為職位是位 SRE[6] ,所以問了他許多 DevOps 的問題,並且因為工作關係時常需要接觸到資訊安全的相關事項,所以也問了他 Tesla 資安方面的問題。重點是在輪到自己提問時要和面試官聊得來,畢竟技術和能力是一回事,但和人溝通和相處的能力在面試中佔的分數至少有三分之一。
而後和面試官的對話時他就已經不小心透露出決定了,因為他對我說在下一輪應該會是遇到雜七雜八的等等,所以我當下便知道了自記得面試結果。

3.5 - 和人事部主管談話

第三輪結束後,人事部主管約了我一小段時間談論了下一步的面試,並告知我下一輪會是最後一輪等等。這裡沒什麼需要特別注意的,只要問清楚下一論的流程等等的事情就好了,其他都是由對方給予自己信息。

4 - Onsite Interview 現場面試

內容

Onsite 面試正常是最後一輪面試了,正常面試官會是未來團隊里的成員。這一輪面試會在公司裡面,如果距離很遠時有些公司還會願意為你出機票錢讓你飛到那裡面試。這一輪面試時常大約 3-5 小時不等,並且會有多個面試官其中包含你未來的上司等等。面試內容非常廣,而且考驗的不只是技術性問題,還會考慮到申請者的溝通能力、是否有上進心、思考模式等等。

準備

這一輪面試可以準備的很多,同樣也是根據申請職位來決定到底要準備哪些東西的。 一般會被問到可以事先準備的問題包括:
簡單介紹簡歷上有提到的項目,並從設計到結構以及負責的部分等問題。
各準簡歷上提到的技術。
這裡稍微提一下,任何寫在簡歷上的技術都要確保自己有一定的技術水準,如果只有一點點經驗,但是認為提到會是加分的話,可以註明經驗並不多或是只是稍有接觸。因為這些東西在這一輪面試都有很大的機率會被針對性提問,如果回答的不情不楚或是讓人不滿,那會給面試官很糟糕的印象。
有些公司會事先給出面試當天的時間表,包括面試官的名稱。這時候可以事先在網路上查一查面試官的基本信息,事先熟悉一下他們的基本資料可以讓面試當時不會太緊張,容易找話題,好讓對方對你留下更深的印象。

實際面試

[14] Senior Staff Software Engineer,非常資深的工程師,最少是 12-15 年以上資歷的工程師。
[15] Recursion遞迴,在電腦科學中是指一種通過重複將問題分解為同類的子問題而解決問題的方法。
[16] Iteration 迭代,對計算機特定程序中需要反复執行的子程序*(一組指令),進行一次重複,即重複執行程序中的循環,直到滿足某條件為止。
[17] Dynamic programming 動態規劃,是一種在數學、管理科學、計算機科學、經濟學和生物信息學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

我的面試因為疫情關係所以是視訊面試,有 5 個面試官並為期 4 小時,一位面試官有 45 分鐘。面試官包括一位未來的上司,三位 Senior Staff Software Engineer[14] 是 12-15 年以上,和一位 Senior Software Engineer[1]。我從下午一點乖乖地坐著和他們面試到了下午五點,中途因為要一直講話一直喝水和跑廁所,剛開始想著平時都是我面試別人,很久沒被別人面試了所以很有新鮮感,不過到後面是真的挺累的。

首先是和上司的面試,從簡歷開始下手並沒有太多技術性的問題,主要在於了解我對工作的看法、工作習性、遇到問題如何解決等等。因為我有小創業的原因還被特別問到工作以及創業的時間分配及管理問題。

第二位開始就是和工程師面試的,大致上都是從簡歷下手的,問一些在你簡歷上看到面試官也有接觸過的技術性問題,然後問一些根據工作要求面試官事先準備好的技術性問題其中包括系統設計等等,最後在來考你算法和編程。這類的題目有各式各樣的,我被問到的題目有大概三種:

 第一種是面試官在他工作上遇到拿出來簡化過後的題目,這一類的我特別喜歡,因為是工作中會遇到問題,所以可以很好地體現出未來工作上都要設計些什麼樣的程式。這次面試我遇到一題這類的,從時間複雜度、能不能運行、以及事後改進都有被要求到。
 第二種是比較實用性的問題,這類問題屬於任何工作中都常見的問題,像是 File Operations 等等,這類問題多會被要求一些限制。舉個例子像是路徑遍歷的問題,但是路徑裡有數百萬資料時該如何設計,如何暫停並且從暫停處開始等等之類的問題。這類問題我被問了兩題,其中一題稍難,時間複雜度、內存使用量、如何分別用 Recursion[15] 和 Iteration[16] 解決、以及事後改進都有被要求到。另一題本身簡單但有許多陷阱,是要在開始前仔細思考的問題。
 第三種是偏向純演算法的問題,這類是我最不喜歡得種類,因為腦子一不小心打結就是萬劫不覆返。而且常會遇到一些 Recursion 或是 dynamic Programing[17] 的問題。我這類問題遇到了一個,並且在有限的 30 分鐘內並沒有寫出完全正確的答案,算是我這次面試中的唯一敗筆。

在做這類題目時我個人推薦告訴面試官你的邏輯和打算用什麼方法解決問題,這樣可以確保對方知道你想做什麼,畢竟解決問題的方法永遠不止一種,有些面試官會因為看不懂你在做什麼而難以給出評價。開始時可以多問一些題目的要求等等,以卻報自己寫出來的程式是符合面試官要求的。我也都會事先和面試官說要是我做錯了或走歪了請提早告訴我,這樣如果對題目的理解有偏差時可以快速得到反饋,並且要是腦子打結時不小心寫出一段怪怪的東西,面試官也會時不時的給予些許提示。

根據每個面試官的題目和要求,有些並不會期望對方在時間內完成,主要是考察申請者的思考模式和遇到問題的解決辦法。不過若是能題題都做出來,那肯定是大大加分,我這次的面試共遇到 4 題,其中作出了 3 題並且最後 1 題大致方向是對的。所以自己認為表現算是還不錯吧!面試完就有 90% 的感覺自己已經上了,也確實在面試完隔天就馬上收到錄取通知。

其中有一位面試官他是在 Tesla Model 3 的發表前特別從 Google 跳槽過來的,因為我在事前看他資料時有發現這點,於是就有計畫性的問他來 Tesla 多久了,然後把話題帶到「哇~那你不是趕上了發售日嗎!」。所以那一輪的面試至少有三分之二都被拿來聊天用了,被問到問題時也感覺對方放水很多,畢竟時間不夠了。就連編程的題目本來是需要運行的,不過因為聊了太久,所以對方看了看覺得邏輯對了就說應該對了。這算是我事前準備發揮到最大作用的地方吧!

總結

這裡不多分享我跳槽決定的標準,但如果有讀者想知道的話我可以另外寫一篇分想,因為實在太多考慮因素了。總題來說面試流程還滿快的,我在一個半月內就走完了大部分流程。難度以普通工程師面試來說應該算中等偏上一點點,但並沒有到不可攻克的地步,畢竟我太多準備硬著來也都過關了。

心情上來說我起初並不是為了想換工作而找工作的,而是因緣際會 下不小心就走到了這一步的。可以說是花一點時間去外面了解一下自己在市場上的價值,順便幫自己熱熱身以備之後有更好的機會,而且或許就真的找到了一份更適合自己的工作呢!

但說到底除了獲得經歷外,誰工作不是為錢呢?剩下的就是考驗小貓貓工程師還價的能力啦!

(更新:我最後拒絕了 Tesla 的 Offer。)