一篇讀懂七種常見的矽谷 軟體工程師面試 7 Types of Onsite Interview

Last updated on February 5, 2023

加入臉書粉絲團或分享給朋友吧~

這篇來總結七種常見的 軟體工程師面試 Onsite Interview 。對於每一種,我會講講它在考什麼範例題目、以及常見的面試官考核點。其實這七種之中,只有兩種會讓你寫程式噢!而且有一種甚至不考知識而是人品噢!所以請務必瞭解這幾類考試,並針對每種做好準備!只要撐過 Onsite Interview 的疲勞轟炸,接下來就只能等結果了。因此請好好把握這最後一個能展示你能力的機會,讓公司願意高價💰把你請回家

系列的相關文章:

軟體工程師面試 :現場面試 Onsite Interview

Onsite Interview 就是要去公司的當面見見大家👋啦,也讓面試官能夠當面問你問題,用白板來互動。你也可以藉這個機會順便了解一下對方,畢竟面試是雙向🔄的:『公司在面試你,你同時也在面試他們。』

一般會有四或五輪的面試,每輪一小時左右。常見的是你早上九點或十點抵達,面到下午三四點結束。所以基本上你那天就不能做其他事了。這對學生還好不過是翹課而已,但如果有工作的話就要找理由跟公司請假,請發揮你的創意😈!

正常來說你幾乎什麼都不用帶,只要帶著證件(E.g., 駕照,護照)就好,其他東西公司都會提供。我也曾遇過公司允許我帶自己的電腦來進行寫程式的面試,因為有些人習慣自己的電腦。但因為我懶得背電腦去面試,所以還是拿他們的來用。

現在由於疫情的緣故,幾乎所有矽谷公司都暫時把現場面試取消,改成線上電話面試了。不過現場面試還是非常重要的,因此我相信等到疫情好轉,大部分的公司還是會回歸到這個方式來做最後的審核。

軟體工程師面試:Run!
image src

一、實作輪:資料結構與演算法 📚

這大概是最常見也廣為人知的一種了,就是考驗你的程式思考與實作能力。在整個 Onsite Interview 之中,通常至少會有兩輪是這種,如果你是畢業生的話四輪或五輪都考這個也不意外,所以大部分網路上資源都會強調如何重點準備這類。

面試官會給你一個題目,你要能夠在短時間內想到解法,並且能正確地實作出來。這些題目是跟演算法與資料結構相關的,合理的問題在設計上會讓你能在一輪面試的時間內可以實作出來。

其實面試官會準備不只一個問題,如果你回答很快,就可能會被要求多解幾題。而有些公司的標準可能就是希望你解出超過一題的,所以要注意自己的速度。不過我在面試臉書時(《Facebook 總部面試心得分享與免費冰淇淋》),也曾遇到過只準備一題的面試官,所以解完後就都在聊履歷。

例題:給你一個二元樹,請用 Preorder Traversal 的方式把它轉換成一個陣列。

常見的流程

  1. 面試官給你題目
  2. 你在白板上寫下思路並且跟面試官討論
  3. 等到兩邊都同意後再開始寫程式碼
  4. 面試官檢查做法正確性,上機的話就是跑測資

程式碼可能是寫白板或是給你電腦上機寫。無論是哪一個都有各自的難點,白板的標準會偏低但寫下後就難以修改(以及字不能太醜😢),上機的話對語法要求比較高而且常常會搭配自動測試,所以請兩種都要練習。

面試官想考核什麼?

最好的情況當然是很快就在極少的提示下給出最佳解啦,但如果沒有也不用太難過。除了少數比較極端的公司外,大部分的公司不會希望你一下子就噴出最好的答案(除非是熱身題)。

在正常的情況下,面試官只要能看到面試者有系統的循序漸進來解決問題,那就是個很好的訊號了。畢竟大部分的人不是完美的,見到問題後本來就是在摸索中找尋解法

