面試準備心得分享(Offers from Uber ATG, Google, Facebook, LinkedIn, Slack)

avatar 429823
tuanlung
9982
21
想跟地裡的大家分享一下準備面試的經驗裡面有很多東西可能是老生常談了
但我想一些實戰的經驗能夠給一些正在準備面試且對於準備方式不夠堅定或是有點迷茫的小夥伴一點信心

先講一點我的背景, 還有這次面次的結果, 讓大家想一下有沒有參考價值再決定要不要讀下去:
我2014年從UCLA EE MS畢業, 搬到灣區在Synopsys做了幾年並拿到綠卡
後來舉家搬到紐約加入一間區塊鏈新創公司, 在那邊從IC慢慢做, 後來升了TLM又做了一小段時間(整個期間不到兩年, startup就是成長比較快但累)
在紐約生了孩子, 覺得大城市的好處都無法享受到, 所以決定搬回灣區

這次找工作主要目標是找比較穩定的大公司, 畢竟有新生兒, 會有好幾年都經不起折騰
最後拿到Uber ATG, Google, Facebook, LinkedIn, Slack, Zoox, Postmates的offer然後最後決定去Uber ATG

從我的描述應該可以看出來, 我剛畢業時並不擅長面試 (EE background轉職software engineer, 有點虛)
但這次感覺是抓到了一點訣竅, 所以想跟大家分享
當然, 面試是個玄學, 我可能完全搞錯了拿到這些offer的原因, 大家參考時請也注意到我的盲點

關於時間安排
這次準備面試, 我是利用了產假準備的(10週). 當然晚上還是要帶小孩的, 但白天就忍痛花錢請了個阿姨來家裡幫忙帶小孩
這種模式明顯是無法複製的, 但我認為如果我把準備時間拉長, 每天工作之餘花一到兩小時, 四到五個月後, 大概也能收穫類似的效果

我在刷題與準備系統設計的時間比例上, 大概是3:1. 前期基本上都在刷題, 確定都拿到onsite interview之後才開始大量閱讀和練習系統設計
我在跟各公司的時間安排上盡量保持同步, 也就是分成五個階段: 1. 遞出申請 2. 與recruiter通電話 3. 電話面試 4. onsite interview 5. offer negotiation
這樣做有兩個主要的好處: 1. 方便compete offers, 能夠有更多的leverage去跟hiring manager談判 2. 我把所有onsite interviews集中在一周半的時間裡, 這樣就只需要飛到加州一次
整體來說, 在五個階段中, 第一階段花了一週, 第二階段花了一週, 第三階段花了3週, 第四階段花了約兩週, 第五階段花了兩週

關於簡歷
簡歷只有間單的一頁, 格式不花俏, 沒有一堆粗體或是底線
英文的部分我花錢請我前同事(一個technical writer)幫我來回修改過
內容的部分我是盡量讓每個project都包含可量化的成就
並且在最下面附上一些skills keywords讓recruiter方便過濾

關於申請
申請方面我是分成四個管道: 內推, 被recruiter聯繫, 求職網站投遞, 直接上公司網站申請
有內推的connection就盡量請朋友內推 - Facebook, LinkedIn, Slack, Pinterest就是這樣勾搭上的
被recruiter聯繫的有: Amazon, Google, Lyft
求職網站投遞包含了Triplebyte, Hired.com, LinkedIn: Uber ATG 和 Postmates
直接上公司網站申請的意外有效: Zoox, Doordash, Coinbase, Square

