如何成爲一名Google工程師

[譯] Google Interview University 一套完整的學習手冊幫助自己準備 Google 的面試

這是?

這是我爲了從 web 開發者(自學、非計算機科學學位)蛻變至 Google 軟件工程師所制定的計劃,其內容歷時數月。

白板上編程 ———— 來自 HBO 頻道的劇集,“硅谷”

這一長列表是從 Google 的指導筆記 中萃取出來並進行擴展。因此,有些事情你必須去了解一下。我在列表的底部添加了一些額外項,用於解決面試中可能會出現的問題。這些額外項大部分是來自於 Steve Yegge 的“得到在 Google 工作的機會”。而在 Google 指導筆記的逐字間,它們有時也會被反映出來。


目錄

—————- 下面的內容是可選的 —————-


爲何要用到它?

我一直都是遵循該計劃去準備 Google 的面試。自 1997 年以來,我一直從事於 web 程序的構建、服務器的構建及創業型公司的創辦。對於只有着一個經濟學學位,而不是計算機科學學位(CS degree)的我來說,在職業生涯中所取得的都非常成功。然而,我想在 Google 工作,並進入大型系統中,真正地去理解計算機系統、算法效率、數據結構性能、低級別編程語言及其工作原理。可一項都不瞭解的我,怎麼會被 Google 所應聘呢?

當我創建該項目時,我從一個堆棧到一個堆都不瞭解。那時的我,完全不瞭解 Big-O 、樹,或如何去遍歷一個圖。如果非要我去編寫一個排序算法的話,我只能說我所寫的肯定是很糟糕。一直以來,我所用的任何數據結構都是內建於編程語言當中。至於它們在背後是如何運作,對此我一概不清楚。此外,以前的我並不需要對內存進行管理,最多就只是在一個正在執行的進程拋出了“內存不足”的錯誤後,採取一些權變措施。而在我的編程生活中,也甚少使用到多維數組,可關聯數組卻成千上萬。而且,從一開始到現在,我都還未曾自己實現過數據結構。

就是這樣的我,在經過該學習計劃後,已然對被 Google 所僱傭充滿信心。這是一個漫長的計劃,以至於花費了我數月的時間。若您早已熟悉大部分的知識,那麼也許能節省大量的時間。

如何使用它

下面所有的東西都只是一個概述。因此,你需要由上而下逐一地去處理它。

在學習過程中,我是使用 GitHub 特殊的語法特性 markdown flavor 去檢查計劃的進展,包括使用任務列表。

  • [x] 創建一個新的分支,以使得你可以像這樣去檢查計劃的進展。直接往方括號中填寫一個字符 x 即可:[x]

更多關於 Github-flavored markdown 的詳情

擁有一名 Googler 的心態

把一個(或兩個)印有“future Googler”的圖案打印出來,並用你誓要成功的眼神盯着它。

future Googler sign

我得到了工作嗎?

我還沒去應聘。

因爲我離完成學習(完成該瘋狂的計劃列表)還需要數天的時間,並打算在下週開始用一整天的時間,以編程的方式去解決問題。當然,這將會持續數週的時間。然後,我才通過使用在二月份所得到的一個介紹資格,去正式應聘 Google(沒錯,是二月份時就得到的)。

感謝 JP 的這次介紹。

跟隨着我

目前我仍在該計劃的執行過程中,如果你想跟隨我腳步去學習的話,可以登進我在 GoogleyAsHeck.com 上所寫的博客。

下面是我的聯繫方式:

John Washam - Google Interview University

不要自以爲自己不夠聰明

  • Google 的工程師都是才智過人的。但是,就算是工作在 Google 的他們,仍然會因爲自己不夠聰明而感到一種不安。
  • 天才程序員的神話

關於 Google

相關視頻資源

部分視頻只能通過在 Coursera、Edx 或 Lynda.com class 上註冊登錄才能觀看。這些視頻被稱爲網絡公開課程(MOOC)。即便是免費觀看,部分課程可能會由於不在時間段內而無法獲取。因此,你需要多等待幾個月。

很感謝您能幫我把網絡公開課程的視頻鏈接轉換成公開的視頻源,以代替那些在線課程的視頻。此外,一些大學的講座視頻也是我所青睞的。

面試過程 & 通用的面試準備

爲你的面試選擇一種語言

在這,我就以下話題寫一篇短文 —— 重點:爲在 Google 的面試選擇一種語言

