面試Google四年終於拿到offer之感想總結

Tobby Kuo
17 min readJan 1, 2023

--

不知道寫這種文章需不需要人權圖(?)

在斷斷續續的努力了四年後,今年終於拿到 Google SWE L4 的 Offer,有種跨過一個里程碑的感覺。還記得多少個因為準備面試緊張睡不著覺的晚上,只能滑著手機看各種前輩們的面試心得(感覺 2019 年我是真的把所有網路上能找到的中英文 Google 面試資源都讀了一遍,每天花三小時翻面試心得),所以當時也決定要是有一天我也順利過了面試,也要把經驗分享出來,算是一種還願。

這篇文不會紀錄任何我遇到的題目(所以如果是來找題目的話可以停在這了),我會簡單紀錄下我四次面試經驗的過程跟心得,然後再來總結下這些年來準備面試的心得跟感想。

個人背景的話,比較值得提的應該是我是非本科系的學生(土木工程),在校期間全都是自己做 side projects,沒有在學校上過任何本科系開設的課程。目前在微軟當軟體工程師(偷引流一下我的另一篇文 Microsoft微軟工程師三年 — 雜想)。

面試經驗

2019

應徵組&Level:General Campus Hire(L3), Google Taiwan

Leetcode 題數:~300(印象是 ~20 hard,剩下 easy、medium 各半)

準備時間:三個月,但因為還是學生所以幾乎一天八小時

面試過程:HR screen -> Phone screen -> Rejected

結果:Rejected

小結:

Phone screen 遇到兩題 medium 左右的題目,自己也沒有發揮好,但其中有一題不是常見的題型,一直跟面試官對不太上頻率。面試官讓我做一個數學證明,當下就感覺自己答的不是他想聽的,但是也不知道他想聽什麼XD 當年覺得自己運氣很不好(還有嘗試跟 recruiter 上訴但失敗),後來想想其實那時候準備的也不是很充分,要是到了 onsite 遇到 hard 題加時間壓力大概也是不行。

2020

應徵組&Level:General Campus Hire(L3), Google Taiwan

Leetcode 題數:~400(分佈應該跟 2019 差不多)

準備時間: 一個月,主要是感覺還沒開始就結束了。

面試過程:HR screen -> Phone screen -> No headcount

結果:Stopped after phone screen

小結:

這年有順利過 phone screen,不過後來疫情跟 hiring freeze 就開始了,recruiter 跟我聊的最後一通電話說是要去幫我問還有沒有組在招人,然後就沒有然後了。

2021

應徵組&Level:Pixel(L4), Google Taiwan

Leetcode 題數:~600(hard 刷到 50 題,剩下多的一百多題 medium 佔大部分)

準備時間:三個月,開始面試後才開始,面試了好久邊上班邊刷題好累。

面試過程:HR screen -> Phone screen(L3) -> Phone screen(L4)-> Onsite(4 rounds coding + 1 round googleyness)-> Team match (failed) -> HC -> Rejected

結果:Rejected

小結:

這年比較特別是一開始是 Target L3,想說自己也工作兩年了應該可以試試 L4,跟 recruiter 反映後多加了一輪 L4 難度的 Phone screen,之後就順利 Target L4 了。滿推薦大家這麼做的,Target L4 的話面不好還有被降成 L3 的可能,雙倍機會(?)

總體來說這年 onsite 遇到的題目不是很難,沒有遇到 hard,甚至有 easy 或是 leetcode 原題。不過因為題目不難所以感覺標準被拉得很高,自評這年很多題目的熟練度都不夠(解太慢或是有小 bug),最後拿到一個低空過關的評價。

Google Taiwan 有個流程是成績比較普通的話,可以先 Team match 再送 HC (Hiring Committee),如果有組比較想招你的話他們會幫你寫 Support Letter,可以增加一點過 HC 的機會。但我大概是成績太差了,努力找了一個多月只聊了一個組,後來也沒有拿到推薦。還是請 recruiter 幫我搜集資料送了 HC(就是想試一下,想說成本就是失敗的話冷凍一年也還好,感覺這年一直麻煩 recruiter 幫忙),大概一週就被拒絕了。

2022

應徵組&Level:Google Cloud(L4), Google Taiwan

Leetcode 題數:~650(題數沒有多,但今年改變刷題策略,後面分享)

