我的矽谷之路-五天拿下五家頂級網際網路公司 offer
從 2017 年 7 月 24 號到 28 號的五天,我面試了 LinkedIn ,Salesforce Einstein ,Google ,Airbnb 和 Facebook ,並拿到了全部五家公司的 offer 。
這是一段神奇的經歷,我很幸運因為我的努力得到了回報。於是我決定寫點什麼來講述我是如何準備,面試的過程以及分享我對著五家公司的感受。
如何開始
我在 Groupon 混了近三年了。 這是我的第一份工作,我一直在和很牛逼的團隊做著了不起的專案。
我們團隊一直在做很酷的事情,在公司內部很有影響也發表了一些論文等等。
儘管我一直渴望學習更多但我覺得我的學習速率開始下降了。作為一名芝加哥的軟體工程師,灣區的那麼多偉大的公司總是強有力的誘惑著我。
人生短暫,職業生涯更短。在跟我的老婆交談並得到她的全力支援後我決定採取行動開始了我職業生涯的第一次跳槽。
充分準備
儘管我一直著迷機器學習的職位,可這些職位在上述五家公司的名稱和麵試流程有著些微的不同。其中三家的職位是機器學習工程師,Salesforce 是資料工程師,而 Airbnb 職位裡則是普通的軟體工程師。由此我不得不準備三個不同領域的知識:編碼, 機器學習和系統設計。
我還有個全職的工作,這使我總共花費了兩三月的時間準備。下面將給出我是如何準備這三個領域的。
編碼
儘管我也認同編碼面試可能不是最好的方式來評估面試者的技能,但無可爭辯的是沒有比這更好的方法在短時間內來證明面試者是不是一個好的程式設計師。
在我看來,想要得到程式設計師的工作編碼測試是不可避免
我主要使用 LeetCode 和 Geeksforgeeks 來練習。 Hackerrank 和 Lintcode 也是不錯的練習工具。
我花了幾周的時間過了下常見的資料結構和演算法。然後重點關注了我之前不熟悉的領域,最後做了一些常見問題的練習。因為時間所限通常一天我只做兩題。
談談的一下想法,
- 多練,這沒有什麼可說的
- 儘可能覆蓋不同型別的題,每個型別花時間搞透它。不要試圖把 Leetcode 上所有題都刷完。我在 Leetcode 上刷了總共差不多 70 題,我覺得做得足夠了。在我看來如果 70 道題還不行那隻能說明你方法不對,就算刷 700 道題也沒用
- 刷最難的那些題,其餘的就簡單了
- 如果一個題卡殼超過兩小時,去檢視別人的解決方案吧,再多花時間可能不值得的
- 做出來後,和別人提交的答案對比一下。我就經常震驚於別人家孩子的那些充滿智慧且優雅的解決方案,尤其是一行 Python 程式碼解決的問題娃兒們
- 用你最熟悉的程式語言答題,並通俗易懂的解釋給你的面試官
系統設計
這個領域更多的和實際工作經驗相關。許多問題會在系統設計面試中被問到,包括但不限於系統架構,物件導向設計,資料庫設計,分散式系統設計,高擴充套件系統等。
有很多線上資源可以幫助我們練習。大部分時候我是通過閱讀關於系統設計以及分散式系統設計面試的文章和一些設計案例的分析。下面我給出一些有用的資源供參考。
- blog.gainlo.co
- horicky.blogspot.com
- www.hiredintech.com/classrooms/…
- www.lecloud.net/tagged/scal…
- tutorials.jenkov.com/software-ar…
- highscalability.com/
儘管系統設計面試涵蓋很多主題,一些常用的套路可以幫助我們解決這些問題。
- 首先要弄明白需求,然後在畫出高層概要設計,最後列出實現細節。不要沒弄清需求而上來就進入細節。
- 沒有完美的系統設計,要正確考慮實際需求
說了這麼多,應對系統設計面試最好的方式還是坐下來實際設計一個系統,例如在你的日常工作中不要總做些表面工作,可以試著深入瞭解使用的工具,框架和第三方類庫。
再比如你用 HBase ,與其簡單的使用客戶端執行些 DDL 和查詢操作不如試著去搞懂它的整體架構,讀寫的流程,HBase 如何保證了強一致性,有哪些主要或細小的封裝,系統是如何使用的 LRU 快取和布隆過濾器來提升效率的。
你甚至可以去比較 HBase 和 Cassandra 在設計上的相同和不同之處。這樣當你在被問到設計一個分散式 key-value 儲存時,你就可以從容應對了。
許多部落格也是好的知識來源如 Hacker Noon 以及一些公司的技術部落格,還有很多開源專案的官方文件。
最重要的是保持謙虛和好奇心,像海綿一樣吸收一切有用的知識。
機器學習
機器學習面試通常分為兩部分:理論和產品設計。
讀一些機器學習相關的書籍是很有幫助的,除非你有機器學習研究的經驗或者ML課程學的很好。比較經典的書如 《機器學習之路》,《模式識別》和《機器學習》都是非常不錯的選擇。如果你對特定領域感興趣可以選擇更多該領域的書籍。
要確保你懂得那些基本概念,例如偏差方差平衡,過度擬合,梯度下降,L1/L2 正則化,貝葉斯理論,整合學習,協同過濾,降維等。
熟悉常見的公式如貝葉斯方程和流行的推導模型,如邏輯迴歸和 SVM 。試著去實現以下簡單模型如決策樹和 K-means 聚類。
如果你放了一些模型在你的簡歷上,那務必確保你完全懂得並能給出這些模型的優缺點。
關於機器學習的產品設計,懂得構建一個機器學習產品的一般過程,這裡給出了我的做法。
- 明確我們的目標:預測,推薦,分類和檢索等
- 找到適合的演算法:監督 vs. 非監督、分類 vs. 迴歸、一般線性模型、決策樹、神經網路等。並要能夠給出選擇的理由。
- 找出可用資料的相關特徵
- 給出模型的效能指標
- 評價在實際專案應用中如何優化上如模型(可選擇的)
這裡我想再次強調保持好奇心和持續學習。不要僅僅是呼叫 Spark MLlib 或者 XGBoost 的 API ,
要試著去弄懂背後的原理。例如為什麼隨機梯度下降適合於分散式訓練,
為什麼 XGBoost 與傳統的 GBDT 不同,它的損失函式有何特殊之處,為什麼它需要計算二階導數等等。
面試流程
從回覆 Linkedin 上 HR 的訊息和尋求推薦開始。在嘗試一次申請某明星創業公司失敗後(後文中我會談到),
我開始了幾個月的艱苦準備。在招聘人員的幫助下,我安排了在灣區一週的現場面試。
我週日飛往矽谷,這樣我有五天時間和世界上那些最牛的技術公司進行約 30 場面試。
非常幸運地是,我拿到了他們中的五家公司的錄用通知。
電話面試
電話面試是這些公司的標配,不同的是面試時長。一些公司如 LInkedin 要一個小時,而 Facebook 和 Airbnb 則是 45 分鐘。
專業性是電面關鍵。因為你只有的有限的時間而且通常只有一次機會。你必須要很快的識別出問題的型別並給出高水平的解決方案。
要確保告訴面試官你的想法和意圖,在一開始這可能會降低你的速度,但溝通是面試中最重要的也是最有幫助的。不要背誦你的答案這很容易讓面試官看穿。
對於機器學習崗位有些公司會問 ML 的問題,如果你被面試這些確保你準備好了這些技能點。
為了更好的利用我的時間,我在同一下午安排了三個電話面試,每個間隔一小時。
這樣的好處是我一直處於手熱的狀態,不好的地方是如果第一個沒發揮好可能會影響接下來的表現。所以我不推薦大家都這麼做。
同時面試多家公司的一個好處會給你帶來一定的優勢。一次電面以後我就成功的跳過了 Airbnb 和 Salesforce 的第二輪電面因為我已經獲得了 LInkedin 和 Facebook 的現場面試
更讓人驚喜的是 Google 在得知我下週有四個現場面試後竟然讓我跳過了他們的電面直接安排我現場面試。我知道這將使我非常勞累,不過沒有人能夠拒絕 Google 的現場邀請。
現場面試
這是我在 Sunnyvale 的第一個現場面試,這裡辦公室總是窗明几淨人們看起來非常專業。
每輪面一個小時,編碼問題中規中矩,但 ML 的問題有點難度。儘管如此,我從 HR 哪裡收到的準備資料起到了很大的幫助。直到面試結束,並沒有讓我太吃驚的問題。
我聽說 Linkedin 有著矽谷最好的伙食,如我所察如果不是真的,也差不遠了。
被微軟併購以後,看來 Linkedin 甩掉了財政負擔,他們開始甩開膀子做真正酷的事,讓人心動的新特徵如視訊,專業廣告等。作為一個關注專業發展的公司,Linkedin 優先增長它的員工。
很多團隊如廣告和訂閱相關的都在擴張,所以抓緊行動如果你想加入。
Salesforce Einstein
明星團隊做的明星專案。這是個相當新的團隊,感覺像一個創業公司。產品是構建在 Scala Stack 上的, 所以在那裡型別安全是實實在在的。Matthew Tovbin 在 Scala Days Chicago 2017,Leah McGuire 在 Spark Summit West 2017 進行過偉大的演講。
我的面試是在 Palo Alto 的辦公室。 他們團隊有很強的文化凝聚力和非常好的工作生活平衡。每個人都對在做的事情充滿激情很真正喜歡。四輪面試下來,整體上比其他公司要短,但我多希望我能待得再長一點。面試完後,Matthew 甚至帶我到惠普的車庫轉了一下。
絕對的行業老大,無需多言婦孺皆知的 Google 。但它真的非常非常的大。 花費了我 20 分鐘的時間騎車去見我的朋友。 排隊點餐的人也很多,對程式設計師而言這永遠是一個美好的地方。
我在 Mountain View 園區眾多樓宇中的一座裡進行的面試,我不知道具體是哪一個,因為實在是太大了。
我的面試官們看起來很聰明。當他們開始談論的時候你會發現他們更加聰明。如果和這幫人一起工作那將是多麼的愉悅。
Google 的面試我覺得一點特別是對時間複雜度的分析特別重要。確保你真的明白大 O 的涵義。
Airbnb
迅速增長的獨角獸企業,有著獨特的企業文化和號稱灣區最美的辦公環境。新產品如餐廳預定,高階細分市場,中國市場的擴張等都預示著公司光明的前景。如果希望快速成長和 pre-IPO 的體驗,並能忍受風險,這將是一個完美的選擇。
Airbnb 的程式碼測驗有一點特別,因為你將在 IDE 上而不是白板上寫,所以你的程式碼要能夠編譯並給出正確答案。有些問題確實非常困難。
他們還有所謂一種跨職能面試。這是 Airbnb 重視公司文化的方式,僅僅技術上優秀並不能保證被錄用。兩輪跨職能面試讓我飛常愉悅。我和麵試官進行了輕鬆的交談,會話結束後我們都很愉快。
整體上我覺得 Airbnb 的現場面試是最難的,因為問題很難,時間也很長並且有跨職能的面試。如果你有興趣,務必瞭解他們的文化和核心價值。
和 Google 相比,Facebook 另一個還在快速增長的巨頭,小但快節奏。它的產品線壟斷了社交網路,並且重點投資了 AI 和 VR ,顯然未來 Facebook 有著巨大的增長潛力。和大牛們如 Yann LeCun 和 Yangqing Jia ,這機器學習人士工作的樂土。
我在 20 號樓進行的面試了,那裡有樓頂花園和美麗的海景。祖克伯的辦公室也在那裡。
我不確定面試官是不是得到指示,但我沒有得到明確的提示關於我的答案是否正確。我還是相信公司指示他們不要評價候選者答案的正確性。
前四天的勞碌給我身體帶來了影響,中午我開始頭疼,我堅持把下午的面試進行完。我覺得自己一點沒發揮好。當收到他們給的錄用通知時我確實有點小吃驚。
總體上我覺得這裡的人相信他們公司的願景,也都為他們做的事情而驕傲。作為一個市值五千億美金並且快速增長的公司,Facebook 是開始你職業生涯的理想公司。
薪資談判
這是一個巨集大主題,在這我不去談論。 有興趣的可以參照這篇文章。
一些我認為重要的事:
- 表現要專業
- 利用你的資源
- 對專案和團隊真正的興趣
- 保持耐心和自信
- 決絕但有禮貌
- 不要撒謊
我失敗的面試經歷 - Databricks
失敗是成功之母,當然也包括面試。
在開啟上述矽谷面試之旅前,五月份時我面試 Databridck 失敗了。
四月的時候, Xiangrui 通過 Linkedin 聯絡我,問我是否對 Spark MLlib 團隊的職位有興趣, 這讓我非常心動。因為 1) 我使用 Spark 熱愛 Scala, 2) Databridck 的工程師是最一流的,
3) Spark 徹底改變了整個大資料世界。這是一個不能錯過的機會,所以幾天後我開始了這次面試。
Databridck 的門檻相當高處理流程也相當的長,包括一次初審問卷表,一次電話面試,一次程式碼測試和一次現場面試。
我成功的獲得了現場面試的邀請,並訪問了他們在舊金山市中心的辦公地點,在那我們能看到金銀島。
我的面試官是個極具聰明才智又同等謙遜的人。面試過程中我經常感覺被逼到了極限。面試還算進行的順利直到一輪災難性的面試,我完全搞砸了因為技能不過硬和準備不充分,最終慘敗。
Xiangrui 真的很善解人意,面試結束後陪我走了一段,我非常感謝和他的交談。
幾天以後我收到了拒信。和預想的一樣,儘管如此這還是讓我沮喪了好幾天。雖然錯去了在 Databricks 工作的機會,我還是衷心的希望他們能夠繼續取得更大的影響和成功。
一點感想
- Life is short. Professional life is shorter. Make the right move at the right time. 人生短暫,職業生涯更短。正確的時間做正確的選擇
- Interviews are not just interviews. They are a perfect time to network and make friends. 面試不僅僅是面試,更是擴充套件人脈和交朋友的最佳時機
- Always be curious and learn. 始終保持強烈的求知慾
- Negotiation is important for job satisfaction. 想獲得滿意的工作,談判技巧很重要
- Getting the job offer only means you meet the minimum requirements. There are no maximum requirements. Keep getting better. 被錄用只是證明你達到了最低要求。人生沒有上限,做更好的自己
從五月的第一次面試到最終九月底拿到錄用通知,我的第一次跳槽是這麼漫長和不易。
這對我真的不容易,因為我需要保證我現在的工作按期完成。連續幾個周我都是準備面試到凌晨一點然後第二天早上八點半起來全身心準備一天的工作。
五天面試五家工作非常的有壓力和冒險,我不建議大家這樣做除非你日程特別趕。但是這樣做也確實有一個好處,就是在手握多個 offer 時,你會在談判的時候更具優勢。
我在這裡要感謝我所有的招聘者,感謝他們耐心的幫我安排所有的流程,感謝他們的時間跟我交流並安排面試的機會以及最終給我錄用通知。
沁人心扉
最後也是最重要的是,我要感謝我的家庭,感謝他們對我的愛和支援。感謝我的父母,他們一直在關注我邁出的每一步。感謝我親愛的老婆為我做的一切還有我親愛的女兒和她暖人心扉的微笑。
也感謝這篇長文的讀者們。
Xiaohan Zeng
10/22/17
譯者更新:作者最終選擇了 Airbnb 的 offer , 並將於 11 月入職。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。