軟體具有容易被改變的特質。軟體開發過程中,任何程式員只要隨手敲幾個鍵,都會造成軟體的改變。這樣的改變,可能讓軟體變得更好,消除原有的 bug;也可能讓軟體變得更差,產生新的 bug。
你可能也遇過這樣的例子:原本正常運作的軟體,在你求好心切、以臻完美境地的修改之后,反倒距離完美越來越遠,不能順利執行。不巧的是,再過一個小時之后,你就必須向客戶展示此軟體,汗水汨汨而下的你,該如何交差呢?
這樣的情節聽起來不陌生,每個程式員都遇過,所以老一代的程式員常諄諄告誡我們「沒壞的部分,就不要去亂動,免得出了亂子」,這個原則就是怕我們把程式越改越糟。但是時代不同了,現在的程式員卻被鼓勵「沒壞的部分,只要你發現有任何不完美之處,還是要主動去修改」,以防積弊日久,一發不可收拾。Martin Fowler 稱這種「沒有錯但只是不完美的程式碼」為「bad smell」,嗅到 bad smell 就要馬上處理,這就稱為 refactoring。我現在使用的 Java IDE 是 IntelliJ IDEA,這套軟體就是以其聰明的即時分析和方便的 refactoring 功能深獲我所喜愛。
Martin Fowler 還認為 testing 對于 refactoring 很重要,我認為 version control 對 refactoring 也很重要。有了 version control 工具軟體的輔助,你不用擔心程式越改越糟,因為 version control 工具軟體可以幫我們記錄許多版本,你可以隨時切換回任一個時刻的版本,就像是時光機器一般。
版本控制(version control)更宏觀的稱呼方式是 software configuration management,簡稱為 SCM。或者應該這么說,SCM 提供對版本控制的支援,但是 SCM 功能更完善。
我剛進入清華大學資訊工程系就讀碩士班時,必須和許多同學一同開發 C 語言版本的 VOD 系統,當時經歷了一場大災難。回想起來,災難的來源主要有下列兩點:
模組版本不一致的問題:因為計畫參與者人數眾多,同一個 Sub-system 由一個教授負責,這個教授又有數個學生參與,所以版本混亂,常常無法進行整合。
改變程式之后,反而不能執行:原本已經可順利執行的軟體,在某些人更動一些「無關緊要」的程式碼之后,反倒不能執行。
不要小看這兩個問題,這已經夠讓我們忙得團團轉了。加上一個學長遺留下一些形同垃圾的程式碼,更是彷彿不定時炸彈,隨時會爆炸。(還好我們 VOD 小組內有一個很優秀的施同學,把那堆垃圾整個改寫成井然有序的程式碼,我實在很佩服他鍥而不舍的努力)。加上我當時并不熟悉 VOD,我的學長竟然把所有的事情通通扔給我,我的壓力很大,因為內分泌失調,我的整個臉和脖子都長滿疹子,當時已經到了毀容的地步了。一想到那時的那些倒楣事,我到現在還是覺得一肚子氣。
上述的兩點問題都可以透過導入 SCM 而輕易解決。聰明人從自己的挫敗中學習,更聰明的人從別人的挫敗中學習。我已經告訴你,我過去因為欠缺 SCM 而導致了諸多問題,非常聰明的你,如果還沒開始使用 SCM 的話,你應該要好好開始規劃導入 SCM。
導入 SCM 可以說是難度最低的軟體工程,但是收效良好。特別注意:SCM 是 CMM level 2 的要求之一,對于有意遵循 CMM 的建議來改進軟體品質的公司而言,采行 SCM 無疑地是最值得最先采行的步驟。
目前 SCM 的產品眾多,大多數人選擇使用免費的 CVS,或者價格便宜的 Microsoft Visual SourceSafe,另外 MKS、Rational ClearCase、PVCS Dimensions、Oracle9i SCM 也是這樣的產品,但顯然功能比較高檔。另外,有些 Java 開發工具也整合進相關的功能,例如 Borland JBuilder、Together ControlCenter:
不只軟體工程需要版本控制,在我看來,只要是更動頻率很高的任何事物,都需要版本控制,例如我們的憲法,就需要版本控制。李登輝總統主政的后十年,憲法歷經六次修改,修憲的頻率之高,幾乎已經到了一年一修的地步,乃至于到底我們的憲法精神目前是類似美國的總統制、類似英國的內閣制、類似法國的雙首長制、或者是所謂的改良式雙首長制,已經沒人搞得清楚了。最近傳出,陳水扁總統有意在下半年啟動修憲工程,身為 SCM 愛好者的我,建議政府購買一套 PVCS 或 Rational ClearCase,以為修憲工程的版本控制之用。這么一來,如果修憲又修出一頭權責失衡的憲政怪獸,而這只怪獸準備吞噬整個國家時,我們可以迅速地利用版本控制的回溯功能,恢復到舊版的憲法,以回歸憲法秩序,免得禍國殃民。
「可是 SCM 軟體都很貴,在政府財政困窘,債務高達近三兆之際,要用什么樣的名目支出呢?」我說你實在是多慮了,我們可以從近來曝光的國安局秘密帳戶的數十億中,省下外交部長簡又新兩套西裝的錢,就有十四萬元了呀!還可以把帳全數賴到逃亡國外的劉冠軍身上呢。
PS1. 最近唱片和電影業發起 404 反盜版大游行。有鑒于我的文章到處被亂 copy,所以我特別改編 IFPI 的話來呼吁大家:「今天你 copy 一篇文章,明天你將失去閱讀好文章的機會。我是蔡學鏞,我希望一直寫文章給大家閱讀。」如果你真的想把我的文章與他人分享,你可以利用 hyperlink 的方式,連結到該文章的 URL 即可。
PS2. 這是 Sleepless in Java 專欄開張三年以來,寫得最痛苦的文章,因為寫這篇文章的同時,住處旁一間「不知道祭祀何方神圣」的廟正進行廟會,他們把我們的街道整個堵住搭起棚架以做為酒席的場所。我擔心我們這里萬一發生火警,消防車根本沒辦法進來。更慘的是,他們還搭起了舞臺,在臺上演唱的不是我喜愛的孫燕姿,而是一個接著一個五音不全又愛現的人。即使我關在屋內仍清晰地聽到那些可怕的歌聲,逼得我把 Shakira 的「Whenever, Wherever」播放到最大聲,用音量壓過他們的「媽媽請你也保重」。文章寫完了,我的耳朵也快聾了,我決定快快逃離這個人間煉獄,到天瓏買書去。