準備時間:三個月,一樣邊上班邊刷題好累。不過中間有跨一個長假。

面試過程:HR screen -> Phone screen -> Phone screen -> Onsite(3 rounds coding + 1 round googleyness) -> HC -> Team match -> Offer

結果:Offer(finally!)

小結:

今年遇到很給力的 recruiter,從頭到尾給了非常多的幫助,不管是流程方面還是面試準備、還有最後協調薪資的部分。一開始是我的一年冷凍期還沒過,但不知道為啥被聯繫了並且說可以開始面試。開始面試的時候我也有點懶,問了能不能用去年的結果跳過 phone screen,結果 recruiter 很堅持說與其用去年低空的結果不如整個從來。結果還是因為第一場 phone screen 表現普通 recruiter 又幫我申請了第二場,不太確定但好像這樣就可以不看第一場的成績。

今年也剛好跨到 4/1 開始新的招募流程,所以 Onsite 少了一關變成三輪 coding,並且 L4 的第三輪可以選擇要考 System Design 還是繼續資結演算法(不過新流程好像更偏組招,所以不確定是不是大家都這樣)。本來想說 System Design 很新奇沒考過就想選,但 recruiter 也是強烈建議我繼續選 DSA,說 L4 不太考量系統設計的成績,這樣等於白白送掉一個表現好的機會。

和 2021 不同的是,這次每輪都遇到一題以上的 hard(是的,有傳說中的 45 分鐘兩題 hard),不過這年總體來說就是我狀況最好的一年,面試當下還以為他們都是 medium(汗)。最後成績好像也是不錯,順利送了 HC 並通過後就 Team match,申請跟三個組聊他們也都願意跟我聊(當下真的很感慨果然去年成績不夠好說什麼都無力回天),然後就是 Offer 了。滿不錯沒有被 down level,拿到 Offer 的當下工作年資兩年多所以也覺得很滿意。

準備面試

刷題的幾個階段

在刷題的過程中,確實有感受過幾個比較明顯的階段,雖然大家的經驗一定不相同,但是我也想分享我的。

一開始的階段是最痛苦的,其實我都差點忘了這階段了,但有時在聽一些 podcast 的 Q&A 的時候這段回憶會被喚醒。第一階段應該是連怎麼「刷題」都不太會,跟 leetcode 的介面不太熟、就算上過學校資結演算法也沒碰過這種類型的題目、連第一題 two sum 都解不太出來(還記得第一次看 two sum 討論區的震撼)…。第一階段對我來說尤其痛苦,因為我沒有上過學校課程,所以一直不太知道自己的程度在哪,每題都解不出來對我來說打擊確實是非常大的,看著這些寫不出來的 easy 題根本沒法想像能寫出 medium 甚至是 hard 的一天。

這階段我事後覺得就是能做的事很有限,所以也不用想太多,有時間就多寫 easy 題多看討論區,抓到感覺後慢慢就能寫出 easy 了(我相信對大家來說是這樣子的!很多 easy 都是一個 for 迴圈能解決的)。另一個建議是,後來看我朋友刷題,覺得一件非常非常有幫助的事是找到一個有經驗的朋友或者找到一個同樣沒經驗的戰友,每週一起約個兩天寫題目,互相分享各自的發現跟學習,很快就能突破這階段了。

第二階段應該就是 easy 差不多了,開始慢慢碰 medium 的階段。我自己的感覺是,easy 題真的是設計來讓你習慣刷題這件事的(包括怎麼讀懂題目、處理輸入輸出、debug 測資等等),從 medium 開始才會加入各種演算法跟資料結構,比如說 graph、DFS/BFS、Dynamic Programming、Tree、Binary Search…。所以這個階段對我來說有兩個難處,一是考驗你過去對這些資結演算法的認識程度,二是考驗你應用這些資結演算法的能力。

Easy 跟 Medium 階段其實我都是鼓勵多看討論區的,很多時候多花兩小時沒辦法讓你把題目解出來,但這兩小時累積的壓力跟挫敗感非常巨大。重點是看討論區的時候不能囫圇吞棗,很多時候以為自己會的,隔一段時間回來還是解不出來,這種感覺也很難受。看討論區答案的話,我對自己的要求就是在不看討論區的情況下自己把那個解答寫出來。

