Google SWE 面試經驗 @Taiwan
Jasmine 學姐、Kelly、zswu 學長和馨儀學姐在面試期間給予我非常多的協助與建議,後來 team match 時也幫我做了許多 Google 相關的介紹與參考,幫我減輕不少壓力。真的十分感謝他們的幫忙!
Cover 取自這裡。
背景
交大資工大四,有一年的微軟 RD internship,在學校系所資訊中心擔任助教,擔任過校內程式競賽社社長,有演算法競賽和接案經驗,專題做網路相關的東西。應徵的職缺是 Google SWE New Grad 2022。
二年級的時候有投過 STEP intern,不過那年實習因為疫情取消了1。去年八月底時收到一位 Google recruiter 的來信邀請面試,我猜是因為投過實習的關係而留下了聯繫方式。但我對於收到這樣的來信感到十分驚訝,加上我並不認為自己有能力上 Google,於是便沒有後續行動。十二月初,我再次收到同一位 recruiter 的來信,當時研究所推甄結果已經塵埃落定,想說不如給自己一個機會,於是決定接受面試邀請。
我和 recruiter 有過一些簡單的交流。對方提到應徵的黃金時段已經過去(大約是九月到十月的時候),因此希望我盡快投出履歷,看能不能在年底前安排面試,不要因為課業的關係拖到寒假。我不知道這說的是真的還是假的。不過由於四年級的課業壓力很輕,我也不想把面試拖太久,便很爽快地答應了。
面試時程
- 十二月初,收到 recruiter 的來信。
- 十二月中,送出履歷,
- 十二月底,一面。
- 一月初,通知一面通過。
- 一月中,二面(五個面試)。
- 一月底,通知二面通過。
- 三月中,通知進行 team match。
- 三月底,team match 成功。
- 四月初,拿到口頭 offer。
- 四月中,簽約。
面試內容
Google 的面試有兩大面。一面是基本能力測驗,用於評估 candidate 是否有達到最基本的應徵門檻,我猜面試結果是 PASS/FAIL 的評分方式。
一面 pass 之後才有二面,分為五個子面試,其中四個考演算法相關的題目,另一個為 Googleyness & Leadership。據聞,二面的結果是由四個面試的綜合評估的,因此不會只因為其中一關烙賽就被刷掉;另外,還要通過第五個面試的 PASS/FAIL 評分。但我在網路上也有看到有人提到五個面試是一關接著一關進行的,要先過前一關才能進下一關;我自己的情況是五個面試全部安排在同一天,從早上連續面到傍晚,不存在中間會被刷掉的問題。
另外,Google 實習生轉正的流程跟素人 (?) 不太一樣,據說面試關卡比較少,流程也比較迅速23。
題目範圍
Google 面試的考題範圍沒有嚴格的規範,但大致落在以下範圍,不會說要你手刻 treap 或 dinic 啥鬼的。
- 技術:二分搜、BFS/DFS、DP、hash、tree/graph。
- 資料結構:基本的 linked list、stack、queue、heap;還有稍難的線段樹、BIT、trie。
- 字串題永不朽!
考題難度大多是 LeetCode medium,偶爾出現 hard。雖然以資料結構和演算法為主,但也有機會出現跟作業系統相關的題目。
進行方式
是因為疫情的關係,所有的面試都是在 Google Meet 上進行,過去的話好像是要親自到 Google 辦公室進行實體面試。面試期間好像不能使用紙筆(面試通知信裡面沒有說可以),當然也不能準備任何參考資料。面試時我的桌上只有筆電、滑鼠、和耳機 (mic)。
另外,面試時除了瀏覽器開著 Google Meet 以外,還有一個專為內部面試而設計的網站,稱為 Google Interview。這是一個線上協作的平台,多人可以同時在上面編輯文件,就像 Google Doc 一樣。你會在面試前事先得到 Google Meet 連結,但面試開始後才能進入。這樣子在線上進行面試的方式,稱之為 “Virtual Interview”。關於 virtual interview 的進行方式,Google 有一份官方文件可以參考。
面試的情境大概就是,interviewer 會拿出一題又一題的考題出來,你需要在 Google Interview 上寫下你的實作,並與 interviewer 分享你的思路。雖然說是考演算法,但面試方式絕絕對對不會是要你 #include <bits/stdc++.h>
,然後把你寫的 code 上傳某個 online judge 看有沒有 AC。Interviewer 不會過度糾結於你的 code 能不能 compile 成功或有沒有忘記 include header 什麼的;重點是放在你能否應用好的方法去解決題目。
另外,Google Interview 沒有內建 highlighting 或 intellisense 的功能,所以不會有提示 function 名稱或 syntax checking 的功能,candidate 應該事先熟練各種函數的用法。儘管這不是面試評分的重點,但如果對於語言的使用方式表現得太過生疏,還是會影響面試結果的。
理想的情境大概是以下這樣,這同樣適用於 Google 以外的面試。
- Interviewer 把題目內容貼在 Google Interview 上。
- 對於題目沒有明確規範的地方,你應該要先向 interviewer 加以確認,而不是直接動筆。例如,如果 interviewer 給你一個數字陣列,你應該先跟他確認一下數值的範圍,以及是不是整數等等,不要擅自假定那是 32-bit int array。
- 向 interviewer 解釋你預期的解題方式。如果 interviewer 感到滿意,你才開始動筆。
- 動筆解題時,不要保持沉默,盡可能邊寫邊解釋給 interviewer 聽。Interviewer 通常會靜靜地聽你講解,偶爾提出一些疑問或指出你寫出 bug。一般來講,這個步驟不會出大問題或整個偏離,因為你的想法已經事先經過 interviewer 認可了。
- 解題結束,interviewer 可能會對你的解法進行提問。典型的問題是要你分析時間與空間複雜度。
- 進入下一題,回到步驟 1.。
這邊講一下,如果 interviewer 沒有給你任何 pre-filled code,也不代表你要去寫一個含有 main
函數的 executable program 出來。通常你要寫的就是題目要求的 API 包成 function 而已,像 LeetCode 那樣。
各次面試經驗
面試準備
因為本身是演算法選手的關係,就沒有特別去刷 LeetCode;私以為面試前才刷 LeetCode 並沒有太大的幫助。我認為對於應屆畢業生而言,應該做好的就是在大學三、四年的生涯中把履歷刷好刷滿,一點一滴培養自己的技能,剩下的交給 HR 與運氣即可。事實上,我唯一的準備是在第一次面試前一小時很心虛地寫了一道 LeetCode medium 的題目,見我的 LeetCode submissions;其他則是在英文口說方面做了些微練習。
值得一提的是,candidate 可以事先練習邊寫邊講解的情境,因為這種事情通常不會發生在日常生活中,在面試現場卻很有幫助。
投出履歷之後不久便收到 recruiter 邀請一面的消息,信件裡附有一些參考資料,像是考題大概會落在哪些範圍、有哪些資料可以預先閱讀等等,讓 candidate 可以預先準備。有提到說可以去看看 Geeksforgeeks 或刷 LeetCode,私以為這幫助有限。
另外,你需要跟 recruiter 講你擅長的程式語言是什麼,到時候 interviewer 會預期你用這個語言解題。可以選擇的語言包含 C、C++、Python、JavaScript 等,有沒有 Go 跟 Java 忘了。談到選擇語言的部分,我認為選擇一個自己最熟悉(不是最喜歡)的語言就好,C++、Python、Java 或 JavaScript 都是可行的選擇,沒有優劣之分;面試現場並沒有 ICPC 演算法競賽那種單一語言稱霸天下的現象。
一面
Recruiter 通知面試將考兩題跟資料結構與演算法有關的題目,各 20 分鐘,共 45 分鐘。面試開始時,interviewer 詢問偏好中文還是英文,我選擇以中文進行。Interviewer 是一位年輕女性,在台灣擔任某部門主管。
一個簡短的自我介紹之後,馬上進入解題環節。當我發現第一題時限 (+25 min) 快到時,心裡很想趕快把題目結束掉,但 interviewer 並不以為意,持續對細節進行追問與延伸,結果整整 45 分鐘只有一題。這題是跟樹有關的資料結構,難度大約是 LeetCode medium 再低一點。我猜只考一題應該是 interviewer 本來就計畫好的,因為 interviewer 對我的回饋並不差,不太像是因為寫爛所以把我擋著。
第一次面試結束後數日,收到 recruiter 邀請第二次面試的消息。經過討論後決定把五場子面試排在同一天,從早上連續進行到傍晚。各 interviewers 似乎知道 candidate 各場面試的時程,因為有幾次面試開始或結束時,interviewer 會對我說「辛苦了,你等等還有面試。」或「你剛剛的面試感覺如何?」這樣的話。
二面之一
Interviewer 是一位中年女性,應該是台灣人。一開始用中文面試,面到一半的時候 interviewer 發現要是英文才對,於是立即切成英文。面試共 45 分鐘,考題跟搜索有關,難度約 LeetCode easy。
Interviewer 聽不懂我的解法,而且不太滿意的樣子。面試結束後我發現自己嚴重高估題目的難度,用了很複雜的方法去解一道很簡單的題目,因此很可能我的回答超出 interviewer 的準備之外了,所以她聽懂。第一場面試拿到一個不滿意的結果,心理蠻沮喪的,幸好後面的面試有把狀態抓回來。
二面之二
Interviewer 是一位中年男性,台灣人。面試以中文進行,共 45 分鐘。這次不是考資料結構,而是一種我不知道該用什麼字眼描述的東東,姑且稱之為某種排序吧。難度約 LeetCode easy。
面試接近尾聲時發生網路斷線的情況,而我自己沒有發現,自顧自地繼續解釋我的解題思路,以為 interviewer 正在聽。直到對方打電話過來我才意識到出大事了。好險這不太影響面試結果,interviewer 的回饋不錯。
二面之三
Interviewer 是一位中年男性,台灣人。跟第一次面試一樣,面到一半的時候發現要改成英文才對,我猜上層給 interviewer 的信件裡面沒有特別用螢光筆強調要用什麼語言進行面試,因此 interviewer 們沒有注意到。考演算法與一些作業系統相關的問題,共 45 分鐘,難度約 LeetCode medium。
二面之四
Interviewer 是一位年輕男性,台灣人。面試以中文進行,共 45 分鐘。面試題目為資料結構與演算法,難度約 LeetCode hard,是所有面試以來最高。除了需要熟練實作某些資料結構外,還要有一定的學理知識,去證明某些操作的所需最低時間複雜度。雖然我沒有解出所有的題目,但 interviewer 給我不錯的評價。
二面之五
Interviewer 是一位中年男性,台灣人。Googleyness & Leadership,中文進行,共 45 分鐘。
大致上就是 interviewer 會出一些情境題給你,然後詢問你會如何應對,例如當與同事間發生衝突或 project 進度不如預期等等。個人認為保守謹慎的回答即可,不要去做一些自以為有創意但實際上有風險的回應。
Team Match
一月底,收到 recruiter 二面通過的通知,實在是非常高興。Recruiter 表示因為 applicants 不足的關係,要等到更多人通過面試後才會做 batch team match,因此時程會推遲到三月。
Team match 的目的是要尋找適合你未來加入的團隊。不僅是你要找、挑團隊加入,團隊主管也在挑、找人,因此這算是一個互相面試的過程。與其說是面試,不如說是談話會好一些。HR 會安排你與團隊主管 30 分鐘的談話,稱為 “Fit Talk”,然後在這短暫的時間當中試著去了解彼此,看看這個團隊是不是你有興趣的。Team Match 不是一個正式的流程,流程不一定由 HR 主導,雙方也不一定由 HR 作媒介。如果你有認識的團隊主管,也可以主動以其他管道聯繫他;反之你也有可能主動收到某些團隊主管的來信。重點就是,找到一個你喜歡、對方也願意收你的團隊即可。
三月中,收到 HR 表示 team match 即將開始的消息,並且有五個 team 對我感興趣。聽實習生朋友說這樣的數字是算高的。三月底,很順利地找到了 match 的團隊,並且通過 hiring committee 的審查。
是說我以為 team match 都是以中文進行,畢竟雙方都是台灣人嘛。結果第一次 team match 團隊主管一開口便是一連串極其華麗優雅的英文,那場 fit talk 簡直是一場悲劇。幸好後來的四場 talk 沒有發生這樣的事情。
回顧
由於主要是考演算法的關係,不太需要特別的準備,因此即使沒有特別用心,也是很僥倖的拿到 offer 了。經過這一戰,我對自己的信心增加了不少,也很幸運自己沒有一而再再而三被動地讓這麼好的機會溜走。Jasmine 學姐幫我了非常多的忙,如果沒有她的協助,想必面試過程一定會備感壓力。
Google 的面試內容以資料結構與演算法為大宗,跟我面過的其他公司比起來這是比較少見的事情,似乎也給了演算法偏門的求職者比較高的機會。可能因為我應徵的是 SWE,跟演算法是比較有關的;但即使我應徵 Foodpanda 的 Backend 或 Amazon Ring 的 SWE,他們的考題也涵蓋了演算法以外各層面的技術內容。
四月初,拿到口頭 offer。談完薪水之後就簽約了,預計畢業後 on board。Google 的求職過程至此告一段落。