我在南大的七年
父親是個(gè)對新事物有強(qiáng)烈興趣的人,村里第一臺(tái)電視機(jī)是他自己組裝的,當(dāng)時(shí)全村人都跑過去看,電視機(jī)只能收到一個(gè)臺(tái),CCTV。座機(jī)電話是第一個(gè)裝的。大哥大剛出現(xiàn)的時(shí)候,他也是第一個(gè)買來用的,那個(gè)時(shí)候的移動(dòng)電話真是貴得離譜。
本文引用地址:http://m.butianyuan.cn/article/201703/345866.htm父親告訴我的第二件最重要的事情是:遇到任何問題,找書去就行。他在自己的專業(yè)中完全是自學(xué)的。在不屬于自己的專業(yè)中(后來買了電腦之后需要學(xué)習(xí)如何架設(shè)公司網(wǎng)站,如何網(wǎng)上營銷,如何進(jìn)行電子財(cái)務(wù)管理,如何使用各種作圖軟件制圖等等)也全都是靠買書自學(xué)。
為什么說到這兩件事情,因?yàn)檫@是對我一生影響最重大的兩個(gè)習(xí)慣。第一個(gè)習(xí)慣給了我學(xué)習(xí)新東西的強(qiáng)烈動(dòng)機(jī),有了熱忱和興趣,做事情就不覺得累,就自得其樂。第二個(gè)習(xí)慣則給了我學(xué)習(xí)任何新東西的方法——不會(huì)么?查書去。(當(dāng)然,學(xué)習(xí)一門專業(yè)并不完全通過看書就行,但這毫無疑問是至關(guān)重要的一個(gè)途徑。)
高三的時(shí)候,父親買了電腦,我立時(shí)對這個(gè)神奇的事物產(chǎn)生了強(qiáng)烈的興趣,每期的《電腦愛好者》和《電腦報(bào)》都會(huì)買來細(xì)細(xì)看,有時(shí)看到各種小工具、技巧還會(huì)摘抄下來,回去在自己家里的機(jī)器上搗鼓。那個(gè)時(shí)候我并不知道這樣單純的興趣會(huì)把我引向一條專業(yè)的程序員道路。
高三時(shí)間變得越來越緊,分配給興趣的時(shí)間越來越少,但興趣的火花一直都沒有熄滅。
跨進(jìn)南大校門的第一天,我知道,我自由了。
這個(gè)自由并不是說我可以做任何事情了,而是我得到了一個(gè)重要的決策的自由權(quán),即關(guān)于如何利用我的時(shí)間。
高考的時(shí)候我報(bào)了計(jì)算機(jī)系,但分?jǐn)?shù)差了幾分,失之交臂,被調(diào)到第二志愿專業(yè)——信息與計(jì)算科學(xué)。當(dāng)時(shí)以為這個(gè)專業(yè)跟計(jì)算機(jī)相關(guān)的,結(jié)果發(fā)現(xiàn)是數(shù)學(xué)系,后來聽不少同學(xué)提到都上了同樣的當(dāng)。
這里出現(xiàn)了一個(gè)歪打正著的事情:我本意并不是上數(shù)學(xué)系,如果當(dāng)時(shí)知道這個(gè)專業(yè)是數(shù)學(xué)系,我可能就不會(huì)填報(bào)了。但正是因?yàn)檫@個(gè)錯(cuò)誤,我在數(shù)學(xué)系好歹也受了一些數(shù)學(xué)基本功的訓(xùn)練(盡管這個(gè)訓(xùn)練的基礎(chǔ)是大一上的不多的幾節(jié)數(shù)學(xué)分析課,以及每次臨考前宿舍哥們例行的“包夜”看書),回過頭來看這個(gè)基本功在后來還是幫了不少的忙,甚至有一陣子我對數(shù)學(xué)本身到了很感興趣的程度。不得不說,這段學(xué)習(xí)的經(jīng)歷是很鍛煉抽象和邏輯思維的。另一方面,困難如數(shù)學(xué)都學(xué)了,對其他學(xué)科就不覺得難,不會(huì)望而卻步。
這是我成長過程中的幸運(yùn)之一。后面還會(huì)提到,還有好幾次更大的幸運(yùn)。
大一上學(xué)期很快過去,應(yīng)該是在大一下學(xué)期的時(shí)候,學(xué)校要開一門C++課程。我利用假期先把課本基本啃掉了,當(dāng)時(shí)動(dòng)機(jī)也很簡單,先啃掉,就不用上課了嘛。
另一件事情是我經(jīng)常喜歡去逛書店,看到侯捷的《深入淺出MFC》上面很多人說這本書好,我當(dāng)時(shí)也對C++有一些基礎(chǔ)認(rèn)識(shí)和好感,所以就買下來啃了。一方面侯捷先生寫的書的確圖文并茂,深入淺出,有意思,另一方面理解一樣復(fù)雜的東西是個(gè)智力挑戰(zhàn)。所以看著看著倒是覺得興致盎然。卻不知就這么和C++結(jié)下了不解之緣。
這是另一個(gè)歪打正著:為什么說是“歪打”呢?因?yàn)?a class="contentlabel" href="http://m.butianyuan.cn/news/listbylabel/label/MFC">MFC的設(shè)計(jì)也并不能說就是C++的Best Practice,另一方面若是以用為本的話也未必就要把MFC的原理摸個(gè)透。所以搞不好現(xiàn)在看來我就不會(huì)細(xì)看這本書。為什么說是“正著”呢?因?yàn)槔斫庖粋€(gè)費(fèi)解的東西本身需要長時(shí)間投入注意力,無形中練了理解能力和思維體力(專注),另一方面雖然MFC不是最佳設(shè)計(jì),但理解里面的代碼卻加強(qiáng)了對C++本身的認(rèn)識(shí),這是基本功;也加強(qiáng)了對C++的興趣,這是動(dòng)力,后來這個(gè)動(dòng)力驅(qū)使了我去看了大量的系統(tǒng)底層知識(shí),從操作系統(tǒng)代碼一直看到硬件體系結(jié)構(gòu)。
大二發(fā)生了幾件重要的事情:一是我在程序員上發(fā)表了第一篇技術(shù)文章,是剖析Boost源碼的。我已經(jīng)不記得什么時(shí)候、通過什么途徑知道Boost這個(gè)庫的了,總之是知道了,然后也是由于受到侯捷先生源碼剖析的影響,也去看源代碼,發(fā)現(xiàn)很難,越是難就越是覺得有趣,跟蹤代碼到臨晨四點(diǎn)居然越看越精神了,后來火速寫了一篇源碼剖析。發(fā)給《程序員》雜志的技術(shù)主編孟巖先生,孟巖先生給了很大的鼓勵(lì),于是我很來勁。后來一鼓作氣分析了N個(gè)庫,寫了一系列的Boost源碼剖析的文章,在網(wǎng)上隨處可以搜到這個(gè)系列。
這是第二個(gè)歪打正著,按理來說,研究語言技巧并不是程序員最佳的時(shí)間投入方法。所以現(xiàn)在我可能不會(huì)去做這件事情,會(huì)認(rèn)為有更好的時(shí)間投入途徑。但當(dāng)時(shí)就一頭扎了進(jìn)去。為什么說也是正著呢?因?yàn)殡m然這也許不是最佳的投入時(shí)間的辦法,但總歸比什么都不專注要強(qiáng)得多,至少這么一深入,對語言的缺陷和陷阱有了更深刻的認(rèn)識(shí)、也鍛煉了對代碼的親切感、跟蹤調(diào)試的耐心(是的,耐心,而不是技巧)。
所以后來我在博客上總結(jié)自己學(xué)習(xí)編程中走過的彎路,孟巖先生說到,是不是彎路,不是那么容易界定的。
的確,也許真的有更好的路,但事前真的很難判斷哪條路是最優(yōu)的,我們能做到的,是把一條路走透了、走深了,只要不是一條太不靠譜的路,深入的過程中總會(huì)有很多的收獲。只要不是太頑固,善于反省,總有一天也會(huì)逐漸意識(shí)到越來越靠譜的路。
除了發(fā)表第一篇技術(shù)文章之外,大二我還用業(yè)余時(shí)間做了一些技術(shù)翻譯,寒假里我坐在家里每天晚上翻譯半章《Effective C++》,當(dāng)然,后來我把譯稿提交給出版社的編輯時(shí)被告知文筆還顯生硬。
同一時(shí)間,我繼續(xù)啃N多C++以及底層知識(shí)的書,一段時(shí)間我的書架上全是這類書,根本不像數(shù)學(xué)系的學(xué)生。非典那陣子,把飯錢都拿來買了書,為什么買得這么瘋,也是因?yàn)槭芨赣H的一個(gè)影響,他告訴我買書不用心疼,因?yàn)槭情L遠(yuǎn)投資,收益遠(yuǎn)遠(yuǎn)大于這點(diǎn)金錢投入。那段時(shí)間我邊看邊寫一些代碼玩,有模仿Windows核心編程的小程序,也有嘗試并失敗的小游戲,也有拿來對宿舍玩的游戲文件分析的工具,還有為上機(jī)考試寫的庫,總之玩得不亦樂乎;不像很多知名的程序員在學(xué)校里面就寫了被廣為使用的工具,那個(gè)時(shí)候我完全沒有這個(gè)意識(shí),也不知道什么是開源,自己自娛自樂而已,所以沒有系統(tǒng)訓(xùn)練編碼量和編碼素養(yǎng),比較盲目。
大二下半年還發(fā)生了一件重要的事情,我在CSDN上開了一個(gè)博客,開始寫學(xué)習(xí)C++和編程的過程中的一些總結(jié)。這個(gè)博客我一直寫到今天,伴隨了我整個(gè)7年的學(xué)習(xí)和成長,回過頭去看就像時(shí)光機(jī)一樣,能夠看到一路過來我都關(guān)注了些什么東西,是怎么想的,以及對一些事情的看法是怎么改變的。這些東西如果不記錄下來,就會(huì)逐漸忘掉,也就無法參照過去的自己,對未來提供更好的借鑒了。所以我一直把記錄當(dāng)做一個(gè)很重要的工具。另外我也通過這個(gè)博客認(rèn)識(shí)了很多朋友,得到了很多的幫助。
后來,學(xué)校提供了轉(zhuǎn)系到軟件學(xué)院的機(jī)會(huì),我立即報(bào)名了。后來的兩年在軟件學(xué)院度過。但其實(shí)反正我也是自己安排時(shí)間,所以無甚區(qū)別。
大三大四發(fā)生了幾件重要的事情:一是榮耀先生邀我合譯《Imperfect C++》,我很樂意的接了下來,可沒想到這本書比我想象得要密度大得多,六百頁,而且排版也很密,我給自己安排了每天6、7頁紙的量,大概花了半年多譯完。中間有一段時(shí)間停滯,榮耀先生給我鼓勁,告訴我一個(gè)重要的方法:如果覺得做不下去了,就硬著頭皮堅(jiān)持做,然后就類似于麻木了,適應(yīng)了,那種望而卻步的感覺會(huì)逐漸自動(dòng)退去。驚人的簡單,但事實(shí)就是如此,硬著頭皮,過了那個(gè)情緒上最艱難的時(shí)候,也就適應(yīng)了。這本書譯完之后,還是有不少的收獲,但我總覺得對性格上的磨練才是最有價(jià)值的收獲。
二是我開始看英文版的書。之前,由于高中不靠譜的英語教育的原因,我恨死了英語,大二的校內(nèi)四級課程還掛了科,直到大四才補(bǔ)考。但對技術(shù)本身的熱愛壓過了對英語的反感,我還是硬把一整本影印版啃下來了,而且津津有味,這本書就是Jeffrey Richter的《Applied .NET Framework Programming》。這個(gè)事情的重要性在于,后來我就不再反感和恐懼英語了,這是其一,其二是我開始意識(shí)到英文世界的技術(shù)資料有多么豐富,所以雖然本身看上去不是一個(gè)太起眼的事件,但卻是我獲取信息方式的一個(gè)Tipping Point,一旦熟練掌握了語言這個(gè)平臺(tái),背后就是一扇大門,通向一個(gè)海量的信息源,后來我的信息獲取絕大多數(shù)便來自于英文,其中尤數(shù)wikipedia和英文版的書為多。另外還有一個(gè)收益后面會(huì)提到。
大四快畢業(yè)的時(shí)候又發(fā)生了一件事情,微軟的Eric Jiang通過我的博客找到我,推薦我去微軟面試,我隨隨便便就把粗糙的簡歷給發(fā)過去了,差點(diǎn)因?yàn)楹啔v太粗糙被HR直接過濾掉。遠(yuǎn)程電話面了兩輪,遠(yuǎn)程Coding一輪,然后記得就是飛到北京面試,住在北航招待所。北京的面試又面了好幾輪,有考察底層知識(shí)的、有考察C/C++的、.Net的,還有考察算法的,編碼素養(yǎng)的??傊褪枪J(rèn)的基本功考察。最終我還是沒能通過面試。個(gè)人自己后來總結(jié)的結(jié)論是算法基本功太差,連什么是動(dòng)態(tài)規(guī)劃都不知道,編碼素養(yǎng)也不夠。這部分也是因?yàn)楸究频膶W(xué)習(xí)方法太業(yè)余,什么好玩干什么,倒不是說興趣驅(qū)動(dòng)不好,只是缺乏系統(tǒng)的規(guī)劃,不清楚也不關(guān)心這個(gè)領(lǐng)域的藍(lán)圖,也弄不清什么是重點(diǎn)。后來在讀研的時(shí)候惡補(bǔ)了一把算法,好歹弄清了一些基本的概念和思考方法。編碼素養(yǎng)的問題也是到了讀研的時(shí)候才開始思考和學(xué)習(xí),現(xiàn)在仍在學(xué)習(xí)。
另外,在本科階段,其實(shí)我也浪費(fèi)了很多時(shí)間,事實(shí)上,是只花了很小一部分時(shí)間來學(xué)習(xí)。之所以還多少學(xué)了點(diǎn)東西,完全是仰賴了專注的習(xí)慣。而這個(gè)專注的習(xí)慣其實(shí)又是從小受父親耳濡目染的,父親會(huì)花一整天揣摩一個(gè)問題,父親跟我說過他以前組裝電視機(jī)時(shí)的故事——一切都似乎組裝正確,但電視機(jī)就是不工作。他苦思冥想,不得其解,當(dāng)晚,半夜從睡夢中醒來,想到了問題的癥結(jié)所在。所以,我在啃一些底層知識(shí)時(shí)如果弄不懂,也會(huì)一遍遍讀,然后用走路吃飯坐車的時(shí)間在腦子里一遍遍去琢磨。我有很多重要的習(xí)慣受到父親的影響,這些習(xí)慣自己一般覺察不到,但卻默默影響了平時(shí)的一點(diǎn)一滴的時(shí)間分配和學(xué)習(xí)軌跡,這些習(xí)慣從紙上很難學(xué)到,但耳濡目染卻會(huì)自然而然地學(xué)會(huì)。
每當(dāng)有人覺得我本科就做了不少事情的時(shí)候,我就會(huì)說其實(shí)我本科真的浪費(fèi)了很多時(shí)間,而另一方面,這也說明,要掌握一門專業(yè)知識(shí),其實(shí)每天一點(diǎn)時(shí)間,專注、積累和持之以恒也就夠了。后來研究生階段才算真正開始惜時(shí)了,于是經(jīng)歷了兩年密度很高的學(xué)習(xí)和思考,心智才成熟了不少。
大四的時(shí)候,和很多人一樣,我也考研,因?yàn)橐粊硪埠苊H?,二來也希望能夠繼續(xù)有一個(gè)寬松的環(huán)境繼續(xù)沉浸在自己的興趣中。但四年來我都是自己安排時(shí)間,逃掉了無數(shù)的課,已經(jīng)對模式化的做題考試產(chǎn)生了抵觸,所以考研的復(fù)習(xí)也沒怎么認(rèn)真準(zhǔn)備,那年考研的數(shù)學(xué)題又偏難,一下慌了神,結(jié)果居然把一整頁題壓在稿紙下忘了做了,心理準(zhǔn)備有多不充分可見一斑。考完數(shù)學(xué)我很沮喪,那么大分值的題目沒做,數(shù)學(xué)肯定過不了了,接下來的專業(yè)課就沒去考了。后來想想其實(shí)還是應(yīng)該去考一考,多少能為下一年積攢經(jīng)驗(yàn)。
后來就工作了,沒去成微軟,經(jīng)同學(xué)張振推薦,就去了南京西門子。心里的打算還是邊工作邊考研,為什么考研,動(dòng)機(jī)也簡單,我心理還沒準(zhǔn)備好,本科只顧著埋頭學(xué)好玩的,也不看路,不知道自己想要什么樣的工作,想做什么樣的事情。去西門子之后更加覺得如此,覺得效率很低,做的事情也并不是我樂意的,每天還要在班車上浪費(fèi)兩個(gè)小時(shí),于是沒過多久就辭掉了工作。打算復(fù)習(xí)考研。那個(gè)時(shí)候大概還有半年多的時(shí)間才到考研,所以我中途不緊不慢地又翻譯了《Exceptional C++ Style》,占用了不少時(shí)間,到最后時(shí)間很緊了,就剩兩三個(gè)月,我才開始認(rèn)起真來,回想起來這是糟糕的時(shí)間管理。結(jié)果我不得不作了最壞的打算:頂多調(diào)劑去軟件學(xué)院讀研(我報(bào)的是計(jì)算機(jī)系),考慮到我反正是自己安排時(shí)間,差別應(yīng)該不大。幸運(yùn)的是,最終一分不差地過了線,算是蹭到了計(jì)算機(jī)系里。雖然如此,還是覺得這種驚險(xiǎn)不要發(fā)生的好,以后或者其他事情上就不會(huì)有這么幸運(yùn)了,及早準(zhǔn)備總是很重要的。
讀研期間的兩年半,是我自己覺得心智年齡成長最迅速的一段時(shí)間。這里也有幾個(gè)很幸運(yùn)的事情。一個(gè)事情是我的導(dǎo)師陳家駿先生給了我很大的自主,于是我得以有時(shí)間安排一些重要的學(xué)習(xí),這段時(shí)間對我來說很重要,我學(xué)習(xí)和思考了很多東西,為個(gè)人以后的發(fā)展作了很多準(zhǔn)備,倒是沒幫導(dǎo)師做什么事情。所以,碩士畢業(yè)離開的時(shí)候是既感激也愧疚。
另一個(gè)事情是認(rèn)識(shí)同實(shí)驗(yàn)室的師兄陳懷興,嚴(yán)格來說是他先來找我聊天,可見那個(gè)時(shí)候我仍然還是沒有意識(shí)到與人交流的重要性的,后來,建立了TopLanguage討論組之后越發(fā)意識(shí)到與他人交流的重要性,也開始主動(dòng)尋找和參與交流,希望以后自己也能組織交流。陳懷興對算法很有造詣,也是TopCoder上的??秃团H耍莻€(gè)時(shí)候我也正在為以后的工作面試準(zhǔn)備一些算法基礎(chǔ),所以經(jīng)常找他討論,獲益很多。有一句話說:看一個(gè)人,只要看他讀的書和見的人。還是很有道理的,這兩者是一個(gè)人成長中最有價(jià)值的信息來源。
研一下半年,女朋友找工作的時(shí)候需要用到營銷方面的知識(shí),于是我去替她找書,偶遇《影響力》這本書,這本書打開了我的視野,讓我開始關(guān)注一個(gè)很有價(jià)值的領(lǐng)域:我們?nèi)绾嗡伎?,如何正確地思考。這個(gè)領(lǐng)域有很多有意思和有價(jià)值的書,我利用近一年的時(shí)間,陸陸續(xù)續(xù)看了近40本相關(guān)的書(我把這些書整理了之后以豆列的形式放在豆瓣上),對思維的特點(diǎn)和缺陷,以及如何思考有了很多的了解,這些知識(shí)后來很大程度上使我更清晰地認(rèn)識(shí)自己,和自己在學(xué)習(xí)和生活中面臨的各種問題。
也是研一下半年,我建立了一個(gè)Google Groups,起名TopLanguage,一開始的時(shí)候是因?yàn)槠匠]人討論問題,憋得難受,希望有人能夠說兩句,無心插柳柳成蔭,后來這個(gè)討論組的交流越來越多,如今已經(jīng)近兩年,組內(nèi)成員超過了4,000人,兩年里我也從中收益頗多,其中最大的收益有兩個(gè):一是和人討論能夠激發(fā)自己進(jìn)一步的思考,也促使自己更清晰地表述自己的觀點(diǎn)或問題。倒不是說別人就一定告訴你什么新東西,而是討論對你自己的思維的刺激。二是交流中認(rèn)識(shí)了不少朋友,后來快畢業(yè)的時(shí)候也受幫助頗多。我一直把TopLanguage的創(chuàng)建看作研究生階段做得最有意義的事情之一。
此外,我有意識(shí)地提前準(zhǔn)備了英語,因?yàn)槲蚁嘈湃绻胍ズ玫耐馄?,口語不過關(guān)很可能成為一塊短板(當(dāng)然,英語作為承載最多技術(shù)知識(shí)的平臺(tái)語言還有更大的價(jià)值),包括閱讀、書寫和口語。我想了一個(gè)方案,可以不用額外花時(shí)間來學(xué)習(xí)英語:閱讀的訓(xùn)練蘊(yùn)含在平時(shí)的英文技術(shù)資料的閱讀中,盡量讀英文的,一來英文資料更一手和全面,二來也順便練閱讀。書寫的訓(xùn)練蘊(yùn)含在去國外郵件列表發(fā)技術(shù)貼和自己寫的英文博客文章中??谡Z的訓(xùn)練則蘊(yùn)含在平時(shí)的娛樂中——美劇,有一個(gè)暑假我?guī)缀跆焯扉_著Friends睡覺,另外學(xué)校有國外過來的團(tuán)隊(duì)演講我不再錯(cuò)過,而是主動(dòng)參加,有一次還帶他們出去逛南京,說了一天英語,回頭在路上聽中文都像英文。雖然和外國友人交流的次數(shù)不多,但似乎對口語感覺的提高還挺大。后來在微軟亞洲研究院的面試最后一輪就是英語的,而且是偏技術(shù)的,好在提前準(zhǔn)備了,所以畢竟還是順利地表達(dá)出了想表達(dá)的意思。
去微軟亞洲研究院面試,是因?yàn)樾疫\(yùn)地認(rèn)識(shí)了微軟亞洲研究院技術(shù)創(chuàng)新組項(xiàng)目主管鄒欣先生。鄒欣先生和他組織的團(tuán)隊(duì)在那段時(shí)間寫了《編程之美》,書中有很多很有意思的題目,而我那段時(shí)間恰和陳懷興討論算法,在討論組上也組織了專題的討論,有了一點(diǎn)粗淺的思考,于是和鄒欣先生郵件交流,由于對鄒欣先生的技術(shù)創(chuàng)新組做的事情很有興趣,所以找工作的時(shí)候便向他毛遂自薦。
承蒙鄒欣先生推薦,時(shí)隔三年,我再次獲得了去微軟面試的機(jī)會(huì)。這一次,由于研究生期間作了一些長遠(yuǎn)準(zhǔn)備,所以心里有底了很多,也就比較冷靜了,由于當(dāng)年知識(shí)體系的漏洞被我花功夫補(bǔ)了補(bǔ),所以面試比較順利。面試的時(shí)候鄒欣先生更為詳細(xì)地介紹了技術(shù)創(chuàng)新組的工作,我更加感興趣了,所以盡管已經(jīng)有另外幾個(gè)也不錯(cuò)的選擇,但心里還是迅速地做了決定。大約一周后,HR通知Offer,我毫不猶豫就接受了。
我想,雖然有很多人本科就明白自己想做什么,我多花了兩年多,總還不算太晚。
評論