No silver Bullet——Essence and Accidents of Software Engineering恐怕是软件工程最重要的文章之一了。它的作者Frederick P. Brooks, Jr.是IBM大型机之父,来自美国北卡罗来纳大学。
什么是silver bullet? 字面理解,“银弹”,它的背后隐藏着一个美国人都听说过的狼人故事。
狼人(werefore)是所有怪兽故事中最恐怖的角色,狼人平常看起来像是一个人,但是会在月圆之夜成为一只凶狠的狼。“They transform unexpectedly from the familiar into horrors”。在一些故事中,被狼人咬伤的人也会成为狼人。在一些电影中,silver bullet(银弹)被视作能迅速杀死狼人的武器。为什么是银弹?也许银色被视作是月亮,子弹是快狠准的武器,狼人在月圆之夜变身,那么银弹作为杀死狼人的灵丹妙药也就解释的通了。
而现在silver bullet经常被视作“解决复杂问题的良方、高招”
A simple and seemingly magical solution to a complicated problem
正如狼人,软件项目平时看起来直接,单纯,但是拉胯的计划、垃圾程序、透支的经费都很有可能使它们突然成为恶狼。我们能否能像降低硬件成本、提升硬件性能一样提升软件性能并降低软件成本?软件工程是否有银弹(silver bullet)?
也许作者认为没有银弹,There is no silver bullet!
为什么no silver bullet?
作者从亚里士多德的角度来看待软件工程的问题
To see what rate of progress one can expect in software technology, let us examine the difficulties of that technology. Following Aristotle, I divide them into essence, the difficulties inherent in the nature of software, and accidents, those difficulties that today attend its production but are not inherent
注:这里attend是伴随发生的意思
作者从通过分析软件技术的困难,来推测软件技术到底能进步得多快。技术的难点分为两类:essence,本质(困难);accidents,意外/伴随(困难)。essence是软件内在的特性带来的困难,而accidents是那些不是本质困难、却伴随着软件生产过程中的困难。
然后我们来欣赏文章的浓缩摘要:
Fashioning complex conceptual constructs is the essence; accidental tasks arise in representing the constructs in language. Past progress has so reduced the accidental tasks that future progress now depends upon addressing the essence.
摘要中第一句话fashioning和constructs是重点
什么是fashion(verb):
to make or shape sth, especially with your hands (尤指用手工)制作,使成形,塑造
什么是constructs
an idea or a belief that is based on various pieces of evidence which are not always true (根据不总是真实的各种证据得出的)构想,观念,概念
首先constructs指软件的设计构想,作者认为生成复杂的软件概念设计构想是一个创造的、艺术的过程,因此作者使用了fashion这个动词。这个动词很有灵气,因为它本意是用手工塑造,这是艺术创造的一个动作。简单地说,复杂的软件的设计概念是(软件工程)的本质。
其次的第二句话,意外伴随的任务在用语言表示软件构想的过程中出现。作者认为,设计软件的本质问题根本不是停留在各种编程语言上,在使用编程语言实现软件构想的过程中所绕的弯路(例如语法错误等等)都属于“意外伴随的任务”,这些任务并不是软件工程的本质。本质是设计软件啊!
有一个举例我很喜欢。数学家和物理学家通过简单的模型来解释复杂的现象,但是作者说软件具有内在的复杂性,软件如何通过简单的模型来解释?当我们想表示软件时,我们需要一系列又臭又长的图表来表示软件:控制流,数据流,依赖,时序,名字空间的关系等等。对于软件,我们根本找不到大一统的原则(unifying principles),精简的解释(simplified explanation)。
因此作者人为软件工程难题最难的部分应该在于“specification, design, and testing of this conceptual construct, not the labor of representing it and testing the fidelity of the representation.”详细阐述、设计、测试这个概念构想是软工的本质难点,并不是看你用语言对软件文档的完成度和准确度有多高。
最后一句话,我们过去所做的努力,都在减少意外的任务的发生;未来,我们应该着眼于解决软件工程的本质问题。
纵观全文,作者从复杂性、一致性、可变性、不可见性论述了为什么没有银弹,分析了过去所做出的努力——高级语言、分时、同一的编程环境等等都是为了解决accidental tasks所做出的努力。其他高级语言、面向对象编程、人工智能、图像编程等等手段也许可以为解决essence做出贡献。作者总结的经验:
1. Buy versus build:软件是造还是用现成的需要权衡。
2. 快速构建原型很重要
3. 增量开发软件(grow software)而不是造软件(build software)
4. 优秀的设计师和管理人员十分重要。毕竟是“fashioning complex conceptual constructs”, 哈哈。
本文内容来自于no silver bullet这篇文章并参考了牛津词典。
上一篇