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