软体尚方宝剑(Silver Bullet)何在?──Fred Brooks和Brad Cox的不同观点

欧阳进(台湾)

本文最初刊登于高焕堂主编的《物件导向杂志》,经允许转载于UMLChina发行的《非程序员》2002年12期

前言

二十年来﹐人们一直寻找解决软体危机的方法﹐包括结构化、人工智慧、物件导向等方法﹔但软体大师Fred Brooks在1986年发表的文章里预言在10年内找不到解决软体危机的尚方宝剑﹐历经了十年﹐果然不幸被他言中。1995年里﹐Brooks与Cox两位大师分别再深思软体尚方宝剑﹐Brooks仍持怀疑态度﹐而Cox则相当乐观。

编注2020:Brad Cox与Tom Love一起创造了Objective-C。

brookscox.png

本文以时间的前后﹐依序交叉介绍两位大师的见解﹐期能引起读者对软体未来的些微兴趣。由于笔者的学养和功力远不如两位大师﹐只能介绍他们文章里的精华﹐并未添加笔者的阐释或见解以免您受到笔者有限能力的误导或局限您的思想和视野。希望您有空细读两位大师的原文著作﹐培养您自己的思维和创意。

介绍

二十年前(1975)﹐IBM大型电脑之父──Fred Brooks出版一本书﹕"The Mythical Man-Month"。

收集了他在1960年代领导1000多人共同发展OS/360大型软体系统的心得和经验。从实际经验中﹐他体会到开发大型软体过程中﹐难以汇集参与人员的设计理念然后提供给使用者一致的设计概念(conceptual integrity)﹐因而导致软体的高度复杂性﹐使得大型软体系统往往会进度落后、成本暴涨及错误百出﹐就是所谓的软体危机(software crisis)。

经过了10年(1986)﹐Brooks发表了一篇著名的论文──"No Silver Bullet: Essence and Accidents of Software Engineering"

他断言﹕

「在10年内无法找到解决软体危机的尚方宝剑(银弹)」(There will be no silver bullet within ten years)。

这文章激起许多软体专家的讨论与争辩﹐而"No Silver Bullet"也成为脍炙人口的名词。Brooks认为软体专家所找到的各种方法皆舍本逐末﹐解决不了软体的根本困难──即概念性结构(conceptual structure)的复杂﹐无法达到概念的一致性﹐软体自然不亲切不好用﹗

到了1990年﹐曾首先提出"Software IC"名词的OO大师──Brad Cox针对Brooks的观点而发表了一篇重要文章──"There Is a Silver Bullet"

说明他找到了尚方宝剑──即有些经济上的有利诱因会促使人类社会中的文化改变(culture change)﹐人们会乐于去制造类似硬体晶片(IC)般的软体组件(software component)﹐将组件内的复杂结构包装得完美﹐使得组件简单易用﹐由这些组件整合而成的大型软体﹐自然简单易用﹔软体危机于焉化解了。

在1995年初﹐Brooks的上述名著第二版出炉了﹐书中含有一篇关于尚方宝剑的新文章──"No Silver Bullet Refired"。文章里﹐Brooks赞扬Cox的文章﹐但他认为Cox误解了他的本意。

同样在这一章节中,Brooks提出了“在等待时,实现人员应该做什么?”的问题。他认为“首先,必须设定良好定义的时间和空间目标,……同时,在物理实现的级别,也有很多可以着手的工作。”实际项目中,早期的投入往往人员较少,一般15人月左右的项目,初期就2~3人,这其中包括了需求分析、设计人员,以及主程序员。主程序员会对系统有初步的了解,对系统开发采用的技术、工具、开发技巧进行研究,同时同PM一同负责搭建软件工程环境和软件开发的环境。这样的安排,出现的一个问题是编程人员与分析设计人员的沟通。它需要大家通畅、自由的交流,经可能对开发达成共识,减少信息的丢失。

尽管历经了十年﹐软体开发方法也有所进展﹐但Brooks仍然认为尚方宝剑仍未出现﹔大型软体系统的开发工作仍然困难重重﹐只能渐进地改善﹐不要奢望短期内会出现尚方宝剑﹐一举解决软体的困境。

在1995年底﹐Brad Cox发表了新文章──"No Silver Bullet Reconsidered"。这文章里﹐Cox更深刻探讨文化和思维变迁(paradigm shift)的话因与效果﹐从人类文化的观点阐释软体危机的原因﹐而得到乐观的结论──软体的尚方宝剑是可能的。

过去10年﹐Brooks的预测是千真万确的﹐果真软体的困境不但未解决﹐反而更加严重。那么下个十年又会如何呢﹖有趣的是﹐大家来欣赏一下两位大师的深思灼见﹐然后再看看您个人的见解﹐也许会激励出许多新创见也说不定﹐不是吗?

