close

給電腦系學生的建議


作者: 周思博 (Joel Spolsky)
譯: Chen Bin
2005年1月2日


僅管一兩年前我還在夸夸其談桌面應用程式是將來的潮流,大學生們偶爾還是會向我請教職業生涯發展的建議。因為每年的新人都會這麼問,所以我認為有必要把我的標準建議寫下來。以供學生們閱讀,嘲笑,或忽略。

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

我和那些前輩也差不多,當我給別人建議時,實際上我也不知道自己在說些什麼。我是如此的落伍,連AIM是什麼也搞不明白,還在使用 emai 這種恐龍時代的產品,在那個時代,音樂是刻在扁扁的的圓圓的盒子上,噢,那種盒子叫cd。

所以你最好不要理睬我將要說的,你應該立刻去製作某種線上交友軟體


然而,

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

我現在是在什麼說?噢,職業生涯的建議。

好了,不囉嗦了,下面就是Joel給電腦系學生們七條免費的建議:

1. 畢業前學會寫作
2. 畢業前學會C語言
3. 畢業前學習微觀經濟學(microeconomics)
4. 不要因為某些非電腦課程枯燥無趣就敬而遠之
5. 學習有大量程式實作的課程
6. 不要擔心工作都跑到印度去了
7. 好好做夏季畢業實習

註: 英文 microeconomics, 台灣稱之為個體經濟學,中國內地則稱之為微觀經濟學

讓我逐條解釋這些建議。但解釋之前我要說明一下,如果因為這些建議是Joel的建議你就無條件地接受,以至於連我的理由都想跳過的話,那麼你就太單純,太容易被別人騙了。如果你是那種單純的人,我還要給你第八條建議,找個心理醫生諮詢一下如何培養自信(self-esteem)。

畢業前學會寫作

如果Linus Torvalds不懂如何布道的話,Linux會成功嗎? 像 Linus 這樣天才的 hacker 都一樣,精通寫作,知道如何準確地在email和newsgroup 中使用英文表達自己的思想,所以 Linus 能夠從全世界召集大量志願者為Linux工作。

你聽說過最近風靡全世界的 Extreme Programming (XP) 嗎? 即使你不懂什麼是 XP,你至少也一定聽過這個詞。為什麼?因為宣揚 XP 的人都是天才的作者和演說家。

就看看你身邊的那些小型的軟體開發組織吧,最有權力和影響力的人是那些可以用自信,準確,舒適的英語交流的人。好吧,我承認這些人也許言過其實,但是你無可奈何。



一個合格的程序員和一個偉大的程序員的區別,不在於知道多少種程式語言,不在於他們是喜歡Python或者Java,而是在於他們是否擅長表達理念。他們能夠說服人們,所以他們獲得權力。他們能夠寫出清晰的註解和技術文件,讓他人懂得他們的代碼,所以別人不用重新發明輪子,只要重用他們的代碼即可,否則他們的代碼就是毫無用處的。他們也能夠寫出清晰的使用者手冊,於是最終使用者能理解他們的代碼是做什麼用的,明白了他們的工作的價值。sourceforge埋葬了許多精美的代碼,這些已死的代碼無人使用,就是因為代碼的作者很少寫作(或者根本從人就不寫的)。

我不會雇用一個不懂寫作的程序員,最好的是會寫作而且以流暢的英文來寫作。如果你擅長寫作,你就很容易找到工作,緊接著當你被要求寫技術規格文件時,就意味著你已經被管理層注意到了。

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

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

畢業前學會C語言

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



畢業前學習微觀經濟學(microeconomics)

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

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

不要因為某些非電腦課程枯燥無趣就敬而遠之

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

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

我在大學裏修過一門叫做“文化人類學”的課程,因為那時候我也搞不懂我到底要學什麼,聽起來這麼課程可能還蠻有意思的。



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

學習有大量程式化實踐的課程

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

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

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

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

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

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

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

我真的試著證明它了。

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

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

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

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

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

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

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

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

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

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

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

好好做夏季畢業實習

明智的招聘者知道熱愛編程的人國中時期就會為當地的牙醫寫資料庫程序,高中就在電腦夏令營教課,為校報規劃網站,在某個軟體公司實習。他們要找的就是這樣的人。



如果你喜歡編程,你最容易犯的最大的錯誤就是“有活就接”。我知道,其他專業的學生假期打工可顧不了這些條條框框。但是你不一樣,你擁有一種特殊技能,不要浪費它。當你畢業時,你的履歷上應該已經羅列一堆的編程實習經驗。讓其他人去“為大家提供租車服務”(Tom Welling是個例外,他業餘時間去演超人)。

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

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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 imagefish 的頭像
    imagefish

    幻想魚的幻想空間

    imagefish 發表在 痞客邦 留言(0) 人氣()