反之,如果是對一道很難的題目突然就跳到最佳解,其實反而會引起面試官的疑心懷疑你曾經寫過這題目。除非你接下來的表現都能一直保持那麼的好,面對很多難題都能有一樣水準的回答,否則就要小心點。(見《Airbnb 糟糕面試經驗》)

上面是指想出解法的部分,而實作上還是會鼓勵盡量能寫出沒 bug 的 code。即使不小心寫出 bug ,最好還是能夠在面試官指出前自己找出來並解掉,才不會被偷偷扣分。我面試人的時候,只要是你自己發現的錯誤,我是不會扣分的~

有些公司會希望你能解出超過一個題目的,因此如果你今天面的是這類型的公司,一定要把握好自己的時間分配,別在無謂的地方耗費太多時間。

想開始寫 Leetcode 題目的話,可以用我設計的表格來追蹤自己的進度:《記性差的人如何有效率地用 LeetCode 刷題?我跳槽用的筆記模板分享以及圖文教學

algorithm makes you cry
image src

二、實作輪:程式除錯 Debug 🐞

這類型的面試非常貼近軟體工程師的日常生活:Debug。跟上一種有點類似,都是要你寫程式。但不一樣的地方在於,它給你一個已經存在的程式,但它有一些問題 bug 卻不知道是為什麼導致的。而你的任務就是要找出問題的根源,並且修好它

這個程式或許是個簡單的 REST API、或許是資料庫相關、或許是緩存(Cache)的問題、或是某個知名的演算法。可以看到,它已經牽扯到一些在實際工作上很常用的工具,而不僅僅只是資料結構或演算法了。因此,這輪非常吃重你實際寫程式的經驗

例題:有一個從資料庫讀資料的 API,不知為何它回傳的資料有時是舊的有時是新的,已知它有使用緩存,請找出問題的根源並解決它。

常見的流程

  1. 面試官給你程式碼與問題敘述
  2. 你從面試官口中套出各種關於這個 bug 的情報
  3. 你開始在電腦上 debug,公司可能會允許你印出一點資料或是 Google
  4. 面試官檢查做法正確性,或是看測試能否通過

面試官想考核什麼?

面試官在這輪主要觀察的是你如何迅速上手從未見過的程式碼、以及如果搜集各種資料來 Debug。注意,這些資料不只是來自於閱讀程式碼,也可以來自於面試官的嘴巴,或者你實際讓程式跑跑看來印出一些有用的資料。

毫無疑問,如果能夠馬上找到 bug 就修好是最完美的。但即使找不到也不用太難過,因為你在除錯的過程中用到的各種技巧通通都會被面試官看在眼裡。如果你的思考方式是有邏輯、有系統且有效率的,那就會大幅的加分。

另一方面是對編程工具的熟悉程度,面試官會允許你用一些常見的 IDE (Integrated development environment)來做這輪。如果你能在這過程中展現出對這些工具的熟練程度,那也是一種加分,尤其是對需要即戰力的公司而言。我曾經在這輪就用了不少 Sublime Text 裡面的快捷鍵,讓面試官事後評分時給了不錯的評價。

軟體工程師面試 When a programer is debugging

上面這兩類是會讓你真的寫程式碼的,而下面這些就是考你的相關知識,頂多畫畫架構圖之類的,不太需要完整地寫出一份程式

三、系統設計輪

這輪考驗你對現在業界常見的大型軟體的相關知識,看你是否知道如何設計系統並利用相關工具,來讓系統能夠達到其需要的目標。如果是很知名的演算法(E.g., Consistent Hashing),在這輪也可能會被拿出來問。

最典型的設計目標就是增加系統承載要求的能力,如果今天你的網頁在一分鐘內被一百人造訪會不會壞掉?一萬人呢?一百萬人呢?不同程度的人潮會需要很不同的設計來讓系統不掛掉