在大多數公司的面試當中,你可以在編程這一環節,使用一種自己用起來較爲舒適的語言去完成編程。但在 Google,你只有三種固定的選擇:

  • C++
  • Java
  • Python

有時你也可以使用下面兩種,但需要事先查閱說明。因爲,說明中會有警告:

  • JavaScript
  • Ruby

你需要對你所選擇的語言感到非常舒適且足夠了解。

更多關於語言選擇的閱讀:

在此查看相關語言的資源

由於,我正在學習C、C++ 和 Python。因此,在下面你會看到部分關於它們的學習資料。相關書籍請看文章的底部。

在你開始之前

該列表已經持續更新了很長的一段時間,所以,我們的確很容易會對其失去控制。

這裏列出了一些我所犯過的錯誤,希望您不要重滔覆轍。

1. 你不可能把所有的東西都記住

就算我查看了數小時的視頻,並記錄了大量的筆記。幾個月後的我,仍然會忘卻其中大部分的東西。所以,我翻閱了我的筆記,並將可回顧的東西製作成抽認卡(flashcard)(請往下看)

2. 使用抽認卡

爲了解決善忘的問題,我製作了一些關於抽認卡的頁面,用於添加兩種抽認卡:正常的及帶有代碼的。每種卡都會有不同的格式設計。

而且,我還以移動設備爲先去設計這些網頁,以使得在任何地方的我,都能通過我的手機及平板去回顧知識。

你也可以免費製作屬於你自己的抽認卡網站:

  • 抽認卡頁面的代碼倉庫
  • 我的抽認卡數據庫:有一點需要記住的是,我做事有點過頭,以至於把卡片都覆蓋到所有的東西上。從彙編語言和 Python 的細枝末節,乃至到機器學習和統計都被覆蓋到卡片上。而這種做法,對於 Google 的要求來說,卻是多餘。

在抽認卡上做筆記: 若你第一次發現你知道問題的答案時,先不要急着把其標註成“已懂”。你需要做的,是去查看一下是否有同樣的抽認卡,並在你真正懂得如何解決問題之前,多問自己幾次。重複地問答可幫助您深刻記住該知識點。

3. 回顧,回顧,回顧

我留有一組 ASCII 碼錶、OSI 堆棧、Big-O 記號及更多的小抄紙,以便在空餘的時候可以學習。

每編程半個小時就要休息一下,並去回顧你的抽認卡。

4. 專注

在學習的過程中,往往會有許多令人分心的事佔據着我們寶貴的時間。因此,專注和集中注意力是非常困難的。

你所看不到的

由於,這個巨大的列表一開始是作爲我個人從 Google 面試指導筆記所形成的一個事件處理列表。因此,有一些我熟悉且普遍的技術在此都未被談及到:

  • SQL
  • Javascript
  • HTML、CSS 和其他前端技術

日常計劃

部分問題可能會花費一天的時間去學習,而部分則會花費多天。當然,有些學習並不需要我們懂得如何實現。

因此,每一天我都會在下面所列出的列表中選擇一項,並查看相關的視頻。然後,使用以下的一種語言去實現:

C —— 使用結構體和函數,該函數會接受一個結構體指針 * 及其他數據作爲參數。
C++ —— 不使用內建的數據類型。
C++ —— 使用內建的數據類型,如使用 STL 的 std::list 來作爲鏈表。
Python ——  使用內建的數據類型(爲了持續練習 Python),並編寫一些測試去保證自己代碼的正確性。有時,只需要使用斷言函數 assert() 即可。
此外,你也可以使用 Java 或其他語言。以上只是我的個人偏好而已。

爲何要在這些語言上分別實現一次?

因爲可以練習,練習,練習,直至我厭倦它,並完美地實現出來。(若有部分邊緣條件沒想到時,我會用書寫的形式記錄下來並去記憶)
因爲可以在純原生的條件下工作(不需垃圾回收機制的幫助下,分配/釋放內存(除了 Python))
因爲可以利用上內建的數據類型,以使得我擁有在現實中使用內建工具的經驗(在生產環境中,我不會去實現自己的鏈表)

就算我沒有時間去每一項都這麼做,但我也會盡我所能的。

在這裏,你可以查看到我的代碼:
- C
- C++
- Python

你不需要記住每一個算法的內部原理。