如果在這階段發現自己對某個資結演算法不熟悉的話,我建議就是直接花兩天回去打掉重練,我很推薦 Coursera 上面 Princeton University 的 Algorithm 課程,也很推薦每個碰到的資結演算法都自己實作幾遍。這階段我感覺就是不能急,基礎不穩的話後面也很難進階的。

第三階段我覺得並不是直上 hard 題,而是把 easy + medium 這個範圍內練得盡量熟練。對於多數人來說我覺得 hard 題是完全沒必要的,除非明確要挑戰 Google,不然台灣大多數的公司包含 Microsoft, Amazon 都不是很常考 hard 題,並且,能在 40 分鐘內解出 hard 題的人是相對很少的,有些公司就算考了 hard 題也沒給出符合這種程度候選人的薪資水平,遇到就笑笑就好XD

能解出 medium 題跟能順暢解出 medium 題是有很大的區別的,也需要很大的努力才能成為後者。試想,如果面試難度訂在 medium,你沒辦法用解 hard 題來證明自己,那就只能靠熟練度了。面試官比起一個磕磕碰碰才解出題目的人,當然更偏好一個看到題就秒,不只解出題目還提出三種解法的人。所以我認為與其花時間跟 hard 題硬碰硬,不如投資時間去把自己的面試表現提升上來。

這階段比較常見的誤區我覺得是拼題數,當然講是很簡單,大家都知道不能一直無意義的堆題數,但真的很輕易地會被那種解題的爽感帶偏,一週寫了五十一百題但其實沒學到什麼。大家這階段應該都養成屬於自己的習慣了,所以我就不特別說應該怎麼做(我自己是經典題派,就是大多時候刷題號小於 500 的題目)。但我覺得兩個指標就是:有沒有感覺不適、還有能不能說出自己今天學了啥。如果一直寫自己舒適圈內的題目,那進步就會相對慢,我是覺得大概都要把自己維持在那種有些題一小時內是想不出來的感覺。而且很多時候我們會一直使用自己慣用的招數,但其實在討論區裡有很多更好的解法更好的招,所以這階段開始應該 coding 時間會慢慢減少,而花在思考跟看討論區的時間要相對增加。

這階段開始我也滿推薦去參加 leetcode 每週日的周賽的,周賽的結構大概是 1 easy + 2 medium + 1 hard 或是 1 easy + 1 medium + 2 hard,在這階段我覺得目標可以設在穩定三題。打比賽的那種全新題目 + 時間壓力我覺得是對於面試來說很好的經驗。更好的還是找個戰友,偶爾互相競爭一下賽後也可以互相討論。

最後一個階段就是開始挑戰 hard 題啦。當然我相信在第三階段大部分的人也會嘗試並偶爾可以解出 hard 題,但大概自己也知道如果是 hard 題在面試中還是多半不行的,所以這階段就是想辦法習慣 hard 題。如果說 medium 題是在熟練資結演算法的話,那 hard 題才是真正應用題的開始。在 hard 題裡你會看到更長或是更迂迴的題目敘述、或是多個資結演算法的組合拳、也有一些比較冷門的演算法。我自己大致把 hard 題分成經典跟非經典題,經典題還是講求熟練,很多 hard 題也是經典題的變形,非經典題部分我就不強求,先想辦法用非最優解寫出來再慢慢優化,遇到一題學一題。

在這階段其實我還是 medium、hard 一比一的比例刷,就算面試 Google 也不是真的題題 hard,撇除那些打比賽或是刷 codeforces 的選手本來就能秒 hard,剩下大家程度應該差不多(?)就是花時間啦,多會一題是一題。

刷題的小撇步

雖然總體來說我認為刷題就是付出程度(不只是時間,還包含思考)跟回報滿正相關的一種活動,但我還是有些自己偷吃步的小技巧。

1.題目描述判斷複雜度:

刷題多一點以後,慢慢開始可以根據題目描述或是面試官的各種暗示(?)來判斷複雜度。比如說有些題目一定得做遍歷才能拿到答案,那你就可以先排除 Binary Search 的方向了。或是題目能不能用動態規劃解通常也是比較明顯的(當然要真的寫出來有時候很難),早點確定方向就可以花更長時間想動態規劃本身要怎麼寫。這個小撇步主要還是靠經驗的累積。

2.測資大小判斷複雜度:

