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