[關注大學生]Joel Spolsky給計算機系學生的建議

雖然大概一兩年前我還在誇誇其談桌面應用程序是將來的潮流,大學生們現在還是偶爾向我請教職業發展的問題。所以我把我的建議寫下來。以供學生們閱讀,嘲笑,忽略。

大多數銳氣十足的學生從來不向前輩徵求意見。在計算機科學領域,這樣做是正確的。因爲前輩們很可能說些“在2010年前,市場對於那些只會敲擊鍵盤的代碼工人的需求將會超過一億(因此前景是樂觀的)”,或者諸如“Lisp語言現在真的很熱門”。

我和那些前輩也差不多,當我給別人建議時,實際上我不知道自己在說些什麼。我是如此的落後於時尚,以至於連AIM也搞不明白,而不得不使用 email(恐龍時代的產品,在那個時代,音樂是刻在扁扁的的圓圓的盒子上,噢,那種盒子叫cd)。(譯者按:我認爲祖兒這裏在說反話,後文很多地方作者都在說反話,讀者儘量理解這種美國式幽默吧。)
所以你最好不要理睬我將要說的,你應該立刻去製作某種在線交友軟件。


然而,如果你喜歡編程,那就感謝上帝吧:你屬於幸運的少數人,這些人喜歡工作,他們的工作可以保證他們能過上舒適的生活。大多數人沒有這麼幸運。對大多數人來說,工作是不愉快的,忍受工作的目的攢錢,是爲了在年滿65歲退休後能過上自己想過的生活。如果他們想過的生活不需要靈活的膝蓋,明亮的眼鏡,輕盈的腳步的話。

現在讓我回到主題,我將提供一些建議。

好了,不羅嗦了,下面就是Joel給計算機系學生們七條免費的建議:

  畢業前學會寫作
  畢業前學會C語言
  畢業前學習微觀經濟學(microeconomics)
  不要因爲某些非計算機課程枯燥無趣就敬而遠之
  學習有大量編程實踐的課程
  不要擔心工作都跑到印度去了
  好好做夏季畢業實習
  讓我逐條解釋這些建議。但解釋之前我要說明一下,如果因爲這些建議是Joel的建議你就打算無條件地接受,以至於連我的理由都想跳過,那麼你就太單純,太容易被別人騙了。如果你是那種單純的人,我還要給你第八條建議,找心理醫生諮詢一下如何培養自信(self-esteem)。

畢業前學會寫作


如果Linus Torvalds不懂如何佈道的話,Linux會成功嗎? 正象每一個黑客,Linus精通寫作,他知道如何準確地在email和郵件討論組中使用書面英語表達自己的思想,所以他能夠從全世界召集大量志願者爲Linux工作。


你聽說過最近風靡全世界的極限編程(Extreme Programming)嗎? 即使你不懂什麼是極限編程,你至少聽說過這個詞。爲什麼?因爲宣傳極限編程的人都是天才的作者和演說家。

就看看你身邊的那些小型的軟件開發組織吧,最有權力和影響力的人是那些可以用自信,準確,舒適的英語交流的人。好吧,我承認這些人也許言過其實,但是你無可奈何。
一個合格的程序員和一個偉大的程序員的區別不在於知道多少種編程語言,不在於他們是喜歡Python或者Java,而是在於他們是否擅長表達。他們能夠說服,所以他們獲得權力。他們能夠寫清楚明白的評論和接口文檔,所以他們使得別人不用重寫,而可以重用他們的代碼,否則他們的代碼就是毫無用處的。他們也能夠寫出清晰的用戶手冊,於是最終用戶可以理解他們的代碼是做什麼用的,明白了他們的工作的價值。sourceforge埋葬着許多精美的代碼,這些已死的代碼無人使用,因爲代碼的作者很少寫(或者根本不寫)用戶手冊。

我不會僱傭一個不懂寫作的程序員。如果你擅長寫,你就很容易找到工作,緊接着你就會被要求寫技術規格文檔,這意味着你已經被管理層注意到了。

大學裏有一些課程,要求你做很多的寫作練習,不要猶豫,趕快參加這些課程。不要錯過任何要求你每週或者每天練習寫作的課程。

給自己建立一個網絡日誌(weblog)。在上面寫的越多,你會寫地越容易。寫地越容易,你就寫地越多,這是一個正向地循環激勵。


畢業前學會C語言

我可沒有說是C++。雖然現在用C的工作不多,但是掌握各種編程語言的程序員事實上用C來交流(lingua franca);更重要的是,C比某些“現代”語言更接近機器語言。我不管現在大學裏在教什麼流行的垃圾語言(trendy junk),你至少得花一個學期接近機器。否則,你不可能使用高級語言寫出高效的代碼。這意味這你不會有機會寫編譯器或者操作系統,也許這是更好的編程工作;別人不會相信你能夠爲大項目設計架構。無論你知道多少高級的控制結構,知道如何進行錯誤處理,如果你不能解釋爲什麼while (*s++ = *t++);的意思是進行字符串拷貝(而且對你而言這是世界上最自然,最易懂的代碼),那麼你就是在對編程一竅不通的狀態下編程(programming based on superstition)。打個比方,就好比一個醫生不懂基本的解剖學就給你開處方,如果你問這個醫生爲什麼開這種藥而不是那種藥,他會說因爲醫藥銷售代表說這種藥有用。

