当前位置: 首页 > 工具软件 > Essence > 使用案例 >

No Silver Bullet: Essence and Accidents of Software | 没有银弹:软件开发中的主要问题和次要问题

景志
2023-12-01

本文系软件工程中著名的一篇论文:No Silver Bullet: Essence and Accidents of Software 1
@Author:Frederick P. Brooks, Jr.,百度百科Wikipedia
@Publish Date:April 1987
@Journal:IEEE Computer

1. 银弹(Silver Bullet)

在西方传说中,有狼人的存在,而杀死狼人的只能是银弹。

作者想要表明的是,软件工程因为没有计划、预算爆炸以及产品缺陷成为了类似狼人的存在,我们想要一种类似银弹的东西,这可以使得软件成本像计算机硬件成本一样快速下降。

但是实际上从此(1987年)向后展望十年,是没有银弹的,即没有一种单独的技术或管理的进步可以保证
在生产率、可靠性、简单性上有一个数量级的改善。作者想要的是十年增长10倍生产效率,但是这无法实现。作者承认这些年会有进步,但是不大(没有达到数量级)就是了。

2. 本质性难题(Essence)

软件工程本质使得其成本不能像计算机一样快速下降,我们不能期望两年两倍收益(计算机硬件满足摩尔定律:计算机硬件每两年CPU芯片上集成度翻一番,性能翻一倍。2)。

当然了,不是软件进展太慢,而是计算机硬件发展太快了。人类文明史上没有一种技术能够在30年内在性能和价格上获得6个数量级的提升。没有其它一种技术可以同时提高性能和降低价格,这是因为电脑制造从组装做业走向了流水线作业。

然而,因为其本质性难题,软件工程不可能做到计算机那样。所谓的其本质难题主要是:

  • 复杂性:软件工程是解决问题的步骤的抽象,在软件中增加元素不是简单的线性增加,而且软件中状态众多,元素之间交互也不是线性的。
  • 配合性:软件接口,因人而异。尤其是其它非本软件所作接口,导致重构软件难以一致。
  • 可变性:软件常常需要根据人群、法规、硬件环境、应用领域等改变。
  • 隐匿性:尚未完成的软件是不可见的,也无法具象化,没法用图表准确表述。

3. 过去突破解决了附属性难题(Accident)

过去的几年里,通过努力基本解决了非本质性难题。

  • 高级编程语言:消除了程序所有非内生性复杂性,但是也带来了工具(非语言本身)负担。
  • 分时性:主要是缩短系统响应时间。但是比100ms还小时人们通常注意不到了。
  • 开发环境统一:完整的函数库、统一的文件格式、管道和过滤器,促成软件共用。

4. 对于银弹的期待

  • Ada和其它高级编程语言:Ada的理念比其自身更加先进:模块化(Modularity)、抽象数据类型(Abstract Data Type)、层次式结构(Hierarchy Structure)
  • 面向对象语言:如上,解决了附属性难题,而非本质性难题。
  • 人工智能:像人一样解决问题;或者通过启发式(Heuristic)算法或基于规则编程。
  • 专家系统:人工智能当时的发展成果【可惜了,我上学太晚了,如果是2000年上大学,那么信息管理与信息系统还挺不错的】。
  • 自动化程序设计相比于解决问题本身,解决问题的方法更应该具有规范。
  • 图形化编程:用图形化的方式进行软件设计(所见即所得呗)。但是流程图并不能很好的表达软件结构,而且电脑屏幕有限,不能展现所有的软件逻辑。
  • 程序验证:测试程序,调试bug。系统设计阶段消除bug好像不太可能(因为这是程序员写出来的额)。
  • 工具和环境:IDE保证的是程序没有语法或者语义错误,但是对于程序本身逻辑的正确性,即是否能够解决问题并不知道。
  • 工作站:加快计算机的速度,也只是提高了编程效率。

5. 从概念设计上看起来具有前途的方法3

  • 买还是构建:作者希望的是买,因为专业,也能降低开发成本。额,“造不如买,买不如租”,国内经过上次中美贸易战和中兴事件,估计。。。
  • 精炼需求和快速原型:这是对于真的要开发而不是买的人来说,作者推崇快速原型方法,现有一个能跑的软件,然后再逐步求精,添加功能。这是一种增量开发。
  • 伟大的设计者:好的设计者和好的管理者一样,都很稀少。好的设计可以传授下去,可以通过学习得到, 但是伟大的设计则是因为伟大的设计师。

参考


  1. No Silver Bullet: Essence and Accidents of Software ↩︎

  2. Moore’s Law ↩︎

  3. 软件工程没有银弹 ↩︎

 类似资料: