我非常希望能上大學(xué),我的理想大學(xué)是加利福尼亞大學(xué)洛杉磯分校(UCLA)。很不幸,我高中的 GPA 低的令人尷尬,只有2.45。所以實(shí)際上,我并沒(méi)有隨便選擇一家大學(xué)。我在普渡大學(xué)蓋萊默分校上的計(jì)算機(jī)科學(xué)課程,希望可以當(dāng)交換生或者找到別的出路。差不多兩個(gè)學(xué)期以后,后者發(fā)生了。我收到了一個(gè)不可拒絕的offer。
第一步:在你能做之前先裝裝樣子。大學(xué)的時(shí)候,我在一家專門為本地企業(yè)建設(shè)網(wǎng)站小公司工作,時(shí)薪是12美金。在我的職業(yè)規(guī)劃里,我從未想過(guò)做這樣一份工作,但當(dāng)時(shí)來(lái)看還不錯(cuò)。
我同時(shí)參與多個(gè)項(xiàng)目,身負(fù)重任,我選擇埋頭苦干,全力以赴。從這個(gè)過(guò)程中我獲得了很多信任。同時(shí),我嘗試?yán)梦也欢嗟臉I(yè)余時(shí)間開發(fā)游戲。我去到一個(gè) 天主教會(huì),向那里的管理人員請(qǐng)求提供我少量的錢和三個(gè)月時(shí)間來(lái)開發(fā)這個(gè)游戲,然后在網(wǎng)上銷售。我繪制了漂亮的報(bào)表和顏色豐富的圖片,向他們展示共享軟件模型( shareware model )是怎么工作以及如何確切知道這會(huì)帶來(lái)回報(bào)。實(shí)際上,我對(duì)于我將要做的東西還不是非常清楚,但是他們買了,也許是由于那些漂亮的顏色。
經(jīng)過(guò)兩個(gè)月的開發(fā),我將Demo發(fā)布到網(wǎng)上。一個(gè)在加州剛剛起步的創(chuàng)業(yè)公司CodeFire發(fā)現(xiàn)我的Demo和他們的游戲如此相似,都是一個(gè)從上往 下看的太空射擊游戲,都和SubSpace非常相似,除了3D部分。不幸的是,他們通過(guò)勒令停止通知函與我交涉。我只能給他們一個(gè)回復(fù)“當(dāng)然可以,只要你們聘請(qǐng)我工作,我就馬上停止”。他們馬上給我發(fā)了offer。然后我就收拾行裝去了加州。
第二步:和大師交朋友。這可能是最重要的事情。在你的領(lǐng)域里找到一位大師,讓他們成為你的導(dǎo)師,不停的向他們學(xué)習(xí)。當(dāng)我在Double Helix工作時(shí),有一位大師叫 Nathan Hunt,他是我遇過(guò)最聰明的卻又最謙卑的人。不管我問(wèn)的問(wèn)題如何的基礎(chǔ),他都極度耐心的一一解答。我至少上千次的走進(jìn)他辦公室,問(wèn)一些諸如“我怎樣才能平滑的將一個(gè)旋轉(zhuǎn)矩陣插值到另外一個(gè)里面”,“我應(yīng)該如何實(shí)現(xiàn)移動(dòng)柱體的碰撞檢測(cè)”的問(wèn)題。幾年以后,他晚我一個(gè)月加入了谷歌。
每一個(gè)導(dǎo)師都改變了我解決問(wèn)題或者看待世界的方法,而這只有其中的一小部分。
第三步:填補(bǔ)不足。因?yàn)槲覜](méi)有一個(gè)正式的計(jì)算機(jī)學(xué)位,我清楚自己缺乏很多基礎(chǔ)的理論知識(shí)。比如,我實(shí)現(xiàn)了一個(gè)物理引擎,但從未解決過(guò)動(dòng)態(tài)規(guī)劃的問(wèn)題。為了填補(bǔ)這些空缺,我?guī)缀鯇?shí)現(xiàn)了所有我見(jiàn)過(guò)或讀過(guò)的數(shù)據(jù)結(jié)構(gòu)與算法。這些雖然都已經(jīng)有了,但是通過(guò)觀察而知道其如何 工作,與通過(guò)實(shí)現(xiàn)而知道其為什么可行有著巨大差別。
完成以下幾點(diǎn):
至少掌握其中一門語(yǔ)言: C、 C++、Objective-C、Java、PHP、Python 或 Ruby。了解至少一門其他語(yǔ)言,熟悉Scala、Haskell 或者 Lisp。
學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)。嘗試實(shí)現(xiàn)其中的大部分。理解他們的時(shí)間復(fù)雜度。
解決編程問(wèn)題。閱讀下面的文章( Read this)和解決這里的大多數(shù)問(wèn)題( solve many of these)。
為你的項(xiàng)目建立主頁(yè)。(比如,編程框架、移動(dòng)應(yīng)用、網(wǎng)頁(yè)應(yīng)用、小游戲等)
第四步:找到自信。在離開印第安納州6年以后,我已經(jīng)通過(guò)多個(gè)平臺(tái)發(fā)布了超過(guò)6個(gè)游戲。我漸漸覺(jué)得無(wú)聊,需要新的挑戰(zhàn)。我申請(qǐng)了谷歌的職位,由于我沒(méi)有學(xué)位,我想著如果我被聘請(qǐng)了,我就能成為夢(mèng)寐已久的一名真正的工程師了。但是,我從未收到回信,對(duì)于這一點(diǎn)我感到一點(diǎn)都不意外。
一年以后,我再次提交了我的簡(jiǎn)歷。而這一次,我把“教育”這一部分刪除了。諷刺的是,這次一位招聘官給我打電話和我預(yù)約了一個(gè)電話技術(shù)面試。我咨詢是否可以預(yù)約在兩個(gè)星期以后,他同意了。我需要這一部分時(shí)間。我利用這段時(shí)間,盡最大努力將盡可能多的算法和數(shù)據(jù)結(jié)構(gòu)塞到我的腦子里。我每天編碼 12-14個(gè)小時(shí),解決了幾百道編程題。我慢慢沉迷進(jìn)去了,直到我對(duì)谷歌面試的害怕變成了自信和興奮。
我記得住在谷歌的每一次面試,每一次與他們的交鋒。面試官都很健談,我相信他們都看得出來(lái)我非常興奮的迎接他們的問(wèn)題。
我遇到的一些面試題如下:
給定一組2維點(diǎn),計(jì)算出他們的輪廓線。這非常簡(jiǎn)單,我采用了非常一種通用的數(shù)據(jù)結(jié)構(gòu)叫做最大堆。這道題有很多解決方法,這里有一個(gè)非常好的。( good one)
設(shè)計(jì)微軟的畫筆。這是目前為止最有趣的問(wèn)題。我從畫接口和類圖開始,我提到了畫筆桶(Paint Bucket),面試官讓我實(shí)現(xiàn)它。幸運(yùn)的是,多虧TopCoder,我閉著眼睛都知道如何實(shí)現(xiàn)一個(gè)迭代的,廣度優(yōu)先遍歷的桶。
描述你的軟件的長(zhǎng)處。這是一道開放的討論面試題。我說(shuō)到了測(cè)試的類型和他們的重要性(單元測(cè)試,集成測(cè)試,驗(yàn)收測(cè)試)。我又說(shuō)到了代碼風(fēng)格的一致性和可維護(hù)性等等。這些東西你可以在《代碼大全》和 《Effective Java》找到。
我真正的享受每一輪面試和每一個(gè)扔給我的問(wèn)題。如果我沒(méi)有那樣認(rèn)真的準(zhǔn)備,我現(xiàn)在肯定不是這個(gè)樣子。面試完了以后,我感覺(jué)非常好。但是,我聽(tīng)說(shuō)即使招聘委員組同意了給offer,拉里本人仍有權(quán)利否決。我擔(dān)心一旦他看到我沒(méi)有學(xué)位以后,我就完蛋了。
不過(guò),這并沒(méi)有發(fā)生,有一天我在Santa Clara吃著壽司午餐,我接到了電話,我非常熱情的接受了Offer。那一天,我清楚的知道我不用再回到學(xué)校里去了。
感言:勝利的戰(zhàn)士先勝了再去戰(zhàn)場(chǎng),而失敗的戰(zhàn)士先上戰(zhàn)場(chǎng)再去求勝。