FAANG 面試準備經驗與建議(二)

Arthur Lin
10 min readOct 19, 2022
designed by Pressfoto — Freepik.com

前言:

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

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

FAANG 面試準備經驗與建議(一) — Leetcode 的準備方式

前面我們聊了面試經驗與 Leetcode 該準備到什麼程度,這篇則會聚焦在你已經有足夠的準備後,如何在面試前做最後衝刺。

針對面試的練習

首先最重要的,一定要習慣在 Google Doc 這類沒有任何輔助的工具上寫題目,並且儘量練到一次複製貼上 Leetcode 就 Submit 通過。FAANG 公司的 Virtual Onsite 面試環境都是這樣,若將來疫情趨緩,恢復實體面試的話,還得練習真正的白板寫 Code。

如果你以前很習慣在紙上畫圖思考,相信我,一但不讓你用,思路很快就會打結。

另外還要練習邊寫邊講解,即使只是畫個 Array 什麼的,你應該開始練習純粹用線上工具解釋跟思考,用純文字畫示意圖。尤其 Linked List, Tree, Graph 類的題目,能熟練的只用純文字來思考跟溝通你腦中想像的東西很重要。一些比較複雜的 Array 或 String 題目,index 數來數去很容易亂掉的那種,你也只能靠 Google Doc 用純文字來輔助你思考跟解釋給別人聽。不習慣時,會有智商被砍半的感受,但習慣後就能正常發揮了。例如我的 Graph 就會像以下這樣去畫,並一邊練習解釋例如我如何在上面找到環的存在。

f - e   h
| |
a - b — c — d
|
g

或 Array 用下面的方式來輔助我數 index,解釋目標位置的移動或改變

 [a,b,c,d,e,f] 
0 1 2 3 4 5
^
|
target

真人模擬練習

再來就是真的找人面對面練習了,面試中的溝通能力真的非常、非常、非常重要,而且對很多人來說是需要刻意練習的,對這塊還沒概念的人,可以先看 Google 官方提供的示範面試

真實場景其實滿像的,你會需要不停的講想法,並根據面試官的回應做出反應,只是題目會難很多。

如果你想要尋找真人模擬練習的機會,除了自己組團找親友外,非常推薦這個練習網站,提供免費的陌生人隨機配對練習,常見的 DSA, System Design, Behavior 題目類型都可以找到夥伴陪你免費對練。

不管你覺得你本來有多厲害,我覺得這個至少要練到 5 次以上,當你突然要邊寫 code 邊用英文溝通想法、沒有慣用的編輯器、還有個人盯著看你做到哪還不時打斷你,就算對方只是個剛畢業的菜鳥工程師,都可以讓你感受到無形的強大壓力。

我自己第一次完全被震撼到,被一個平常 15~20 分鐘能搞定的題目徹底洗臉,搞了 60 分鐘沒做出來最佳解,溝通也非常卡,結束後馬上回頭跟 Google Recruiter 把面試推遲了一個月,說我得練習一下,下面截圖是我當時從跟我配對的對象那邊收到的評價

但大概練到第 3, 4 次之後,得到的評價就變成了。

當然這是基於原本有足夠紮實的基本功,才能短時間快速進步。這個環節主要是提高原有實力能真正發揮出來的 % 數。

我第一次做 System Design 練習中也遇到一個智利的前端工程師,要應徵 Amazon 的後端 SDM (L6)職位,而他表現的比我好太多倍,但他承認他沒有開發大型後端系統的經驗,完全靠不斷的練習達到現在的表現,讓我這個身為真正開發過大型後端系統人感到汗顏,也學了一課。

另外是心理素質的成長,一開始我即使明知只是個練習,還是會在開始前感受到不自覺的心跳加速,需要提前半小時放空讓頭腦冷靜下來,但幾次之後完全習慣這個模式,就可以悠哉的跟老婆看劇看到開始前 3 分鐘才登進去。

