本文獲作者臺灣大學資工系副教授洪士灝同意轉載
我說過寫程式像是寫文章,但仔細想想,我們很多人學習寫程式的方法,和學習寫文章所採用的過程,似乎有很大的差別。
大部分人如何學習寫程式?從寫Hello World!開始,一路學習程式語言的語法、控制結構、資料結構、演算法等等,但即便是資訊系的學生,除了課本中的範例程式、習題解答、程式競賽題庫之外,究竟看過多少別人寫的程式碼?
少、得、可、憐。
學寫文章可就麻煩多了。我們從小先學會聽話、說話,然後才學認字讀文章,過一段時間後才開始學寫文章,這是自然的過程。如果沒有讀過幾篇文章,光是研究文法、修辭學、背成語辭典,可能成為好作家嗎?沒看過小說,可能成為小說家嗎?
不、大、可、能。
很多作家每天還是大量閱讀別人的作品,欣賞和學習別人的才華。日常所讀的文章,多半比自己所寫的多得多。藝術家、建築師也不是整天埋頭苦幹,常常要去看過別人的作品。
但為什麼我們不是這樣學寫程式?為什麼覺得參加程式競賽得獎才是程式高手?
因為「急就章」。想要再最短時間內獲得一項技能的「認證」,最有效率的方式,就是針對認證所考驗的項目做準備,不考的就不準備。因此,學生會先去搞清楚,程式競賽考什麼?程式設計課期末考什麼?碩士班入學考什麼?程式技能檢定考什麼?某公司面試考什麼?
但急就章訓練出來的,問題很大。就拿進到研究所的學生來說,看不懂別人的程式碼,寫出很爛的程式碼的,不會用程式開發工具的,比比皆是。我們為了要做系統研發,不得不花很多時間訓練學生去看別人寫的程式碼,但不少學生視為畏途,甚至會排拒,以為要寫出屬於自己的程式才是神人。
幫、不、了、忙。
我想,急就章的作法很多,不是只有程式設計。國內學英文的方式,也有文章讀得太少的問題,和學程式設計的過程類似。台灣學生學習英文時,偏重於文法、單字、成語,很多學生除了課文之外,沒讀過幾篇文章,於是常常有些成績還不錯的學生用英文所寫出的論文,讓我目瞪口呆,欲哭無淚。
那麼,想扎實地學,學好後證明自己的能力,該怎麼做呢?這裡有個簡單的方法:從大量「閱讀」開源程式碼開始訓練自己,到達能夠「悅讀」高品質的開源程式碼,進而對重要的開源程式碼計畫做出「貢獻」。
舉例來說,幾週前,大學沒畢業的黃敬群教授(jserv),帶著的一位台大電機系大學部的學生,到奧地利發表他們這個暑假對Linux/Xenomai開源碼所做的貢獻。沒有期刊論文點數,貢獻不被台灣的學術界承認,但這趟旅程獲得業界的贊助。
在國外,數不清的優秀軟體人才,熱心參與開源碼計畫,匯聚成高品質的社群和人脈;歷經千錘百鍊的開源碼計畫,擁有許多精益求精的程式碼,開再多課也講不完。
學校只是帶領入門而已。
我在2000年離開學校到矽谷的SUN公司工作時,看到身邊很多同事整天盯著螢幕看程式碼,有一天我忍不住問一位資深的同事,為什麼這樣做?他露出不可思議的表情後說,找別人最新釋出的程式碼來看,已經是習慣,也是興趣,沒事就會如此做,而且他們會以程式碼論英雄。說著說著,一邊指著螢幕上的程式碼,開始評論起作者的寫作風格。
此後,我不敢自稱為軟體工程師,因為我知道我看過的軟體程式碼太少。但是因為工作需要,我必須分析幾個大型軟體的效能,想辦法找出瓶頸加以改善,包括當時最精良的作業系統Solaris,網頁伺服器iPlanet Web Server和Apache HTTP Server,以及幫通訊加密的NSS和OpenSSL,也用了開源碼解決不少工作上的需求。
幸好,我廣結善緣,周遭這些同事幫了我很大的忙,公司裡面厲害的人太多,我也從他們身上學到許多。也因此,我始終還是不敢自稱為程式專家,因為和這些同事的程度差太多了,追都追不上,還好我另有專長。
十年前回國後,莫名地接到了要開一門新課「Linux Kernel and Device Drivers」的任務,我這個非程式專家,花了很多時間了解Linux kernel的原理和程式碼。為了教「平行與分散式程式設計」,我也得學Hadoop、CUDA、OpenCL等新出來的東西,但我在教學相長、樂在其中的同時,我發現很多學生是不看程式碼、不懂得自學的。
因此,我想鼓勵想自學的朋友一起來悅讀開源碼系統軟體。
挑選系統軟體,有幾個原因:第一,世界上非常多開源碼計畫,我不想太發散,我們必須先聚焦在特定領域上;第二,系統軟體與台灣的產業高度相關,可培養產業轉型所需的軟實力,又不會距離太遠;第三,這是我個人的研究專長和興趣
因此,我稍早說我這幾年想推動開源碼系統軟體,除了這些軟體本身的重要性之外,還有其更廣泛的教育意義:希望讓我們的學生和業界朋友,一起來多讀一些高品質的程式碼,研討大型的軟體專案的架構和運作方式,來提升自己的眼界。由此入門,逐漸能充分運用和賞析別人的作品,應該比較有機會成為高段的軟體設計師。
我希望多成立一些愛好開源碼系統軟體的社群,藉由賞析和討論這些重要的開源碼來促進軟體人才的跨國交流和合作,希望大家能一起來提升國內系統軟體研發的水準。不然,我們很難有世界級的軟體人才。
話說,學程式設計和學英文,可能相輔相成,這是我個人經驗談。我自己因為高一時迷上了電腦,嫌當時中文翻譯的書太少,時常到重慶南路的書店站著原文書,也省吃儉用買了不少書回家看,不知不覺中增進了英文閱讀能力。隨後我發現,學校英文考卷上的閱讀測驗和作文,對我來說都不是甚麼大問題。
延伸上述個人的經驗,我提出幾個臆測:(1)多讀優質的開源碼,有助於英文的學習。(2)程式設計的訓練,有助於英文寫作。(3)英文能力的提升,有助於理解高階的程式碼 (4)英文能力和程式能力的提升,有助於與國外交流以及走上國際舞台。
話已經說在前頭,這只是我一時興起的臆測,是否適合每個人,請自行判斷。但現在隨手可得的電子書、程式碼教學、線上課程這麼多,如果師父帶進門之後,因為不懂得大量閱讀而學藝不精的話,恐怕要怪自己了