1975

Brooks在"The Mythical Man-Month"书中之看法

该书是论文集﹐其中有一篇文章叫"The Mythical Man-Month"﹐他就以此作为书名。在1956~1965之间﹐Brooks实际领导IBM 360大型电脑的开发计划﹐包括硬体结构及庞大的OS/360作业系统在内﹐因之他具有「IBM大型电脑之父」之尊称。由于OS/360是多达1000位程式师共同合作的大型软体开发工作﹐让他深刻了解到大型软体开发的技术和管理上所面临的种种困难和挑战。于是﹐他就将其领导开发OS/360软体系统的经验心得收集在这本书里。

人们常拿Man-Month(多少人﹐做多少个月)来计算软体的工作量﹐但是Brooks发现软体的开发工作是需要人与人之间密切沟通的﹐使得设计工作不易分割﹐所以Man-Month为单位的计算方法是有问题的(mythical)。也就得出著名的Brooks法则──

「对于进度已落后的软体开发计划而言﹐若再增加人力﹐只会让其更加落后。」(Adding manpower to a late software project makes it later)

这是该书名称的涵义。

Brooks从经验中深深感觉到参与人员之间的概念一致性(conceptual integrity)是软体设计中最重要的一环(conceptual integrity is the most important consideration in system design) 。一旦软体师们有一致的设计概念﹐其所共同创造出来的软体才有可能达到简单(simplicity)及好用(straightforward)之效果。

为了达到这效果﹐Brooks主张应注重软体的主架构(architecture)﹐并将它与实施细节(implementation)分开来。所谓主架构﹐就是﹕对使用者介面之完整而详细之叙述(the complete and detailed specification of the user interface)。主架构汇集各软体师的不同思绪﹐融合成为一致的概念﹐然后呈现给使用者﹐让使用者感觉软体是源自于单一的设计理念(single philosophy)﹐而不是基于庞杂无序的众多思绪。将主架构与施行细节分开来﹐是让大型软体计划获得一致性概念的有力途径(separation of architectureal effort from implementation is a very powerful way of getting conceptual integration on very large projects)。

1987

Brooks在"No Silver Bullet"文章中的看法

自从"The Mythical Man-Month"一书上市以来﹐历经了十年﹐尽管软体专家们努力研究新方法来解决软体的困难﹔但是Brooks认为这些方法﹐包括高阶语言、OOP、AI等皆舍本逐末﹐只解决了一些概念的表达(representation)技巧而已﹐并无法解决根本性的概念结构(conceptual structure)问题。在"No Silver Bullet"文中﹐他藉亚里斯多德(Aristotle)的用词而将软体之困难分为两种﹕

●Essence──此为概念上(conceptual)的根本困难。

●Accidents──此为将概念转换为电脑表示法时﹐在表达(representation)上之困难。

例如﹐OOP上的抽象资料型态(即类别)观念﹐只是改进了设计的表示方式而已﹐所以抽象时只去除掉表达性(accidents)的复杂和困难﹐但并未去除掉任何根本性的复杂。

由于没办法解决这种根本性的困难﹐使得原本单纯可爱的软体﹐逐渐演变为进度落后、成本暴涨、错误丛生等﹐像恶梦中的狼群般蜂踊而至﹐于是哀号而希望有种「银弹」(silver bullet又译为尚方宝剑)能即刻平息牠们。然而Brooks认为:

「不仅眼前找不到尚方宝剑﹐由于软体的本质使然﹐未来也不太可能找得到。」(Not only are there no silver bullets now in view, the very nature of software makes it unlikely that there will be any)

Brooks列出的根本性困难包括﹕

*复杂性(complexity)──「复杂」是软体的根本特性﹐可能来自于程式师之间的沟通不良﹐而产生结构错误或时间延误﹔也可能因为人们无法完全掌握程式的各种可能状态﹔也可能来自新增功能时而引发的副作用等等。

*一致性(conformity)──大型软体开发中﹐各小系统之介面常会不一致﹐而且易于因时间和环境的演变而更加不一致。

*易变性(changability)──软体的所处环境常是由人群、法律、硬体设备及应用领域等各因素融合而成的文化环境﹐这些因素皆会快速变化。

*不可见性(invisibility)──软体是看不见的﹐既使利用图示方法﹐也无法充分表现其结构﹐使得人们心智上的沟通面临极大的困难。

这些是软体的本性﹐Brooks认为没有捷径可解决之(there is no royal road)。但可以渐进式地改善之。他认为可行的方案有﹕

