02.28 谷歌大牛手把手教你搞定面試

Pablo Samuel Castro是谷歌Brain的一名高級研究員,其研究內容包括強化學習、機器學習等。近日,Pablo分享了他作為谷歌面試官的一些經驗,以期對有意向到谷歌工作或從事軟件工程工作的研究者有所幫助。


人們經常問我:怎樣才能在谷歌找到工作?基本要求是通過面試;這又會涉及另一個問題:我是如何通過谷歌面試?


雖然通過谷歌面試沒有硬性規定,但我確實有一些在過去幫助過別人(包括我自己)的技巧和指導方針。儘管這篇文章的大部分內容都是谷歌特有的,但大部分內容仍然應該適用於其他公司的軟件工程職位。


這篇文章主要適用於軟件工程(SWE)的職位,但其中的一些內容應該也與其他職位相關(如研究科學家);在結尾處可以看到關於這個職位的一些想法。雖然谷歌的面試流程不是很完美,但是我覺得它是很好、很客觀的。


無論結果如何請記住,你的價值不應該由是否得到了這份工作來決定。

背景介紹

我應該申請谷歌嗎?這是一個常見的問題,答案几乎總是:是的!這將挑戰你的極限,你可能會學到一些你可以提高的東西,如果你確實嘗試了,但沒有成功,我保證你會成為一個更強的程序員或面試官。

當完成博士學位時,我的想法是成為一名學者,但當時的就業市場真的很糟糕(大約在2011年)。在主管的建議下,我申請了谷歌。這是我申請的唯一一份行業工作,因為這是我最感興趣。


但是在我決定申請之後,我為面試做了很多準備。我確信,如果我在申請當天就參加面試,我是無法通過面試的:我花在準備面試上的時間是至關重要的。


當我參加面試時,我覺得我已經做好了最大的準備。我的努力得到了回報:我收到了加入匹茲堡谷歌的工作邀請,從2012年開始就在谷歌做SWE。


最全面經 | 谷歌大牛手把手教你搞定面試

我在Google匹茲堡的辦公桌


文章的其餘部分是我的經驗:

  • 為面試做準備


  • 作為SWE在谷歌工作


  • 進行數百次採訪


  • 主持數十個面試研討會


  • 成為招聘委員會成員


  • 在谷歌內外,我與許多人進行了討論。


這裡的建議並不能保證你能得到谷歌的工作,但它應該會有所幫助。

如何準備谷歌面試?


你可以在谷歌求職網站上找到你認為合適的工作。

找人推薦會有幫助,如果你認識已經在谷歌的人,讓他們推薦你。如果你不認識谷歌的任何一個人,你已經申請了職位,但是在一段時間裡沒有收到回覆了,請隨時把你的簡歷發給我,我看看有什麼我可以做的。


注意,這仍然不能保證你會得到面試機會。不幸的是,我對應徵者如何被選中參加面試知之甚少,在面試過程中的影響力也有限。

我如何準備谷歌面試?

至少有三個要素能讓你在面試中表現出色:編碼、算法和數據結構,以及個性。谷歌經常有研討會,你可以做模擬面試。

編碼

你需要能夠編寫功能代碼,最理想的情況是能夠立即編譯/運行。語言不是特別重要,但是你需要具體說明你想用什麼語言面試,所以一定要掌握好。偽代碼不是一種語言。

貧乏的編碼

如果依賴於花哨的 IDE來編寫代碼,那就去做最基本的工作吧!無論你用什麼程序來寫代碼,請關閉語法高亮和自動完成。事實上,嘗試使用一個基本的vim來編寫所有的代碼是大有裨益的(即使在今天,我仍然使用一個非常簡單的vim來編寫大多數東西,包括這篇博客文章),我想你也可以使用Emacs。

練習、練習、再練習

準備面試的時候,我主要用c++編程,所以我決定專注於此。我發現了一個在線編程比賽,它有以前比賽的日誌,這樣我就可以“假裝”自己在比賽。很棒的是,這個在線服務可以以編程方式檢查我的代碼的語法和算法正確性。


我做了足夠多的工作,最終可以從頭開始編寫c++代碼來編譯並解決這個問題。在做到這一點之前,我經歷了很多很多的反覆。很長一段時間,我仍然需要查找需要包含哪些庫,如何正確地執行I/O等等。


