給資訊科系學生的建議 Advice for Computer Science College Students

作:周思博 (Joel Spolsky)
譯:Paul May 梅普華
校:Tian-Jian "Barabbas" Jiang 姜天戩
Sunday, January 02, 2005
屬於 Joel on Software, https://www.joelonsoftware.com/2005/01/02/advice-for-computer-science-college-students/

雖然一兩年前我才喊過 rich Windows GUI 用戶端會是未來趨勢,不過還是經常有大學生寫電子郵件來問工作方面的建議,由於正逢招募時期,我想還是把我的標準建議寫下來,讓這些學生讀一讀笑一笑然後忘掉。

還好大學生大多很傲慢所以從不找長輩討教,而這就資訊科學領域來說是件好事,因為他們的長輩很可能會說些荒唐過時的主意,比如說「2010 年打卡操作員的工作機會會超過一億個」或是「現在 lisp 工作可是炙手可熱的呢」。

我也差不多,在給大學生建議時根本不知道自己在講些什麼。我實在是徹底的過時,連 AIM 都搞不懂,還在用叫做 email 那種奇怪古老的玩意(真恐怖!)。當這玩意流行時音樂還是由叫「音樂 CD」的圓形薄片裡放出來的呢!

CA1.JPG

所以你最好忽略我這裡寫的東西,直接離開去做些線上交友軟體之類的東西幫其他學生配對約會吧。

然而......

如果你喜歡寫電腦程式,恭禧你:你是少數能從事自己所喜愛的好工作的幸運兒。大部份人都沒這個福氣。「愛你的工作」是個新概念。工作應該是某種討人厭的東西,是你得靠它賺錢去做自己真正喜歡做的事,不過得等到你 65 歲可以退休又存夠錢,而且到時不會太老太虛弱,另外你喜歡的事還不能需要好膝蓋、好眼睛、以及走 20 呎不斷氣的身體。

我剛剛要說些什麼?哦對。建議。

不再廢話,來,以下是約耳的:給資訊科學系學生的七個免費建議(物超所值哦):

  1. 在畢業前學會寫作。
  2. 在畢業前學會 C。
  3. 在畢業前學會個體經濟學。
  4. 不要因為非資訊課程無聊就放棄。
  5. 修要寫大量程式的課。
  6. 別擔心所有工作都會外流到印度。
  7. 不管你做什麼,去找個好的暑期實習工作。

接下來是解釋,除非你好騙到只因為我叫你做就去做。萬一你真的那麼天真,那就再來一個吧:8. 自尊心受損時要尋求專業援助。

在畢業前學會寫作

如果沒有 Linus Torvalds 在傳道的話,Linux 會成功嗎?雖然他是個很出色的駭客,不過還是因為 Linus 能以英文透過電子郵件及 mailing list 推廣他的想法,Linux 才能夠吸引全球大量的志願者。

聽說過極限程式設計這個最新的流行嗎?很好,先撇開我對它的想法,你會聽過 XP 是因為有一群好作家和講者在推廣。

即使從小尺度來看,當你細看任一個寫程式的組織,最有權力和影響力的程式師都是能清晰自信又自在地說寫英文的人。另外長得高也有用,不過這一點你做啥都沒用。

CA2.JPG

堪用的程式師和偉大的程式師的差別並不在於他們會多少種語言,也不在於他們喜歡 Python 還是 Java。重點是能夠和他人溝通自己的想法。偉大的程式師藉由說服他人而得到影響力。他們撰寫清楚明白的意見和技術規格,讓其他程式師瞭解他們的程式,因此別人可以運用這些程式而不是重寫。如果少了這一點,他們的程式碼就毫無價值可言。他們為使用者撰寫清楚易懂的技術文件,讓大家能瞭解他們程式的作用,這是唯一能讓使用者理解其程式價值的方法。SourceForge 裡埋藏了很多神奇有用卻沒有人用的程式。只因為程式的作者寫不出好文章(或者根本不會寫),所以沒人知道他們的成果,而出色的程式碼就此凋萎。

我不會雇用寫不出好英文的程式師。如果你有能力寫作,不管到哪上班,很快就會發現自己被要求寫規格文件。這意味著你已經發揮自己的影響力,還讓管理階層注意到你了。

