代码改变世界

杀不死的人狼——我读《人月神话》(四)

2007-03-15 02:11  乱世文章  阅读(164)  评论(0编辑  收藏  举报

 

=====
四、没有银弹,或人狼杀不死
=====
人狼这个动物很奇怪,皮肉坚实还是自疗系的,所以要么砍它不动,要么杀它不死。这种动物如同习得(传说中的)金钟罩功夫,刀枪不入,水火不怕。也如同金钟罩有罩门一样,人狼对银没有免疫,因此如果做一颗银弹就能穿透它,进而杀了它。
所以人们总是说一物克一物,大象怕老鼠,总有对付它的法子。但如果你设定了一个自圆已说的悖论,那除了否定悖论本身没有意义,也就没有解它的法子了。同样的道理用在“没有银弹”这个观点上,也是成立的。
也就是说,如果我们讨论“有或者没有银弹”,那么应该先反过来看看“人狼”的本质。因为本质是人狼对银不免疫,所以我们才能找到银弹并杀了它。如果人狼根本就杀不死,那么不要说金弹银弹,就是核弹也没用——因为它杀不死。
 
我们来看看Brooks所谓的人狼,也就是“软件活动的根本任务”。首先,Brooks认为我们并没有足够的精力来放到“软件活动的根本任务”这一目标之上。他的论证过程是:
  • 根本任务的目标:抽象软件构成的复杂概念结构;
  • 次要任务的目标:表达抽象实体,在一定范围内映射成计算机的执行逻辑;
  • 我们大多时候在关注次要目标,例如写程序和开发“写程序用的”程序;
  • 我们写再多的程序与再强的“写程序用的”程序都不会触及到根本任务。
进一步的分析来说,是我们探索目标的方法,分散了达到目标的力量。我们在通向目标的路线上越是努力,那么我们的力量就被分解得越快。次要目标是达到主要目标所必须的,但次要目标上花费越多的精力,就越无法接近主要目标。既然要经过A才能达到B,而经过了A也就没有力量达到B。那么结论自然是:达不到B(主要目标)。
 
这个悖论说的是手法问题。你当然可以超越某种手段,可以从纯理论上来推论出:没有了A就成了,我们可以由C达到B。由于永远存在C*(任意)的途径,那么当然存在CB的途径。由于手段无以穷尽,所以Brooks当然不能从这上面说服大众。于是,Brooks立即又论述了这个人狼的四个具体特性:复杂度、一致性、可变性和不可见性。
一是要面对极端的复杂性。尽管我们可以用模件复用来缓解复杂性,但是软件实体的扩展必须是不同元素实体的添加,这些元素“以非线性递增的方式交互,因此整个软件的复杂度以更大的非线性级数增长”。所以你创建一个新软件就必然面临更多的(非线性级数增长的)旧软件中不能被复用的元素。所以在复杂性方面,人狼是自疗系的:越做越复杂,不可能变简单。
二是要背上不可丢弃的历史包袱。由于Brooks强调新的软件需要保证跟旧的软件兼容(有点象MS Vista兼容MS DOS),你创生了一个软件也就创生了下一个软件的需求,所有的创生活动产生了需求的自增集合,尽管这种“变体不是必需的”,但它一个不可丢弃的历史包袱。所以在保证一致性这一方面,人狼是自增长的。
三是要接受需求的持续变更。软件要保证设计一致性才能成功,但从这个软件被设计的那一刻开始,你就必须接受来自它人的、自身的、市场的、自然及社会规律的,以及不同的文化和思想习惯的差异的需求(这意味着每个人的想法都可能被作用在一个软件实体上)。需求是无度和不可控的,所以人狼本身又是变形系的。
四是不可见。你找不到足够的抽象方法描述软件的不同侧面,也就不能将它们表达为抽象概念上的图形。如果你找到了这样的方法,那么这个“软件”本身就不足够复杂,因此也就不是原本含义上的“根本任务”。所以,它是隐形的——你如果看见了它,要么是看见了诸多复杂的方面中的一面,要么根本就是看错了。
 
从游戏术语来说,我们要面对的是“自增+自疗+变形+隐身”的终极大BOSS,而Brooks还要求:HI,小子,你得拿个足够简洁(例如小刀?)的武器去单挑(独立的解决方案?)。
如果有游戏策划写出这样的脚本,那么他得被玩家活活骂死。但Brooks描绘了这样一只“杀不死的人狼”,并开心的说“你们没有银弹”。然而,他不但没有被骂死,还得到了一致的认可,并且整个工程界欢欣雀跃,一致以找出那枚银弹为已任。
 
这样来戏谑大师的预言实在是有些不敬。那么大师是否就是在那么严谨地对待自己的观点呢?他说:必须声明的是,构建独立小型程序的数据不适用于编程系统产品。
大师的意思是:因为不能通过“做更多的小型程序”来得到做大型系统的经验/数据,所以无论何时,只要面对大型工程,你的经验值就立即归零(或者极低)。显然,(连白痴都知道)毫无经验值地直接面对终极大BOSS,结果一定是失败。又由于所有面对这些大BOSS的都(无可置疑地)失败,因此我们也就不可能有成功。
显然这是一个法宝:如果你违背这个逻辑而又获得了成功,那么这种成功可以立即被归结于:你在做一个小型程序。
放心吧,没有人能杀得死Brooks的人狼的,也不可能找得到这样的银弹。因为Brooks的人狼原本就是杀不死的,他甚至连“给睡熟的人狼胸口一刀”这样偶然性的机会也没给你留下。任何时候,你杀死了一头看起来有点象是人狼的怪物,Brooks都可以轻描淡写的说:OH,小子,你看错了,那并不是人狼。