GitHub上最勵(lì)志的計(jì)算機(jī)自學(xué)教程
首先來看一下谷歌工程師的要求:名校出身、CS(Computer Science,計(jì)算機(jī)科學(xué))專業(yè)背景、博士學(xué)位加持,技術(shù)過硬?
這么苛刻的條件,成為谷歌工程師是不是特別難?國外一個(gè)叫 John Washam 的小哥告訴你:不用,自學(xué) 8 個(gè)月也可以!
John Washam 勵(lì)志要成為一名谷歌軟件工程師,但沒有 CS 專業(yè)背景的他,只能通過自己的努力來達(dá)成目標(biāo)。
于是,8 個(gè)月的時(shí)間里,小哥花了數(shù)千小時(shí)閱讀書籍、編寫代碼、觀看 CS 技術(shù)講座,一路披荊斬棘、打怪升級(jí)。
最終,雖然沒有去成谷歌,還順利成為了一名亞馬遜 AWS 的技術(shù)專家,年薪百萬(亞馬遜真心也不錯(cuò))。
更加難能可貴的是,小哥還將自學(xué)經(jīng)驗(yàn)編寫成了一份教程,在 GitHub 上線以來,已收獲 140k+ 星的好評(píng)。

項(xiàng)目地址如下所示:
https://github.com/jwasham/coding-interview-university
小哥說:“即便沒有面上夢寐以求的谷歌,但是這份教程,也算是好好充實(shí)了一下自己。”
小哥最初的目的是“考上”谷歌,于是每天自學(xué) 8-12 個(gè)小時(shí),堅(jiān)持了 8 個(gè)多月。一邊學(xué)習(xí),一邊順手整理出了這份自學(xué)項(xiàng)目。
小哥表示:
無論你要面試哪家軟件公司,這個(gè)項(xiàng)目都可以讓你做好充分的準(zhǔn)備,包括像亞馬遜、Facebook、谷歌和微軟這樣的科技巨頭。
接下來,我們就跟著小哥的腳步去了解一下這份面試寶典。
首先要做的就是選擇一門編程語言,在 Google,一般是 C++、Java、Python,有時(shí)也會(huì)用到 JavaScript、Ruby。
接著開始學(xué)習(xí)計(jì)算機(jī)的一些知識(shí),比如說計(jì)算機(jī)是如何處理一段程序的,編譯器是如何工作的,浮點(diǎn)數(shù)是如何存儲(chǔ)的。
然后是算法復(fù)雜度、Big-O(用于描述函數(shù)漸近行為的數(shù)學(xué)符號(hào))、漸進(jìn)分析法、數(shù)據(jù)結(jié)構(gòu)(數(shù)組、鏈表、堆棧、隊(duì)列、哈希表、圖)。以及二分查找、按位運(yùn)算。
還有樹這塊,知識(shí)點(diǎn)比較多,我畫一個(gè)思維導(dǎo)圖:

排序這塊的知識(shí)點(diǎn)也不少,繼續(xù)上思維導(dǎo)圖:

此外還有遞歸、動(dòng)態(tài)規(guī)劃、組合與概率、NP(非決定性多項(xiàng)式集合,是計(jì)算理論中最重要的集合之一)和 NP-完全和近似算法、緩存、線程與進(jìn)程、系統(tǒng)設(shè)計(jì)。
這么多知識(shí)點(diǎn),是不是覺得有點(diǎn)懵逼?
來看一下小哥的經(jīng)驗(yàn)心得:
1)意識(shí)到你不可能一遍就記住所有的知識(shí)點(diǎn),這點(diǎn)心理建設(shè)很重要。
2)把要回顧的知識(shí)點(diǎn)做成抽認(rèn)卡:正常的及帶有代碼的,類似于背單詞。然后在抽認(rèn)卡上做筆記,在你真正懂得如何解決問題之前,多問自己幾次。重復(fù)地問答可幫助您深刻記住該知識(shí)點(diǎn)。
3)回顧,回顧,回顧,每編程半個(gè)小時(shí)就要休息一下,并去回顧你的抽認(rèn)卡。
4)專注。在學(xué)習(xí)的過程中,往往會(huì)有許多令人分心的事占據(jù)著我們寶貴的時(shí)間。因此,專注和集中注意力是非常困難的。
學(xué)到一定程度后,就可以準(zhǔn)備面試了。面試的第一步當(dāng)然是要有一份好的簡歷,這樣才能為你爭取到寶貴的面試機(jī)會(huì)。
Steve Yagge 給出的 10 個(gè)小貼士可以幫你做出一份還不錯(cuò)的簡歷。
1)一開始,沒人在乎你,所以不要在簡歷上談你的希望、目標(biāo)、夢想、抱負(fù)。
2)盡量使用純文字,不要花里胡哨的。
3)記得檢查,不要出現(xiàn)錯(cuò)別字。一些英文術(shù)語一定要大小寫敏感。
4)不要在簡歷中記錄你參與了什么,而是實(shí)際做了什么。
5)不要盲目夸大自己。
6)不要在簡歷上羅列一些無關(guān)緊要的證書。
7)請(qǐng)不要輕易說“精通”二字。
8)不要妄自菲薄,自信點(diǎn)。
9)不要寫一些無聊的內(nèi)容。
10)實(shí)事求是。
Steve Yagge 曾經(jīng)在亞馬遜和 Google 工作過,因此他的建議還是很值得參考的。
在面試時(shí),你可能會(huì)遇到這 20 個(gè)問題:
你為什么想得到這份工作? 你解決過的最有難度的問題是什么? 面對(duì)過的最大挑戰(zhàn)是什么? 見過的最好或者最壞的設(shè)計(jì)是怎么樣的? 對(duì)某項(xiàng) Google 產(chǎn)品提出改進(jìn)建議。 你作為一個(gè)個(gè)體同時(shí)也是團(tuán)隊(duì)的一員,如何達(dá)到最好的工作狀態(tài)? 你的什么技能或者經(jīng)驗(yàn)是你的角色中不可或缺的?為什么? 你在某份工作或某個(gè)項(xiàng)目中最享受的是什么? 你在某份工作或某個(gè)項(xiàng)目中面臨過的最大挑戰(zhàn)是什么? 你在某份工作或某個(gè)項(xiàng)目中遇到過的最蛋疼的 Bug 是什么樣的? 你在某份工作或某個(gè)項(xiàng)目中學(xué)到了什么? 你在某份工作或某個(gè)項(xiàng)目中哪些地方還可以做的更好?
你最好為每個(gè)問題準(zhǔn)備 2-3 種回答,可以通過故事的形式來回答,面試官會(huì)更喜歡聽。
在你回答完所有問題之后,并不意味著全部都結(jié)束了。如果面試官問你:“你有什么問題嗎?”千萬不要說自己什么問題了!可以試試下面這些問題:
團(tuán)隊(duì)多大規(guī)模? 開發(fā)周期是怎樣的? 會(huì)使用瀑布流/極限編程/敏捷開發(fā)么? 經(jīng)常會(huì)為 deadline 加班么? 或者是有彈性的? 團(tuán)隊(duì)里怎么做技術(shù)選型? 每周平均開多少次會(huì)? 你覺得工作環(huán)境有助于員工集中精力嗎? 目前正在做什么工作? 喜歡這些事情嗎? 工作期限是怎么樣的?
如果你順利獲得了夢想的職位,那么恭喜你!當(dāng)然,這并不意味著一切都結(jié)束了,你還需要堅(jiān)持學(xué)習(xí),得到一份工作只是一個(gè)新的開始。
下面這些內(nèi)容推薦給你繼續(xù)學(xué)習(xí)下:

