软件工程只能是零碎工程
绝不相信任何观念可以绝对地真确,唯一真确地,是自由竞争着的各种观念
所构成的演化格局(哈耶克)
——作者按
我一直在尝试着用历史的眼光来看待人类的软件构造行为的发展历程。对于
这句话,我必须做两个简明但非常必要的解释。所谓“历史的”,只是一种历史
陈述,抑或事后的解释,并非带有预告意味,而后者恰恰是我要极力批判的。第
二个解释,将针对“人类的软件构造行为”(以下简称构造行为)。以物理、化
学等学科发展起来的工程学的特点是其基本的研究对象是客观世界的物质;而软
件构造却是对人类智识的研究和加工。智识将体现在行为上,所以,构造行为是
软件业需格外强调的东西。但,容易引起误解的一点是,“人类的软件构造行为”
并不等同于软件工程,这是确凿无疑的。因为软件工程实际上涵盖了构造行为,
涉及到质量、成本等多个方面,所以构造行为也只是其中零碎的一部分,而这恰
恰是我想在此表达的核心观点,即软件工程只能是零碎的,甚至于构造行为,也
是零碎的。
为什么零碎
零碎的含义重在其不可计量的复杂的分散性。比如,一个苹果被切成几半,
并没有形成零碎,因为它的各部分可计量,且其和还为1;而一个密切配合的团队
被拆散,其结果就形成零碎,因为人的关系很复杂且很难量化,不应该把拆散后
的人的总和直观地等同于拆散前。这两个对应的比喻只是想清楚地界定零碎。以
此为标尺,就可以得出构造行为恰如其分的适合该标准的结论。首先,人类行为
是分散的,每个软件工程师都在做着自己的零碎实验,有着不同的感受和经验,
对此,很多具体的理论或者方法其实都是本着一个错误的前提,即假定人的同一
性。而这个假定作为总体论比较有代表性的观点,是很值得怀疑的。每个人甚或
每个公司,作为小的单元,是不可能有多大同一性的,它们只能按一定抽象的规
则,用试错法得出自己的方法。其次,计算机技术是零碎的。承认这一点就等于
承认人类存在很多知识上的问题,因为仅仅在计算理论中就还有很多是我们所未
知的。既然未知,又怎能说它是一个完整的体系?而个人所做的,甚至于许多大
师所做的,也只不过是添砖加瓦而已,说他们的功能在于建构,是有点儿夸张的
溢美之辞。我只是认同,它们所添加的分量比一般人要沉得多。
写到这儿,我想以足够引起许多人的反驳了。他们会问,诚如你所言,是什
么合力使个人的(零碎)实验,汇聚成今天的软件生产力量?若作为基础的计算
机技术都如此复杂,是不是我们就该持以悲观的态度?
零碎实验的重要性
下面我将着力回答这两个问题,首先是第二个问题。
在第二个问题背后,其实隐藏着一种更深的理想主义者的唯理主义观点。他
们认为:人类是可以解决所有计算问题的,而软件业的发展,必定存在着一种客
观的规律。毫不隐瞒地说,我曾经也持这种观点——我相信真理的客观实在。但
是,今天我想说的是,如果你无法判别什么是普适真理,就不要相信或接受任何
以真理之名而大行其道的理论。而我们能判别吗?不能。所以绝不应相信。一旦
以真理为客观的,就易陷入“历史决定论”,以为构造行为的发展将循着一条既
定的(虽然是个人无法控制的)道路发展,或者人为地为其设立一个终极目的。
幸好,这样的思潮在当今并不是很明显,不过,当人类的软件生产能力大大发展
时,很难说没有人会声称总结出某些“最终性”的规律,并宣称可以解决所有的
问题。对此,我的观点非常明确,那就是我们必须乐观地承认自己的无知——面
对复杂的系统,只有通过把它分散为零碎的系统进行研究,因此知识的积累是零
碎的——就算已研究透了一些部件,也无法宣称发现了部件之间的所有关系。我
想,混沌理论和复杂性理论有助于我做此辩护,暂按此不表。另一个重要论据是,
通过与其它工程学科比较。为什么在今天从蓝图到实物的过程中,机械工程,建
筑工程实施得如此顺利,而在软件工程中又如此艰难呢?特别值得注意的一点是,
前者已经积累了足够多的零碎实验(但也不能宣称解决了所有的问题),有了充
分多的试错和调整行为。我还有第三条论据,它将依赖于后面提到的“演化模型”,
到那时,我想我的所有观点才会显得清晰。
什么环境适合于零碎实验
先前的第一个问题似乎又引出了另一个问题——如果构造行为是零散的,为
什么我们通常看到的进步和发展却呈现着整体性的态势?这确实很有趣,甚至有
点难以理解,而我会尽力地自圆其说,我的最重要的依据是现代经济学中的演化
的观点。如前所述,每个人都在做着自己的零碎实验。何谓零碎实验?一言以蔽
之,即试错和调整。而人们又是在何种环境中实验的,或者说何种环境更有利于
实验?我认为,这样的环境有两个特点:其一是融入传统,其二是开放性。每个
人的行为无不受着传统的影响,形成了一种路径依赖。比如,大多数人并不知道
划分模块的依据是什么,却自然地这么实践着;并不清除goto语句的渊源,却明
白应避免使用它。正是传统,使我们节约了很多信息成本。而开放性,恰恰是现
代公司积极倡导的,比如沟通,交流。因为以别人之所知来弥补自己之所不知,
信息成本比自己探索或创新要低得多。一方面继承前人的零碎实验结果,另一方
面又吸取别人的零碎实验结果,于是形成了一种演化格局,一种扩展的秩序,正
是它们加速了人类社会的发展。
用零碎实验来检验规律
此时,我想我应该揭开所为规律的本来面目,并在它与零碎工程之间搭设一
座桥梁。如此,也许对很多人的观念会起到某些启示作用。
任何规律,判别其真伪的依据都是其有效性有多大——不仅是现在,还在将
来。那什么样的规律长久有效的可能性更大呢?比如我说“苹果好吃”和“只有
红的苹果好吃”,显然前者的解释力会更大,因为如果一旦我发现绿的苹果也好
吃,后者就被证伪。再比如比较“三个代表”和“毛主席的话永远是对的”,显
然还是前者的解释力更大。因为一旦毛主席犯一个错,就被证伪。从这两个例子
中,可不加证明地推出一个结论,即规律越抽象,解释力会更强。这个结论太重
要了,它说明了没有一个规律可以被证明永远有效,而有效性也只是相对的,这
取决于其抽象程度。而“红的苹果”,“毛主席”无疑太具体了。
现代计算机技术中很多规律都是加了很多限定的,它们都是人类智慧的结晶,
企业或个人该如何对待呢?对于任何规律,都不能不加判别地吸收,特别是某些
限定条件太多的规律。只有利用自己或别人的零碎实验,用试错法来检验规律对
于自己的有效性,并不断调整自己的方法,才有可能探寻到自己的软件之道。而
我们也更应该相信,在良好的人类秩序中,规律会越来越抽象化,从而解释力更
强,我们构造软件的能力也会越来越强。
总结
我想改变什么?这是写完此文我问自己的第一个问题。由之而来的第二个问
题是,我可以改变什么?
看完此文,大家该下班的还是下班,该回家的还是回家,一切都以与我毫不
相干的方式展开,我真的达到了目的吗?如果说我达到了,我想我是改变了某种
观念,至少稍稍修改了别人的某种理解,不管有多么细微,它都是有意义的。因
为,我深信只有观念才能战胜观念,即使我错了,也很乐意见到解释力更强的观
念出现。
软件工程的发展必须以无数零碎的发展为前提,在这个模型中,你我都身处
其中。所以,保护那些零碎实验赖以生存的环境就太重要了。靠什么保护?只有
靠制度。它将保护一套抽象的规则,其内容是最大限度地保障个体的自由和权利,
使他们把自己纳入一种传统之中,并保持开放的心态。这正是自发生成人类秩序
的途径。