當然設計目標是根據各種情況變化的,像是設計一個通訊軟體與設計一個影音串流平台所在乎的東西可能就差很多,優化的對象也不同。

各種設計都會有所取捨 Tradeoff,畢竟大部分的情況是不存在銀色子彈的。而你的任務就是要跟面試官弄清楚問題的定義什麼是重要的、什麼事可以拋棄的,再基於這些回答來提出你的設計。

例題:請設計一個縮網址服務(URL Shortening service),並說明當 QPS (Query Per Second) 為 X 時,需要多大的機器與資料庫。

面試官想考核什麼?

除了大量的相關知識外,這輪最最最重要的就是溝通了。很多時候面試官會(故意)拋給你一個很開放的問題希望你來問他更多隱藏的系統需求,才知道到底要設計什麼。如果不問的話,你可能就會設計出一個貌似能動但不符合商業目標的系統。因此大膽地多開口問問題吧

在解題的時候會大量用到白板來畫圖,來描述在系統內每個點之間的關聯性為何。因此利用白板來講解系統的表達能力也很重要,請多練習。

我在 Facebook 面試時就曾經被問到過具體要多少 GB 的硬碟才能裝下某些 QPS 的資料,因此這方面的計算也記得複習一下!

推薦閱讀:

Latency Numbers Every Programmer Should Know

軟體工程師面試 which idiot designed this system
image src

四、產品設計輪

隨著資歷的增加,軟體工程師對產品的敏感度也很重要,畢竟即使技術再強,還是要做出點什麼東西來為公司賺錢錢的。這輪就是模擬公司想要開發一個新產品的情境,如果你是技術首席,會如何設計這個產品與其系統。

其實跟系統設計輪很像,但是除了系統之外,會更著重在於產品相關的問題,因此可以問的東西又更多了。

就拿設計一個 Netflix 來舉例吧!如果是在系統設計輪,可能就會著重在於如何同時讓上億人觀看各種影片而系統不掛掉。但如果是在產品設計輪,就會要考慮開怎樣的 API 讓前端跟後端接起來、怎樣的系統適合產品初期人少時、而當流量變大後如何拓展等。

例題:請設計一個類似 Netflix 的產品,並且說明如何設計後端以支援網頁行動用戶

面試官想考核什麼?

跟系統設計輪類似,在專業知識以外,面試官主要看的還是你的溝通能力,看你如何一步一步去解決一個定義不是很清楚的問題,並且把大問題拆解成能夠讓團隊去分工解決的小問題

其實啦,這輪可以問的東西是無止盡的,如果你能全部回答完美的話也可以去開公司了,幹嘛還來面試?所以只要你的專業知識有夠、溝通能力不差、講的系統不要太離譜,應該分數都不會太低。

推薦閱讀:

A Beginner’s Guide To Scaling To 11 Million+ Users On Amazon’s AWS

軟體工程師面試 front end and back end
image src

五、專業知識輪:以機器學習為例

跟上面大家都會常遇到的那些面試不一樣,這輪很大一部分取決於你的履歷上放了什麼東西。如果你號稱有某個領域的深度知識(E.g., 後端,前端,資訊安全,資料庫,C++等),則這輪就會從公司找個專家來考驗你對該領域的能力到底有多深

比方說,我在履歷放了不少機器學習(ML, Machine Learning)跟自然語言處理(NLP, Natural Language Processing)的經驗,所以公司就會找個有類似背景的人來問我這相關的問題,來確保我不是放好玩的。

而問題的範圍非常廣泛:可以是曾經做過的專案使用過的工具、最近看過哪些相關論文、或是直接講一個自己最熟悉的 ML 模型等。根據你的回答,面試官可能會進一步的追問,來看你到底暸解有多深。我在 FacebookLinkedinQuora 面試時都有專門的整整一輪來問這相關的問題。

ML 的例題:什麼是 Overfitting?如何偵測它以及解決它?

面試官想考核什麼?