畢業前學習微觀經濟學


我個人對經濟學的一些理解:在經濟學剛誕生的時候,它只是侷限於有限的領域,在這些領域中人們發展和發現了很多有用的理論和很有趣的事實,這些理論和事實是從邏輯上是可以證明的。然後, 經濟學開始走下坡路了。 “有限的領域”就是微觀經濟學,它對於商業可以進行有意義的指導。然後,事情就開始變糟了(以下部分你可以跳過),你接下來碰到的是討論諸如失業率和銀行利率之間關係之類東東的宏觀經濟學,很多時候宏觀經濟學討論的理論都是無法證明正確或者錯誤的。接下來事態更加惡化了,經濟學中的一些領域開始和物理學搭界,嗯,學習物理經濟學也許你幫你在華爾街找到好工作。言歸正傳,無論如何請學習微觀經濟學,因爲你需要知道什麼是“供給和需求”,什麼是競爭優勢,什麼是淨現值(NPVs,Net Present Value,指項目經濟壽命期內現金流入總和與現金流出總和之差額),什麼是折扣和邊際效用(discounting and marginal utility),如果你真想了解商業是如何運作的話。

爲什麼計算機系的學生要學習經濟學?因爲理解商業基本規律的程序員對商業界來說是寶貴的程序員。我記得無數個程序員使我非常沮喪,因爲他們在代碼中堅持某些瘋狂的設計,這些設計從技術上來說,完美;從資本主義的角度來看,發瘋。如果你是一個理解商業的程序員,商業會給你回報。這就是你要學習經濟學的原因。

不要因爲某些非計算機課程枯燥無趣就敬而遠之

首先,你需要讓你的學分平均分(GPA)看起來漂亮點。

不要低估學分平均分的威力。很多僱主和人事經理(包括我)閱讀簡歷時首先看成績,爲什麼?因爲這代表了大部分的教授在很長的時期內對你的學業的一個平均的看法。託福成績(美國的託福大致相對於我國的高考中的語文考試)?哈,幾個小時的測驗而已。當然學分不一定說明了一切,如果你修的是很難的課程,學分就有可能低一點。即使你的學分平均分很高,我還是要看各科分數是否一致。如果你應聘的是軟件工程師職位,我爲什麼要關心你在大學裏學的歐洲歷史課程分數的高低呢?畢竟,歷史很枯燥。那麼要是你要編程的部分也是很枯燥的,你是不是要放棄了?事實上,有時候編程是枯燥的,如果你不能忍受編程中的枯燥部分的話,你就不能完成整個工作,僱主不願意僱傭你這樣的員工。

我在大學裏修過一門叫做“文化人類學”的課程,因爲那時候我也搞不懂我到底要學什麼,聽起來這麼課程可能還蠻有意思的。
出乎我的意料。我不得不閱讀大量講述巴西熱帶雨林中的印第安人如何如何的書,讓人真昏昏欲睡。聽老師講解也好不到哪去,我發覺看教室外的草如何長更有趣點。土著人如何烤蕃薯藤和我有什麼關係?我爲什麼要去討論如何烤蕃薯藤?但是期中考試馬上就要到了,我暗暗下定決心,如果我能跨越“文化人類學”這個障礙,以後也許沒有什麼能難倒我了。我決心得A並且得到了A。以後當我不得不坐在林肯中心,連看18個小時的瓦格納的《尼伯龍根的指環》時,我終於明白我爲什麼要學習“文化人類學”了,相比之下,我也能忍受這種歌劇了。

學習有大量編程實踐的課程

我還記得決定不去讀研究生的那一刻。

就是在學習《動態邏輯》(Dynamic Logic)這門課的時候,我記得是耶魯的Lenore Zuck(一個天才的教師)教的。

修這門課的時候,我已經不再是雄心勃勃了。我可不指望在這麼課程中得個A,我夢想的是混個及格。邏輯本質上是很簡單的:如果結論正確,前提必須正確。例如,如果“所有讀書好的人都能找到工作”並且“張三的讀書好”,那麼“張三能夠找到好工作”。就這麼簡單。

但是我要學的是動態邏輯, 動態邏輯和一般邏輯差不多,但是要考慮時間因素。例如,“在你開燈之後,你可以看見你的鞋子”加上“過去燈被打開了”意味着“你現在可以看到你的鞋子”

動態邏輯學對於象Zuck教授這樣的天才理論家來說非常誘人,因爲這門學科的知識也許可以用來證明計算機程序是否正確。我記得在第一堂課上,爲了證明“如果你有一盞關着的燈”並且“你按了一下開關”,那麼“現在燈亮了”,Zuck教授就使用了兩黑板加上邊上的牆壁。

證明過程難以置信的複雜。我覺得如此複雜的證明過程很可能會有小錯誤,但是我沒辦法證明證明過程本身是正確的。事實上,寫在黑板上的證明跳過了很多中間步驟,許多步的證明使用了演繹法,使用了歸納法,以及一些研究生才懂的證明方法。

