為了準(zhǔn)備 Google 軟件工程師的面試,我花了數(shù)以千計個小時讀書、寫代碼、觀看計算機科學(xué)相關(guān)的講座。
這個計劃是怎么產(chǎn)生的呢?
我中學(xué)時期就開始編程,但是大學(xué)卻選了經(jīng)濟學(xué)。這是因為我擔(dān)心畢業(yè)時會有太多程序員找工作。現(xiàn)在想想我錯大發(fā)了。
后來為了稱為一個程序員我加入了軍隊,但是招聘人員卻把我送到了軍事情報處,于是我花了一年學(xué)習(xí)漢語,又在韓國服役了兩年。
在退役前我試著重新拿起鍵盤,卻發(fā)現(xiàn)物是人非,區(qū)別太大了。我從初中到高中一直使用的是 BASIC。但是回歸后使用的是 C++,這兩者間差別太大了,一時間我無法適應(yīng)。
但是我很喜歡做網(wǎng)站,那會兒使用的還是 WordPress。我不懂怎么從零開始搭建一個網(wǎng)站。
在退役后,我決定在韓國再留一年,教英語。同時不忘初心,晚上、周末都用來學(xué)習(xí) Web 開發(fā),用的是 Perl, HTML, CSS (這在那會兒是個新生物), JavaScript 和 SQL。
在經(jīng)過一年高強度的學(xué)習(xí)后,我得到一份在西雅圖編程的工作,從此以后我就待在西雅圖了。
從此以后我做了 15 年 Web 開發(fā)者。我創(chuàng)辦了三家公司,其中兩家至今還在盈利。這些年我在大公司、小公司都待過,見證、助力過創(chuàng)業(yè)公司的啟動和成長,也招募、管理過團(tuán)隊,也當(dāng)過產(chǎn)品經(jīng)理,設(shè)計師,市場人員和 CEO。
在這個過程中我收獲了很多,也算是比較成功。但是還差得很多。
職業(yè)方向的改變
還記得我錯選經(jīng)濟學(xué),沒拿到計算機學(xué)位那部分嗎?最終有所改變。
工作幾年后,我覺得我已經(jīng)大成了,去哪家公司都妥妥的,畢竟我是一位“全棧工程師”。
然而在 2013 年找工作時,我意識到自己原來差的這么多。
過去那些年我花了太多時間追尋金錢,甚至空余時間也在運營公司,這讓我的技術(shù)止步不前。我的技術(shù)棧有些跟不上時代了。
過去那些年我的技術(shù)一直是夠用就行了。雖然技術(shù)面比較廣,卻沒有任何一個方向稱得上專家。
別會錯意了,我想找到工作還是沒問題的,只不過不是我想要去的技術(shù)或者領(lǐng)域。我還是可以被一些技術(shù)棧不是很新的公司聘用的,給的待遇也不差,但是我對那樣的前景無法感到興奮。
我的這種“差得很多”的自我認(rèn)識在去年一次找工作時達(dá)到了極點。我對一家風(fēng)投投資的本地創(chuàng)業(yè)公司工作很感興趣。但是由于我沒有計算機學(xué)位,不具備這個學(xué)位掌握的技術(shù)和知識,導(dǎo)致我最終沒有機會。
那時我一直在我公司中全職工作。
在 2016 年初,我覺得是時候做出改變了,從 Web 開發(fā)者到軟件工程師。為了在幾個月內(nèi)掌握計算機學(xué)位學(xué)習(xí)的知識,我需要刻苦學(xué)習(xí)和練習(xí),雖然長路漫漫,但我相信,一旦成功,我就會進(jìn)入一段新的職業(yè)生涯。
有人可能覺得 Web 開發(fā)者和軟件工程師沒什么區(qū)別。它們都需要編程和技術(shù),但是軟件工程需要更多知識,比如數(shù)據(jù)結(jié)構(gòu)和算法,編譯型語言,對內(nèi)存的關(guān)注,理解不同的代碼和架構(gòu)對運行機器的影響。
大公司招聘軟件工程師時,期望候選人掌握這些知識。
我向在 Google 工作的一位朋友咨詢了關(guān)于在 Google 工作的問題,也讀過《How Google Works》,對 Google 有了一定的了解。
偶然一次機會,還得到一份 Google 面試候選人的指導(dǎo)筆記,這成為我學(xué)習(xí)計劃的基礎(chǔ)。
Google 是一個非常棒的公司,在意識到這一點之前,它就已經(jīng)是我的目標(biāo)。
為什么我的目標(biāo)是 Google
目標(biāo)設(shè)到月球,即使失敗,也能落到眾星之間。
Google 的門檻非常高,他們只想招聘最棒的人才,所以我把目標(biāo)設(shè)定的高一點,即使最后沒去成 Google,去別的公司應(yīng)該也沒什么問題。
而且,隨著對 Google 的了解越深,我對它的渴望就越發(fā)強烈。
Google 有很好的“招培育留”氛圍。簡單地說,Google 選用聰明、有創(chuàng)造力的人,然后把他們照顧得很好。Google 獎勵能創(chuàng)造價值的人,鼓勵大膽創(chuàng)新,給員工自由,讓他們?yōu)橛脩糇龀龊玫臎Q定。
Google 的招聘流程經(jīng)過多年調(diào)整,招聘以聰明、激情為準(zhǔn)。腦力測驗早就不用了,候選者的編程能力,技術(shù)知識,是否“夠谷歌”(這個詞蘊含的內(nèi)容太多了…)。
Google 的管理也很不一般。他們的管理非常寬松,相信工程師可以做正確的決定。對雇員的信任使得 Google 的管理角色不同于平常公司。此外,管理層不能單方面決定雇傭、開除或者提拔一個員工,大多數(shù)重要的決策都需要由委員會投票決定,這樣可以降低風(fēng)險。
Google 的人力資源部一直在進(jìn)步,他們根據(jù)數(shù)據(jù)和員工反饋來提升評估系統(tǒng),這個系統(tǒng)包括招聘、提升、獎勵等內(nèi)容。
我的天,Google 的優(yōu)點太多了。我曾去過一次 Google 的辦公室,我本來的期望就很高,結(jié)果發(fā)現(xiàn)那兒的情景比我想象的還要好!
關(guān)于谷歌面試學(xué)院
還記得那份告訴我該學(xué)習(xí)什么的面試指導(dǎo)筆記么?雖然上面的內(nèi)容我很多都不懂,但至少它讓我有了目標(biāo)。
我把筆記上的題目變成提綱,然后通過觀看麻省理工學(xué)院和加州大學(xué)伯克利分校在 YouTube 上的講座來一一學(xué)習(xí)。每個鏈接上可能有多個學(xué)習(xí)內(nèi)容,很多視頻基本都會引出下一個視頻,就這樣我不停地學(xué)習(xí),學(xué)習(xí)提綱逐漸豐富。
由于之前我的寫的商業(yè)、工作代碼都是保密的,我的 Github 基本是空空的,看起來像根本沒有在敲代碼一樣,于是我把這份學(xué)習(xí)提綱上傳了上去。我需要創(chuàng)建一個作品,開始我叫它“Project 9894”,是因為 Google 創(chuàng)建于 1998 年 9 月 4 號。后來我把它改名為“谷歌面試學(xué)院”。
在學(xué)習(xí)的過程中,我把自己發(fā)現(xiàn)的話題都一一添加上去。
過去我總覺得“知識夠用就行了”。這么多年職業(yè)生涯中我根本不清楚 CPU 怎么處理一段程序,內(nèi)存如何工作,或者其他的知識,我很佩服自己這么多年是怎么過來的。
我的 Github 小項目漸漸開始得到一些關(guān)注,我甚至寫了篇文章慶祝項目得到 20 個 star。
有天早晨我發(fā)現(xiàn)我的項目有 120 個 star 了!某個業(yè)內(nèi)知名人士前一晚上在推特上分享了我的項目,讓我的項目收到很多關(guān)注,甚至進(jìn)入了 Github 當(dāng)日流行榜。好幾天我都是 Github 流行榜的第一名哈哈。
許多善良的人主動鼓勵、感激我,這讓我發(fā)現(xiàn)原來有數(shù)以千計的人跟我一樣,不僅想去 Google 工作,也想成為一名軟件工程師,我列出的學(xué)習(xí)內(nèi)容正是他們需要學(xué)習(xí)的方向。
到目前為止它有超過 21000 個 star 了,難以置信。
如果我無法 Google 工作怎么辦
只要不是天塌下來,都沒關(guān)系。
為了成為 Google 的軟件工程師,我投入了大量的時間和精力,即使我不幸失敗了,我學(xué)到的知識和能力也足以讓我去任何其他公司任職。
不論結(jié)局如何,起碼我會成為一名入門級別的軟件工程師。我不認(rèn)為我有 15 年的軟件工程師經(jīng)驗,因為我過去的確不具備這個能力,我和剛畢業(yè)的計算機學(xué)生一樣還只是新手。
這對于我來說是一段新的旅程,才剛剛開始,即使我會犯很多錯,也毫不畏懼,因為我有學(xué)習(xí)新內(nèi)容的熱情,我要學(xué)習(xí)所有需要的知識,成為團(tuán)隊中優(yōu)秀的一部分。
叮囑:別像我一樣學(xué)過多東西
我花了八個月時間準(zhǔn)備面試,但事實上我可以縮短很多時間。跟做其他復(fù)雜的事情一樣,一開始都需要試錯、走彎路,總有一些事我想回去重做。
我學(xué)習(xí)了很多我不需要的內(nèi)容,有些是因為我覺得面試需要,有些是我覺得工作里會用到。我不想成為團(tuán)隊中的負(fù)擔(dān)。但事實證明我操心太多了,很多內(nèi)容都沒必要學(xué)習(xí)。
我花了三周閱讀一本 1000 頁左右的講 C++ 的書,那么多內(nèi)容我沒記得多少,但是起碼對 C++ 了解多了一點。本來我以為會用到 C,C++,或者 Java,結(jié)果我面試中準(zhǔn)備用的是 Python。記住這個教訓(xùn):別猜,去問!去查!
到后來才發(fā)現(xiàn),我只需要讀三四本書就夠了,我讀的太多了。
我歸納了一本重復(fù)查看的算法總結(jié),里面記錄了很多我不希望在面試中遇到的問題。這其實是無用功,你不必這么做。
我花了很多時間看視頻,然而本應(yīng)該少看一些的,應(yīng)該隨著時間慢慢增加內(nèi)容。
我應(yīng)該盡早停止看書,換成看視頻,早點開始編程驗證、解決問題。早點開始動手實踐我所學(xué)的。
隔一段時間重顧知識是記憶的關(guān)鍵方法。不要一次性學(xué)完一項知識就不管了,這樣你無法真正的掌握。隔一段時間回顧一下,每次重復(fù),你都會加深自己的理解,次數(shù)多了,你就會理解每個細(xì)節(jié),成為真正的專家。
為了幫助回顧知識,我做了個手機上用的知識點抽記卡,里面有 1792 份知識,現(xiàn)在想想內(nèi)容有些過于多了。一有時間我就回顧上面的知識點,比如圣誕節(jié)購物、排隊等公交時。當(dāng)抽記卡上的問題我能正確地回答時,就標(biāo)記為“理解了”,否則從抽記卡上看明白答案,等待下次回答問題正確了再標(biāo)記。
我內(nèi)心的恐懼讓我學(xué)習(xí)了太多不需要的知識,比如“要是他們考我紅黑樹相關(guān)的知識怎么辦”。
但是我不想面向面試學(xué)習(xí),我想要為了在 Google 工作、解決重量級問題而學(xué)習(xí)。這就意味學(xué)習(xí)算法還是有用的,它們可以提升計算機的時間和空間效率。
或許我永遠(yuǎn)用不到 Ford-Fulkerson 算法(一類計算網(wǎng)絡(luò)流的最大流的貪心算法),但學(xué)習(xí)后我起碼知道如果有類似的問題出現(xiàn),該怎么解決。
總結(jié)
現(xiàn)在我了解了計算機的歷史,編程中最偉大的部分–數(shù)據(jù)結(jié)構(gòu)與算法,還有計算機系統(tǒng)底層是如何工作的。
在開始準(zhǔn)備谷歌面試之前,我總希望可以跳過所有準(zhǔn)備階段,直接應(yīng)聘,然后去學(xué)習(xí)工作中用到的語言和工具就好了。
但是在這個過程中,我意識到這些知識是多么重要,雖然它們可能在日常開發(fā)中應(yīng)用不到,但是我相信我的付出會給自己帶來內(nèi)在的提升。
我馬上就提交申請了,為了這件事我?guī)缀鯗?zhǔn)備了一年(一月份開始,但直到四月,我才能夠保證全職學(xué)習(xí))。
我覺得我已經(jīng)準(zhǔn)備的差不多了,是時候提交申請,對我這段時間的學(xué)習(xí)進(jìn)行一次檢驗了。
這將是我人生的一次飛躍。我看到前方有一個光明的未來。
謝謝你花時間讀我的故事。
-
谷歌
+關(guān)注
關(guān)注
27文章
6166瀏覽量
105352 -
軟件工程師
+關(guān)注
關(guān)注
8文章
218瀏覽量
21136
發(fā)布評論請先 登錄
相關(guān)推薦
評論