软体具有容易被改变的特质。软体开发过程中,任何程式员只要随手敲几个键,都会造成软体的改变。这样的改变,可能让软体变得更好,消除原有的 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」播放到最大声,用音量压过他们的「妈妈请你也保重」。文章写完了,我的耳朵也快聋了,我决定快快逃离这个人间炼狱,到天珑买书去。