Pablo Samuel Castro是谷歌Brain的一名高級研究員,其研究內容包括強化學習、機器學習等。近日,Pablo分享了他作為谷歌面試官的一些經驗,以期對有意向到谷歌工作或從事軟件工程工作的研究者有所幫助。
人們經常問我:怎樣才能在谷歌找到工作?基本要求是通過面試;這又會涉及另一個問題:我是如何通過谷歌面試?
雖然通過谷歌面試沒有硬性規定,但我確實有一些在過去幫助過別人(包括我自己)的技巧和指導方針。儘管這篇文章的大部分內容都是谷歌特有的,但大部分內容仍然應該適用於其他公司的軟件工程職位。
這篇文章主要適用於軟件工程(SWE)的職位,但其中的一些內容應該也與其他職位相關(如研究科學家);在結尾處可以看到關於這個職位的一些想法。雖然谷歌的面試流程不是很完美,但是我覺得它是很好、很客觀的。
無論結果如何請記住,你的價值不應該由是否得到了這份工作來決定。
我應該申請谷歌嗎?這是一個常見的問題,答案几乎總是:是的!這將挑戰你的極限,你可能會學到一些你可以提高的東西,如果你確實嘗試了,但沒有成功,我保證你會成為一個更強的程序員或面試官。
當完成博士學位時,我的想法是成為一名學者,但當時的就業市場真的很糟糕(大約在2011年)。在主管的建議下,我申請了谷歌。這是我申請的唯一一份行業工作,因為這是我最感興趣。
但是在我決定申請之後,我為面試做了很多準備。我確信,如果我在申請當天就參加面試,我是無法通過面試的:我花在準備面試上的時間是至關重要的。
當我參加面試時,我覺得我已經做好了最大的準備。我的努力得到了回報:我收到了加入匹茲堡谷歌的工作邀請,從2012年開始就在谷歌做SWE。
我在Google匹茲堡的辦公桌
文章的其餘部分是我的經驗:
為面試做準備
這裡的建議並不能保證你能得到谷歌的工作,但它應該會有所幫助。
如何準備谷歌面試?
你可以在谷歌求職網站上找到你認為合適的工作。
找人推薦會有幫助,如果你認識已經在谷歌的人,讓他們推薦你。如果你不認識谷歌的任何一個人,你已經申請了職位,但是在一段時間裡沒有收到回覆了,請隨時把你的簡歷發給我,我看看有什麼我可以做的。
注意,這仍然不能保證你會得到面試機會。不幸的是,我對應徵者如何被選中參加面試知之甚少,在面試過程中的影響力也有限。
我如何準備谷歌面試?
至少有三個要素能讓你在面試中表現出色:編碼、算法和數據結構,以及個性。谷歌經常有研討會,你可以做模擬面試。
編碼
你需要能夠編寫功能代碼,最理想的情況是能夠立即編譯/運行。語言不是特別重要,但是你需要具體說明你想用什麼語言面試,所以一定要掌握好。偽代碼不是一種語言。
貧乏的編碼
如果依賴於花哨的 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)。我個人幾乎總是在候選人寫完他們的代碼後問這個問題,因為這表明他們能夠分析他們實現的有效性。
正如我將在下面詳細介紹的,即使你只能為一個問題提供一個簡單的解決方案,如果你能夠正確地分析它,也會有很大的幫助。
個性
這個有點難準備,但它仍然很重要。作為面試官,我們需要問自己的一個問題是:我願意和這個人一起工作嗎?
如果你是個天才,能夠解決拋給你的所有問題,但你在面試中表現得十足差的話,那麼你被錄用的機會就很低。關於準備工作,我沒有太多的建議,但在面試過程中有幾點需要記住,我會在下面列出。
面試的時候
恭喜你,你已經安排好面試了!這已經是很大的成功了,(不是每個人都被邀請參加面試),所以你應該為自己感到自豪。這裡有一些重要的事情要記住:
把它當作一次談話,而不是審問。雖然在面試中存在明顯的權力不平衡,但我們並不是要欺騙你或讓你犯錯。事實上,我們大多數人都在暗中支持你!
別怕有分歧。不同意面試官的觀點是可以的,但是要有禮貌。使用具體的工件(例如代碼和測試示例)來為你的參數打基礎確實很有幫助;只說不做的討論常常會導致誤解,這會佔用你有限的時間。試著去理解面試官的觀點(即使他們看起來是錯的),並且冷靜地確保面試官理解你的觀點。
面試結束後
唷!你成功了,再次祝賀你!隨後的過程如下:
每個面試官都會為你寫他們的反饋,並提供僱傭/不僱傭的建議。面試官看不到其他面試官的反饋。
最後的一些想法
這篇文章比我預期的要長很多,但我真的希望它對你有用。雖然這篇文章主要是為谷歌的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