我是一名程序员,我想我碰巧窥见了不少软件开发的真谛。
我是一名程序员,这句话的意思是说,在过去的七、八年里,我是一个不折不扣的、充满探索精神和人文关怀的二进制主义者--这一略嫌晦涩的注脚又可以用比较浅显明白的事实阐述如下:在大学恋爱时我曾经朝思暮想、如今为我准备早餐晚餐时取法朝三暮四、饭前饭后还要告诫我不要朝秦暮楚的爱人兼老婆同志,因为我沉溺于C++、UML、J2EE以及诸如此类的垃圾技术不能自拔,现在已经正式把我手中的笔记本电脑册封为我的小老婆;和所有开明前卫但又不失妒意的女士们一样,我的爱人兼老婆同志理所当然地反对我在聊天、看电视、逛街、吃必胜客之类的二人时间里携带小老婆,并严禁我和小老婆在她面前做出任何过于亲密的举动。幸运的是,就在老婆同志第六百一十五次从我怀里夺过笔记本电脑试图让我恢复正常生活的一刹那间,我就像被人当头棒喝的禅宗僧侣或者被迅猛龙逼上绝路的侏罗纪访客一样,智慧不知不觉从大脑里满溢出来--我竟然悟到了如此之多关于软件开发的奇思妙想,这些想法竟然无一和学校里学到的理念雷同。
作为立论的基础,我把软件当成是流动着二进制血液的原始生命,并且尝试着用寒武纪物种大爆炸时出现的各种生物为它们分门别类。比如我把Microsoft的Office叫做三叶虫,把IBM的DB2记为古杯,把Sun的iPlanet看成是太阳女神螺,CA的Unicenter则是伸角石,Rat Hat的Linux是爱丽丝木脚石,Borland的Kylix是笔石,金山的词霸系列当然是软舌螺……说实在的,软件从上世纪九十年代开始,随着互联网的兴起一下子变得如此丰富多彩并且无处不在,这的确类似于生命形态在寒武纪的突然爆发;从另一个意义上讲,既然生命在寒武纪之后又走过了五亿多年才衍生出集自我意识与笨拙精神于一身的无毛两足动物--人,那么,软件要从今天的多样化阶段发展到真正具备《星球大战》里C-3PO和R2-D2那样的智能特性,或者干脆像尤达大师一样老谋深算外加深藏不露,这恐怕还需要一段相当漫长的时间。
因此,在现阶段,开发软件还不像上帝在第六日制造亚当那样复杂或者说竟要借助天父的伟大力量和神奇智慧,开发软件的人也就是程序员当然也不需要像可怜的数学家纳什那样,为了博得一个"美丽心灵"的定评,在研究博弈论之余还要佯装痴狂。依我的浅薄之见,所有软件无论形态怎样、结构如何,最终都要被转换成二进制的0、1序列由CPU逐一处理,这说明程序员的工作无非是用0和1这两个二进制的"符码"进行无休止的排列组合,然后把合成出来的二进制血液灌输到主板、CPU、显卡、硬盘之类的电子躯壳里面--如此制造出来的东西当然算不得万物之灵,这充其量不过是在生产寒武纪的三叶虫罢了。
简单地讲,开发软件或者说生产二进制代码的过程可以用四个词语来概括,它们是:倾听、编织、反讽和洞见。
不善于倾听的程序员永远无法写出优秀的代码。有一个故事是说客户想要一个软件,这个软件必须使客户的生活永远充满乐趣。第一个程序员为客户开发了一套游戏软件叫做《武当足球》,结果客户因为无法操控中国国家队打遍天下无敌手而懊恼万分;第二个程序员给客户设计了一段Flash电影,电影里一只流氓兔因为没办法用胡萝卜钓到湖里的大鲤鱼就祭出卑鄙手段把屁股探进湖里制造了一串气泡熏死了大鲤鱼,结果客户看过Flash并且大笑三声之后指着程序员大骂"我早看过了你这是抄袭";第三个程序员不得已躲进深山老林闭关七天七夜,然后为客户安装了一套QQ并伪装成网络上的美眉陪客户度过了漫长但充满乐趣的下半生。这个故事的意思是说倾听客户的需求其实是一个蛮讲求方式方法的工作,一味傻听只会落得一脑门子没趣。当然我们所讲的倾听还不只限于软件开发里的需求分析,团队内部的知识共享其实也是倾听与被倾听的一个实例。不过,程序员之间的门户之见或者嫉妒之心有时比传说中的"文人相轻"还要厉害,如果你既想与其他程序员分享经验又不想被人当傻瓜起哄,你就要学会在发表意见的同时引导别人仔细倾听。
编织,指我们生产代码或者说编写程序的过程。尽管这个过程充斥着越来越多的争吵、愤懑而非惬意、温馨,我还是更喜欢用编织这样柔和暧昧的字眼来指代它。编织这个词首先让我联想到的东西既不是苏州的双面刺绣,也不是成都的竹编花瓶,而是美国新墨西哥州荒漠上的甚大阵射电望远镜。我经常用一种纯感性的口吻来描述这一天文学杰作:从阵列中心极舒展地向外散出三条射线,每条射线上都优雅地"编织"着一组大口径射电望远镜,整个构图的严谨程度足以让从未编过一行程序的新手在兴奋中写出大段大段优美绝伦的EJB代码;在这里,没有人会觉得自己正身处人类求索苍穹奥秘的起点,大家多半会在第一时间一脸恭肃地说:"噢,我尊敬的阿米达拉女王,《星球大战》开演了!"于是,和世界上所有壮观的射电望远镜阵列一样,我们用Ada语言、Basic语言、C语言、Java语言、Pascal语言或者其他什么语言写出的优秀软件也应当同时具备技术上的完善和感官上的完美。事实上,编织优秀软件本身就是一个不断拆解和不断构造的过程,这一过程常常是周而复始和变幻莫测的--我并不是想在这里论证螺旋模型生命周期的重要,我只是突然想起了周星驰在《大话西游》里用后现代手法编织出的忽而五百年前、忽而五百年后的搞笑时空。
反讽是幽默的终极形式。我们通常把姜昆在《虎口遐想》里面的反讽称为存在主义的反讽,因为把大活人弄到老虎笼子或者类似的极端境遇里尽情捉弄正是萨特之流的拿手好戏;另一种更加痛快的、充满现实批判精神的反讽被牛群在《小偷公司》里演绎得酣畅淋漓;王小波则在《文明与反讽》里介绍了一种被异教徒烤焦了下半截还要说"喂!下面已经烤好了,该翻翻个了"的自嘲式的反讽。类似的,从Grace Hooper 1945年第一次从计算机的继电器里捉出一只小虫子开始,以Bug和Debug为主题的反讽就几乎一成不变地寄生在所有软件的生命周期里。相似的术语对还包括病毒和反病毒软件、黑客和防火墙、密码和密码攻击、项目资源和项目需求、项目计划和项目风险等等。当你看到像Rational Suite TestStudio这样的测试软件包售价不菲的时候,当你看到无数家杀毒软件公司借着病毒孳生的势头业绩蒸蒸日上的时候,当你看到Microsoft、IBM、Oracle之类的软件巨头在网站上没完没了发布补丁程序的时候,你难道不觉得诸如Bug之类的软件痼疾其实是对我们这些程序员没日没夜辛勤劳动的最大反讽吗?
洞见是最后一个可以用来准确概括软件开发的关键字。如果不能洞见软件都要为人所用这一终极真理,很多程序员就会陷入技术至上的泥潭而找寻不到出路;如果不能洞见传承比单纯的技术炫耀更重要这一实用主义哲学,很多程序员就会编写出高效但佶屈聱牙、难以卒读的"抗维护代码";如果不能洞见软件开发不过是一种二进制的排列组合游戏,程序员的工作其实只类似于建筑工人的码砖砌墙(有别于BBS上的砖客拍砖),我又怎么会在这里如此心安理得地借用罗兰·巴特先生的语词精义来阐发软件开发的粗浅理论?
好吧好吧,我老实交代--我被爱人兼老婆同志揪住了耳朵,一般来讲只有这种方法才能使我尽快脱离妄想和痴迷的状态--我既不是求伯君也不是谭浩强我就是我自己我哪里懂得什么软件开发的真谛,我只不过读了三遍罗兰·巴特先生的《S/Z》却没有读懂郁闷之极脑海里尽是让我费解的几个术语比如"倾听"比如"编织"比如"反讽"比如"洞见",我发誓我真的没有恶意没想在软件开发的学问上滥竽充数,我错就错在身为一个新世纪的程序员不该把数据库接口、流程控制、通信协议、设备驱动都放在一边偏要去读跟我八竿子也打不着的罗兰·巴特。
很遗憾,直到现在为止,我还是一名程序员。
王咏刚 2002年4月14日