
導(dǎo)讀:原文作者大學(xué)時(shí)修的經(jīng)濟(jì)學(xué)學(xué)位,早年曾在韓國當(dāng)兵,并在退伍后留在韓國教授英語。然而心中對(duì)于代碼的理想并沒有因?yàn)闀r(shí)間的推移而磨滅,盡管困難重重,作者還是從零開始學(xué)習(xí)新的編程思想和技術(shù),并花費(fèi)了八個(gè)月時(shí)間來制定學(xué)習(xí)計(jì)劃,將前往谷歌工作作為自己的目標(biāo)。
原文:Why I studied full-time for 8 months for a Google interview
作者:John Washam
譯者:Aceyclee
歡迎關(guān)注知乎專欄「極光日?qǐng)?bào)」,每天為 Makers 導(dǎo)讀三篇優(yōu)質(zhì)英文文章。
以下便是作者博客的全文翻譯版,在文中作者詳述了過往經(jīng)歷、做這個(gè)決定的原因、為什么選擇谷歌以及自己的學(xué)習(xí)方法和經(jīng)驗(yàn)體會(huì)。歡迎閱讀。

(上圖:我的陳舊白板,上面寫的是 Dijkstra 單源最短路徑算法)
說出來可能你不信,在過去的一段時(shí)間里,我花了上千個(gè)小時(shí)去閱讀書籍、編寫代碼還有觀看科技講座。而這一切的努力,都只是為了谷歌軟件工程師的面試去做準(zhǔn)備。
我怎么來到這里
中學(xué)的時(shí)候,我便開始了編程。然而當(dāng)我來到大學(xué),我卻修了經(jīng)濟(jì)學(xué)學(xué)位。我認(rèn)為等我畢業(yè)的時(shí)候,肯定會(huì)有很多程序員尋找工作??墒悄菚r(shí)的我畢竟還太年輕,我意識(shí)到我錯(cuò)了。
后來,我參軍了,同時(shí)也成為了一名程序員。但是 HR 提供給我的入職部門卻是軍事情報(bào)局,因此我用了兩年時(shí)間去學(xué)習(xí)韓語,并在這個(gè)崗位工作了兩年。
在我離開軍隊(duì)之前,我試圖重新拾起編程的技能,然而困難程度大大出乎我的意料。初中的時(shí)候我就開始學(xué)習(xí) BASIC,即使到了高中我仍保持著編程的練習(xí)??墒钱?dāng)我重頭開始 C++ 的學(xué)習(xí)后,我才意識(shí)到編程語言的迅猛發(fā)展讓我難以把握。
我甚至不知道如何重建一個(gè)網(wǎng)站,即使我非常喜歡自己搭建網(wǎng)站,因?yàn)槲疫^去用的是一種類似于 Word 的工具去發(fā)布我的網(wǎng)站。退役后,我決定留在韓國教授英語,然后利用周末和晚上的時(shí)間去學(xué)習(xí) Web 開發(fā)技術(shù),包括 Perl、HTML、CSS(當(dāng)時(shí)還是特別前沿的一項(xiàng)技術(shù))、JavaScript 和 SQL。
經(jīng)過一年的緊張學(xué)習(xí)后,我前往西雅圖地區(qū)工作,自此以后便一直留在那里。