大部份大學把某些課標示為「密集寫作」,意思是你得寫很多很多東西才會過。找幾門這種課來修吧!不要管學科,去找哪些每週或每天都需要書寫作業的課。

開始寫日誌或網路日記。你寫得愈多,寫起來愈容易,就會再寫得更多,這是個正向的循環。

在畢業前學會 C

第二要素:C。注意我並不是說 C++。雖然 C 愈來愈少用,但它還是現役程式師的通用語。它是程式師與程式師互相溝通所用的語言;更重要的是,它比大學裡教的「現代」程式語言(ML、Java、Python 或其他最近教的流行垃圾)更接近機器多了。你至少要花一學期去貼近機器,否則你永遠無法用高階語言寫出有效率的程式。你也永遠不能去做編譯器或作業系統,這裡頭可有些最棒的程式工作機會呢。另外也永遠不會有人相信你能創造大型專案的架構。我才不在乎你有多懂 continuation 和封閉集合(closure)和例外處理:如果你不能解釋為什麼 while (*s++ = *t++); 會複製一個字串,又或這對你並不是天底下最自然的事,那麼我就會認定你寫程式的依據是迷信:一個不懂基本解剖學的醫生,會因為賣藥的菜鳥業務說藥應該有效就用來開處方。

在畢業前學會個體經濟學

CA3.JPG

如果你沒修過任何經濟學課程,面試會結束都其快無比:經濟學和某些學科一樣,開場白聲勢浩大,有著許多很有道理的有用理論和事實,可以在真實世界裡實證等等,之後卻突然急轉直下。這個有用的開場白就是個體經濟學,亳無疑問是所有重要商業理論的基礎。不過接下來事情就惡化了:你進入總體經濟(不想的話可以跳過)和關於利率和失業的有趣理論(不過實際上反例似乎比較多),接下來只有愈來愈糟,所以很多專攻經濟的人就跳槽到物理,反而在華爾街有更好的工作機會。不過個體經濟學是一定要修的,因為你得瞭解供求與需求,也得知道競爭優勢並了解淨現值和折扣還有邊際效用,才能稍為搞清楚商業為什麼能這樣運作。

為什麼主修資訊的學生要學經濟學呢?因為懂商業基礎的程式師會是個更有價值的程式師。事情就是這樣。有些程式師的點子從程式的立場來看有道理,但由資本主義來看完全不通。我已經數不清被這種人打敗多少次了。如果你能瞭解這種事,你就會是更有價值的程式師,同時也會獲得對應的報酬,而其中的道理也能在個體經濟學裡學到。

不要因為非資訊課程無聊就放棄

放棄非資訊課程是個降低 GPA(學業平均成績)的好方法。

永遠別低估 GPA 的影響有多大。很多的招募人員和用人經理(包括我在內)會在瀏覽履歷時直接去看 GPA,而且不會覺得有任何不對。為什麼呢?因為比起別的單一數字,GPA 更能反映長期下來各種狀況下,幾十個老師對你成果的總評價。SAT 分數呢?哈!只是過程數小時的一個測驗罷了。GPA 反映了四年間的幾百份作業還有期中考和課堂參與狀況。沒錯,GPA 本身是有些問題。比如這些年來有分數膨脹的情形。另外 GPA 也沒有說分數是怎麼來的,是在無名社區大學家政系修簡單課程?還是在加州理工學院修研究所的量子力學課程?最後當我剔除所有在無名學校拿 2.5 GPA 的履歷後,就會去要成績單和推薦信。然後我會找那些全部都拿高分的人選,而不是只在資訊科學拿高分的。

為什麼我這個找軟體開發者的雇主要在意你修歐洲史的分數呢?畢竟歷史是蠻無聊的。哦,所以你是說由於你覺得工作無聊就不去好好做,我就應該雇用你嗎?算了吧,寫程式也有無聊的事情。每個工作都有無聊的時候。我才不會請一個只想做好玩事情的人呢。

我在大學時候修了一門叫文化人類學的課,因為我不知怎的覺得自己需些知道有關人類學的東西,而這看起來像門好玩的通識課程。

CA4.JPG