我不記得我使用了什麼網站,但似乎topcoder有一個實踐問題領域,可以達到相同的目的。

瀏覽glassdoor這樣的網站也是很有用的,那裡有很多過去谷歌的面試。嘗試解決所有這些問題!請注意,如果你在這樣的地方看到了問題,你在真正的面試中被問到這個問題的可能性很小。

在白板上寫代碼

試著在白板上寫代碼(如果沒有粉筆或白板,也可以用手寫)。在白板上寫代碼感覺是很不一樣的,但這就是你在面試中要做的。最好是你已經有了一些經驗,我的建議是在白板上練習寫完整的程序,然後在你的電腦上編碼,並確保一次編譯/運行。如果沒有,再試一次!

當別人在看的時候,在白板上練習編碼也是非常有用的,可以讓你適應潛在的焦慮反應。

雖然有一些語法錯誤是可以接受的,但是我們要注意的是,如果代碼很粗糙,而且語法錯誤很多,這表明你使用的是你可能不太熟悉的語言。

算法和數據結構

我用來準備面試的那本書是我本科時用過的:托馬斯·h·科曼(Thomas H. Cormen)、查爾斯·e·雷瑟森(Charles E. Leiserson)、羅納德·l·裡維斯特(Ronald L. Rivest)和克利福德·斯坦(Clifford Stein)合著的《算法導論》(Introduction to Algorithms)。

這裡並沒有太多需要了解的算法和數據結構,但是這裡有一些事情是你絕對應該知道的,並且是需要非常熟悉的。請注意,這絕不是詳盡無遺的,如果你覺得我遺漏了什麼,請告訴我!

分類:你瞭解幾種不同的分類方法,什麼時候會用?他們的複雜性是什麼?


鏈表:它們是什麼?你能從頭開始編寫鏈表嗎?插入的複雜度是多少?刪除嗎?搜索嗎?什麼時候使用鏈表?鏈表有不同的類型嗎?


散列函數:什麼是散列函數?什麼是好的散列函數?衝突是什麼?如何處理碰撞?平均複雜度?最壞的複雜性?


二叉樹:二叉樹是什麼?你能從頭開始編寫二叉樹嗎?什麼是二叉搜索樹?搜索的複雜度是多少?插入嗎?刪除嗎?樹的平衡意味著什麼?複雜性?動態規劃是什麼?有什麼用處?你能用它來解決一個問題嗎?


圖形算法:圖形遍歷(BFS/DFS)、有向圖和無向圖,你可以從頭編寫圖形數據結構的代碼嗎?什麼時候用圖表?修改圖形有哪些不同的方法?


上面的列表並不是需要了解的全部內容,但我認為知道這些都是應該的。

就像編碼一樣,關鍵是練習、練習、再練習。當你處理不同的問題時,請考慮解決這些問題的最佳數據結構。

它已經在上面的列表中有所暗示,但是你應該能夠對你編寫的任何代碼執行復雜性分析(即big-O)。我個人幾乎總是在候選人寫完他們的代碼後問這個問題,因為這表明他們能夠分析他們實現的有效性。


正如我將在下面詳細介紹的,即使你只能為一個問題提供一個簡單的解決方案,如果你能夠正確地分析它,也會有很大的幫助。

個性

這個有點難準備,但它仍然很重要。作為面試官,我們需要問自己的一個問題是:我願意和這個人一起工作嗎?


如果你是個天才,能夠解決拋給你的所有問題,但你在面試中表現得十足差的話,那麼你被錄用的機會就很低。關於準備工作,我沒有太多的建議,但在面試過程中有幾點需要記住,我會在下面列出。

面試的時候