(上圖:在美麗的華盛頓貝爾維尤)
我作為一個(gè) Web 開發(fā)者已經(jīng)十五年了,并且創(chuàng)辦了三家公司,其中的兩家仍在正常運(yùn)營和盈利。在此期間,我在大大小小的公司工作過,幫助初創(chuàng)企業(yè)啟動(dòng)和發(fā)展,招募和管理團(tuán)隊(duì)。我是一名產(chǎn)品經(jīng)理,也是一名 CEO,同時(shí)我還是一名設(shè)計(jì)師,也是市場運(yùn)營人員。
盡管我有著還不錯(cuò)的事業(yè),并且一路走來的過程中也成長了許多,但我覺得這遠(yuǎn)遠(yuǎn)不夠。
尋求職業(yè)改變
還記得之前我說我沒有取得計(jì)算機(jī)科學(xué)與技術(shù)的學(xué)位嗎,我覺得我應(yīng)該做些改變!
幾年前,我還以為我分分鐘就能找到一份不錯(cuò)的工作。我覺得我是一枚香餑餑——實(shí)力不可小覷的全棧 Web 開發(fā)者。但直到2013年,求職過程中我才發(fā)現(xiàn)我在技術(shù)上已經(jīng)缺乏底氣了。我在業(yè)余時(shí)間內(nèi)創(chuàng)辦公司和掙錢,卻忽視了個(gè)人技術(shù)的提升。
多年來,我僅僅淺嘗輒止,博而不精。盡管我重新找一份工作并不困難,但卻不是我想從事的領(lǐng)域。我能被雇傭的領(lǐng)域和我的技術(shù)一樣是稍顯過時(shí)的,雖然薪資不錯(cuò),但我卻看不到前景。
這個(gè)想法在去年的一次招聘會(huì)上達(dá)到了頂峰。我對(duì)一份由風(fēng)險(xiǎn)投資機(jī)構(gòu)啟動(dòng)的實(shí)驗(yàn)室工作非常感興趣,然而由于缺乏計(jì)算機(jī)科學(xué)學(xué)位而導(dǎo)致對(duì)相關(guān)技能和知識(shí)的不足,使我在這份工作面前根本沒有機(jī)會(huì)。
至今我仍從事當(dāng)時(shí)所擁有的全職工作。
在 2016 年年初,我決定是時(shí)候從 Web 開發(fā)者轉(zhuǎn)行為軟件工程師了。這意味著我需要在短短幾個(gè)月時(shí)間內(nèi)拿到計(jì)算機(jī)科學(xué)的學(xué)位,因此我需要非??炭嗟貙W(xué)習(xí)和不斷地練習(xí)。但一旦我做到了,我便可以開始新的職業(yè)生涯!
你可能覺得 Web 開發(fā)和軟件工程師并沒有太多不同,二者都涉及編程和架構(gòu)。但軟件工程師還要求程序員了解數(shù)據(jù)結(jié)構(gòu)和算法、匯編語言、內(nèi)存考量,以及這些代碼和架構(gòu)決策對(duì)機(jī)器的影響。
大公司在雇傭軟件工程師的時(shí)候希望應(yīng)聘者能擁有這方面的知識(shí)。
我有在谷歌工作的熟人,從而了解到他在谷歌的一些經(jīng)歷。同時(shí)我也閱讀過 「How Google Works」,因此對(duì)谷歌也是相當(dāng)熟悉了。
通過期間的接觸,我收到谷歌提供給候選人的培訓(xùn)教材副本,這便成為了我制定學(xué)習(xí)計(jì)劃的基礎(chǔ)。
在谷歌工作是非常棒的一件事情,在此之前我一直把谷歌定為我的目標(biāo)。
為什么選擇谷歌?
谷歌的聘用條件非??量?,他們只招聘最優(yōu)秀的人才。所以當(dāng)我把谷歌定為我的目標(biāo)時(shí),即使在谷歌落選了,我依然能非常輕松地得到其他公司的青睞。
我越了解谷歌,我便越希望能得到這份工作。
簡而言之,谷歌是一家既雇用聰明有創(chuàng)意的人才、又對(duì)待這些人才非常好的公司。谷歌自由而創(chuàng)新,使員工能更好地作出對(duì)用戶正確的決策。
多年來谷歌不斷優(yōu)化招聘流程,使之更適合聰明而熱情的求職者們,大腦發(fā)熱的情況早已不復(fù)存在。如今會(huì)更考察面試者編碼能力、技術(shù)知識(shí)和谷歌的需求。在這個(gè)世界這是一項(xiàng)長足的進(jìn)步。