在一個白板上寫代碼,而不要直接在計算機上編寫。在測試完部分簡單的輸入後,到計算機上再測試一遍。

必備知識

算法複雜度 / Big-O / 漸進分析法

數據結構

更多的知識

樹(Trees)

排序(Sorting)

圖(Graphs)

圖論能解決計算機科學裏的很多問題,所以這一節會比較長,像樹和排序的部分一樣。

可以從 Skiena 的書(參考下面的書推薦小節)和麪試書籍中學習更多關於圖的實踐。

更多知識


終面

這一部分有一些短視頻,你可以快速的觀看和複習大多數重要概念。
這對經常性的鞏固很有幫助。

綜述:

  • [ ] 2-3 分鐘的短視頻系列 (23 個)
  • [ ] 2-5 分鐘的短視頻系列 - Michael Sambol (18 個):

排序:

書籍

Google Coaching 裏提到的

閱讀並做練習:

  • [ ] 算法設計手冊 (Skiena)

    read and do exercises from the books below. Then move to coding challenges (further down below)
    一旦你理解了每日計劃裏的所有內容,就去讀上面所列的書並完成練習,然後開始讀下面所列的書並做練習,之後就可以開始實戰寫代碼了(本文再往後的部分)

首先閱讀:
- [ ] Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition

然後閱讀 (這本獲得了很多推薦, 但是不在 Google coaching 的文檔裏):
- [ ] Cracking the Coding Interview, 6th Edition
- 如果你看到有人在看 “The Google Resume”, 實際上它和 “Cracking the Coding Interview” 是同一個作者寫的,而且後者是升級版。

附加書單

這些沒有被 Google 推薦閱讀,不過我因爲需要這些背景知識所以也把它們列在了這裏。

如果你有時間

編碼練習和挑戰

一旦你學會了理論基礎,就應該把它們拿出來練練。
儘量堅持每天做編碼練習,越多越好。

編程問題預備:

編碼練習平臺:

當你臨近面試時

你的簡歷

當面試來臨的時候

隨着下面列舉的問題思考下你可能會遇到的 20 個面試問題
每個問題準備 2-3 種回答
準備點故事,不要只是擺一些你完成的事情的數據,相信我,人人都喜歡聽故事
  • 你爲什麼想得到這份工作?
  • 你解決過的最有難度的問題是什麼?
  • 面對過的最大挑戰是什麼?
  • 見過的最好或者最壞的設計是怎麼樣的?
  • 對某項 Google 產品提出改進建議。
  • 你作爲一個個體同時也是團隊的一員,如何達到最好的工作狀態?
  • 你的什麼技能或者經驗是你的角色中不可或缺的?爲什麼?
  • 你在某份工作或某個項目中最享受的是什麼?
  • 你在某份工作或某個項目中面臨過的最大挑戰是什麼?
  • 你在某份工作或某個項目中遇到過的最蛋疼的 Bug 是什麼樣的?
  • 你在某份工作或某個項目中學到了什麼?
  • 你在某份工作或某個項目中哪些地方還可以做的更好?

問面試官的問題

我會問的一些:(可能我已經知道了答案但我想聽聽面試官的看法或者瞭解團隊的前景):
  • 團隊多大規模?
  • 開發週期是怎樣的? 會使用瀑布流/極限編程/敏捷開發麼?
  • 經常會爲 deadline 加班麼? 或者是有彈性的?
  • 團隊裏怎麼做技術選型?
  • 每週平均開多少次會?
  • 你覺得工作環境有助於員工集中精力嗎?
  • 目前正在做什麼工作?
  • 喜歡這些事情嗎?
  • 工作期限是怎麼樣的?

當你獲得了夢想的職位

我還能說些什麼呢,恭喜你!

堅持繼續學習。

得到這份工作只是一個開始。


*****************************************************************************************************
*****************************************************************************************************

下面的內容都是可選的。這些是我的推薦,不是 Google 的。
通過學習這些內容,你將會得到更多的有關 CS 的概念,並將爲所有的軟件工程工作做更好的準備。

*****************************************************************************************************
*****************************************************************************************************

附加的學習

一些主題的額外內容

我爲前面提到的某些主題增加了一些額外的內容,之所以沒有直接添加到前面,是因爲這樣很容易導致某個主題內容過多。畢竟你想在本世紀找到一份工作,對吧?

視頻系列

坐下來享受一下吧。”netflix and skill” :P

計算機科學課程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章