記一次 Google 面試經歷

2016-05-09    分類:推薦閱讀、程式設計師人生、首頁精華3人評論發表於2016-05-09

本文由碼農網 – 小峰原創翻譯,轉載請看清文末的轉載要求,歡迎參與我們的付費投稿計劃

這是我上週去面試的地方。很順利,我覺得——至少我認為我已經盡我所能,並且無論發生什麼事情對我都是有幫助的。

由於我簽署了保密協議,所以我不能把他們問我的問題寫出來。但是,我可以寫我大概的面試過程,以及我做了哪些準備。

首先,這是谷歌——所以我當然不會讓我在那裡工作的朋友不推薦我。我沒有經過電話採訪,因為我是“本地”的,所以我被直接邀請到公司面試。我個人認為,面對面絕對比電話面試好,我很幸運。

首先,我和招聘人員很簡短地聊了一下,他告訴我我需要使用白板和程式,然後是兩個軟體工程師分別對我進行了45分鐘一對一的兩場面試。然後我很驚訝自己居然發現了面試的樂趣!通常情況下我在面試時感受到的只有壓力,但是Google的面試真的很棒,因為沒有笨蛋的參與,不會有對牛彈琴的尷尬。超酷!第一場面試的問題相當容易,而第二場則有點難,但也不算太糟糕。可能最困難的是在白板(而非計算機!)上寫程式碼——在白板上很難做TDD!他們告訴你沒有必要盛裝出席,因此絕對不要裝扮儀表——因為你需要坐在地板上寫程式碼,而且不是一時半會就可以在白板上寫完的,還會寫得滿手都是油墨。想象一下如果你穿著裙子會怎麼樣!

他們發給我了一系列很有幫助的面試準備。由於我堅實的學習基礎,所以在一定程度上我都有所涉獵。此外平時我還會做這些事情——及時瞭解最新的行業新聞,廣泛使用Google產品,寫部落格,以及思考技術如何改變我們的生活(是的,最後兩件事情很有幫助)。我會深刻理解和使用Java 5的新產品,例如GenericsEnums,for-each等。

下面是我準備的內容(所有的圖書連結均連結到Amazon):

  • 閱讀《Effective Java》(第2版)——不帶任何誇大之詞,這本書助我成為了一名合格的Java程式設計師
  • 閱讀《Programming Interviews Exposed(程式設計面試攻略)》,並通過所有練習——概述和複習基本的資料結構,如列表和樹。遞迴部分沒有我自己學到的那麼強大(因為我有著函式背景),它反而主張編寫迭代方法,不過除此之外,這的確是一本既非常好又有用的書。
  • 閱讀《Coders at Work》——這本書中談到了很多的谷歌人,表達了作者對文化的觀點。它還介紹了很多我不知道的卻又非常有趣的程式設計歷史,以及關於這些歷史偉人如何解決問題的見解,以及對於API、可擴充套件性等的討論。
  • Combinatorial Algorithms: Generation, Enumeration, and Search》(我幾乎看過整本書,並上過一門關於組合演算法(Combinatorial Algorithms)的課程)——說實話,我不是這本書的狂熱愛好者。我覺得這本書的數學符號氣息太重。因為我們是程式設計師,而不是數學家,所以使用實際程式碼來解決問題可能更有幫助,並且維基百科幾乎可以肯定更具可讀性。
  • 研究《Java Puzzlers》——有助於培養鑽研程式碼,研究問題的心態。雖然並沒有人要求我這麼去做,但我確實需要批判性地看待自己的程式碼。IBM的面試中就提到了關於EB手機螢幕的問題,而且谷歌也用了那一類的問題。
  • 複習併發問題——死鎖、活鎖、 互斥鎖、核心鎖、訊號量等。什麼時候在Java中使用synchronized關鍵字?如何避免死鎖?如何避免活鎖?
  • 複習樹的遍歷——前序,中序,後序。深度優先搜尋vs.廣度優先搜尋。 A *,Dijkstra演算法等。
  • 複習平衡二叉樹——紅黑樹、AVL樹、伸展樹。
  • 複習圖表。表示圖,最小生成樹,搜尋等。
  • 執行時分析。
  • 6種排序演算法編碼——包括關鍵的時間複雜度為n log n的演算法——TDD風格(測試驅動開發——關於我的測試案例請看這個帖子)。
  • 雜湊表編碼,只使用陣列。包括:泛型,動態陣列,延遲初始化。此外還有測試先行。
  • 做一做所有手頭可以獲取的實踐問題——搜尋“谷歌面試問題”,但不要浪費時間在什麼面試預測或井蓋問題上,要找類似問題——有時,我在Eclipse中編碼,但有時在Google文件中。我喜歡和朋友一起工作,他會審查我的程式碼,並提出問題。
  • 和已經在那裡工作多年的朋友交談。問很多問題。他真的很贊,幫我做了很多的準備工作。不僅如此,瞭解他為什麼認為我會是一個不錯的求職者,以及他為什麼會相信我可以做好,有助於我知道自己為什麼要在那裡工作(這是一個老生常談的問題,雖然這家公司是Google,但正如我的一個導師說的那樣,你想為他們工作的熱切程度得和他們想要你的程度差不多)。

我的Google朋友說我做了“瘋狂的準備”,甚至可以說我做了充分的準備——那麼,除此之外,我還做了什麼呢?

  • 更多地執行時分析——儘可能多找到程式碼進行分析。
  • 計算總和。例如,如何計算1至n的和?事實證明是有用的。第二次面試中就涉及到了回放執行時分析,因為我有一些東西看起來是這樣的:(n-1)(n-2)+(n-2)(n-3)+ … +(3)(2)+(2 )(1)。當然,我並沒有在當時建立它,所以它的時間複雜度上限為O(n³)。
  • 複習Java庫的資料結構。有一回,我說了這樣的話,“我知道一個不重複的資料結構,但我現在一時想不起它的名字”。後來在當天下午我想起來了。
  • 複習庫方法,複習一些關鍵的東西——陣列和字串將會很有幫助。
  • 在白板或紙上練習編碼。也許你理所當然地認為插入行或重構很簡單,事實上,當你在白板上寫程式碼的時候,肯定沒有在計算機上趁手。而且我們很容易忘記返回語句——Eclipse中不需要我們這麼做。因此我傾向於先寫宣告和返回語句,然後再在中間補上程式碼——當然,在白板上可不能這麼做!

接下來要說的是?

Waiting。
Waiting。
Waiting!

無論發生什麼,我都希望能得到一些反饋。

編碼面試問題(以及測試用例!)

完成《Java Puzzlers》。

充分利用時間——我花了很多時間來做好諸多準備工作。

調查其他公司。特別是——與IBM員工見面,看看有沒有什麼東西適合用於Google。

聽取導師的意見。

譯文連結:http://www.codeceo.com/article/my-google-interview.html
英文原文:INTERVIEWING @ GOOGLE
翻譯作者:碼農網 – 小峰
轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊。]

相關文章