還有個收穫是可以跟世界各國工程師聊天很有趣,日韓、印度、歐美、俄羅斯都遇過,而且大多都是一同在挑戰 FAANG 公司的人,幾乎都很 nice,結束後還會互相閒聊寒暄鼓勵,有種當背包客遇到世界各地相同目標的戰友的溫馨感。

付費資源推薦

最後整理了一些我有花到錢的資源,事實上免費資源已經夠多了,所以要不要選付費資源就看個人選擇,以下列幾個我自己用過的心得讓大家參考

Leetcode Premium

我對他的評價持平,就是你不會覺得花了浪費,但也不到物超所值這樣,以下列舉幾個點

  1. 官方解答的品質不錯,他們有花錢聘人做這塊,也有審核機制,可以把他想成討論區精華總整理,各解法之間的思路比較連貫,而且幾乎都有精美配圖,對新手培養跟拓展思路比較友善,有些甚至還附贈 interview tips。當然極少數也是有寫的太簡略被罵爛,甚至直接複雜度寫錯的,所以自己還是得有點判斷力,當然你有能力自己研究討論區前五名的解法的話,也是可以不需要靠這個。
  2. 公司題組,我覺得寫這個比較像是體驗跟感受,這個公司喜歡怎樣的類型。實際想靠他直接命中應該是機率太低。我自己花了兩三週寫完 Google 跟 Amazon 系列,可以感受 Google 喜歡需要一些巧思的題目,即使簡單題也會藏一些繞彎或可以進一步優化的細節(也有一些被大家罵爆的苦工題,還好我沒遇到)。而 Amazon 題目則比較偏向扎實的基本功,很少需要花俏的思路。
  3. 官方教學系列:對新手來說,如果你找不到學習方向,這也不失爲一個起頭的好資源,跟著他分章節安排的題目刷,可以讓你更有目標的準備基本功,不過教學部分我覺得寫的不怎麼樣,主要價值在題庫整理。當然這部分也有知名的免費教材 NeetCode.io 可以用。

Educative: Interactive Courses for Software Developers

這網站有個方案可以繳年費後無限觀看任意課程,是非影片的純圖文課程,主要是準備 System Design 與 OOD 用,下面推薦三門課,是同作者的系列,我覺得超神。可以靠他非常快速掌握重點,小缺點是深度不足,每個主題要更深入要另外去找資源(e.g. 聖經 DDIA)。

  1. Grokking the System Design Interview
  2. Grokking the Advanced System Design Interview
  3. Grokking the Object Oriented Design Interview

(2023/04 updated) 作者似乎把課程轉移到新平台了,現在在這邊:https://www.designgurus.io/courses

不過雖然我準備程度是比這個深很多,但實際經驗來看,由於時間有限(30~40min),你也不太有機會真的一路討論到很深很細,那對面試準備時間不夠的人來說,就只看這個,也足夠讓你面試中拿 70~80 分達標了,算是 CP 值極高,還可搭配下面的免費資源服用

system-design-primer/solutions/system_design at master · donnemartin/system-design-primer

另外同系列也有 Grokking the Coding Interview 是講資結演算法的,我自己沒看這份,但抽幾章節掃了一下,看起來寫的也是不錯的,有需要的也可以靠他當基礎教材。

Exponent (tryexponent.com)

這也是真人面試練習,差別在他的練習對象是專家,從 Pramp 選教練也會連到這邊,可以請到頂尖大公司出身的專業教練跟你 1 對 1 練習,知名的公司都找得到,熱門的教練時段還很不好搶。但真的非常、非常貴。我是很想知道教練跟免費隨機練習差多少,還有買個心安確認一下實力有沒有到,所以心一狠捏下去刷了三堂(2*DSA from Google, 1*SD from Amazon)。結論來說我覺得是划算的,面試官用心又專業,事前可以先寄信溝通你的狀況,由於我題目做的算快,所以教練額外指點了我如何溝通會更能展現專業感,揪出一些不好的小習慣,卡住時可以做的事,還有 Google 面試官喜歡的 coding style 等很細的細節面向。