作爲課後作業,我們需要證明以下命題:如果燈過去是關着的,並且現在它是開着的,請證明有人按了開關

我真的試着證明它了。

我花了許多小時,試圖證明這個命題。

在無數個小時的努力後,我發覺Zuck博士的原始的證明有一個邏輯上的錯誤,也許這個錯誤是我的筆記抄錯了,我不知道。於是我終於認識到,如果爲了證明一個簡單的問題需要花三個小時寫下幾黑板的證明步驟,再考慮到這個漫長的證明過程中可能會引入種種錯誤,那麼這種機制是不可能用來證明任何有趣的東西的。

對動態邏輯學家來說,有用是無關緊要的。

於是我退出了那門課程,發誓永遠不會去讀計算機系的研究生。

這個故事的主題是,計算機科學和軟件開發不一樣。如果你非常非常幸運,你的學校會開軟件開發的課程。然而,他們也可能不開這樣的課程,因爲名牌大學認爲教授實用技巧的事情應該留給那些二三流的技術學院或者某些釋放犯人再安置計劃。你可以在任何地方學習編程,我們是耶魯大學,我們培養未來的世界領導人。你付給耶魯16萬美元的學費就是爲了學習如何寫循環語句嗎?你把耶魯當成什麼地方了?Java速成班嗎?哼。

問題在於,我們沒有一個專業的學校教授軟件開發。所以如果你想成爲一個程序員,你可以進計算機系讀書(當然計算機科學也值得學習),但是你學的不是軟件開發。

如果走運的話,你可以在計算機系發掘出很多有大量編程實踐的課程,就象你能在歷史系找到很多提供寫作水平的課程一樣。這些課程絕對值得學習。如果你喜歡編程,不要爲你不能上教授諸如lambda算子或者線性代數的課程沮喪,在那裏你連摸一下計算機的機會都沒有。找找看有沒有名字中帶有“實習(Practicum)”字樣的課程,不要在乎Practicum是個拉丁語。有用的(無奈狀)課程就是需要在課程名中塞一些拉丁語,才能從那些裝模作樣(Liberal Artsy Fartsy)管理層的眼前矇混過關。

不要擔心工作都跑到印度去了

啊哈,如果你人在印度,你就無所謂了。願你享受外包帶來的工作機會並順祝身體健康。

但是我聽說現在願意讀計算機系的學生越來越少了。據說原因之一是工作機會都跑到印度去了。我認爲這種觀點是大錯特錯。首先,根據眼前的商業時尚選擇事業是非常愚蠢的。其次,即使工作真的都跑到印度和中國去了,編程對於其他有趣的工作來說都是極好的訓練,例如業務流程工程(business process engineering)。第三,無論是在美國還是印度,好程序員仍然是非常短缺的,請相信我。當然,現在有許多所謂搞IT的人吵吵嚷嚷地說就業形勢不好,工作太難找。但是事實如何?恕我直言,好程序員找工作還是很容易。第四,你還有更好的主意嗎?歷史系的畢業生找工作更容易嗎?去法學院如何?據我所知,99%的律師恨他們的工作,每分鐘都恨。而且律師一週工作90小時。正象我以前說過的,如果你喜歡計算機,那麼感謝上帝,你將屬於全世界人中的極少數的幸運兒,這些幸運兒熱愛他們的工作,而且工作也可以提供體面的收入。

實際上,我也不認爲報考計算機系的人越來越少有多大的意義。相對於internet泡沫時期大家都瘋狂的往計算機系擠,現在的人數回落只是迴歸正常水平而已。在泡沫時期,我們這個行業涌入了許多對計算機毫無興趣的南郭先生,他們夢想的是拿着高的嚇人的薪水加誘人的期權,然後年輕退休。謝天謝地,現在這些人都跑了。

好好做夏季畢業實習

明智的招聘者知道熱愛編程的人初中就爲當地的牙醫寫數據庫程序,高中就在計算機夏令營教課,爲校報規劃網站,在某個軟件公司做實習。他們找的就是這樣的人。
如果你喜歡編程,你最容易犯的最大的錯誤就是“有活就接”。我知道,其他專業的學生假期打工可顧不了這些條條框框。但是你不一樣,你擁有一種特殊技能,不要浪費它。當你畢業時,你的簡歷上應該已經羅列一堆的編程工作實習。讓其他人去“爲大家提供租車服務”(Tom Welling是個例外,他業餘時間去演超人)。

最後,爲了讓你的生活更容易一點,也爲了說明我這篇文章是能夠自圓其說的,我將給我自己的公司的做做廣告。我的公司Fog Creek軟件公司,可以爲大學生提供軟件開發方面的實習機會。在我們公司,你可以學習“編碼,開發,商業”。去年在我們公司實習的Ben就是這麼說的,可不是因爲我給他什麼好處他才這麼說。二月一號截至,抓緊機會吧。

如果你聽了我的建議,你就會太早地賣掉Microsoft公司的股票,拒絕Google提供的職位,原因是因爲你已經擁有自己的公司了。到時候可別後悔,更別怪我,呵呵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章