- 本文爲掘金投稿,譯文出自:掘金翻譯計劃
- 原文地址:Google Interview University
- 原文做者:John Washam
- 譯者:Aleen,Newton,bobmayuze,Jaeger,sqrthree
- 友情提醒:文章較長,需耐心閱讀。
這是我爲了從 Web 開發者(自學、非計算機科學學位)蛻變至 Google 軟件工程師所制定的計劃,其內容歷時數月。html
這一長列表是從 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 的詳情面試
把一個(或兩個)印有「future Googler」的圖案打印出來,並用你誓要成功的眼神盯着它。算法
我還沒去應聘。
由於我離完成學習(完成該瘋狂的計劃列表)還須要數天的時間,並打算在下週開始用一成天的時間,以編程的方式去解決問題。固然,這將會持續數週的時間。而後,我才經過使用在二月份所獲得的一個介紹資格,去正式應聘 Google(沒錯,是二月份時就獲得的)。
感謝 JP 的此次介紹。
目前我仍在該計劃的執行過程當中,若是你想跟隨我腳步去學習的話,能夠登進我在 GoogleyAsHeck.com 上所寫的博客。
下面是個人聯繫方式:
部分視頻只能經過在 Coursera、Edx 或 Lynda.com class 上註冊登陸才能觀看。這些視頻被稱爲網絡公開課程(MOOC)。即使是免費觀看,部分課程可能會因爲不在時間段內而沒法獲取。所以,你須要多等待幾個月。
很感謝您能幫我把網絡公開課程的視頻連接轉換成公開的視頻源,以代替那些在線課程的視頻。此外,一些大學的講座視頻也是我所青睞的。
視頻:
文章:
附加的(雖然 Google 不建議,但我仍是添加在此):
在這,我就如下話題寫一篇短文 —— 重點:爲在 Google 的面試選擇一種語言
在大多數公司的面試當中,你能夠在編程這一環節,使用一種本身用起來較爲溫馨的語言去完成編程。但在 Google,你只有三種固定的選擇:
有時你也可使用下面兩種,但須要事先查閱說明。由於,說明中會有警告:
你須要對你所選擇的語言感到很是溫馨且足夠了解。
更多關於語言選擇的閱讀:
因爲,我正在學習C、C++ 和 Python。所以,在下面你會看到部分關於它們的學習資料。相關書籍請看文章的底部。
該列表已經持續更新了很長的一段時間,因此,咱們的確很容易會對其失去控制。
這裏列出了一些我所犯過的錯誤,但願您不要重滔覆轍。
就算我查看了數小時的視頻,並記錄了大量的筆記。幾個月後的我,仍然會忘卻其中大部分的東西。因此,我翻閱了個人筆記,並將可回顧的東西製做成抽認卡(flashcard)(請往下看)
爲了解決善忘的問題,我製做了一些關於抽認卡的頁面,用於添加兩種抽認卡:正常的及帶有代碼的。每種卡都會有不一樣的格式設計。
並且,我還以移動設備爲先去設計這些網頁,以使得在任何地方的我,都能經過個人手機及平板去回顧知識。
你也能夠免費製做屬於你本身的抽認卡網站:
在抽認卡上作筆記: 若你第一次發現你知道問題的答案時,先不要急着把其標註成「已懂」。你須要作的,是去查看一下是否有一樣的抽認卡,並在你真正懂得如何解決問題以前,多問本身幾回。重複地問答可幫助您深入記住該知識點。
我留有一組 ASCII 碼錶、OSI 堆棧、Big-O 記號及更多的小抄紙,以便在空餘的時候能夠學習。
每編程半個小時就要休息一下,並去回顧你的抽認卡。
在學習的過程當中,每每會有許多使人分心的事佔據着咱們寶貴的時間。所以,專一和集中注意力是很是困難的。
因爲,這個巨大的列表一開始是做爲我我的從 Google 面試指導筆記所造成的一個事件處理列表。所以,有一些我熟悉且廣泛的技術在此都未被談及到:
部分問題可能會花費一天的時間去學習,而部分則會花費多天。固然,有些學習並不須要咱們懂得如何實現。
所以,每一天我都會在下面所列出的列表中選擇一項,並查看相關的視頻。而後,使用如下的一種語言去實現:
C —— 使用結構體和函數,該函數會接受一個結構體指針 * 及其餘數據做爲參數。 C++ —— 不使用內建的數據類型。 C++ —— 使用內建的數據類型,如使用 STL 的 std::list 來做爲鏈表。 Python —— 使用內建的數據類型(爲了持續練習 Python),並編寫一些測試去保證本身代碼的正確性。有時,只須要使用斷言函數 assert() 便可。 此外,你也可使用 Java 或其餘語言。以上只是個人我的偏好而已。
爲什麼要在這些語言上分別實現一次?
由於能夠練習,練習,練習,直至我厭倦它,並完美地實現出來。(如有部分邊緣條件沒想到時,我會用書寫的形式記錄下來並去記憶) 由於能夠在純原生的條件下工做(不需垃圾回收機制的幫助下,分配/釋放內存(除了 Python)) 由於能夠利用上內建的數據類型,以使得我擁有在現實中使用內建工具的經驗(在生產環境中,我不會去實現本身的鏈表)
就算我沒有時間去每一項都這麼作,但我也會盡我所能的。
在這裏,你能夠查看到個人代碼:
你不須要記住每個算法的內部原理。
在一個白板上寫代碼,而不要直接在計算機上編寫。在測試完部分簡單的輸入後,到計算機上再測試一遍。
計算機是如何處理一段程序:
編譯器
浮點數是如何存儲的:
若是部分課程過於學術性,你可直接跳到文章底部,去查看離散數學的視頻以獲取相關背景知識。
視頻:
在線課程:
使用線性探測的數組去實現
AVL 樹
伸展樹
2-3查找樹
2-3-4樹 (亦稱2-4樹)
B 樹
紅黑樹
筆記:
關於堆排序,請查看前文堆的數據結構部分。堆排序很強大,不過是非穩定排序。
斯坦福大學關於排序算法的視頻:
Shai Simonson 視頻, Aduni.org:
Steven Skiena 關於排序的視頻:
加州大學伯克利分校(UC Berkeley) 大學課程:
實現:
有興趣的話,還有一些補充 - 但並非必須的:
圖論能解決計算機科學裏的不少問題,因此這一節會比較長,像樹和排序的部分同樣。
Yegge 的筆記:
Skiena 教授的課程 - 很不錯的介紹:
圖 (複習和其餘):
完整的 Coursera 課程:
Yegge: 若是有機會,能夠試試研究更酷炫的算法:
我會實現:
能夠從 Skiena 的書(參考下面的書推薦小節)和麪試書籍中學習更多關於圖的實踐。
我建議先閱讀和學習足夠多的動態規劃的例子,以便對解決 DP 問題的通常模式有個紮實的理解。
視頻: