給計算機系學(xué)生的建議
作者: 周思博 (Joel Spolsky)
譯: Chen Bin
2005年1月2日
雖然大概一兩年前我還在夸夸其談桌面應用程序是將來(lái)的潮流,大學(xué)生們現在還是偶爾向我請教職業(yè)發(fā)展的問(wèn)題。所以我把我的建議寫(xiě)下來(lái)。以供學(xué)生們閱讀,嘲笑,忽略。
大多數銳氣十足的學(xué)生從來(lái)不向前輩征求意見(jiàn)。在計算機科學(xué)領(lǐng)域,這樣做是正確的。因為前輩們很可能說(shuō)些“在2010年前,市場(chǎng)對于那些只會(huì )敲擊鍵盤(pán)的代碼工人的需求將會(huì )超過(guò)一億(因此前景是樂(lè )觀(guān)的)”,或者諸如“Lisp語(yǔ)言現在真的很熱門(mén)”。
我和那些前輩也差不多,當我給別人建議時(shí),實(shí)際上我不知道自己在說(shuō)些什么。我是如此的落后于時(shí)尚,以至于連AIM也搞不明白,而不得不使用 email(恐龍時(shí)代的產(chǎn)品,在那個(gè)時(shí)代,音樂(lè )是刻在扁扁的的圓圓的盒子上,噢,那種盒子叫cd)。(譯者按:我認為祖兒這里在說(shuō)反話(huà),后文很多地方作者都在說(shuō)反話(huà),讀者盡量理解這種美國式幽默吧。)
所以你最好不要理睬我將要說(shuō)的,你應該立刻去制作某種
在線(xiàn)交友軟件。
然而,
如果你喜歡編程,那就感謝上帝吧:你屬于幸運的少數人,這些人喜歡工作,他們的工作可以保證他們能過(guò)上舒適的生活。大多數人沒(méi)有這么幸運。對大多數人來(lái)說(shuō),工作是不愉快的,忍受工作的目的攢錢(qián),是為了在年滿(mǎn)65歲退休后能過(guò)上自己想過(guò)的生活。如果他們想過(guò)的生活不需要靈活的膝蓋,明亮的眼鏡,輕盈的腳步的話(huà)。
現在讓我回到主題,我將提供一些建議。
好了,不羅嗦了,下面就是Joel給計算機系學(xué)生們七條免費的建議:
畢業(yè)前學(xué)會(huì )寫(xiě)作 畢業(yè)前學(xué)會(huì )C語(yǔ)言 畢業(yè)前學(xué)習微觀(guān)經(jīng)濟學(xué)(microeconomics) 不要因為某些非計算機課程枯燥無(wú)趣就敬而遠之 學(xué)習有大量編程實(shí)踐的課程 不要擔心工作都跑到印度去了 好好做夏季畢業(yè)實(shí)習
讓我逐條解釋這些建議。但解釋之前我要說(shuō)明一下,如果因為這些建議是Joel的建議你就打算無(wú)條件地接受,以至于連我的理由都想跳過(guò),那么你就太單純,太容易被別人騙了。如果你是那種單純的人,我還要給你第八條建議,找心理醫生咨詢(xún)一下如何培養自信(self-esteem)。
畢業(yè)前學(xué)會(huì )寫(xiě)作
如果Linus Torvalds不懂如何
布道的話(huà),Linux會(huì )成功嗎? 正象每一個(gè)黑客,Linus精通寫(xiě)作,他知道如何準確地在email和郵件討論組中使用書(shū)面英語(yǔ)表達自己的思想,所以他能夠從全世界召集大量志愿者為L(cháng)inux工作。
你聽(tīng)說(shuō)過(guò)最近風(fēng)靡全世界的極限編程(Extreme Programming)嗎? 即使你不懂什么是極限編程,你至少聽(tīng)說(shuō)過(guò)這個(gè)詞。為什么?因為宣傳極限編程的人都是天才的作者和演說(shuō)家。
就看看你身邊的那些小型的軟件開(kāi)發(fā)組織吧,最有權力和影響力的人是那些可以用自信,準確,舒適的英語(yǔ)交流的人。好吧,我承認這些人也許言過(guò)其實(shí),但是你無(wú)可奈何。
一個(gè)合格的程序員和一個(gè)偉大的程序員的區別不在于知道多少種編程語(yǔ)言,不在于他們是
喜歡Python或者Java,而是在于他們是否擅長(cháng)表達。他們能夠說(shuō)服,所以他們獲得權力。他們能夠寫(xiě)清楚明白的評論和接口文檔,所以他們使得別人不用
重寫(xiě),而可以重用他們的代碼,否則他們的代碼就是毫無(wú)用處的。他們也能夠寫(xiě)出清晰的用戶(hù)手冊,于是最終用戶(hù)可以理解他們的代碼是做什么用的,明白了他們的工作的價(jià)值。sourceforge埋葬著(zhù)許多精美的代碼,這些已死的代碼無(wú)人使用,因為代碼的作者很少寫(xiě)(或者根本不寫(xiě))用戶(hù)手冊。
我不會(huì )雇傭一個(gè)不懂寫(xiě)作的程序員。如果你擅長(cháng)寫(xiě),你就很容易找到工作,緊接著(zhù)你就會(huì )被要求寫(xiě)技術(shù)規格文檔,這意味著(zhù)你已經(jīng)被管理層注意到了。
大學(xué)里有一些課程,要求你做很多的寫(xiě)作練習,不要猶豫,趕快參加這些課程。不要錯過(guò)任何要求你每周或者每天練習寫(xiě)作的課程。
給自己建立一個(gè)網(wǎng)絡(luò )日志(weblog)。在上面寫(xiě)的越多,你會(huì )寫(xiě)地越容易。寫(xiě)地越容易,你就寫(xiě)地越多,這是一個(gè)正向地循環(huán)激勵。
畢業(yè)前學(xué)會(huì )C語(yǔ)言
我可沒(méi)有說(shuō)是C++。雖然現在用C的工作不多,但是掌握各種編程語(yǔ)言的程序員事實(shí)上用C來(lái)交流(lingua franca);更重要的是,C比某些“現代”語(yǔ)言更接近機器語(yǔ)言。我不管現在大學(xué)里在教什么流行的垃圾語(yǔ)言(trendy junk),你至少得花一個(gè)學(xué)期接近機器。否則,
你不可能使用高級語(yǔ)言寫(xiě)出高效的代碼。這意味這你不會(huì )有機會(huì )寫(xiě)編譯器或者操作系統,也許這是更好的編程工作;別人不會(huì )相信你能夠為大項目設計架構。無(wú)論你知道多少高級的控制結構,知道如何進(jìn)行錯誤處理,如果你不能解釋為什么while (*s++ = *t++);的意思是進(jìn)行字符串拷貝(而且對你而言這是世界上最自然,最易懂的代碼),那么你就是在對編程一竅不通的狀態(tài)下編程(programming based on superstition)。打個(gè)比方,就好比一個(gè)醫生不懂基本的解剖學(xué)就給你開(kāi)處方,如果你問(wèn)這個(gè)醫生為什么開(kāi)這種藥而不是那種藥,他會(huì )說(shuō)因為醫藥銷(xiāo)售代表說(shuō)這種藥有用。
畢業(yè)前學(xué)習微觀(guān)經(jīng)濟學(xué)(microeconomics)
我個(gè)人對經(jīng)濟學(xué)的一些理解:在經(jīng)濟學(xué)剛誕生的時(shí)候,它只是局限于有限的領(lǐng)域,在這些領(lǐng)域中人們發(fā)展和發(fā)現了很多
有用的理論和很有趣的事實(shí),這些理論和事實(shí)是從邏輯上是可以證明的。然后,
經(jīng)濟學(xué)開(kāi)始走下坡路了。 “有限的領(lǐng)域”就是微觀(guān)經(jīng)濟學(xué),它對于商業(yè)可以進(jìn)行有意義的指導。然后,事情就開(kāi)始變糟了(以下部分你可以跳過(guò)),你接下來(lái)碰到的是討論諸如失業(yè)率和銀行利率之間關(guān)系之類(lèi)東東的宏觀(guān)經(jīng)濟學(xué),很多時(shí)候宏觀(guān)經(jīng)濟學(xué)討論的理論都是無(wú)法證明正確或者錯誤的。接下來(lái)事態(tài)更加惡化了,經(jīng)濟學(xué)中的一些領(lǐng)域開(kāi)始和物理學(xué)搭界,嗯,學(xué)習物理經(jīng)濟學(xué)也許你幫你在華爾街找到好工作。言歸正傳,無(wú)論如何請學(xué)習微觀(guān)經(jīng)濟學(xué),因為你需要知道什么是“供給和需求”,什么是競爭優(yōu)勢,什么是凈現值(NPVs,Net Present Value,指項目經(jīng)濟壽命期內現金流入總和與現金流出總和之差額),什么是折扣和邊際效用(discounting and marginal utility),如果你真想了解商業(yè)是如何運作的話(huà)。
為什么計算機系的學(xué)生要學(xué)習經(jīng)濟學(xué)?因為理解商業(yè)基本規律的程序員對商業(yè)界來(lái)說(shuō)是寶貴的程序員。我記得無(wú)數個(gè)程序員使我非常沮喪,因為他們在代碼中堅持某些瘋狂的設計,這些設計從技術(shù)上來(lái)說(shuō),完美;從資本主義的角度來(lái)看,發(fā)瘋。如果你是一個(gè)理解商業(yè)的程序員,商業(yè)會(huì )給你回報。這就是你要學(xué)習經(jīng)濟學(xué)的原因。
不要因為某些非計算機課程枯燥無(wú)趣就敬而遠之
首先,你需要讓你的學(xué)分平均分(GPA)看起來(lái)漂亮點(diǎn)。
不要低估學(xué)分平均分的威力。很多雇主和人事經(jīng)理(包括我)閱讀簡(jiǎn)歷時(shí)首先看成績(jì),為什么?因為這代表了大部分的教授在很長(cháng)的時(shí)期內對你的學(xué)業(yè)的一個(gè)平均的看法。托福成績(jì)(美國的托福大致相對于我國的高考中的語(yǔ)文考試)?哈,幾個(gè)小時(shí)的測驗而已。當然學(xué)分不一定說(shuō)明了一切,如果你修的是很難的課程,學(xué)分就有可能低一點(diǎn)。即使你的學(xué)分平均分很高,我還是要看各科分數是否一致。如果你應聘的是軟件工程師職位,我為什么要關(guān)心你在大學(xué)里學(xué)的歐洲歷史課程分數的高低呢?畢竟,歷史很枯燥。那么要是你要編程的部分也是很枯燥的,你是不是要放棄了?事實(shí)上,有時(shí)候編程是枯燥的,如果你不能忍受編程中的枯燥部分的話(huà),你就不能完成整個(gè)工作,雇主不愿意雇傭你這樣的員工。
我在大學(xué)里修過(guò)一門(mén)叫做“文化人類(lèi)學(xué)”的課程,因為那時(shí)候我也搞不懂我到底要學(xué)什么,聽(tīng)起來(lái)這么課程可能還蠻有意思的。
出乎我的意料。我不得不閱讀大量講述巴西熱帶雨林中的印第安人如何如何的書(shū),讓人真昏昏欲睡。聽(tīng)老師講解也好不到哪去,我發(fā)覺(jué)看教室外的草如何長(cháng)更有趣點(diǎn)。土著(zhù)人如何烤蕃薯藤和我有什么關(guān)系?我為什么要去討論如何烤蕃薯藤?但是期中考試馬上就要到了,我暗暗下定決心,如果我能跨越“文化人類(lèi)學(xué)”這個(gè)障礙,以后也許沒(méi)有什么能難倒我了。我決心得A并且得到了A。以后當我不得不坐在林肯中心,連看18個(gè)小時(shí)的瓦格納的《尼伯龍根的指環(huán)》時(shí),我終于明白我為什么要學(xué)習“文化人類(lèi)學(xué)”了,相比之下,我也能忍受這種歌劇了。
學(xué)習有大量編程實(shí)踐的課程
我還記得決定不去讀研究生的那一刻。
就是在學(xué)習
《動(dòng)態(tài)邏輯》(Dynamic Logic)這門(mén)課的時(shí)候,我記得是耶魯的Lenore Zuck(一個(gè)天才的教師)教的。
修這門(mén)課的時(shí)候,我已經(jīng)不再是雄心勃勃了。我可不指望在這么課程中得個(gè)A,我夢(mèng)想的是混個(gè)及格。邏輯本質(zhì)上是很簡(jiǎn)單的:如果結論正確,前提必須正確。例如,如果“所有讀書(shū)好的人都能找到工作”并且“張三的讀書(shū)好”,那么“張三能夠找到好工作”。就這么簡(jiǎn)單。
但是我要學(xué)的是動(dòng)態(tài)邏輯, 動(dòng)態(tài)邏輯和一般邏輯差不多,但是要考慮時(shí)間因素。例如,“在你開(kāi)燈之后,你可以看見(jiàn)你的鞋子”加上“過(guò)去燈被打開(kāi)了”意味著(zhù)“你現在可以看到你的鞋子”
動(dòng)態(tài)邏輯學(xué)對于象Zuck教授這樣的天才理論家來(lái)說(shuō)非常誘人,因為這門(mén)學(xué)科的知識也許可以用來(lái)證明計算機程序是否正確。我記得在第一堂課上,為了證明“如果你有一盞關(guān)著(zhù)的燈”并且“你按了一下開(kāi)關(guān)”,那么“現在燈亮了”,Zuck教授就使用了兩黑板加上邊上的墻壁。
證明過(guò)程難以置信的復雜。我覺(jué)得如此復雜的證明過(guò)程很可能會(huì )有小錯誤,但是我沒(méi)辦法證明證明過(guò)程本身是正確的。事實(shí)上,寫(xiě)在黑板上的證明跳過(guò)了很多中間步驟,許多步的證明使用了演繹法,使用了歸納法,以及一些研究生才懂的證明方法。
作為課后作業(yè),我們需要證明以下命題:如果燈過(guò)去是關(guān)著(zhù)的,并且現在它是開(kāi)著(zhù)的,請證明有人按了開(kāi)關(guān)
我真的試著(zhù)證明它了。
我花了許多小時(shí),試圖證明這個(gè)命題。
在無(wú)數個(gè)小時(shí)的努力后,我發(fā)覺(jué)Zuck博士的原始的證明有一個(gè)邏輯上的錯誤,也許這個(gè)錯誤是我的筆記抄錯了,我不知道。于是我終于認識到,如果為了證明一個(gè)簡(jiǎn)單的問(wèn)題需要花三個(gè)小時(shí)寫(xiě)下幾黑板的證明步驟,再考慮到這個(gè)漫長(cháng)的證明過(guò)程中可能會(huì )引入種種錯誤,那么這種機制是不可能用來(lái)證明任何有趣的東西的。
對動(dòng)態(tài)邏輯學(xué)家來(lái)說(shuō),有用是無(wú)關(guān)緊要的。
于是我退出了那門(mén)課程,發(fā)誓永遠不會(huì )去讀計算機系的研究生。
這個(gè)故事的主題是,計算機科學(xué)和軟件開(kāi)發(fā)不一樣。如果你非常非常幸運,你的學(xué)校會(huì )開(kāi)軟件開(kāi)發(fā)的課程。然而,他們也可能不開(kāi)這樣的課程,因為名牌大學(xué)認為教授實(shí)用技巧的事情應該留給那些二三流的技術(shù)學(xué)院或者某些釋放犯人再安置計劃。你可以在任何地方學(xué)習編程,我們是耶魯大學(xué),我們培養未來(lái)的世界領(lǐng)導人。你付給耶魯16萬(wàn)美元的學(xué)費就是為了學(xué)習如何寫(xiě)循環(huán)語(yǔ)句嗎?你把耶魯當成什么地方了?Java速成班嗎?哼。
問(wèn)題在于,我們沒(méi)有一個(gè)專(zhuān)業(yè)的學(xué)校教授軟件開(kāi)發(fā)。所以如果你想成為一個(gè)程序員,你可以進(jìn)計算機系讀書(shū)(當然計算機科學(xué)也值得學(xué)習),但是你學(xué)的不是軟件開(kāi)發(fā)。
如果走運的話(huà),你可以在計算機系發(fā)掘出很多有大量編程實(shí)踐的課程,就象你能在歷史系找到很多提供寫(xiě)作水平的課程一樣。這些課程絕對值得學(xué)習。如果你喜歡編程,不要為你不能上教授諸如lambda算子或者線(xiàn)性代數的課程沮喪,在那里你連摸一下計算機的機會(huì )都沒(méi)有。找找看有沒(méi)有名字中帶有“實(shí)習(Practicum)”字樣的課程,不要在乎Practicum是個(gè)拉丁語(yǔ)。有用的(無(wú)奈狀)課程就是需要在課程名中塞一些拉丁語(yǔ),才能從那些裝模作樣(Liberal Artsy Fartsy)管理層的眼前蒙混過(guò)關(guān)。
不要擔心工作都跑到印度去了
啊哈,如果你人在印度,你就無(wú)所謂了。愿你享受外包帶來(lái)的工作機會(huì )并順祝身體健康。
但是我聽(tīng)說(shuō)現在愿意讀計算機系的學(xué)生越來(lái)越少了。據說(shuō)原因之一是工作機會(huì )都跑到印度去了。我認為這種觀(guān)點(diǎn)是大錯特錯。首先,根據眼前的商業(yè)時(shí)尚選擇事業(yè)是非常愚蠢的。其次,即使工作真的都跑到印度和中國去了,編程對于其他有趣的工作來(lái)說(shuō)都是極好的訓練,例如業(yè)務(wù)流程工程(business process engineering)。第三,無(wú)論是在美國還是印度,好程序員仍然是非常短缺的,請相信我。當然,現在有許多所謂搞IT的人吵吵嚷嚷地說(shuō)就業(yè)形勢不好,工作太難找。但是事實(shí)如何?恕我直言,好程序員找工作還是很容易。第四,你還有更好的主意嗎?歷史系的畢業(yè)生找工作更容易嗎?去法學(xué)院如何?據我所知,99%的律師恨他們的工作,每分鐘都恨。而且律師一周工作90小時(shí)。正象我以前說(shuō)過(guò)的,如果你喜歡計算機,那么感謝上帝,你將屬于全世界人中的極少數的幸運兒,這些幸運兒熱愛(ài)他們的工作,而且工作也可以提供體面的收入。
實(shí)際上,我也不認為報考計算機系的人越來(lái)越少有多大的意義。相對于internet泡沫時(shí)期大家都瘋狂的往計算機系擠,現在的人數回落只是回歸正常水平而已。在泡沫時(shí)期,我們這個(gè)行業(yè)涌入了許多對計算機毫無(wú)興趣的南郭先生,他們夢(mèng)想的是拿著(zhù)高的嚇人的薪水加誘人的期權,然后年輕退休。謝天謝地,現在這些人都跑了。
好好做夏季畢業(yè)實(shí)習
明智的招聘者知道熱愛(ài)編程的人初中就為當地的牙醫寫(xiě)數據庫程序,高中就在計算機夏令營(yíng)教課,為校報規劃網(wǎng)站,在某個(gè)軟件公司做實(shí)習。他們找的就是這樣的人。
如果你喜歡編程,你最容易犯的最大的錯誤就是“有活就接”。我知道,其他專(zhuān)業(yè)的學(xué)生假期打工可顧不了這些條條框框。但是你不一樣,你擁有一種特殊技能,不要浪費它。當你畢業(yè)時(shí),你的簡(jiǎn)歷上應該已經(jīng)羅列一堆的編程工作實(shí)習。讓其他人去“為大家提供租車(chē)服務(wù)”(Tom Welling是個(gè)例外,他業(yè)余時(shí)間去演超人)。
最后,為了讓你的生活更容易一點(diǎn),也為了說(shuō)明我這篇文章是能夠自圓其說(shuō)的,我將給我自己的公司的做做廣告。我的公司Fog Creek軟件公司,可以為大學(xué)生提供
軟件開(kāi)發(fā)方面的實(shí)習機會(huì )。在我們公司,你可以學(xué)習“編碼,開(kāi)發(fā),商業(yè)”。去年在我們公司實(shí)習的Ben就是這么說(shuō)的,可不是因為我給他什么好處他才這么說(shuō)。二月一號截至,抓緊機會(huì )吧。
如果你聽(tīng)了我的建議,你就會(huì )太早地賣(mài)掉Microsoft公司的股票,拒絕Google提供的職位,原因是因為你已經(jīng)擁有自己的公司了。到時(shí)候可別后悔,更別怪我,呵呵。
本文最先用英文出版,題為
Advice for Computer Science College Students Joel Spolsky 是紐約市一家小軟件公司,
Fog Creek Software, 的創(chuàng )始人。他畢業(yè)于耶魯大學(xué),曾在美國微軟公司,Viacom, Juno 任軟件設計師及經(jīng)理。