既然你都放在履歷上了,基本上就是人家問什麼你就要能回答什麼。畢竟很多應該都是你曾經接觸過的東西,或是該領域公認的基本常識。能回答越多就代表你對這領域越熟悉,越加分~

但如果真的遇到沒聽過或沒用過的,就誠實回答不知道或不熟就好,不用逞強,否則人家再追問兩下然後被問掛的話,你之前回答的可信度或許就會降低。我在那些面試時大部分被問到最後就是說『只聽過那個工具,但是沒用過。』,或是『從來沒聽過耶~』。而面試官也只是說懂了然後換一個問題,無傷大雅~

軟體工程師面試 Deep Learning
image src

六、過往經驗輪

跟上面那輪一樣,這輪也是根據你履歷上的資料來問問題,以確保你履歷上的東西是真的,不是拿組員的光來沾。

面試官通常就是把你的履歷看過一輪,然後挑那些他們有興趣的、或是跟公司產品相關的東西來問。如果這個項目是你有參與實作的話,就可能會問到很深的實作細節,所以記得要複習一下當初怎麼做出來的。

例題:你在履歷上提過的XXX專案是什麼?你負責做哪個部分?具體是怎麼分工以及實作的?

面試官想考核什麼?

主要看的就是你是否能流利地講出自己曾做過的東西為何當初會這麼做而不是那麼做,依此來判斷你做事的風格為何。如果你曾經做過跟該團隊很相關的東西,那就會是很大的加分

像我在面試 LinkedIn 時就遇到過一個面試官發現我做的東西跟他們組正要做的很接近,面試官就聊到差點忘記問他原本準備的其他問題,並直接開始幫他們組打廣告。(見《LinkedIn 總部軟體工程師面試 心得與美食聖地巡禮》)在面試結束的當場也給我好評,希望我之後選他的組。

軟體工程師面試 Resume before and after

七、行為面試輪

與上面那些跟技術相關的面試不同,這輪不考專業知識,而是看你做人的風格,也就是看你人品好不好啦!有些公司會把這個混雜在每一輪的面試的前十五分鐘,而有些公司會單獨把它放出來成獨立的一輪,像是 Airbnb 的 Core Value Interview

通常會問那些在待人接物上的問題,以此來判斷你是不是個好相處的人,也就是 EQ 是否正常,是否能夠融入該公司的文化。

例題:你如何跟處理與同事或主管之間的衝突?你做過最驕傲的事為何?

面試官想考核什麼?

其實這類問題大部分都沒有標準答案當然你也不能說有衝突就揍他),所以只要你的回答不要太離譜都還好。

重點是讓對方覺得你是可以共事的人不要讓人覺得自己很渣渣。畢竟即使你技術很強,還是沒有人想與人品差的人共事。

簡單來說,你可以想像假如立場反過來,你的組員做出你的回答中的那種舉動,你是否願意當他同事?如果不是的話,那你可能要反省一下,看怎樣才是好回答。

軟體工程師面試  Animal job interview
https://commons.wikimedia.org/wiki/File:Animal_job_interview.jpg

軟體工程師面試 中場休息:午餐時間

就像在《矽谷軟體工程師面試都在做什麼:我以為我是來面試的?給面試者的各種福利》提到過的,公司會提供午餐,並且請人來陪你吃,所以你只要專心在面試上就好~

通常人資會找人陪你吃飯、或是問你有沒有想哪個跟在該公司的朋友吃、或甚至是人資親自陪你吃。如果是小公司可能就一群公司團隊陪你吃飯,很溫馨~

結語

看到這邊大概也累了,辛苦啦!我其實只列了最常見的七種軟體工程師面試,有些比較特別的我就沒放在上面。希望大家看完後有所收穫,如果有遇過有趣的面試種類也歡迎在下面留言分享噢~

你覺得呢?來留言一起討論吧!

加入臉書粉絲團或分享給朋友吧~