拿到 Google & Amazon Offer 的面試之旅(一)

Arthur Lin
11 min readAug 13, 2022

簡介

本輪面試 Google 與 Amazon,也是第一次挑戰一線大公司,共歷時約 4 個月,幾乎同時開始同時結束,最後很幸運的皆拿到 Offer。

面試機會比較特別,都算是對方自己找上來,Google 是 7, 8 年前認識的 Recruiter 突然來信問有沒有興趣試試(聽說今年也滿多人在 LinkedIn 上突然被問的),Amazon 猜測是年初某次 Leetcode Weekly Contest 是他們主辦的,有要求填寫信箱,可能當時成績不錯,最近缺人就收到來信邀請。

地點上,Google 面的是台灣的,Amazon 是美國西雅圖的團隊,由於沒有美國工作身份,若想去得先在加拿大待一年再內轉西雅圖,具體還有點繁瑣,不過由於最後選擇了 Google,就沒有談後續 relocate 細節了。

希望用這篇文章來分享一下這趟旅程跟學到的經驗給大家,這篇主要會聚焦在 Google 上,想看 Amazon 的人可以置底看第二篇。

背景與準備

背景:台大非本科生,碩畢後自學轉職,工作 4~5 年後面試卡關才回頭學習 CS 基礎,當時可說是連 Bubble Sort、Binary Search 都不會寫的狀態。後來緩慢的邊工作邊東看西學,直到 30 歲後才真的開始認真鑽研資結、演算法、OS… 等。希望可以分享這份面試經驗,給一些同樣是轉職的工程師,年紀稍大才回頭學起 CS 基礎知識的人。

工作經驗:7~8 年 back-end / data engineer,待過各種新創公司,從 10 人小團隊到獨角獸都有,近一兩年則偏向教學工作。

刷題:Leetcode 今年面試前剛好寫到 900 題,另外各種競賽型 OJ 大概 300 題。Leetcode Weekly Contest 名次約落在 100~500, Contest Rating 最高到 2369,但面試完後較鬆懈掉回了不少

其實僅以面試準備來說,這樣的刷題量有點太過了,大多是近一年 contest 打出興趣,每週末當玩樂累積下來的,也有不少是我教的學生提問而去刷的

至於會玩競賽型 OJ 是因為去上了超頂尖競程高手的家教課半年多,玩了一圈諸如 codeforce、AtCoder、CodeChef、GCJ … 等平台的難題,開了一輪眼界,因為這邊根本另一個異世界,比較前段的競賽高手,Leetcode Hard 對他們來說就是超無聊看膩的基礎老梗題,比賽出題者都沒臉丟出來浪費大家時間,深刻體會到頂尖競程玩家的水準有多恐怖。

好消息是,如果只是為了面試,沒有一定需要去拼頂尖競賽難度的題目

甚至因為他的準備方向跟一般工作差距太遠,難度又太高,若沒有高手輔導,弄不好還可能有害。

我自己當初玩競賽也不全是為了面試,更多是好玩想挑戰看看自己能到什麼程度,所以仍然很感謝帶我的老師,算是強迫自己對部分艱難的資料結構與演算法,例如 DP 或 Graph 的理解程度,到達了以前完全想不到的境界,遠超出面試的範疇。以負重訓練的角度來看的話,這些競賽題目確實讓我核心能力提升很多,回到 Leetcode 的世界時會有拆掉負重包的輕鬆感。(該老師後來開設了自己的學院,對程式競賽或高強度訓練有興趣的推薦去聽聽看)

至於單純想面試大公司的人該怎樣準備,我另外寫了兩篇,有興趣的可以看

這篇還是先聚焦回 Google 與 Amazon 的面試經驗,雖然我面試前還滿有自信的,但上場後仍然遭遇一些驚嚇,下面就來詳細分享經過。

Google (Taipei)

Google 一共五關,每一輪 45 min,除了一關 BQ 外,另外四關都是不囉嗦直接解題。但 Google 出題很有趣,標準常見的 Leetcode 題嚴格來說只有 1 場,其餘 3 場都有點變形,因為 NDA 不能透漏題目,但可以講一些心得與注意事項。

第 1 關:(Phone interview)

面試官描述希望完成某個系統,並要求給出其中一個環節的最佳解決方案。剛聽完敘述後,覺得是個經典 Leetcode 題(Medium 難度),我很快的給出了時間與空間複雜度最優解,但面試官卻不夠滿意,認為還可以優化。