(上圖:在 2015 年的客場之旅,筆者走訪了山景城總部,并在這埋下理想的種子)
谷歌的管理也是非同尋常的,管理者并不事必躬親。他們相信工程師的決策,信任員工改變了管理者以往的形象。另外,管理者不能單方面雇用、解雇或者進(jìn)行單方面宣傳。許多被認(rèn)為會(huì)導(dǎo)致辦公室政治的重要管理決策,都會(huì)由專門的委員會(huì)去處理,從而消除潛在的隱患。
谷歌的人力資源部門會(huì)了解什么因素導(dǎo)致加班,并且他們會(huì)收集數(shù)據(jù)和員工反饋去提升評(píng)價(jià)體系、優(yōu)化招聘流程、晉升通道和薪酬福利等。你可以去閱讀 Laszlo Bock 著的「Work Rules!」從而了解更多信息。
是的,谷歌的福利特別好!我曾經(jīng)去過華盛頓州的柯克蘭谷歌辦公室參觀,這超出了我的預(yù)期。而我的期望已經(jīng)很高了。
谷歌大學(xué)面試
還記得前邊我說收到一份學(xué)習(xí)指南嗎,這份學(xué)習(xí)計(jì)劃看起來還不錯(cuò),然而我對(duì)名單上面的知識(shí)仍舊一無所知。
我展開筆記上的主題列表,并在 YouTube 上觀看麻省理工學(xué)院和加州大學(xué)伯克利分校的講座以填充我的知識(shí)盲區(qū)。一邊是鏈表的視頻,另一邊又是隊(duì)列的視頻,因此這份學(xué)習(xí)名單開始變得越來越長。
我的 GitHub 實(shí)在是太空了,因此我把學(xué)習(xí)清單公布在我的 GitHub 主頁上。由于我寫的商業(yè)和工作的代碼是私人的,因此我的 GitHub 賬戶看起來似乎是空的。我需要新建一個(gè)投資組合,一開始我把項(xiàng)目命名為“Project 9894”,因?yàn)楣雀璩闪⒂谝痪啪虐四昃旁滤娜铡V笪抑孛@個(gè)項(xiàng)目為“Google Interview University”。
隨后我又不斷地添加了一些我發(fā)現(xiàn)的其他主題。

(上圖:我夏季的閱讀書單,只是其中的一小部分)
我有時(shí)候也會(huì)非常詫異,盡管在我的職業(yè)生涯中,我甚至不知道 CPU 是如何處理程序,內(nèi)存是如何工作的,但我卻剛剛足夠讓我得到成功。
我在 GitHub 上的小項(xiàng)目開始能得到 Star,因此我發(fā)表了一篇博客慶祝我拿到二十枚 Star。
有天早上醒來的時(shí)候,我發(fā)現(xiàn)居然得到 120 Stars。有個(gè)大 V 在晚上給我點(diǎn)了贊,這直接讓我進(jìn)入每日熱榜,并持續(xù)了幾天排行榜首。
許多善良的朋友給予我感謝和鼓勵(lì),原來他們要的并不僅僅是谷歌的工作,而是想成為一名軟件工程師,而這份書單恰好能幫助他們。
截止到目前為止超過 21000 Stars,這仍舊讓我覺得不可思議。
如果我落選了?
這并不是世界末日。
我為了能得到谷歌軟件工程師的職位,付出了相當(dāng)多的時(shí)間和精力去學(xué)習(xí)。即使我失敗了,我擁有的這些知識(shí)和技能也足夠我成功獲得任意一家公司軟件工程師的職位。
無論我在哪里結(jié)束,我都將成為一個(gè)初級(jí)軟件工程師,而非擁有十五年經(jīng)驗(yàn)的軟件工程師,因?yàn)槲掖_實(shí)不具備十五年的經(jīng)驗(yàn)。當(dāng)我入職的時(shí)候,我不過相當(dāng)于一位 CS 專業(yè)的畢業(yè)生而已。
但我同樣擁有初出茅廬不怕虎的勇氣和熱情,這對(duì)于我來說是個(gè)全新的領(lǐng)域,我才剛剛開始而已。我知道我會(huì)犯錯(cuò),但我并不懼怕失誤,我同樣想學(xué)習(xí)各種知識(shí),不論在哪個(gè)團(tuán)隊(duì)中我都能變得更出色。
不要像我一樣學(xué)得太雜
沒錯(cuò)我用了八個(gè)月的時(shí)間,但我完全可以縮短這個(gè)周期。就像任何大目標(biāo)的開始,你都會(huì)犯錯(cuò)和走彎路,這其中總有你覺得可以做得更好的地方。
我研究了很多我并不需要的項(xiàng)目,其中的一些我認(rèn)為我可能會(huì)在面試中用到,另一些我則認(rèn)為是我開始工作時(shí)應(yīng)該掌握的知識(shí)。我并不想成為團(tuán)隊(duì)中的吊車尾,然而事實(shí)證明我似乎準(zhǔn)備過度了。
我用三周的時(shí)間閱讀了一千頁的 C++ 書籍,雖然現(xiàn)在我并不記得大部分內(nèi)容,但我還是對(duì) C++ 有了比較全面的了解??山Y(jié)果卻是在面試過程中我用的是 Python 而非 C++。我以為我需要掌握 C++、C 或者 Java,但我錯(cuò)了。所以應(yīng)該勤問,而非假設(shè)。
其實(shí)我只需要看 3、4 本書而已,可我卻閱讀了遠(yuǎn)超這個(gè)數(shù)量的書籍。我有個(gè)代碼目錄,里面記錄了我復(fù)習(xí)的幾十個(gè)算法,其中大部分都不會(huì)在面試中遇到。你可以不用這樣做。