好玩?連一點點都算不上!我得讀些單調到爆的書,裡頭寫的是巴西雨林印第安人和特羅布里恩群島島民,不管從任何觀點來看,我都不會覺得它很有趣。有時候課程實在煩得要命,煩到我想找些更刺激的事,比如看著草生長。我對這個主題徹底完全失去興趣,眼睛還流著淚。我已經受不了不停的討論土著在堆集山芋。我不知道特羅布里恩島民為啥要花這麼多時間堆山芋,我什麼都記不住了,這實在是無聊透頂但期中考到了,所以我就考砸了。最後我決定把文化人類學當作我煩人的鐵手套:我個人無聊而單調的障礙課程。如果我能在一門得完全搞懂冬季贈禮節互贈毛毯的課拿到 A,我就能搞定任何事,不管它有多無聊。後來當我意外卡在林肯中心對付全長 18 小時的華格納「指環」時,我得感謝當初研讀誇扣特爾部族,相較之下華格納真是親切啊。

我後來拿到 A。如果我能做到,你也可以。

修要寫大量程式的課

我還記得我發誓絕不上研究所的那一刻。

那是動態邏輯的某堂課上,教課的是活力充沛的耶魯教授 Lenore Zuck,是這出色電腦科學學府裡最出色的一位老師。

我現在的回憶已經模糊,並不能正確地評價這門學科,但請容我敷衍過去。形式邏輯的想法是:你能證明某件事是對是因為其他事情是對的。舉例來說,形式邏輯可以由「成績好的人都能得到工作」加上「強尼成績好」,讓你發現新事實:「強尼被得到工作」。這一切非常的離奇有趣,而且一個解構者只要十秒,就能用形式邏輯把任何有用的東西完全拆散,只剩下一些有趣而無用的玩意。

現在呢,動態邏輯是一樣的東西,只是再加上時間因素。舉例來說,「你把燈打開之後,你就能看到你的鞋子」加上「燈原本是開著的」暗示「你可以看到你的鞋子」。

動態邏輯對 Zuck 教授這種出色的理論家來說非常有吸引力,因為你有希望用它來正式證明有關電腦程式的事,而這種證明會非常有用。舉例來說,你可以正式證明,應該在紅色行星上到處尋找火星人馬文(譯註:某卡通人物)蹤跡的火星漫遊號,它的記憶卡不會有溢出錯誤而因此整天不斷重新開機。

於是 Zuck 博士在那門課第一天就寫滿兩面白板和白板大塊的牆壁,證明如果你有個電燈開關而且燈是熄掉的,當你打開開關時,電燈就會打開。

證明過程繁複至極而且非常容易出錯。要證明該證明正確要比說服你自己開開關會開燈還要困難。寫了這麼多面白板的證明其實已經略過了很多過程,省略的原因是是因為這些過程太冗長沉悶無法正式寫出。很多過程都是用歸納法得到,其他則是用歸謬法,剩下的是用研究生證法證明的(譯註:意指教授叫許多研究生進行大量人工計算才驗證得出來,又稱為研究生演算法)。

至於作業呢,我們必須證明相反的情況:如果燈原本是熄的,而且現在開著,證明是你打開了它。

我嘗試了,我真的試過了。

我在圖書館花了很多個小時去試。

花了好幾個小時之後,我在模仿 Zuck 博士原本的證明時發現其中有個錯誤。或許是我抄錯了,不過這讓我明白一件事:如果得花三小時寫滿幾個黑板才能證明某件小事,而且過程中會出錯的地方有好幾百個,這種機制永遠無法證明出有趣的事情。

不過這跟動態邏輯家無關:他們做這個並不是因為它有用,而是為了長聘教職(譯註:tenure,以往是終身教職,但現在未必了)。

我退掉那門課並且發誓絕不上資訊科學的研究所。

這個故事的教訓是資訊科學並不等同於軟體開發。如果你真的非常幸運,你的學校可能會有一套合宜的軟體開發課程,不過大概是不會有的,因為精英學校認為技職教育和犯人改過自新計劃才需要教導實務技能。只不過是寫寫程式而已,到處都可以學。我們可是耶魯大學,身負鑄造未來世界領袖的重責大任。你覺得 16 萬美元的學費是讓你來學 while 迴圈的嗎?你以為這是什麼?某個在機場旅館舉辦的騙人 Java 研討會嗎?哼。