當時一度非常困惑,思緒空白了一下,好在迅速冷靜後,透過一一列舉資料結構,並不斷跟面試官溝通他們的優點以及代價,總算發現有個方法,雖然沒改變複雜度,但 trade off 之下某些性質在實際的系統上有好處,此時只剩約 10 多分鐘,靠著手速夠快寫完並修正到 bug free 通過。

事後回想發現,面試官一開始給的工程情境是有意義的,不像很多考題瞎掰個故事而已。考慮實際情境,面試官滿意的做法更加合理,可以避免某些長期使用的問題,這是平常 Leetcode 不太去考慮的部分。

結束後沒多久 Recruiter 打來表示 Positive,順利進入正式的 Onsite Interview。面試前其實還是很緊張的,發現這樣的題目難度與面試表現是合格的,讓我信心大增。

這關學到的經驗:

1. 考題很靈活,雖然仍是資結演算法,但最好一併考量到實際工程情境。

2. 腦中真的沒想法時,可以試著把你所有學過的知識一一列舉講出來,並討論其優缺點,就能幫助你繼續前進,不會陷入尷尬沉默。

3. Coding 速度雖然一般不是最重要的,但以 Google 等級的面試仍然有可能成為左右成績的關鍵,畢竟時間非常緊湊,寫的快狠準能幫你爭取更多時間討論或做更多題目。

第 2 關:(Virtual onsite interview round 1)

讓人很舒服的台灣人年輕面試官,給人很聰明的感覺,給了個 Graph 變化題 + follow up,一點巧思可以轉化成經典問題,難度約是 Medium 與 Hard,算是最像 Leetcode 的一關,也是我過得最順的一關,一路溝通寫 code 聊的滿開心的,有種跟要好的同事討論有趣難題的感覺,中間還針對某個地方深入聊了一下較嚴謹的數學證明思路,還有面試官自己覺得有趣的額外延伸問題。

這輪體感表現比前面更好,猜測是個 Strong Hire。

第 3 關:(Virtual onsite interview round 2)

Behavior Interview,感覺面試官心中有想要聽到的關鍵字,但我有幾題沒有打中,所以最後 Feedback 是表現平平,不太好也不太糟。我自己是不太喜歡這種題目還要有標準答案的感覺,就是一個講故事猜面試官想法,但為了統一標準大概也是沒辦法,或許管理經驗更豐富的人,真的就能猜的更準吧,但如果有花更長時間針對性的訓練應該也是可以進步的。Behavior 部分 Amazon 相對更的看重更全面,留待下篇分享。

第 4 關:(Virtual onsite interview round 3)

這天是早上 8:00 的面試,但我前一晚不幸生病完全沒睡,狀況很慘。

一個很和善健談的澳洲人,問的題目一開始感覺莫名簡單,只有 Easy 等級,但我給出的幾個答案面試官都不滿意,繞了很久才終於搞懂,面試官想要的數據範圍跟我直覺以為的不太一樣,在他的條件下有個 General Case 很高效的做法,但被我一開始太過想當然爾的排除了。最後我講出對方滿意的最佳解時,只剩約 5~10 分鐘,不知道面試官是覺得時間不夠還是聽到正解就好,總之最終沒有請我寫 code,直接讓我隨意問問題。

後來有點後悔沒有積極爭取一下寫出來,因為並不難寫,但當下真的精神太累,面試官又很和善說 OK 沒問題了,我也就順勢閒聊怕多做多錯。最終收到 Feedback 是表現還可以,我猜大概 Lean hire。

這邊學到的教訓是:

1. 不要覺得面試氣氛很好就代表得分很高,有時候可能只是面試官特別友善,還是要提醒自己不斷爭取與把握表現的機會,在短短 45 分鐘裡把你全部的能力展現出來。

2. 這關其實也是我自己的失誤,沒有確實的做到一開始要跟面試官仔細確認需求的環節,聽到題目後有點自以為是,覺得類似題我看多了,就把腦袋閃過的解題方向都講出來,導致浪費太多時間在溝通不是他要的複雜解法上面,反而一直忽略了樸實但有效的做法。

第 5 關:(Virtual onsite interview round 4)

講話很平板的面試官,感覺是個台灣人,但一上來就英文開場,完全不聊天的直接敘述題目了,且整個面試過程都不苟言笑,是氣氛上最有壓力的一位面試官。