恭喜你,你已經安排好面試了!這已經是很大的成功了,(不是每個人都被邀請參加面試),所以你應該為自己感到自豪。這裡有一些重要的事情要記住:

  • 把它當作一次談話,而不是審問。雖然在面試中存在明顯的權力不平衡,但我們並不是要欺騙你或讓你犯錯。事實上,我們大多數人都在暗中支持你!


  • 談談你的思考過程。一定要把腦子裡的想法用語言表達出來,尤其是在你把代碼寫在白板上之前。作為面試官,我們需要為你的良好表現提供證據,所以通過你的思考來說話可以幫助我們收集證據。此外,如果你誤入了我們不想花時間解決的問題,我們也可以更容易地幫助你。如果你保持沉默,直接編寫錯誤的代碼,我不知道這是因為你偏離了軌道,還是因為在你的思維過程中有一個簡單的誤解。另一方面,如果你保持沉默,直接編寫完美的代碼,我將不知道你是否真的很聰明,或者你是否已經看到了我剛才提出的問題。


  • 簡單的解決方案是很好的起點。不要覺得必須馬上想出最有效的解決方案。從幼稚的解決方案開始是一個偉大的戰略,原因如下:


  • 儘管這個問題看起來微不足道,但通常存在一些難以預料的複雜情況。它們更容易通過簡單的解決方案找到並解決。
  • 它允許你非常快速地將代碼放到板上,這對於收集對你有利的證據非常有用!
  • 簡單解決方案的複雜性分析可能比更復雜的解決方案容易得多。


  • 如果你能很快地編寫出簡單的解決方案,那就太好了!一旦它停止了,你可以轉移到更復雜的解決方案,但至少你有一個作為基線的解決方案。


  • 對於面試官來說,理解一個簡單的解決方案要比理解一個複雜的解決方案容易得多。你希望面試官理解你的解決方案:你不會因為欺騙/迷惑面試官而得到分數!


  • 遍歷一個簡單的解決方案是代碼的“手動分析器”,它可以幫助你識別冗餘的工作和優化的機會(感謝Pascal,對於這一點)。


  • 回到這是一個對話的問題上。從一個簡單的解決方案開始,很明顯你知道一個解決方案。然後你可以問面試官你是否想找一個更好的解決辦法。


  • 但是再一次,你要確保告訴面試官你從一個簡單的解決方案開始。


  • 可以簡化假設。如果它可以幫助你更清楚地思考問題,那麼完全可以進行簡化假設(例如,“我可以假設列表已經排序了嗎?”),其原因與簡單解決方案類似。這實際上是一個很好的信號,因為它表明你可以將一個問題分解為多個部分,並且你可以識別那些導致更多問題的部分。一旦你用簡化假設解決了這個問題,你就可以得到一個不需要假設的解決方案;至少你已經有了一個有效的解決方案!


  • 使用測試用例。提出一些可以在代碼上測試的測試用例。寫下一些測試用例將幫助你確保你的代碼是正確的,它也可以幫助你說服面試官!此外,當你試圖與面試官消除誤解時,在面試板上有一組具體的例子是非常有用的。面試官甚至可能會增加一些額外的測試用例來突出你可能錯過的一些邊緣用例。花幾分鐘整理一下思緒是可以的。即使我建議你把你的想法從頭到尾說一遍,也不要覺得有必要從頭到尾都說一遍,尤其是如果你還沒有把你的想法完全組織好,因為這往往會讓你誤入歧途。簡單地說“我能花一兩分鐘整理一下我的思緒嗎?”,然後在你的頭腦中解決問題,重要的是讓面試官知道你在做什麼。,果你覺得整理思緒的時間太長,你可能會被問題的一部分弄糊塗,這就引出了我的下一個觀點:


  • 尋求幫助是可以的。如果你感覺被困住了,可以尋求幫助,但要儘量具體說明你的問題癥結是什麼。通常可能只是你在問題中誤解了什麼,你沒有注意到問題的一個關鍵方面,有時甚至可能是面試官忘記提及問題的一個重要部分!我曾經遇到過這樣的面試,應聘者似乎真的被難住了,但只要我給他們一點幫助,他們就能解決問題。


  • 不知道也沒關係。在進行訪談時,我實現了一個自定義數據結構,以簡化解決方案的其餘代碼。面試官問我:“你為什麼不用地圖呢?”,我回答說:“我不知道那是什麼。”面試官很快在黑板上解釋了地圖的語法,然後我就能更快地解決這個問題了。我不知道我是否因為不知道而被扣分,但我得到了這份工作。


  • 沒有單一的“正確”解決方案。至少在大多數面試中不是這樣。我最喜歡問的問題是那些我可以很快陳述的,容易理解的,承認幼稚和更有效的解決方案,並且可以很容易變得更復雜的問題。我想大多數面試官都會問這類問題。這意味著我們不希望你得到答案,越遠越好!


  • 不要問你的解決方案是否正確。最好是試著通過測試示例來完成你的解決方案,並說服你自己(和麵試官)它是正確的。

  • 別怕有分歧。不同意面試官的觀點是可以的,但是要有禮貌。使用具體的工件(例如代碼和測試示例)來為你的參數打基礎確實很有幫助;只說不做的討論常常會導致誤解,這會佔用你有限的時間。試著去理解面試官的觀點(即使他們看起來是錯的),並且冷靜地確保面試官理解你的觀點。


  • 把每次面試都看作是一個新的開始。如果你覺得你的一次面試非常糟糕,試著把這件事拋到腦後(或者推遲到一天結束的時候再考慮這件事),重新開始下一次面試。我知道這說起來容易做起來難,但是要記住,下一位面試官不會知道你在前一次面試中的表現。正如下面所描述的,即使你的一次面試很糟糕,你仍然可以通過面試!


  • 如果有時間,可以問面試官一些問題。在面試結束時,我儘量會留出一些時間,讓面試者問一些關於在谷歌工作、我的角色/經驗等方面的一般性問題。這不是必須的,但如果你有一些問題,而且確實是你熱切和感興趣的,你可以問一些。如果你已經沒有什麼問題可以問了,一個好的問題是讓面試官告訴你他們在谷歌的角色和經驗。不要問“我在面試中表現如何?”或者“正確的解決方案是什麼?”,因為我們無法回答,而且這可能會讓事情變得尷尬。

