昨天我經歷了人生第一場谷歌面試,作為谷歌全家桶的忠實擁躉和半路出家的新手程序媛,不論結果如何,還是很激動有機會參加面試。
每次面試結束后我都會寫下給自己看的個人反思記錄,但是曉穎鼓勵我把這次面試經歷寫成文,一來能和更多人分享經驗,二來自己也可以好好總結總結。
我申請的是谷歌倫敦分部的 TTS Team 的開發職位。不太了解自然語言處理(NLP)的讀者可能不知道 TTS (Text To Speech) 是什么;簡單地說,就是研究如何從文本合成語音的技術,比如谷歌翻譯就有個“發音”的選項,你可以聽到機器來朗讀多語種文本。
我在面試前就犯了個“嚴重”錯誤,直接導致面試時發揮不佳(還沒收到結果,不過我估計這次面試掛了)。什么錯誤呢?兩天前,HR突然詢問我可不可以參加第二天中午的面試,我當時沒多想先同意了。但不到一天的準備時間實在太少,在后來面試快結束時我有種強烈感覺:如果多幾天準備時間,很多問題我完全可以答得更好。面試時間安排一般都可以與公司商量,所以如果下次碰到類似情況,我肯定會吸取教訓選擇多要一個周準備時間。
我人在德國,所以安排了視頻面試。面試我的是谷歌倫敦同部門的兩個員工,一個項目經理,一個高級工程師。在面試前我做了一點背景調查,所以大致了解兩位面試官的教育背景和工作經歷,這樣在他們自我介紹時我不至于覺得措手不及。
面試持續一小時,通過 Google Hangouts 視頻對話,利用 Google Docs 現場解題(谷歌在線文檔的多人實時編輯功能做得太好,打字速度、停頓、光標位置所有參與者都可以立即看到,所以,壓力還是蠻大的)。整場面試分為三大部分,先針對過去的工作經驗提問,接著提問 TTS 領域內的專業問題,最后是編程測試。
如果不是視頻面試而是現場,一般會讓面試者在白板上寫代碼,同樣是一小時左右。如果應聘軟件開發類職位,大概會有2/3的時間都在編程與算法題目上,剩下1/3時間才會問與技術關系不大的綜合問題(信息來自谷歌求職官網)。
上周我才寫了一篇關于如何提一個好問題的文章,這周就參加面試被人提問。我由衷地覺得,雖然好幾次被問倒,但谷歌的面試官真的好會提問!因為只有幾小時時間可以準備,所以大部分我能想到的面試問題也只是在頭腦中過了一遍,沒琢磨太多,更沒空背題。針對過去工作經驗,面試官不僅問我具體做了什么,我的工作對于團隊有多重要,具體工作任務中的重點與難點,還會抓住某個技術性細節反復追問:
“針對那個難題你用了什么方法?效果如何?有什么缺點?為什么不用xyz?”
總之,除了要考證面試者的經歷真實性外,還要看到面試者的思維能力——
是的,我覺得這才是谷歌面試的考察重點。聽一下來自谷歌面試官的真切發問:
“你解決問題的思路是什么?”
接下來,關于 TTS 的專業問題。其實我完全沒有這個領域的經驗,不過我語言學的背景和掌握的概率知識對分詞和語音合成的問題有所幫助,加上提前幾小時細讀了幾個相關的 wiki 詞條,所以大體思路都還過得去。在這兒就不得不再多夸維基百科 (英文版) 一次了——當提到維基百科時,總有人說維基不夠學術不夠權威;事實上,有人做過調查,由于維基百科的維護者遍及全球、數量眾多、更新極其頻繁,上面內容的準確度完全可以和專業學術期刊相媲美。對于想快速了解某個新領域的人來說,認真搞懂幾個相關維基詞條 (英文) 就能達到高度 basic knowledge 的程度。
最后,是我最擔心的編程測試環節。擔心一方面是因為自己學術不精,畢竟是半路出家,還得好好修煉;另一方面是因為……我還需要提高自己承受別人注意力的能力。我之前發過一條微博,就是關于“當眾寫碼恐懼癥”的;不僅是編程,面試也不是我的強項,朋友就曾經評價過我有“interview voice”——面試時由于太緊張,聲音聽起來像另一個人。對于這一點我只能多練習,碰到感興趣的職位就去投簡歷試試,能進入面試的話就又多一次真實的練習機會。
不過,由于我這次申請的職位不是純粹寫代碼的軟件開發崗,所以面試官出的編程題都較為初級。如何根據 TTS 的產品需求來分詞,以兩種方法寫驗證 palindrome 的 python 小程序,根據面試官給的一系列 pattern 寫正則表達式 (regex) ,最后測驗常見 unix tools 的命令行代碼(來查看修改文檔、編排格式等)。我卡在了最后一步——雖然我平時常用命令行,但碰到復雜些的情況,都會去求助 stackoverflow……如果當下問題解決了,我會把未來可能再用到的命令行收集到一個記事本里。但整理完的命令行“收集簍”我卻很少再回頭去研究。在這次面試中,我突然意識到,記住解決某個具體問題的代碼 (WHAT) 只是最最低的要求,知道下次該如何靠自己舉一反三地解決問題(HOW) 才初步具備了合格程序員的基本素質。再近一步地,若能理解到底為什么那么做(WHY) 則最好不過了。
在我卡殼時,那位高級工程師面試官一直在試圖通過提問 HOW 和 WHY 來幫我找回思路:
“你是如何思考這個問題的?為什么要這么寫?”
比起幾行沒有語法錯誤的代碼,面試官明顯更感興趣我的思維過程 (thought process) 與表達能力。
但我當時的狀態很像下面這個網友的評論:
讓我想起高中時同學常開的玩笑,數學記不住公式就在考場上當場推導好了!我面試時倒是可以想起公式,但不知道該如何重新推導。
最后推薦一篇谷歌面經?Get that job at Google?吧 ,是谷歌高級工程師 Steve Yegge 08年寫的,在網上流傳多年依然被視為經典 (考慮到很多人不能訪問 blogspot,我就把完整文章放在 這兒?了) 。其實對于任何想從事軟件開發的人來說都值得一讀,文章并不局限于面試經驗,更多的是工程師應該具備的基本數學與計算機素養。