*买来装配(buy and build)──软体的建造尽量使用现有零组件﹐不要一切都从头做起。

*快速雏型(rapid prototyping)──使用重复式的开发方法(iterative development)来渐进地改善软体的雏型﹐裨逐步厘清使用者需求。

*有机成长(growing organically)──有生命的东西皆是由小慢慢长大的﹐建造大型软体的方法应该是逐渐成长﹐而不是一次建造完成。

*优秀设计者(great designer)──人是软体设计的核心﹐良好的方法可改善人的创造过程﹐但无法激励人的原本创造力﹐须藉重有创意的人。

1990

Cox在"There Is a Silver Bullet"文章中的看法

And in "No Silver Bullet: Essence and Accidents of Software Engineering," he(Brooks) argues that the difficulties are inevitable, arising from software's inescapable essence--not from accident, but from some deficiency in how programmers build software today.

(在"NSB"文中﹐Brooks声称这些软体的困难是无法避免的﹐是源自软体上无法逃避的根本质──亦即不是来自一些旁技细节﹐而是今日程式师设计软体时缺点)

接着﹐Cox针对Brooks所提的软体困境所在﹐Cox从新的观点来阐释之﹐而得到乐观的结论。

Cox认为软体危机是必然会面临的(irresistible)的困境﹐但并非是无法克服(immovable)的。当全球经济进入资讯时代﹐市场对资讯殷切需求而产生的经济诱因(economic incentive)﹐将促成人们社会中的文化改变(cultural change)。加上目前遭遇的软体困境﹕成本过高、品质不良、以及人们无力去改善它们。使得人们对软体的看法和思维产生巨大的变迁(paradigm shift)﹐从过去一行一行撰写指令的土法炼钢方法转而尝试去建立可重复使用的标准组件(standard component)以及组件交易市场(market)。在这种新环境中﹐软体的价值体系(value system)、权力结构(power structure)、以及软体师与消费者关系重新定位﹔彻底从过去重视程式的撰写过程(process)转而重视组件价值、拥有、及买卖系统等基本文化要素、而导致软体产业的革命(software industry revolution)。

软体组件类似于硬体的晶片(IC)一般﹐把组件的复杂封装起来﹐对使用者而言﹐调组件再也不复杂了。因之﹐建立软体晶片市场﹐让人们不再受困于组件内程式撰写的复杂﹐而专注在组件本身的使用、价值和买卖上﹐软体的复杂和困难就自然烟消云散了。

因之﹐文化和思维的变迁将是一把尚方宝剑﹐能克服软体的困境﹔而且这种变迁是即将来临的﹐并非海市蜃楼!

1995

Brooks在"No Silver Bullet" Refired文章里的看法

自从1987年Brooks发表"No Silver Bullet"一文之后﹐激发了许多人对到底有没有尚方宝剑的讨论与争辩﹐例如前述的Cox之"There Is a Silver Bullet"文章﹐以及Harel的"Biting the silver bullet"文章等等。

Brooks在理解各方的反应﹐以及检验当今各种软体设计方法之后﹐他仍认为尚方宝剑尚未出现(the magic solutions are not just around the corner) 。

Brooks赞扬Cox的"There Is a Silver Bullet"文章是一篇极佳的文章﹐可是他认为Cox误会了他的本意﹐误解之处有二﹕

1、如上节所述﹐Cox在文章中写道﹕

"...but from some deficiency in how programmers build software today."

Cox把根本性困难解释为软体建造方法上的缺失﹐事实上Brooks所谓的根本性困难是指软体上概念性的复杂所导致的﹐无论使用什么方法﹐无论在任何时刻﹐皆必然呈现的软体固有特性。

2、如上节所述﹐Cox在文章中写道﹕

"...Brooks argues that the difficulties are inevitable..."

事实上﹐Brooks认为他自己只是持怀疑之态度﹐并非认为尚方宝剑是完全没希望的。例如﹐Brooks认为软体系统的复杂是可分层次(level)的﹐若软体下层的小组件(object)组成上层的大组件﹐再由大组件组成更大之组件﹐层次分明地组织起来﹐则复杂度就可以减低了。还有﹐当软体由小而大渐进地有机成长时﹐虽然复杂有系统地增加﹐但可确保软体的正确性。导致这种困难的原因仍可藉渐进式地改善或去除﹐只是没有捷径罢了。

Brooks认为OO是个有希望的途径﹐但由于牵涉到人们思维方式的转换﹐使得企业组织必须先投下资金(front-loaded cost)﹐才能逐渐回收其利益(down-stream benefits)﹐因而OO的进展会是慢如蜗牛。既使它可解决软体危机﹐也不会是在眼前。

1995年底