面試結束後


唷!你成功了,再次祝賀你!隨後的過程如下:

  • 每個面試官都會為你寫他們的反饋,並提供僱傭/不僱傭的建議。面試官看不到其他面試官的反饋。


  • 你的簡歷——包括所有東西:你的簡歷、面試反饋、過去的面試等等——會經過幾個招聘委員會的審核(但我不知道具體有多少)。這是一群谷歌人(沒有一個面試過你),他們會通讀你的簡歷,並根據你的簡歷內容提供他們自己的招聘建議。將有許多人閱讀你並提供反饋。


  • 根據招聘委員會的決定,可能會發生以下幾種情況:


  1. 你被錄用了!
  2. 你被要求接受額外的面試。這並不一定意味著你在面試中表現不夠出色。可能有很多不同的原因,比如有一種技能在面試中沒有得到恰當的評估。
  3. 你被考慮扮演一個不同的角色。再說一遍,這並不是一件壞事,這只是意味著根據你的分組,不同的委員會認為不同的角色更適合你。這可能會涉及到一些額外的面試。最後,這是一件好事,你申請的職位可能不是你想的那樣。
  4. 你沒有得到工作機會。如果這是你的結果,我很抱歉。在谷歌獲得一份工作是非常困難的,人們已經暗示有很高的假陰性率。所以不要氣餒!你為這次面試所做的準備工作,以及面試本身的經歷,肯定會幫助你在其他面試中表現得更好。最後,你可以在一年後重新申請!我查看了一開始收到無報價的信息包,一年後又收到了報價。

最後的一些想法

這篇文章比我預期的要長很多,但我真的希望它對你有用。雖然這篇文章主要是為谷歌的SWE面試而寫的,但是這些建議應該也適用於其他公司的SWE職位。


幾年前我為Shopify面試過,我運用了以上所有的技巧;我最終得到了一份工作機會,但我拒絕了,因為我被邀請加入了谷歌Brain(我現在愉快地在那裡工作)。

這篇文章對non-SWE角色也有一定的幫助。我最熟悉的non-SWE角色是研究科學家(RS)。我對RS角色進行了一些研究訪談,但還不足以提供具體的指導。然而,我要說的是,即使是對於RS角色,你也必須通過一些編碼面試。


我面試了一個應聘RS職位的人,他在理論方面很強,但在編程面試中表現很差,因此我提出了不聘用的建議 (這個人從來沒有加入谷歌,但我不知道他是否被錄用了)。

還有很多人分享了非常有價值的建議,Mekka Okereke在這個帖子中分享了一些很棒的建議,還有Steve Yegge,一些人也建議把《編碼面試》作為一本值得學習的好書。


參考鏈接:


https://twitter.com/mekkaokereke


http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html


https://twitter.com/mekkaokereke/status/1135981075086266368


原文鏈接:


https://psc-g.github.io/interviews/google/2020/02/25/interviewing-at-google.html



分享到:


相關文章: