寫給未來程式設計師的建議

turingbooks發表於2015-05-05

給計算機系學生的建議


大概在一兩年前,我還在高喊,有著良好使用者體驗的Windows圖形介面式客戶端(rich Windows GUI client)將是未來的潮流。儘管我這樣說了,但是時不時地還是有大學生寫信給我,問我對於找工作有何建議。既然現在又到了招聘季節,我想我還是把我的標準建議寫下來,讓那些大學生讀一讀,笑一笑,然後忘掉。

大多數大學生都很自以為是,從不會虛心向前輩求教,他們覺得那樣太麻煩。但是,很幸運,在計算機領域,這樣做是對的。因為他們的前輩很可能會說一些不靠譜的話,比如“到2010年之前,對紙帶打孔員的需求將超過1億人”,還有“目前Lisp語言的相關人才非常搶手”。

我也不能例外,當我在給大學生提供建議時,我完全不知道我在說些什麼。我已經無可救藥地屬於過時人物了。我真的搞不清楚AIM[1]是什麼,我仍然在使用一種老掉牙的叫作Email的東西,真是太恐怖了。那玩意流行的年代,人們聽音樂還是用一種又扁又圓叫作CD的小圓盤。

所以,你最好直接漠視我在這裡說的話,將時間用來開發某種可以使其他學生找到約會物件的線上軟體上。

儘管如此,我還是會說出我的建議。

如果你喜歡程式設計,那麼你真是受到了上天的眷顧。你是非常幸運的少數人之一,能夠以自己喜歡的事謀生。大多數人沒有這麼幸運。你認為理所當然的觀念“熱愛你的工作”,其實是一個很現代的概念。通常的看法是,工作是一種讓人很不開心的事,你為了拿工資才不得不去上班。你工作的目的是為了攢下錢去幹那些自己真正喜歡乾的事,但是前提是你得等到65歲退休之後才行,而且還有不少條件。條件一,你的積蓄必須足夠多;條件二,你沒有老到走不動,你還有體力去幹那些事情;條件三,你喜歡的事情不需要用到脆弱的膝蓋、昏花的視力,也不要求你走上一里地不喘氣,等等。

我剛才說到哪裡了?對了,我要提建議。

二話不說,下面就是喬爾針對計算機專業學生的7條免費建議。(絕對超值哦。)

(1) 畢業前練好寫作。

(2) 畢業前學好C語言。

(3) 畢業前學好微觀經濟學。

(4) 不要因為枯燥就不選修非計算機專業的課程。

(5) 選修有大量程式設計實踐的課程。

(6) 別擔心所有工作都被印度人搶走。

(7) 找一份好的暑期實習工作。

我會一一解釋這7條建議。如果你頭腦簡單到我說什麼你就做什麼,那麼你就不必讀下去了。在這種情況下,我還要加上一條:

(8) 尋求專業人士的幫助,培養你的自信心。


畢業前練好寫作


如果不是LinusTorvalds不斷地散佈福音,請問Linux作業系統會成功嗎?雖然他是一個非常聰明的計算機天才,但是Linux吸引來全世界一大批志願者的真正原因卻是Linus Torvalds的表達能力。他通過電子郵件和郵件列表用書面形式傳播自己的想法,最終引起了所有人的注意。

你聽說過現在風靡一時的“極限程式設計”[2](Extreme Programming)嗎?我在這個地方不談我對極限程式設計的看法,我只說如果你聽過這個詞,那麼原因就是它的倡導者都是一些非常有才華的作家和演說家。

即使我們縮小範圍,將目光侷限在任何一個軟體開發團體中,你也會發現該團體中最有權勢和影響力的程式設計師正是那些表達能力強的程式設計師,他們無論是做書面表達還是做口頭表達,都能夠清晰、自如、具有說服力地傳達觀點。此外,長得高也有助於提升影響力,不過這個不取決於你。

一個普通程式設計師與一個優秀程式設計師的區別,不在於他們懂得的程式語言誰多誰少,也不在於他們喜歡用Python語言還是喜歡用Java語言,而在於他們能否與他人交流思想。如果你能說服其他人,你的力量就可以得到放大。如果你能寫出清晰的註釋和技術規格說明書,其他程式設計師就能夠理解你的程式碼,因此他們就能在自己的程式碼中使用,而不必重寫。如果你做不到這一點,你的程式碼對其他人就沒有價值。如果你能為終端使用者寫出清晰的使用手冊,其他人就能明白你的程式碼是用來幹什麼的,這是唯一讓別人明白你的程式碼有何價值的方法。SourceForge[3]上有許多優美的、有用的程式碼,但是它們都像被埋葬了一樣,根本沒人來用,原因就是它們的作者沒有寫好使用說明(或者壓根就沒寫)。這樣一來就沒有人知道他們的成果,他們傑出的程式碼就衰亡了。

如果一個程式設計師不會用英語寫作、沒有良好的寫作能力,我就不會僱他。如果你能寫,不管你去哪家公司工作,你很快就會發現寫作技術文件的任務會落到你頭上,這意味著你已經開始在放大自己的影響力了,管理層正在注意到你。

大學裡有些課程被公認為“寫作密集型”(writing intensive)課程,這就是說為了拿到學分,你必須寫作多得可怕的文字。一定要去上這樣的課程!不要管學科,只要這門課每週甚至每天都要你寫東西,你就去上。

你還可以動手寫日記或者網誌。你寫得越多,寫作就會變得越容易。寫起來越容易,你就會寫得越多。這是一個良性迴圈。


畢業前學好C語言


第二點我要講的是C語言。請注意,我說的是C語言,而不是C++。雖然在實際使用中C語言已經越來越罕見,但是它仍然是當前程式設計師的共同語言。C語言讓程式設計師互相溝通,更重要的是,它比你在大學中學到的“現代語言”(比如ML語言、Java語言、Python語言或者其他正在教授的流行垃圾語言)都更接近機器。你至少需要花一個學期來了解機器原理,否則你永遠不可能在高階語言的層次寫出高效的程式碼。你也永遠無法開發編譯器和作業系統,而它們恰恰屬於目前程式設計師能夠得到的最佳工作之列。別人也永遠不會放心將大型專案的架構設計交給你。我不管你懂多少延續(continuation)、閉包(closure)、異常處理(exception handling),只要你不能解釋為什麼while (*s++ = *t++);的作用是複製字串,或者不覺得這是世界上對你來說再自然不過的事情,那麼你就是在盲目無知的情況下程式設計。在我看來,這就好像一個醫生不懂得最基本的解剖學就在開處方,他看病的根據完全是因為那些娃娃臉的醫藥銷售代表說這種藥有用。


畢業前學好微觀經濟學


如果你沒有上過任何經濟學課程,那麼我首先來作一個超短的評論:經濟學是這樣一門學科,剛開始學的時候轟轟烈烈,有許多有用的、言之有理的理論和可以在真實世界中得到證明的事實,等等;但是,再學下去就每況愈下,有用的東西就不多了。經濟學一開始那個有用的部分正是微觀經濟學,它是商業領域所有重要理論的基礎。跟在微觀經濟學後面的東西就不行了。你接下來學的是巨集觀經濟學,如果你願意,儘管跳過去,也不會有什麼損失。巨集觀經濟學開頭的部分是利息理論,內容比方說是利率與失業之間的關係,但是怎麼說呢,看上去這部分裡面還沒有被證實的東西多於已經被證實的東西。學完這部分,後面的內容越來越糟糕,許多經濟學專業的學生實際上都變成在搞物理學,因為這樣才能在華爾街上找到更好的工作。但是不管怎樣,你一定要去學微觀經濟學,因為你必須搞懂供給和需求,你必須明白競爭優勢,你必須理解什麼是淨現值(NPV),什麼是貼現,什麼是邊際效用。只有這樣,你才會懂得為什麼生意是現在這種做法。

為什麼計算機系的學生也應該學經濟學?因為,從經營一家公司的角度來看,比起那些不懂的程式設計師,一個理解基本商業規則的程式設計師將會更有價值。就是這麼簡單。我無法告訴你有多少次我是那麼充滿挫折感,因為我看到了太多的提出一些瘋狂的想法的程式設計師,這些想法在程式碼上也許可行,但在資本主義世界中毫無意義。如果你懂得商業規則,你就是一個更有價值的程式設計師,你會因此得到回報的,但是前提是你要去學習微觀經濟學。


不要因為枯燥就不選修非計算機專業的課程


想提高GPA[4]績點的一個好方法就是多選修非計算機系的課程。請千萬不要低估你的GPA的重大意義。千千萬萬的人事經理和招聘人員在拿到一份簡歷的時候,第一眼就會去看GPA,包括我也是這樣。我們不會為這種做法道歉。為什麼?因為GPA不反映單個的成績,而是代表了許多個教授在一段很長的時間中,在不同的情況下,對你的表現的一個總的評估。SAT[5]成績難道不夠嗎?哈,那隻不過一場幾個小時的測試罷了。GPA中包括了四年大學期間你的小論文、期中考試和課堂表現,總數有幾百次之多。當然,GPA也有自己的問題,不是百分之百準確。比如,這些年來,老師對學生的打分越來越寬鬆,學習成績有通貨膨脹的趨勢。再比如,GPA無法反映課程的難度,沒人能夠看出你的GPA是來自無名社群大學家政系的輕鬆課程還是來自加州理工學院針對研究生的量子力學課程。漸漸地,我形成了一套自己的做法,首先我會過濾掉所有來自社群大學、GPA低於2.5的簡歷,然後我會要求剩下的人給我寄成績單和推薦信。我再從中發現那些成績一貫優秀的人,而不是那些僅僅在計算機系課程中得到高分的人。

為什麼我要關心某人的“歐洲歷史”課程成績呢,畢竟作為僱主我要找的應該是程式設計師啊?何況,歷史是那麼枯燥,不得高分很正常。哦,這麼說來,你的意思是我應該僱用你,而不用考慮一旦工作變得枯燥你會不會努力工作?別忘了,在程式設計工作中也有很枯燥的東西。每一項工作都有枯燥難耐的時刻。我不想僱用那些只想幹有趣事情的人。

在大學裡,我選修過一門叫作“文化人類學”(Cultural Anthropology)的課程。因為我很好奇,想知道這門課會講什麼,想學一點關於人類學的知識,看上去這很像一門有趣的概論類課程。

這門課有趣嗎?連有趣的邊都沾不上!我不得不閱讀那些乏味到極點的書籍,內容有關巴西雨林中的印第安人和特洛布里安德[6](Trobriand)島上的居民。恕我直言,我對這些東西一點興趣也沒有。有一次,聽課聽到一半,實在是太無聊了,我渴望幹一些更有意思的事情,比如看著窗外青草在長高。我對這個學科已經毫無信心了。完全地、徹底地,不想學下去了。我的眼睛痠疼,課堂上正在無休止地討論堆山藥,我徹底厭倦了。天知道為什麼特洛布里安德島上的居民要花那麼多時間來堆山藥?其他的事情我都已經忘記了,總之,這門課超級乏味。但是,那天講的東西期中考試時肯定會考。所以,我忍住了,繼續往下學。我逐漸下定決心,就把文化人類學當成我的抗無聊免疫劑,這是我的個人萬米障礙跑的訓練場,專門訓練如何對抗無聊。如果我想在這門課的考試中得到A,那麼就連印第安人在冬慶節[7](potlatch)中使用的毯子,我都必須知道得一清二楚。如果我做到了,那麼我就無敵了,以後天底下再無聊的東西我都能夠對付。後來,出於偶然我坐在林肯中心[8]聽完了整整8個小時瓦格納的歌劇《指環》[9]Ring Cycle)。幸虧我在文化人類學中已經嘗過研究誇扣特爾人[10](Kwakiutl)的滋味,兩相比較,我覺得坐著聽8個小時歌劇可謂愉快經歷。

最後,我在那門課中得到了A。如果我能做到,你也一定能做到。



[1]    AIM是AOL Instant Messenger的縮寫,也就是AOL出品的即時通訊軟體。它的首次釋出是在1997年5月。據統計,在2006年,它佔據了美國即時通訊市場52%的份額。

[2]    極限程式設計是一種軟體工程的方法論,之所以稱為“極限”,是因為這種方法提倡將一些公認的軟體開發的“最佳原則”都發揮到極限,追求軟體開發的最佳效果。

[3]    SourceForge.net是一個程式碼倉庫,任何個人或團體都可以在上面免費釋出開放原始碼的專案,訪問者可以免費得到這些程式碼或軟體。

[4]    GPA(Grade Point Average的縮寫)是高校中衡量學生平均成績的一種手段,將各種課程的成績換算為一個績點,然後再求加權平均。常見的GPA為4分制,A(90~100分)為4分。有的學校會將A+算為4.3分。

[5]    SAT(Scholastic Aptitude Test和ScholasticAssessment Test的縮寫,“學習能力測試”)是美國的一項標準化考試,通常用來評估高中畢業生的水平。美國高校採用這個成績作為錄取參考。

[6]    特洛布里安德群島是南太平洋中的一個由珊瑚礁構成的群島,面積為170平方英里,靠近新幾內亞的東海岸。

[7]    冬慶節是北美洲太平洋沿岸的一些印第安部落的重大節日之一,人們在這個節日中往往互贈禮物。

[8]    林肯藝術中心是紐約最著名的文化表演場所之一,建於20世紀70年代。

[9]    歌劇《指環》全名為《尼伯龍根的指環》(The Ring of the Nibelung),是德國音樂家瓦格納(Wilhelm Richard Wagner,1813—1883)的鉅作。全劇共分4部,全部演完需要4天,每天8個小時。

[10]   誇扣特爾人是太平洋東北海岸的美洲印第安人,主要生活於溫哥華島上。

相關文章