(上圖:堆棧算法,打印出來以供我復(fù)習(xí))
同時(shí)我在 YouTube 上也加班加點(diǎn)地觀看了遠(yuǎn)超我需要的視頻。
我應(yīng)該早點(diǎn)停止看書和看視頻,從而進(jìn)行代碼的編寫。這樣我可以用更多的時(shí)間去實(shí)踐我所學(xué)的知識(shí)。
記憶的關(guān)鍵在于重復(fù)訓(xùn)練。一旦你開始學(xué)習(xí)新東西,你需要不斷地回顧和練習(xí)。每一次的復(fù)習(xí)都能鞏固你的知識(shí)。一次花費(fèi)足夠長的時(shí)間去學(xué)習(xí)一個(gè)東西并不會(huì)讓你成為專家,成為專家需要你不斷地回溯你的知識(shí)。你這樣做了之后你就會(huì)發(fā)現(xiàn)你再也不會(huì)忘記任意一個(gè)細(xì)節(jié)。
為了幫助復(fù)習(xí),我做了 1792 張卡片(電子卡片),這有點(diǎn)多了??臻e的時(shí)候(比如圣誕節(jié)購物時(shí))我便在我的手機(jī)或者平板上復(fù)習(xí)這些知識(shí)。學(xué)習(xí)新知識(shí)和復(fù)習(xí)同時(shí)進(jìn)行,就算我在新卡片上得到答案,我也不會(huì)把它標(biāo)記為已知,除非我多次看到它并都能正確地回答出這個(gè)問題,我才將其標(biāo)記為已知的。
我的不安全感(萬一他們問我關(guān)于紅黑樹的問題)讓我盡可能地學(xué)習(xí)遠(yuǎn)超需要的知識(shí)。
但我并不僅僅只是準(zhǔn)備面試,我同時(shí)為在谷歌的職業(yè)生涯做準(zhǔn)備,解決大規(guī)模的問題。這意味著精通算法能節(jié)省時(shí)間、空間和 I/O 等計(jì)算機(jī)資源。
我可能永遠(yuǎn)不需要知道最大流算法(Ford-Fulkerson),但當(dāng)情況出現(xiàn)時(shí),我知道我能解決它也并不是一件壞事,同時(shí)我也能知道問題出現(xiàn)在哪里。
結(jié)語
以前我只是希望我能跳過這些學(xué)習(xí),盡早被錄用,從而我能將這些時(shí)間去學(xué)習(xí)我未來團(tuán)隊(duì)所需要的知識(shí)和工具。但一路走來,我才意識(shí)到這方面知識(shí)非常重要,盡管其中的大部分可能不是每天都會(huì)用到,但我仍然很高興我付出了努力。我對(duì)計(jì)算機(jī)的歷史、該領(lǐng)域的大拿、數(shù)據(jù)結(jié)構(gòu)和算法(以及它們之間是如何相互影響)都有了全新的認(rèn)識(shí),同時(shí)我也知道了計(jì)算機(jī)的底層工作機(jī)理。
我很快就會(huì)遞交我的申請(qǐng),這真是個(gè)漫長的旅程——幾乎整整一年。它開始于一月,但直到四月我仍舊不能承諾我能全身心投入學(xué)習(xí)。
我盡我所能去準(zhǔn)備,我不能持續(xù)學(xué)習(xí)并無限期地推遲我的申請(qǐng)。有些時(shí)候我不得不大步向前。
曙光在我前方。
感謝閱讀。
跌宕起伏的后續(xù):
