凡是 LUG 的活躍會員,都早晚會被吸引進碼農(nóng)的圈子。
這個謠言的出處及真假暫不考證。到底是 LUG 的氛圍把小伙伴們引上了碼農(nóng)這條不歸路,還是打定了主意走碼農(nóng)路的才會長期活躍在 LUG,我說不清。
為什么選擇計算機專業(yè),事實上是兩個命題:
我試圖用自己的經(jīng)歷來解讀這兩個命題。少年時代,我曾把科學(xué)家作為自己的夢想,高三那會兒想的是做理論計算機研究。在大一升大二的關(guān)頭,我曾在數(shù)學(xué)和計算機之間徘徊抉擇,還曾考慮過學(xué)物理。因為想不清楚,大一下學(xué)期的時候我并沒有申請轉(zhuǎn)專業(yè)。在大二上學(xué)期開學(xué)一周后,我感覺不能繼續(xù)混沌下去了,于是提交了轉(zhuǎn)專業(yè)申請,從第二周開始,踏上了碼農(nóng)的不歸路。
少年的科學(xué)家之夢
小時候,跟很多人一樣,我的夢想是成為一個科學(xué)家。直到高中,我的偶像一直是錢學(xué)森。我喜歡前總理的一句詩:“我仰望星空,它是那樣寥廓而深邃;那無窮的真理,讓我苦苦地求索、追隨。” 自然科學(xué)領(lǐng)域有太多美妙而值得探索的東西,小時候看的各種科普更是讓我感覺與科學(xué)相見恨晚。
為了能學(xué)到更多的知識,我不顧老師和家長 “要集中精力” 的勸阻,除了生物競賽以外全報了,周六周日的上午下午都排滿了。反正不用交錢,不聽白不聽。現(xiàn)在還不到評判當(dāng)年的選擇是否正確的時候,但我確實很享受這段充實的時光。自然科學(xué)還在很大程度上影響了我的三觀。高一的時候,通過物理競賽聽說了熱力學(xué)第二定律,聽說了 “熵增” 的原理和 “熱寂論”,就開始思考人生的意義了,當(dāng)然現(xiàn)在看來都是虛無縹緲的。高中畢業(yè)的時候,我對數(shù)學(xué)、物理和計算機并沒有特別的傾向。
剛進科大的時候,我的想法是在本科階段打好數(shù)學(xué)基礎(chǔ),然后去搞理論計算機研究(就是可計算性理論、算法之類的),其實我也不懂理論計算機到底是個什么玩意。科大保送生有個先修大學(xué)課程的計劃,“義務(wù)勞動” 老師給我的建議是:本科打好數(shù)學(xué)基礎(chǔ),以后從事各種研究都比較方便。理論計算機雖說是數(shù)學(xué)和計算機的交叉學(xué)科,其研究方法很多還是從數(shù)學(xué)里繼承過來的,對計算機工程方面的技術(shù)反而不需要太多了解。
于是,我進入了華羅庚班學(xué)習(xí)數(shù)學(xué)。還加入了新生的物理社團——格物致知社,因為聽說科大的物理專業(yè)很好,就不想放棄這個優(yōu)勢條件。但我沒有參加 ACM,因為我當(dāng)時看到網(wǎng)絡(luò)上一些 “碼農(nóng)” 的自嘲,不想再編程序了(我當(dāng)時不知道碼農(nóng)跟碼農(nóng)也是有很大差別的);也聽說科大計算機專業(yè)的排名不是很靠前,感覺在科大學(xué)計算機,還不如當(dāng)初選擇上海交大呢(這是被沉沒成本束縛,掉進了思維陷阱)。
如果我一直在華羅庚班老老實實地學(xué)數(shù)學(xué),也許我會成為學(xué)霸,在美帝過著幸福的讀博生活。可惜,在格物致知社,我遇到了一群有理想有追求的小伙伴,搭建了學(xué)習(xí)資料共享和物理討論的論壇,我也因此陰差陽錯地掉進了 Linux 的坑?,F(xiàn)在回首四年前搭建的論壇,這些星空圖片和物理圖像仍然引我遐想:我拋棄誘人而深邃的自然科學(xué)而掉進計算機的坑,是偶然的,還是冥冥中存在某種必然?
數(shù)學(xué)與計算機的抉擇
由于沒有刷吉米多維奇,我一直沒學(xué)會積分。大一下學(xué)期的數(shù)學(xué)分析,很多內(nèi)容是以積分為基礎(chǔ)的,我已經(jīng)感覺有些吃力了。那次期中考試,我由于睡過頭,遲到了一個小時,但我做了一個小時的題,到交卷的時間,剩下的題就基本不會做了;助教帶我到他辦公室給我延長了一個小時時間,但那一個小時我愣是只做出了一道題。這種頭腦一片空白的失落感,是我之前從未遇到過的。(當(dāng)然大二掛科的數(shù)理方程考試比這種感覺更甚,所以說大學(xué)要掛科還是蠻困難的)
大一下學(xué)期,數(shù)學(xué)分析的史濟懷老師利用最后一次習(xí)題課的時間回答我們的問題。我問:“我想從事理論計算機方面的研究,但對連續(xù)數(shù)學(xué)不是很感興趣,覺得離散數(shù)學(xué)還比較好玩,但現(xiàn)在數(shù)學(xué)課學(xué)習(xí)的都是連續(xù)數(shù)學(xué),是不是跟理論計算機關(guān)系不大呢?我是不是應(yīng)該轉(zhuǎn)計算機專業(yè)?” 史老師說,連續(xù)數(shù)學(xué)是基礎(chǔ),離散數(shù)學(xué)的很多問題不方便處理,要用連續(xù)數(shù)學(xué)來逼近(這一點我現(xiàn)在越來越有感觸了),所以連續(xù)數(shù)學(xué)是必須學(xué)好的。至于學(xué)數(shù)學(xué)專業(yè)還是計算機專業(yè),要看你個人的興趣。
學(xué)習(xí)連續(xù)數(shù)學(xué)的失敗,讓我開始懷疑自己的能力。大一快結(jié)束的時候,我去線性代數(shù)老師的辦公室,咨詢我是否適合數(shù)學(xué)專業(yè)。他說,并不是有 “天分” 的人才能學(xué)好數(shù)學(xué),沒有誰適合或者不適合數(shù)學(xué)研究,只要認(rèn)真學(xué)、下功夫,這些東西都能學(xué)會的。老師的話是對的?,F(xiàn)在想來,還是因為搞社團和網(wǎng)站分心太多,如果當(dāng)年靜下心來好好刷題,也許能把連續(xù)數(shù)學(xué)學(xué)好呢。
不過,經(jīng)過了一年的荒廢,我的數(shù)學(xué)優(yōu)勢已然轉(zhuǎn)變?yōu)榱觿荩瑢τ嬎銠C的興趣卻不斷上升——計算機總能給我即時反饋的滿足感,而很少有搞不定的東西。不管是搭建 LAMP 服務(wù)器,還是讓 Discuz! 論壇支持 LaTeX,還是 PDF、Word 文檔在線預(yù)覽,都是通過 Google 和各種文檔資料,在一周左右的時間里能折騰出來的。但數(shù)學(xué)問題卻很難搜索到答案,寢室里又沒有其他人學(xué)數(shù)學(xué)專業(yè),遇到難題的時候挫敗感很強。
暑假的時候,我還覺得有跟上數(shù)學(xué)系節(jié)奏的希望。大二開學(xué),我拿到數(shù)學(xué)分析和常微分方程的教科書,看到里面那些令人恐怖的數(shù)學(xué)符號,就感覺此地不宜久留了。在轉(zhuǎn)專業(yè)的申請上,我寫的是 “由于興趣改變”,不過真實原因是數(shù)學(xué)學(xué)不下去了……真是一件悲傷的事情。到計算機系之后,還是有一些數(shù)學(xué)和物理課的,不過這些課程相比數(shù)學(xué)專業(yè)和物理專業(yè)簡單了很多,學(xué)起來就沒有那么吃力了。
計算機:戴著鐐銬跳舞
數(shù)學(xué)專業(yè)的一個好基友跟我說,數(shù)學(xué)是研究世界的本質(zhì),自然科學(xué)是研究上帝的意志,而計算機則是揣摩屌絲人類的意志。計算機的很多設(shè)計沒有為什么,只是某個屌絲程序員或者研究生廉價勞動力在趕 deadline 的時候拼湊出來的。他今早吃飽了喝足了,就給你設(shè)計好看點;要是早上沒睡醒或者跟女朋友吵了一架,那就把無盡的痛苦留給子孫后代了。想到這里,頓時感覺碼農(nóng)的逼格降低了好多,我們所做的事情都是戴著路徑依賴的鐐銬跳舞。
從探索自然的科學(xué)家降級為一個戴著鐐銬跳舞的碼農(nóng),其實是認(rèn)識到了自己的卑微和渺小。2011 年 6 月,《中國計算機學(xué)會通訊》刊出了一則對圖靈獎得主姚期智的訪談,盡管我轉(zhuǎn)專業(yè)的時候沒有看到這篇文章,但我當(dāng)時恰巧也是這么想的,摘錄如下。
問:您于 1972 年在哈佛大學(xué)獲得了物理學(xué)博士學(xué)位。但您并沒有從事物理學(xué)研究而改變了自己的專業(yè),去伊利諾伊大學(xué)香檳分校學(xué)習(xí)計算機專業(yè),并于 1975 年獲得了計算機博士學(xué)位。當(dāng)年您為什么要改變自己的專業(yè)呢?計算機的魅力何在?
姚期智:我那時學(xué)的是理論物理學(xué)。當(dāng)時大家覺得要了解宇宙的基本物理方向,尤其用數(shù)學(xué)推導(dǎo)出來,都是比較悲觀的。我當(dāng)時感覺物理學(xué)研究與我原來想象的有些不同。恰在那個時期計算機剛剛興起,有很多有意思的問題等著解決。當(dāng)時計算機也不像現(xiàn)在有專業(yè)不專業(yè)之分。我恰巧遇上這一學(xué)科,我認(rèn)為這個選擇是對的,也很順利。
關(guān)于姚期智還有一個傳言,說是 “我做理論物理的時候覺得太難了,但轉(zhuǎn)到計算機之后就發(fā)現(xiàn)沒有什么難題了”。這里面的原因我覺得是這樣的。自然科學(xué)面對的是上帝的創(chuàng)造,而計算機科學(xué)面對的是人類的創(chuàng)造。如果我對一個人類的創(chuàng)造感覺不爽,比如我發(fā)現(xiàn)現(xiàn)在的關(guān)系型數(shù)據(jù)庫限制太多,我可以造一個非關(guān)系數(shù)據(jù)庫,創(chuàng)造一個新的輪子出來。但如果我對一個物理定律不爽,我不可能向上帝祈禱,“光速為什么這么快,能不能慢一點,等我看清楚?”
也就是說,盡管搞計算機的人是在戴著鐐銬跳舞,但可以在不同的鐐銬之間作出選擇(比如選擇 Windows 或者 Linux,選擇 x86 或者 ARM)。選擇的多樣性使領(lǐng)域變得細化,大家不是在追求相同的目標(biāo)、解決相同的問題,而是在創(chuàng)造問題并嘗試解決。在計算機研究中,最重要的事情是發(fā)現(xiàn)問題,當(dāng)問題被形式化后,解決一般只是時間的問題,因為計算機領(lǐng)域不要求 “完美” 的解答,只要給出在現(xiàn)實中可以接受的解決方案即可,有各種各樣的方法做妥協(xié)和折中。
碼農(nóng)與科學(xué)家
相比計算機科學(xué),我其實更傾向的是計算機技術(shù),也就是那些已經(jīng)成熟、能夠用來改變世界的工程技術(shù)。搞技術(shù)相比搞研究,免除了很大的一個煩惱:對數(shù)學(xué)家的妒忌。各種研究領(lǐng)域之間的鄙視鏈,上一節(jié)開頭已經(jīng)說過了。不僅是計算機領(lǐng)域的科學(xué)家,各種領(lǐng)域的科學(xué)家為了讓自己的工作看起來更 “專業(yè)” 一些,往往喜歡把很淺顯的道理用嚴(yán)謹(jǐn)而生澀的數(shù)學(xué)公式表達出來,最好再用上些拉丁字母。這種 “數(shù)學(xué)情結(jié)” 使得科學(xué)家們傾向于解決易于形式化的問題,而非真正需要的問題。因此,很多研究基礎(chǔ)科學(xué)的科學(xué)家自嘲說,他們事實上不是在為 “人類” 做貢獻,而是在滿足自己的好奇心。
碼農(nóng)(攻城獅,程序猿/媛)則與科學(xué)家有本質(zhì)的區(qū)別。他們跟建筑師、設(shè)計師一樣,是在遵循一定的科學(xué)原理和成本控制的前提下,發(fā)揮自己的想象力創(chuàng)造東西。也就是說,碼農(nóng)不再需要妒忌數(shù)學(xué)家了。不同于建筑師,碼農(nóng)能夠更自由地發(fā)揮想象力。建一座大樓需要很多錢,一個建筑師縱使再有想法,沒有工程項目,也不可能看到自己的設(shè)計付諸實現(xiàn)。但計算機行業(yè)較低的進入門檻和信息的低復(fù)制成本使得 “屌絲逆襲” 成為可能,也就是一個人可以憑借自己的力量實現(xiàn)一個不錯的想法,如果產(chǎn)品受到歡迎的話,它會以指數(shù)的速度傳播發(fā)展。
我不希望自己的發(fā)展受到環(huán)境限制,也就是不希望我的發(fā)展軌跡被限制在某個預(yù)設(shè)的常規(guī)路線上。我希望能夠自由地實現(xiàn)自己的想法,并把這個想法推廣出去。作為一個屌絲,只有低門檻的互聯(lián)網(wǎng)行業(yè)能夠?qū)崿F(xiàn)這個夢想。互聯(lián)網(wǎng)是 “手工業(yè)者” 的時代,也就是互聯(lián)網(wǎng)發(fā)展的主要動力不是大公司和大權(quán)在握的決策者,而是千千萬萬有想法的年輕創(chuàng)業(yè)者,他們中的一部分脫穎而出,刷新著人類的生活方式和互聯(lián)網(wǎng)的運行模式。順便說一句,開源硬件運動和 3D 打印技術(shù)正在悄然改變制造業(yè),隨著進入門檻(制造成本)和物流成本的降低,制造業(yè)也將迎來 “手工業(yè)者” 的春天。
說到自由,很多碼農(nóng)一定會跳出來:你 too young too simple 了!那是因為我們對 “找工作” 的理解不同。從大學(xué)到公司,表面上只是個頭銜的變化,但事實上地位已經(jīng)從主人變成了仆人。上大學(xué)我們是交了學(xué)費的,某種意義上說學(xué)校是在為學(xué)生服務(wù),為學(xué)生提供各種資源來幫助學(xué)生成長。但在公司是老板給我們付錢,我們在為公司服務(wù)。因此當(dāng)我們說 “要找一份工作” 的時候,就暗示了自己要出售自己的知識和時間來換取公司的報酬。因此我對 “找工作” 的理解是 “找一家公司來實現(xiàn)自己的價值”,也就是利用公司的平臺和資源來做有價值的事情。這個心態(tài)的轉(zhuǎn)變可以讓我們擺脫打工者的自我定位,追求自己真正想要的東西。
我轉(zhuǎn)投計算機專業(yè),本質(zhì)上還是源于心態(tài)的轉(zhuǎn)變。即使我沒有加入格物致知社,后面少院學(xué)生會做網(wǎng)站的事情也會找到我。也就是說,這不是巧合而幾乎是必然。我遇見計算機專業(yè),遇見科大 LUG(Linux User Group),一系列機緣巧合,看起來像是小概率事件全讓我碰上了,但就像生物進化一樣,有一種 “自然選擇的壓力” 在幕后推動著這個進程。
總結(jié)一下我是如何掉進碼農(nóng)這個坑的:
本科為什么選擇計算機專業(yè)
下面談?wù)勅绻蛩愠蔀榇a農(nóng),為什么要在本科階段選擇計算機專業(yè)。這一部分的框架是這樣:
要系統(tǒng)地學(xué)習(xí)計算機專業(yè)課
選擇其他專業(yè),不如直接學(xué)計算機
計算機專業(yè)課重要嗎
有這么一種說法,碼農(nóng)的技術(shù)主要是通過實踐習(xí)得,而不是通過正規(guī)的計算機課程,在 “理論指導(dǎo)” 下學(xué)會的。對于一些應(yīng)用技術(shù),確實是這樣。但要脫離北大青鳥的水平,重復(fù)低層次的項目實踐,幫助是不大的。一些人花了很多時間學(xué)習(xí),但成績總是不見提高,很可能是因為他們總是在重復(fù)已經(jīng)學(xué)會的東西,而不敢挑戰(zhàn)有困難的問題,在解決簡單問題的時間陷阱里麻醉自己。那些整日做外包項目的碼農(nóng)也是一樣,他們或者是沒有興趣挑戰(zhàn)更難的東西,或者是沒有機會挑戰(zhàn)更難的東西,從而總是停留在那個層次。
要提高姿勢水平,就要系統(tǒng)地學(xué)習(xí)該領(lǐng)域的基本原理,這就是計算機專業(yè)開設(shè)的專業(yè)課。程序員不懂?dāng)?shù)據(jù)結(jié)構(gòu)與算法、操作系統(tǒng)、計算機網(wǎng)絡(luò)、計算機體系結(jié)構(gòu),就像建筑師不懂力學(xué),倒是能干活,但做設(shè)計的時候可能想不到一些潛在的問題而給以后帶來無窮無盡的麻煩。計算機歷史上的無數(shù)壞設(shè)計,大多是因為程序員的姿勢水平不夠高,而由于某種商業(yè)原因這個設(shè)計成為了行業(yè)標(biāo)準(zhǔn)。如果我們?nèi)巳硕继岣咭稽c鑒賞能力,整個計算機世界就會變得更加美好。鑒賞能力顯然是要專業(yè)知識和經(jīng)驗作為支撐的。
當(dāng)然,我讀本科的時候,計算機學(xué)院的課程設(shè)置還是有很多可吐槽的,我在瀚海星云 BBS 上就發(fā)了一篇引起激烈口水戰(zhàn)的文章《關(guān)于計算機學(xué)院部分非專業(yè)課程實行彈性選修的建議》。我發(fā)完帖那幾天突然忙起來了,于是沒有參加這場口水戰(zhàn)。不過直到現(xiàn)在,我支持彈性選修的觀點仍然沒有改變。
有人也許說,計算機發(fā)展太快,學(xué)的東西很快就過時了。事實上,本科計算機專業(yè)課的大多數(shù)內(nèi)容都是經(jīng)過了至少二三十年的考驗仍未過時,比如經(jīng)典數(shù)據(jù)結(jié)構(gòu)、UNIX 操作系統(tǒng)的設(shè)計、TCP/IP 網(wǎng)絡(luò)、編譯器的語法和語義分析,盡管在新的時代條件下出現(xiàn)了這樣那樣的問題,進行了這樣那樣的改進,但基本原理是不變的。容易過時的東西恰恰是那些通過實踐習(xí)得的應(yīng)用技術(shù),比如 MFC 窗口編程、Java 的 Web 框架、Apache 服務(wù)器的配置,一旦技術(shù)不流行了,就又要趕緊充電了。
數(shù)理基礎(chǔ)的迷思
很多優(yōu)秀的程序員并非計算機專業(yè)出身,這似乎是個有力的反面論據(jù)。但我們應(yīng)當(dāng)看到,更多的優(yōu)秀程序員是計算機專業(yè)(所謂 “科班”)出身。
從進入科大開始,我們就被灌輸 “重視數(shù)理基礎(chǔ)” 的觀念。很多同學(xué),包括大一的我,認(rèn)為本科四年應(yīng)該專心學(xué)習(xí)數(shù)學(xué)和物理,這樣以后的發(fā)展是 “寬口徑”、“有潛力” 的。在科學(xué)研究領(lǐng)域也許是這樣的。但對計算機工程來說,恕我不才,我實在看不到實分析和四大力學(xué)有什么應(yīng)用,或者能給我們的代碼帶來什么啟發(fā)。
我們不應(yīng)該把 “數(shù)理基礎(chǔ)” 和 “選擇數(shù)學(xué)或物理專業(yè)” 相混淆。大一大二不管是哪個專業(yè),都要學(xué)一些數(shù)學(xué)、物理的基礎(chǔ)課。然而數(shù)學(xué)或物理專業(yè)的后續(xù)課程,尤其是分了專業(yè)小方向之后的課程,就是進入那個專業(yè)領(lǐng)域研究的入門訓(xùn)練了。這些訓(xùn)練確實能給我們帶來思維能力的提升,也確實能帶來一些跨學(xué)科的靈感,但人的時間是有限的,投入這些時間成本的價值,相比直接學(xué)習(xí)計算機相關(guān)專業(yè)知識的價值,哪個更高呢?
我們不妨逆向思維一下:如果一個人將來打算從事物理學(xué)研究,那么本科學(xué)習(xí)計算機專業(yè)有多少幫助?學(xué)計算機專業(yè)的人編程能力會比較強,但他在最初幾年需要惡補物理學(xué)的基礎(chǔ)知識,開組會各種聽不懂;日后他會逐漸發(fā)現(xiàn),除了幫著實驗室修電腦和架設(shè)主頁方面可以讓大家 Wow 一下以外,本科學(xué)的那些操作系統(tǒng)、編譯原理、體系結(jié)構(gòu)似乎都用不上了。也許最有用的課程是算法與數(shù)據(jù)結(jié)構(gòu),因為有了這個可以高效地處理數(shù)據(jù)——事實上數(shù)學(xué)和物理專業(yè)也需要學(xué)這門課,當(dāng)然難度比計算機專業(yè)低多了。
有些同學(xué)會想,既然計算機專業(yè)比較 “簡單”,我本科學(xué)習(xí)其他專業(yè),課余時間學(xué)計算機,不行嗎?畢竟現(xiàn)在網(wǎng)絡(luò)上有這么多計算機的學(xué)習(xí)資源。這里有三個問題。第一,時間分配的問題。第二,自學(xué)沒有督促,拖延癥往往會犯(MOOC 確實有課程作業(yè),不過學(xué)校學(xué)分的強制力可比 MOOC 證書大多了)。第三,大學(xué)的作用不僅僅是上課,結(jié)識朋友、交流思想也是很重要的,自己窩在寢室、圖書館看計算機課程,肯定不如身邊有一群計算機專業(yè)的小伙伴。當(dāng)然,對沒有打定主意從事計算機行業(yè)的同學(xué)來說,這是個蠻不錯的折中選擇。
還有一個很現(xiàn)實的因素:求職面試的時候,畢業(yè)專業(yè)對很多面試官來說是重要的參考條件。計算機專業(yè)畢業(yè),就意味著計算機基本原理的各個方面都至少達到了及格水平;而如果沒有計算機專業(yè)的學(xué)位,就必須通過其他方式證明自己,或者是通過簡歷上的項目,或者是讓面試官對你進行一次全方位的考查。一些編程能力很強的同學(xué)就是在專業(yè)這一項上被面試官鄙視,以致后面的表現(xiàn)都被打了折扣,血淚教訓(xùn)啊。
我思考要不要讀博士的時候其實也考慮到了這個方面:如果我擁有一個網(wǎng)絡(luò)方向的博士學(xué)位,那么我就會自動被認(rèn)為是這方面的專家;如果我沒有博士學(xué)位,那么就要花很多心思來證明自己在網(wǎng)絡(luò)方向的能力。盡管證書、學(xué)歷一類的東西往往為高水平的人所不齒,但既然有獲得它的能力,為什么不給自己增加一個籌碼呢?
寫在最后
如果你希望站在信息時代的浪潮之巔,如果你希望自由地把想法變成現(xiàn)實,如果你懷揣屌絲逆襲、改變世界的夢想,選擇計算機專業(yè)吧,你將不虛此行。身在曹營心在漢的朋友們,不要再在專業(yè)選擇上徘徊、猶豫、浪費生命了,follow your heart。
寫著寫著我就有預(yù)感,這篇文章是一定會被噴的。就讓暴風(fēng)雨來得更猛烈些吧!