Warm up 不難但面試官對細節追問很多,花了不少時間,Follow up 題聽完以為抽到籤王 Concurrency 題,但確認了一下不需要寫 Multi-thread 後鬆了口氣,但比較類似互動題,同樣在 Leetcode 上較罕見(Tag: Interactive),要優化的東西特別了點。

雖然經過前幾輪,已經沒這麼驚嚇了,但還是痛苦掙扎了一下,所幸在面試官已經打算請我先寫暴力解時,多請求了 2 分鐘思考,終於看穿了最佳解一次到位,剛好壓線寫完 Code 並一次 bug free pass,運氣很好。

最後的小閒聊時間,看到整場嚴肅的面試官露出笑容,滿感動的。

這邊學到的經驗是:

當暴力解很明確,可以先清楚的敘述,讓面試官知道你會即可,是否真的實作要看時間而定。假如時間很吃緊,寫暴力解花掉數分鐘,會讓你沒機會寫出最佳解。若對寫 code 速度有自信,可以嘗試多爭取時間思考,直到真的剩下 x 分鐘還不行(x = 你最少能完成的時間)再放棄,寫暴力解拿基本分。

面試結果

後續 Recruiter 來電表示整體 Feedback 不錯,可以送 Team Match,這邊特別的地方是剛好遇到 Google 大改流程,變成先 Team Match 再送 Hiring Committee(以前是反過來,然後 HC 會等很久),一週內聊了三個 Team 後下了決定送出,說要 7 個工作天左右等回應。

等最終結果的時間算是整場面試最煎熬的時刻,因為完全無法掌控任何事了,時不時會上 blind 刷一下別人的面試心得,發現有人 HC 等了一兩個月!但我 4 天後就突然收到 Recruiter 來電恭喜並發了 Offer Letter,神速的令人意外,感謝 Google 沒讓我煎熬太久。

聽說 Google 是今年 4 月才史無前例的大改流程,就是為了加速搶人,以免優秀人才等到跑了,沒想到 7 月就因為大環境不妙宣佈要 Slow down hiring process,緊接著馬上凍結了全球面試流程,論壇上哀鴻遍野,只能說時事變幻莫測,實力以外運氣也很重要。

總結論

整體來說,遭遇到很多非典型的 Leetcode 題讓人有點措手不及,但需要的技能仍然都是 Leetcode 的範圍,所以熟練最核心的資料結構與演算法基本功,然後靈活運用才是最重要的,不要死背題型,面試前充足的睡眠也很重要,45 分鐘高強度的解題需要很強大的專注力,最後就是看運氣了。

雖然每一輪基本上都是在沒有得到明確 Hint 的狀況下做出最佳解,但過程其實並不是都非常平順,當做不出來時,透過大量的溝通與敘述想法,可以得到一些資訊,例如你講了某個做法,觀察面試官的回應,最少會知道(或猜到)這方向正確與否,也算變相的得到 Hint,同時良好的溝通表達也會幫你加分。

至於第二關剛好考到我熟悉的 Graph 題,最後一關則壓死線內靈光一閃想到正確的方向,就是運氣的部分了,心懷感恩。也要感謝家事有老婆 cover,讓我這段時間下班後可以全心專注在準備兩間面試上面。

不知道是我的遭遇比較奇特,還是 Google 真的有刻意讓題目更靈活一點,我覺得這是很棒的出題方向,因為更貼近真實開發情境,有點像把一些實際系統遇到的問題抽出來包裝成 DSA 考題,而不是如以往被人詬病的,考一些現實中很難遇到的特殊難題等等(例如網路上看過考 KMP 字串比對,或要你刻出 Treap,我是覺得有點過分),雖然考奇怪的難題對我或許更有利,但我並不贊同這種面試取向。

最後,不得不稱讚一下 Google 的 Recruiter,一路上都很友善又專業,有時早上寄信想約面談,一小時內就開好下午 google meet 寄行事曆來了,談薪階段也幫我爭取了不少。相比之下 Amazon 雖然面試官很棒,但 Recruiter 流程卻非常混亂… 下篇待續。

拿到 Google & Amazon Offer 的面試之旅(二)

--

--

Arthur Lin

Google 軟體工程師,AppWorks School 前導師。對於程式和教育充滿熱情,看到學生的成長是一種無比的喜悅。樂於接受挑戰,將複雜的知識整理成清晰易懂的樣貌並分享出來,是我最喜歡的成長方式。