我同時也在 ExpertMitra 買了一堂試水溫,半價不到,但過程簡直沒氣死,面試官第一次搞錯時間早了三天在我上班時間突然敲我說開始吧(滿臉問號?),重約後,第二次搞錯時區,他以為我約的時間是印度時區(但我明明信中再三確認過時區了…)。最後搞到我在半夜 12 點練習,而且過程不怎麼愉快…最後也沒給我後續 feedback,真的只能說一分錢一分貨,用這甚至不如免費 pramp.com 的體驗好。

心態面的建議

如果你已經看到這了,應該資訊量已經非常足夠了(希望沒有過載),最後想和大家聊聊一些心態面的建議

對非本科生來說,練習這些基礎知識不是一天兩天的事,盡可能不要為了說”我要面試 XX 公司”來準備,不然你壓力會很大,得失心也會很重,同時也會不斷在內心質問面試考這個要幹嘛。

我覺得比較好的心態是,把這些當成”你軟體工程師職涯中應該要具備的能力”,這樣你的練習就很有意義了,因為不是為了迎合某家公司的標準,而是為了自己的整體實力提升。

因此我也不太建議去學那種很標榜”刷題”的練習方式,他們會很強調面試技巧,甚至要你死背模板,但這些不是初學者該努力的方向。

反而不如好好的學習這些東西的基本核心價值,理解工程上哪邊用得上,即使你自己沒用上,也認識一下哪些工具、例如 RDBMS 的 Index、ElasticSearch 的全文搜尋、Google Search 的關鍵字提示、Compiler 解讀程式碼的 Syntax Tree、四則運算… 等等這些背後分別用了什麼資料結構與演算法。你會感覺跟你關聯性更高一些。

其實真的要說,我覺得熟讀資料結構與演算法帶給我最大的價值,是一種太陽底下無新事的掌握感。

你會知道電腦能做的事,翻來覆去基本上就是這些了

當然頂尖的專家每日都在一些最前沿的研究有所突破,但不太可能會有什麼完全違反基本定律的東西跑出來。有點像你熟練了高中的牛頓力學,雖然你離造火箭還很遠,但起碼你隱約可以知道他大概怎麼動的,而不會覺得像黑魔法一樣。同理,讀完資料結構與演算法後,看到什麼新奇的工具解釋他的強項與弱項時,雖然你還是很難馬上知道他怎麼做的,但起碼會覺得一切聽起來還算合理,為了 A 所以犧牲了 B,總結得到了 C 的好處,適合用在 D 上面,這個邏輯是通順的。

而有了一定基礎後,再開始大量刷 Leetcode 題,這件事就不會那麼痛苦了,反而可以體會自己實做出來的成就感,看討論區大神的講法時,發現這些技巧還有這些神奇使用方式,也會開始感到新奇有趣。

真的等要面試前 1~3 個月,再很針對性的做面試特訓習慣那個節奏就好。

暫時應該是這系列最後一篇了,除非以後我找到時間與力氣寫 System Design 與 Behavior Interview。最後的最後,想為所有因面試感到緊張與壓力的讀者們,分享一篇我很喜歡的大神寫的心得,非常有趣又中肯

Get that job at Google | Stevey’s Blog Rants

節錄裡面我最喜歡的一段是

Because of the inherently flawed nature of the interviewing process, it’s highly likely that someone on the loop will be unimpressed with you, even if you are Alan Turing. Especially if you’re Alan Turing, in fact, since it means you obviously don’t know C++.

其實你永遠都不知道什麼時候準備才夠,但你有很多次的嘗試機會,因此準備到一定的程度,就去試試吧。

由於面試有非常大的不確定性,每個面試官有自己覺得最重要的東西,甚至兩個面試官可能互相通不過對方的面試,因此沒通過也不用太在意,很大機會就是運氣不好,剛好沒 match 到而已,換一家,或一年後再來就好。

祝大家順利!

--

--

Arthur Lin

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