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