問題在於我們並沒有真正的專門軟體開發學校,所以如果你想當個程式師,可能還是得主修資訊科學。這是個好的主修學科,不過跟軟體開發是兩回事

不過如果你幸運的話,可以在資訊科系找到很多密集寫程式的課程,就像你可以在歷史系找到很多能學會寫作的課一樣。這些是最好的課程了。如果你喜歡寫程式,修 lambda 演算或線性代數這種不碰電腦的課時,有些地方搞不懂不必難過。去找那些課程名稱有 Practicum 的 400 等級課程。這些課用這個拉丁文只是想弄個漂亮的課程名稱,好瞞過那些愛跩文的屁管理階層。

別擔心所有工作都會外流到印度

好,首先如果你已經身在印度,的確永遠不用管它,你根本不用開始擔心工作所有都跑到印度。這些工作很都很好,好好享用並祝身體健康。

不過我還是一直聽說資訊科系的入學人數直線下降,而謠傳的原因之一是「學生害怕進入一個工作機會都將外流到印度的學科」。有很多理由可以證明這實在是錯得很離譜。首先,根據目前流行事業來選擇職業本身就蠻荒謬的。其次是即使每一個程式設計的工作都移到印度跟中國,寫程式還是一種絕佳的訓練,可以協助你從事各種非常好玩的工作(如商業流程工程)。再來就是真正好的程式師還是非常搶手,不管是在這裡還是印度,這點你得相信我。沒錯,的確有一大群失業的資訊人員在吵著說他們已經失業很久很久了。雖然會得罪這些人,不過你知道嗎?真正好的程式師還是有事做。第四點是沒有更好的主意了,你還能有什麼選擇?去主修歷史嗎?不然你只好去唸法學院了。不過我倒是知道一件事,99% 的執業律師都他們的工作,恨做律師的每一分鐘,更不用說他們每週同樣要工作 90 小時。就如我所說的:如果你喜歡寫電腦程式,恭禧你:你是少數能從事自己所喜愛的好工作的幸運兒。

不管如何,我不認為學生真的能想到這一點。資訊科系入學人數的下降,不過是在網路熱潮造成人數暴增的泡沫後,回復到以往的正常水平吧。這些多的人並不是真的喜歡寫程式,只是認為可以在資訊科系找個誘人的高薪工作,還有機會 24 歲就能股票上市上櫃。謝謝老天,這些人現在都走啦!

不管你做什麼,去找個好的暑期實習工作

精明的招募人員都知道,愛寫程式的人國中時就替牙醫寫過資料庫,讀大學之前就去過三次夏季電腦營,還替營隊報紙架設管理系統,另外暑假還會到軟體公司實習。他們就是要找這種人。

CA5.JPG

如果你喜歡寫程式,絕對不過要隨便選工作,不管是暑期打工還是兼差或其他情況,一定要找寫程式的工作。我知道其他19歲的青少年都想去商場打工摺襯衫,不過即使你只有 19 歲也一樣,拿你所擁有的珍貴才能去摺襯衫實在太笨了。當你畢業時應該要有一份列有各種程式設計工作經驗的履歷。摺襯衫的同學畢業了就讓他去租車公司服務他人吧(Tom Welling 例外。他的打工是去上電視演超人。)

為了讓你的生活更容易,也為了強週這整篇文章純粹是為了個人的利益,我的公司 Fog Creek Software 提供了在履歷上會很醒目的軟體開發暑期實習。「比起其他實習機會來說,你在 Fog Creek Software 很可能會學到更多關於軟體的程式撰寫、開發、商業知識。」去年的暑期實習生 Ben 是這樣說。這可不全是因為我派人去他宿舍才讓他這樣說的。申請期限是 2 月 1 號。來吧!

如果你聽從我的建議,你最後可能還是會做些蠢事,比如太早賣掉微軟股票,或者為了有門的辦公室而回絕在 Google 的工作機會,或是做出其他愚蠢的重大決定,不過那些都不關我事。我說過不要聽我的了。

這些網頁的內容為表達個人意見。
All contents Copyright © 1999-2006 by Joel Spolsky. All Rights Reserved.