關於刷題
刷題的練習我把它分成兩個維度: 深度和廣度
在廣度方面, 我按演算法和數據結構類型把題目分類(其實OJ網站都已經分類好), 然後挑經典的練習
在深度方面, 我把這些經典題目在限時時間內嘗試做一遍, 如果時間內想不出解法, 就會去找論壇裡的解答. 網路上有一些github repo是這類leetcode解答, 但我看過之後覺得論壇裡的解答往往比較有啟發性, 也比較值得學習. Github repo裡的程度參差不齊, 如果同樣都得自己挖出金子, 我個人是比較願意在論壇裡自己找, 因為來源比較廣
這些經典題目如果特別技巧性的, 我會記錄下來, 在第一輪之後, 會再刷第二遍
找解答時, 我除了專注於解法之外, 也很在意可讀性
很多解答強調用很少的行數解決問題或是runtime打敗90%的提交, 這樣我個人認為都不是面試時應該考慮的
面試時並不會去跟其他candidate的解答做runtime benchmark, 但你寫的code邏輯容不容易懂, 直接影響了面試官願不願意日後跟你合作, 有些公司的面試官可能就是你的同事, 而這一點往往是大家最在意的
當然, 這是在你的big O time complexity在同一個數量級的前提下

最終我從開始準備到面試結束, 刷過的題目不超過120題, 其中大約20題是在面試前幾天來地裡看面經搜集的, 而那100題是我自己找的各類別中比較經典的題目

關於系統設計
老實說, 我系統設計應該是最弱的一環, 因為我的前兩份工作都沒有接觸到backend分佈式系統也沒做過SOA, 而最後面試起來也確實導致我大部分offer都只有拿到L4, 所以這個部分參考價值就比較低.

儘管先天不足, 我還是做了一點準備, 沒有直接放棄
我準備的途徑主要有三個, 一個是閱讀educative.io網站的材料, 第二個是系統設計課, 第三個是跟我老婆討論system design primer上面的題目
即使我做了很多練習, 在面試時也都能夠跟面試官進行比較良好的溝通, 但我想面試官還是能夠看得出來我實操的經驗不足
我猜給他們的感覺是: “這個candidate雖然好像沒有相關經驗, 但有一些背景知識, 給予一些幫助, 似乎能夠很快上手”, 所以可能給了weak hire

關於面試
每一輪面試的前兩天我都會來地裡找最新的面經, 然後練習
命中率大概30%
我算法面試全部都能解出來, 儘管有一些是在對方給提示之後
對於算法面試, 我建議大家按照這個流程走:
clarify問題本身, 確認input/output的類型和特點
跟面試官描述一個可行解, 並解釋它的時間空間複雜度, 然後講一下你在直覺上認為這是不是最佳解, 如果不是, 稍微講一下哪些地方可能可以優化 (即使你還不知道怎麼優化), 然後跟面試官說你現在想要花時間想一下能不能想出一個最佳解. 如果你題目理解錯了, 一般來說面試官會在這時候糾正你. 如果面試官同意讓你再想一想, 那就進入下一步
這時候一般你會花一點時間去想最佳解, 如果你不擅長一面講一面想, 你這時候稍微沈默一下是可以的, 因為你前面已經跟面試官解釋你在思考什麼部分了.
如果你花的時間有點長, 一般面試官會給你一點提示或是鼓勵你直接進入coding把可行解寫出來. 如果面試官比較不在狀態, 那你可能得自己把關一下時間, 你如果覺得時間快要不夠你寫出可行解的話, 你可以問面試官說你可不可以先寫可行解, 然後可能寫一寫會有靈感. 基本上就算最後真的有靈感也來不及做了, 這邊就只是一個讓你有機會進入coding的一個理由.
如果想出最佳解, 一樣大略解釋給面試官聽, 最好舉個小例子, 然後講一下時間空間複雜度.
不論你最後打算實現可行解還是最佳解, 記得要讓面試官同意你的解法再開始coding
開始實現, 一面寫一面解釋給面試官聽, 這不是說你寫一行講一行, 畢竟你前面已經花很多時間讓面試官有預期你要寫什麼了, 所以你可以假設大部分地方不用解釋. 而且你前面溝通如果做得好, 很多面試官會在你coding時犯小錯誤時直接提醒你. 你不用緊張這樣被扣分了, 就把面試官當成pair coding的同事就可以. 那什麼地方需要特別解釋呢?你寫到一些比較繁瑣或是複雜的部分, 就是那種你在codebase裡面也會加註解的code那你就解釋一下, 這樣可以省去打上comment. 另一種狀況就是你寫的有點亂, 但你想晚點回來refactor到function裡面, 你可以先說一下, 這樣不會給人你code readability很差的感覺. 而你也能繼續專注在你的logic而不是refactoring上面
實現結束之後, 不要說你寫完了, 也不要compile & run. 而是先試試用手演示general test case給面試官看. 這個部分要盡量畫圖或是在IDE上面keep track of variables, 讓面試官很輕鬆的可以跟上. 這個部分成功之後, 馬上告訴面試官你想試一下corner cases. 一樣用手演示.
如果你在過程中自己發現bug, 或是面試官急不可待地給了你一個反例, 不要急著去改code. 先好好看一下這個反例, 說出這個反例的什麼特徵造成這個bug, 然後跟面試官討論一下解決的辦法, 然後再動手改, 我自己做面試官時看過太多candidates急於改bug然後又寫錯, 這是一大忌
如果test演示都過了, 那你應該很有信心可以compile & run了, 那就試試吧, 如果又遇到bug, 扣分已不可避免, 但一樣心平氣和按照前面test發現bug來處理