Cox在"No Silver Bullet" Reconsidered文章中的看法

Cox认为Brooks所谓的根本(essential)困难──complexity、conformity、changability及invisibility──并非最根本﹐而是由一个隐藏在深处的病因(cause)所造成的症状(symptoms)罢了。这个病因就是:

目前文化中缺乏有利的诱因来鼓励企业公司生产、买卖软体的组件(component)以及更少的子子孙孙组件(subcomponent)。

如果买卖各层组件者皆有利可图﹐自然会想尽办法将组件封装得简单易用﹐则Brooks所指的软体困难自然消失了。

Cox觉得Brooks的观点是以技术为核心(technocentric)﹐而他的观点则是以人为核心(human-centric)。由于观点的差异﹐对软体危机的阐释自然会获得不同的结论。他的结论是﹕尚方宝剑是可能的﹐只是这把剑是软体思维的变迁(paradigm shift)﹐而不是技术(technology)。

想一想﹐造铅笔的公司卖掉了一支铅笔﹐就少了一支铅笔﹐亦即少了这铅笔的各小组件﹐如铅笔擦、笔心等。为了要再造另一支铅笔﹐就得付费去购买铅笔擦和笔心﹐使得制造笔心等小组件之企业公司也有利可图。因之﹐铅笔到铅笔擦、笔心等制造者皆会用心去把组件包装好﹐使其简单易用﹗

但是﹐在软体中﹐制造试算表软体的公司﹐卖出一套试算表软体﹐只是个拷贝动作﹐并不会少掉一个位元﹔不必再向小组件的制造者购买﹐使得小组件制造者无利可分﹐自然无法进行生产、包装和买卖了﹔这是目前软体业的困境。

在未来新文化之中﹐使用者(end user)每使用一次某物件(object)﹐就必须付一次费用给这物件的生产者﹐而这生产者则必须付一次费用给其内部各次物件(subobject)的生产者﹐依此类推到最小的组件为止。在此环境中﹐各层次物件之复杂结构皆封装得完义无缺﹐使得各层物件皆简单好用﹐软体的复杂与困难就迎刃而解了。

结论

在前言中已提到﹐本文只是介绍Brooks与Cox的文章精华﹐笔者因能力所限而不做推论﹐当然不会有结论﹐盼您在细读过这两位大师的原文后﹐才做出您自己的结论。如果您愿意﹐也盼您有所结论时﹐能与笔者分享﹐自当感激不尽﹗再会了。

[参考资料]

[1] Brooks, Frederick. The Mythical Man-Month. Reading, MA:Addison-Wesley, 1975.

[2] Brooks, Frederick. "No Wilver Bullet:Essence and Accidents of Software Engineering," IEEE Computer(April 1987"), PP.10-19.

[3] Brooks, Frederick. The Mythical Man-Month, the 20th anniversary edition. Reading, MA:Addison-Wesley, 1995.

[4] Cox, Brad. Object-Oriented Programming:An Evolutionary Approach, Reading,MA:Addison-Wesley.

[5] Cox, Brad. "There Is a Silver Bullet." Byte(October 1990), PP. 209-218.

[6] Cox, Brad. Superdistribution "Objects as Property on the Electonic Frontier. Reading, MA:Addison-Wesley, 1995.

[7] Cox, Brad. "'No Silver Bullet'" Reconsidered," American Programmer (Novermber 1995), PP.2-8.

[8] Harel, D. "Biting the silver bullet:Toward a brighter future for system development," IEEE Computer(January 1992), PP.8-20.

Fred Brooks

Fred Brooks在1956-1965之间领导IBM System/360大型电脑的开发计划﹐建立了IBM在商业电脑市场上的盟主地位。目前任教于University of North Carolina at Chapel Hill.

1975年他出版的"The Mythical Man-Month"一书﹐是软体设计方面的经典名著。历经20年﹐该书第二版终于在1995年上市﹐一出炉就发行250000册。1986年﹐他发表了重要文章──"No Silver Bullet"﹐激起众多人士对软体危机与奇迹的好奇与争论﹐一直持续到今天。

Brad Cox

Brad Cox 是著名的 OO 大师﹐他的重要著作──“Object-Oriented Programming: An Evolutionary Approach"

家喻户晓的「软体 IC」一词就是来自他的著作。他是Objective-C语言的创造人;目前任教于George Mason大学。他最近出版一本新书--“Superdistribution: Objects as Property on the Electonic Frontier”

探讨在朝向全球性资讯密集产业过程中所面临的各种问题和困难。Cox相信化解软体危机的尚方宝剑是文化的改变﹐即人类思维模式的变迁(paradigm shift)﹐而不是技术(technology)。

weixinpanjiayu2.jpg