這個就是 leetcode 專用的,經驗上來說大概操作數量超過 10⁹ 就會超時,所以如果你看到 input 大小可以到 10⁵ 的話,那 log(n²) 的解法大概就可以放棄了,大概最佳解是 nlog(n)(為什麼不會是 log(n) 呢,因為 log(n) 的解法應該要能明顯到看得出來吧不需要這招)。這個是打比賽或刷題的時候好用,實際面試用不上的小技巧。

3.特定演算法的SOP:

很多人都會有這個,比如說實作 Binary Search 是要 while (low < high) 還是 while (low <= high) 最後要 return low 還是 return low+1,或是實作 BFS 的程式結構。

我自己的話就是 Binary Search、BFS、DFS、Dynamic Programming、Recursion 都有固定的寫法,固定寫法能去掉很多小失誤還有不確定因素,你當然會希望面試的時候能把大部分時間花在思考解法,而不是要預留時間想怎麼實作 DP,能準備的就要先準備起來。

刷題策略

很多人也會討論要怎麼選題目來刷,比如說按分類刷、按公司 tag 刷、隨機刷或是按難度刷。

前面大概有提到,我自己是按難度刷然後經典題為主,因為我覺得按分類刷的話好像會多一個提示,知道這題肯定得用 Queue 之類的。一般經典題裡討論區也會有很豐富的資源跟解法,對刷題初期我覺得幫助很大。有些新題可能討論區不太熱絡,最受歡迎的解法也不一定是最優的。

我覺得有一個可以提的是,每年開始面試的時候我是怎麼把之前的熟練度撿回來的。我大概是在 2019 年還在學生階段的時候每天花八小時度過了前三個刷題階段的,之後每年的首要目標就是先把熟練度撿回來然後繼續第四階段的 medium、hard 一比一刷題。一開始我就是跟我第一年的刷題策略差不多,但後來發現其實以前有沒有熟練的題目真的很明顯,不熟練的題目隔一年回來看就跟第一次見面差不多,熟練的題目沒必要再回來寫,所以我的策略就轉為先從不熟練題目列表開始解(感謝自己每年都有認真做筆記)。今年因為自己的不熟練題目列表好像已經沒那麼不熟練了,所以就從 Top 100 Liked 開始,我覺得這個清單滿不錯的,各種難度的題目分佈很健康。

刷題的程式語言

這個其實不太需要討論,我是什麼語言都可以派的。但確實,我第一年是用 Python 刷,後來花了點時間忍痛改成 C++。當時我是因為非本科 + Python 對於某些人來說好像是一種 red flag,所以第一年面試的時候即使我對資結演算法都挺熟的,還是在面試中常常被問到 python 的 list 或是 sort 是怎麼實作之類的,很煩XD 後來改成 C++ 後就很少遇到這種事了,除了 Google 外我相信大部分公司的面試官自己都是用 Java 或 Python 刷題。

一般來說可能前端工程師用 JavaScript 刷題外,大部分人就是 Python, Java, C++ 三種選擇。其他語言當然都可以,但 Leetcode 討論區可能就資源少一點。如果選擇 Python 的話,我是建議還是得多花點時間學習一下內部實作,很多人都是 list 跟 dictionary 一套用到底,但也可以多看看 Collections 內的一些資料結構。如果 C++ 一開始吃得進去的話我是覺得挺不錯的,沒有大家一開始想像的那麼可怕,上手後也常常從 STL(C++ 的內建 library)學到一些設計上的思想,會在某個階段突然有種打通任督二脈的感覺(咦)。

要不要買 Leetcode 會員

買!

我自己是每年都有買一個月啦。不過因為是一個月一千、一年五千,所以得自己拿捏一下要買一個月還一年。

我覺得我的心態就是,如果面試出了 leetcode 原題,我就要把握。一個月一千是不便宜,但每個月的不必要支出大概多數人都有超過一千XD 如果我今年的努力掛在一題會員才看得到的原題,那我應該會很不爽,所以就果斷買了。

準備面試的心得與心態

連續面試了四年