至於system design, 我面得不是很好, 所以我就不誤導大家了

就面試整體來說, 我認為從來不需要表現完美, 除非市場真的嚴峻, 很多公司就是想要找能夠對公司有正面貢獻的工程師. 意思是, 你不用是超強的菁英, 但你絕對不能是帶給團隊負擔的人. 所以如果你給不出最佳解, 但是寫code邏輯很清晰, 溝通很良好, 很能接受面試官的意見, debug時條理清晰且不會病急亂投醫, 那你還是很可能得到weak hire.

最後再強調兩件我認為最重要的事, 一個是有意識地友善溝通, 不是有講就好, 而是真正看著對方的眼睛, 聽對方說話, 確保自己聽懂, 也確認對方聽得懂你說什麼. 我也曾遇過態度很糟糕的面試官, 或是口音太重聽不懂對方說什麼的面試官, 但是我都用肢體語言想辦法讓對方engage.
我曾經遇過google的面試官坐下來給我一張紙, 上面有題目, 就讓我寫, 而且說中途不用解釋給他聽, 然後他就開始幹自己的事
但我還是盡量把我的想法講出來, 最後他把他緊急的事處理完之後也engage了
為什麼這個這麼重要呢?說一點玄的, 我自己做面試官跟其他面試官討論時, 常常會聽到那種“candidate沒把題最佳解想出來但是溝通很順暢“ , 還有“candidate聽到題目什麼也沒問就把最佳解完美寫出來很可能是看過這個題”的comment. 其實講白了點, 這都是面試官自己的主觀意識, 都是偏心與臆測, 但是他們也是你可能的未來同事, 所以他們“想不想要”跟你cowork是很重要的

另一件事, 就是不要放棄, 即使面試官是個種族歧視混蛋且你待會準備跟hr抱怨他, 你也不要放棄
我自己在公司裡做面試官的經驗告訴我, 如果有三個candidates拿到這樣的score cards:
A: 100, 0, 80, 80, 80 -> one more round, or no hire
B: 70, 70, 60, 80, 80 -> weak hire
C: 80, 80, 80, 80, 0 -> no hire
所以如果確定拿不到100分, 也得先爭取個60分. 因為red flag是很難很難挽回的

關於薪水談判
這我不能說是非常擅長, 所以我就只講兩點
進入到談薪水階段, 即使你不缺錢, 你也應該把這當作一個數字遊戲, 目標就是要把你的package maximize. 這是數字遊戲, 跟你和未來manager的關係沒關連 (level 則是很有關), 跟你是怎麼樣的追求也沒關.
Competing offer是你真正的leverage, 但即使你沒有competing offer也應該試著用你能想到的理由negotiate, 因為很多manager出價時已經把講價空間保留了, 就等你開口

後記
我還很junior, 上面談的東西很多都太武斷了, 我未來回來看必定會覺得很羞愧
但我相信有一些東西還是有參考價值的, 希望地裏夥伴一如既往不吝指正.
    • 190
    21条回复