Google 面試

堅持完成這套學習手冊,你就能夠去 Google 面試

 

這是?

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

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

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


目錄

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


爲什麼要用到它?

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

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

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

如何使用它

下面全部的東西都只是一個概述。所以,你須要由上而下逐一地去處理它。程序員

在學習過程當中,我是使用 GitHub 特殊的語法特性 markdown flavor 去檢查計劃的進展,包括使用任務列表。(注:因極客頭條的 markdown 並不支持此語法,所以在下方作了刪除處理)github

更多關於 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))
由於能夠利用上內建的數據類型,以使得我擁有在現實中使用內建工具的經驗(在生產環境中,我不會去實現本身的鏈表)

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

在這裏,你能夠查看到個人代碼:

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

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

必備知識

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

數據結構

更多的知識

樹(Trees)

排序(Sorting)

圖(Graphs)

圖論能解決計算機科學裏的不少問題,因此這一節會比較長,像樹和排序的部分同樣。

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

更多知識

相關文章
相關標籤/搜索