當(dāng)然了,小哥之所以這么優(yōu)秀,是有原因的。
從高中起,小哥就開始學(xué)習(xí)編程,學(xué)的是 BASIC 語言,這還在是上世紀(jì) 90 年代。大學(xué)畢業(yè)拿到經(jīng)濟(jì)學(xué)學(xué)位后,他先是在軍隊(duì)服役兩年,駐扎韓國。
退役后他留在韓國教英語,突然發(fā)現(xiàn)自己離開 CS 領(lǐng)域的這幾年間,太多的新技術(shù)新工具出現(xiàn),自己的知識(shí)結(jié)構(gòu)出現(xiàn)了斷層,無法支撐起一個(gè)程序員的職業(yè)生涯了。
于是他利用一切業(yè)余時(shí)間,艱苦地學(xué)習(xí) Perl、HTML、CSS(當(dāng)時(shí)還是新東西)、JavaScript 和 SQL。
終于在 2001 年,小哥正式成為了一個(gè)網(wǎng)頁開發(fā)程序員,開始了 19 年的碼農(nóng)生涯。
截止 2017 年,John 的職業(yè)生涯可謂十分成功:在大小公司都有過任職、組建管理過項(xiàng)目團(tuán)隊(duì)、經(jīng)營壯大過初創(chuàng)公司,自己還親自創(chuàng)辦了 3 家軟件公司,其中 2 家至今還在健康運(yùn)營著。
按照小哥的話說,這十幾年的工作經(jīng)歷,將他鍛煉成了一個(gè)合格的程序員、一個(gè)優(yōu)秀的產(chǎn)品經(jīng)理、一個(gè) CEO、一個(gè)市場銷售。
但是他的目標(biāo)不止于此。他的夢想是在谷歌任職軟件工程師,在充滿智慧和創(chuàng)造力的團(tuán)隊(duì)里提高自己。
最初他認(rèn)為憑自己的工作經(jīng)驗(yàn)可以輕松獲得職位,但拿到了谷歌面試題后他才發(fā)現(xiàn)自己欠缺太多。
一個(gè)優(yōu)秀的軟件工程師應(yīng)該精通數(shù)據(jù)結(jié)構(gòu)和算法、匯編語言、內(nèi)存設(shè)計(jì)等,還要綜合考慮代碼和程序結(jié)構(gòu)對(duì)機(jī)器在應(yīng)用場景下的影響。
于是他以一份谷歌試題為指導(dǎo),開始了自學(xué)編程。并且在 GitHub 上創(chuàng)建了「9894項(xiàng)目」,因?yàn)楣雀杞⒂?998 年 9月 4 日。后來這個(gè)項(xiàng)目改名為現(xiàn)在的「coding interview university」。
小哥結(jié)合自己的學(xué)習(xí)經(jīng)歷,給出了三點(diǎn)自學(xué)編程的建議。
1)早問早計(jì)劃,不要想當(dāng)然
小哥最大的教訓(xùn)是自己花了太多時(shí)間學(xué)習(xí)根本用不上的東西,比如他曾經(jīng)用了 3 周時(shí)間閱讀了 1000 多頁 C++ 的資料,但是最后面試和工作中用的卻是 Python。
這個(gè)例子不是說 C++ 沒必要學(xué)。而是強(qiáng)調(diào)你要提前收集信息做出計(jì)劃,在不同的項(xiàng)目上分配合理的學(xué)習(xí)時(shí)間,提高效率。切忌「我覺得……」。
2)初學(xué)時(shí),視頻比看書效率更高
初學(xué)時(shí),視頻就像老師一樣,快速引導(dǎo)你入門。但想要深入的話,還得通過讀書深入的學(xué)習(xí),課余時(shí)間也很重要。
3)反復(fù)溫習(xí)
不斷反復(fù)是形成記憶的關(guān)鍵,正如我們?cè)谏衔奶岬降模「缤扑]使用記憶卡。
他為自己制作了 1792 張電子記憶卡,一有空閑時(shí)間就掏出來溫習(xí),比如超市排隊(duì)時(shí)、公交車上、擠地鐵時(shí)等等。
小哥說,他現(xiàn)在他已經(jīng)全面掌握了軟件工程的基本技能,無懼工作中的任何挑戰(zhàn),并且實(shí)現(xiàn)自我飛躍的那一天越來越近。
對(duì)于我們普通人來說,也應(yīng)該像小哥一樣,認(rèn)定一個(gè)目標(biāo),然后制定計(jì)劃、勤奮付出,最后天道酬勤獲得回報(bào)。
小哥可能是「一萬小時(shí)定律」的擁躉,但就算按照他每天 12 小時(shí)、堅(jiān)持 8 個(gè)月(每月 31 天)算,也不過 2976 個(gè)小時(shí)——遠(yuǎn)未到 1 萬個(gè)小時(shí)。
但就是這樣目標(biāo)堅(jiān)定的 8 個(gè)月,小哥成功獲得了大廠(雖然不是谷歌,但亞馬遜軟件工程師的平均年薪也超過百萬人民幣了)認(rèn)可。
這是我在 GitHub 看到的最勵(lì)志的故事,也是我希望讓更多人看到的原因,并且由衷地希望更多人因?yàn)檫@樣的經(jīng)歷和分享,創(chuàng)造屬于自己的故事。
坊間笑談太多的“從入門到放棄”,但也有人“從入門到百萬年薪”。
生命不息,奮斗不止,Keep walking~
PS:來看一下這份140k+ 星的面試攻略的部分目錄:

真心不錯(cuò),怎么獲得中文版呢?
微信搜索“沉默王二”公眾號(hào),或者掃描下面的二維碼,后臺(tái)回復(fù)關(guān)鍵字「奮斗」獲取在線閱讀地址以及離線的 PDF。