這邊我想說的是,雖然很多很猛的人可以應屆去 Google 工作,但網路上也常常可以看到很多人強調多數 Googler 都是面了不只一次的(依稀記得有個印像只有 10% Googler 是一次就面上的)。雖然冷凍期一年很煩,但也只有在應屆那年得失心會特別重,後來邊上班邊面試,一來你沒有太多心力準備跟煩惱,二來也沒有那種找不到工作的壓力。對我來說每年面試也是有好有壞,雖然固定要付出時間跟心力,但對於我這種剛畢業沒多久的人來說能有機會固定維持手感也不錯。很多網路上的文章也會強調,面試上了 Google 然後呢?進了公司後也要從菜鳥開始慢慢學習,有些人也把競爭的賽道從面試轉換到績效還是升職上,在工程師這條路上就是一直不斷的學習還有自我成長,進了想去的公司也就只能算是一個 checkpoint,沒進想去的公司也不代表自己以前沒成長或未來不會有成長。

還有一個是我自己很喜歡的發現,就是每年面試的過程中你可以感受到自己的成長是很明顯的,過了一次 phone screen 就不太擔心下次過不了,第三年能送 HC 第四年我開始面試的時候就有信心也能送 HC,每年都有種多走遠一點的感覺。總體來說我覺得雖然有些運氣成分,但 Google 面試比起其他家還是相對滿公正考察候選人的,至少不會有那種死得很冤的感覺。

面試的運氣

面了同一家公司四年,也可以看到有各種情況,比如說第一年跟面試官對不上頻率、第二年直接沒 headcount、第三年跟第四年面試難度差異巨大。雖然上一段才說相對公正,但不可否認的就是每年都有這些不確定性。

我覺得應屆生比較容易有那種雞蛋放同個籃子的感覺,比如說應屆沒上想去的公司就有世界毀滅感,但實際進入公司後你會發覺真的從公司內部都能看到太多亂七八糟的情況了,從公司外部根本就是純碰運氣。你從外面永遠不會知道這個 L4 職位主管是期待一個三年經驗的人還是八年經驗的人,你也不會知道這個職位是誰出錢的有沒有招人時間上的壓力,這方面我覺得就是盡人事聽天命,如果你有人脈可以打聽,多拿一些資訊永遠不吃虧,如果沒有資訊就投,投了就蓋牌不管,不要輕易有那種把一切都賭在一場面試的感覺。

Google Taiwan 的難度

這個我覺得是不可否認的,台灣 Google 就是比美國 Google 難,雖然我面試過程也有遇到美國的面試官,但就算是同一個面試官問同一題,台灣的職位就是比美國少很多,所以自然就競爭很激烈。

我也不是無憑無據的這樣講,我自己本身在台灣微軟跟美國微軟都工作過,確實台灣的門檻高很多,同事們跳槽去 Google 也是差不多這種心得。

跟 Recruiter 合作

網路上也很多人強調了這個,但我真的今年感受非常明顯,好好跟 recruiter 合作真的幫助很大。recruiter 可能有些不能告訴你的資訊,但他可以透過暗示或是默默幫助你,加上人家對於這家公司的面試經驗當然比我們多很多。不過跟 recruiter 合作當然也不是單方面的希望對方付出,我覺得自己要準備的部分就是好好搞清楚自己想要什麼還有遇到問題就發問,就是要給別人能幫你的空間。

微軟面試官心得

我自己在微軟也當過面試官,面 intern 跟正職都有,當過面試官之後看待面試的角度會不太一樣。比如說,對面試者來說這是你努力爭取來的一場面試機會,但面試官可能今天已經面了一整天八個人了,你剛剛面試前在緊張,面試官可能剛從一場會議出來,邊面試邊想等下還要寫面試報告。

很多人也提過,面試除了把題目解出來外,讓面試官覺得你是個不錯的同事也是很重要的,這部分大多就是體驗在溝通交流上,如果你有好好的花時間跟面試官討論,面試官也會覺得這場討論的體驗是比較好的,整體印象分數更好(?)其實也有很多時候面試官是想幫忙的,但常常沒有空間幫忙,所以好好跟面試官確認自己的解法跟疑問真的是很重要的。

正常的面試官也不會要求一定要每題 bug-free,誰工作上不是每週在產出 bug 的,重要的是寫出 bug 後的反應,慌不慌,解 bug 有沒有邏輯性。低級錯誤能不能靠自己找出來,複雜一點的錯誤能不能在提示下跟面試官一起解決。

-

如果覺得我的心得分享有幫助的話就幫我拍手分享囉。我也很樂意幫助更多人,如果有疑問的話留言我應該有時間會回。

--

--

Tobby Kuo

Microsoft Software Engineer, focus on infrastructure developments for big data in distributed environments.