1、软件工程实践者的研究方法前 言软件工程已进入到目前的第四代,它已具有许多优势,虽然它仍存在同 时代人曾经历的某些弱点,但其早年的天真和热情已被更合理的经历多年培 育的期望(以及甚至善意的嘲讽)所替代,软件工程正带着许多成就步入中 年,然而还有大量工作需要去做,今天,它已被公认为一个重要学科,值得 认真地研究、细心地学习和热烈地争论。在整个产业界,“软件工程师”已 经替代“程序员”成为更受欢迎的工作头衔。产业应用软件中已广泛而成功 地采用了软件过程模型、软件工程方法以及软件工具。管理者和实践者均认 识到,需要一个更严谨的软件方法来支持手头的工作。但是,在本书的早期版本中很多讨论的问题仍然存在,很
2、多个人和公司 仍然在随意地开发软件,很多专业人员和学生不知道现代方法,最终,我们 生产的软件仍然存在大量质量问题。此外,关于软件工程方法的真实性质的 争论仍在继续。然而,今天软件工程已成为研究的热点,人们对它的态度已 有很大变化,它的发展也很明显,但是,要使软件工程最终发展成为一个完 全成熟的学科还需做大量工作。本书的第 4 版试图成为正逐步走向成熟的软件工程学科的一个指南。和前面三版一样,第 4 版的主要读者群仍然是学生和实践者,而且在写作风格 上我们力图仍然保持前面各版的格式和风格。本书的基本目标仍然是:作为 产业界专业人员的指南以及作为高年级大学生和一年级研究生的软件工程的 全面导论。我
3、们在第 4 版中并不仅仅简单地修订了原稿,为适应本领域快速的增长 我们完全重新组织了书中的内容,并着重讨论了新的重要的软件工程方法, 还 全 面 地 修 订 了 从 早 期 版 本 保 留 的 章 节 , 加 入 了 12 章 新 内 容 , 以 提 供 对 当 代 趋势和技术的完整讨论。加入了很多新例子、思考题,每一章中还增补了推 荐阅读文献及其他信息搜索地址,包括数百个新的出版站点以及超过 160 个 WWW 信息站地。第 4 版由 5 个部分共 30 章 构 成 。 这 样 做 的 目 的 是 按 专 题 安 排 内 容 , 并 使 那些没有时间在一个学期内完成书中内容教学任务的老师,可
4、以按需取用。 第一部分:产品和过程,简介软件工程的相关语境,引出书中主要内容,并 着重介绍了以后章节用到的概念;第二部分:管理软件项目,讨论那些与计 划、管理和控制软件开发项目的人员相关的话题;第三部分:传统软件工程 方 法 , 讨 论 那 些 被 视 为 传 统 软 件 工 程 不 同 “学 派 ”的 分 析 、 设 计 和 测 试 方 法 ; 第 四 部 分 : 面 向 对 象 软 件 工 程 , 讨 论 跨 越 整 个 软 件 工 程 过 程 的 面 向 对 象 方 法 , 包括分析、设计和测试方法;第五部分:软件工程高级课题,分章专门讨论 形式化方法、 净室软件工程、 复用、 再建工程
5、、 客户/服务器软件工程和 CASE。第 4 版比以前版本更多地强调了度量和测度方面的相关技术。有三章和 软件度量相关,分别是:软件过程和项目的度量、软件的技术度量、面向对 象系统的技术度量。本书的组织使得老师可以根据时间和学生需要安排授课话题。一个学期 可选择一个或多个部分。例如,“设计课程”可能只需要第三或第四部分, “方法课程”可能只需第三、第四和第五部分的部分章节,“管理课程”可 能只需要第一和第二部分。按这种方式组织本书第 4 版,目的是给老师提供 灵活的教学选择。第 4 版的写作工作已成为我生活中持续最长的技术计划。即使当写作停 止时,从各种技术文献中提炼、组织信息的工作也一直在进
6、行,为此,我要 感 谢 许 多 书 籍 、 论 文 和 文 章 的 作 者 , 以 及 新 一 代 的 电 子 媒 体 (新闻组和 WWW) 的贡献者们,他们在过去的 15 年中给我提供了大量的信息资源、思想和评 注,很多信息资源已在每章的参考文献中列出,他们在这个快速发展的领域 中 的 贡 献 是 值 得 称 道 的 。 我 还 要 感 谢 第 4 版 的 审 阅 者 : Wayne State University 的 Frank H.Westervelt、The University of Connecticut 的 Steven A.Demurjian、California State
7、 PolytechnicUniversity 的 Chung Lee、University of Colorado 的 Alan Davis、QSM Associates 的 Michael C.Mah、 University of CaliforniaIrvine 的 Richard N.Taylor、 Virginia Tech.的 Osman Balci、 AuburnUniversity 的 James H.Cross、 Portland State University 的 Warren Harrison、NortheasternUniversity 的 Mieczyslaw M.K
8、okar,他们的评注和批评是无价的。本书第 4 版内容的成型有赖于许多曾经使用过本书以前版本的产业界专 业人员、大学教授和学生,他们花了很多时间和我通信交流他们的建议、批 评和思想,我要感谢他们中的每一位。此外,我也要向我们的在北美和欧洲的许多产业客户表示感谢,他们教 我的比我教他们的要多。Roger S.Pressman译 者 序20 世 纪 末 发 生 在 我 们 这 个 星 球 上 的 最 大 变 化 之 一 无 疑 是 席 卷 全 球 的 信息技术 (IT) 革命, 人们将这场革命视为 21 世纪知识经济时代的前奏曲。 在这场 IT 革 命 中 , 软 件 无 疑 扮 演 了 极 其
9、重 要 的 角 色 。 软 件 产 业 作 为 一 个 独 立 形态的产业,正在全球经济中占据越来越举足轻重的地位。而软件工程正是 软件产业健康发展的关键技术之一。从 1968 年软件工程概念的正式提出到现在,软件工程已有逾 30 年的发 展,出现了大量的研究成果,也进行了大量的技术实践。正是由于学术界和 产业界的共同努力,软件工程正在逐步发展为一门成熟的专业学科,以解决 软件生产的质量和效率问题为宗旨,在软件产业的发展中起到了重要的技术 保障和促进作用。本书是一本系统而全面地介绍软件工程理论、技术和实践的专著,是北 美 学 术 界 和 产 业 界 的 畅 销 书 之 一 。 本 书 作 者
10、Roger S.Pressman 是软件工程领 域国际知名的咨询专家和作者,著有多本学术专著,本书已是其第四版。本 书第二版曾在国内翻译出版,并被很多学校选为软件工程教材,在我国软件 工程研究、教学和实践中起到了很好的借鉴和参考作用。而第四版并不仅仅 是简单的修订,而是被完全重构以适应软件工程领域快速的增长并着重于新 的、重要的软件工程方法。从早期版本保留的章节被全面地修订,并加入了 12 章 新 内 容 , 以 提 供 对 当 代 趋 势 和 技 术 的 完 整 讨 论 。 书 中 还 加 入 了 很 多 新 例 子、思考题、推荐阅读文献及其它参考信息源。本书的翻译出版旨在向国内 软件工程领
11、域的研究、教学、管理和技术人员提供一个全面的参考文献、教 材或实践指南。本书由黄柏素、梅宏组织翻译,其中梅宏负责第二部分 7、8、9 章和第 三部分的翻译工作,黄柏素翻译了其余部分并负责全书的统稿工作。同时译 者希望向参与了部分章节翻译工作的李克勤、张路、袁望洪、常继传、郭立 峰、谢涛、郭耀、马黎等,以及参与了插图绘制和参考文献录入工作的徐松 青、沈璞、刘洋、孟祥文等表示诚挚的感谢。由于译者自身的知识局限及时间的仓促,译稿中难免存在错误和遗漏。 谨向读者及原书作者致以歉意,并欢迎指正。黄柏素、梅宏 黄 柏 素 ( 女 ) , 博 士 , 北 京 大 学 计 算 机 科 学 技 术 系 副 教
12、授 。 1993 年于西 北工业大学获得博士学位。同年进入北京大学计算机科学技术系博士后流动 站 。 1995 年 出 站 后 留 校 工 作 。 主 要 研 究 方 向 为 软 件 工 程 、 软 件 开 发 环 境 及 工 具、面向对象技术、用户界面管理系统等。承担了软件工程课程教学工作。目前已发表学术论文 20 余篇,并获得多项国家及部委科技成果奖和个人奖。 梅 宏 , 博 士 , 北 京 大 学 计 算 机 科 学 技 术 系 教 授 。 1992 年于上海交通大学获工学博士学位,1994 年从北京大学计算机科学技术系博士后出站。研究、 教学工作主要涉及软件工程及软件开发环境、 软件复
13、用及软件构件技术、 (分 布)对象技术、软件工业化生产技术及支持系统、新型程序设计语言等。已 在 国 内 外 学 术 刊 物 及 国 际 、 全 国 学 术 会 议 上 发 表 学 术 论 文 60 余 篇 。 并 多 次 获 得国家及部委级科技成果奖,以及其他个人荣誉奖。作 者 简 介Roger S.Pressman 是软件工程领域国际知名的咨询专家和作者。他以优 等成绩从 Connecticut 大学获得学士学位,从 Bridgeport 大学获得硕士学 位 , 从 Connecticut 大 学 获 得 工 学 博 士 学 位 。 已 有 超 过 25 年 的 产 业 经 验 。 主 要
14、从事工程产品软件和系统软件的开发技术工作和管理工作。作为产业的实践者和管理者, Pressman 博士主要从事的是航空航天应用 中高级工程和制造的 CAD/CAM 系统的开发,他也从事科学及系统程序设计方 面的工作。除了他的产业经验之外,Pressman 博士还是 Bridgeport 大学计算机工 程系的兼职副教授和该大学的计算机辅助设计和制造中心的主任。Pressman 博士是 R.S.Pressman Associates,Inc 公司的总裁,这是 一家专门从事软件工程方法和培训的咨询公司。他是公司主要的咨询专家, 专门负责帮助其他公司建立有效的软件工程方法。 他开发了 RSPA 软件工
15、程 评估方法,该方法采用独特的数量和质量分析混合的方式,帮助客户评估他 们软件工程实践的当前状况。除了给 500 多个客户提供咨询服务外,R.S.Pressman Associates, Inc 公司还提供大量的软件工程培训及过程改善服务。公司开发了一个艺术 式 的 录 像 课 程 “Essential SoftwareEngineering”, 它 全 面 地 讲 述 了 产 业 界 关 于 这 一 主 题 的 内 容 。 另 一 个 产 品 “Process Advisor”是 指 导 企 业 软 件 工 程 改进的自测系统。Pressman 博 士 还 在 产 业 期 刊 上 发 表 了
16、 许 多 技 术 论 文 , 是 企 业 期 刊 的 特 约 撰稿人并出版了 6 本 书 。 除 了 本 书 外 , 还 有 : “Making Software Engineering Happen(Prentice Hall 出版公司出版)”,这是第一本涉及到改善软件工 程实施过程中的主要管理问题的书籍;“Software Shock(DorsetHouse 出 版 公 司 出 版 ) ”, 该 书 叙 述 了 软 件 及 其 对 商 业 和 社 会 的 影 响 ; “A Managers Guide toSoftware Engineering(McGrawHill 出版公司出版)”,该
17、 书使用独特的 QA 方式表示了创立和理解技术的管理指南。Pressman 博士 是杂志 American Programmer(美国程序员)和 IEEESoftware(IEEE 软件) 的编委,是 IEEE Software 的 Manager(管理员)专栏的编辑。他还是 ACM、 IEEE、Tau Beta Pi、Phi Kappa Phi、Eta Kappa Nu 和 Pi Tau Sigma 的会 员。软 件 工 程 实 践 者 的 研 究 方 法第 一 部 分 产 品 和 过 程在本书的这一部分中我们主要讨论什么是工程产品和如何为工程技术提 出一个框架的过程。在下面的章节中,我们主
18、要解决下列问题:到底什么是计算机软件?为什么我们不断努力要建造高质量的基于计算机的系统?我们如何对计算机软件的应用领域分类?关于软件仍存在什么样的神话?什么是软件过程?是否存在一般性的方法评价一个过程的质量?软件开发中可以应用什么过程模型?线性过程和迭代过程有何区别?它们的优点和缺点是什么?在软件工程中可以建议什么更高级的过程模型? 一旦回答了这些问题,读者就能够更好地理解本书其余部分给出的工程原则的管理和技术方面的知识。第 1 章 产 品本书的第 1 版在 80 年代初出版后不久 , Business Weekly(商业周刊 ) 杂志在头版给出如下的大标题:“软件:新的驱动力”。编辑们当时并
19、没有 意识到他们的预见是多么的正确。那时,大多数人对软件还是一无所知。大 软件公司,如微软公司,还不存在;拥有 15000 平方英尺专门出售包装好的软件的计算机超市闻所未闻; 在电视上为计算机操作系统做 60 秒钟商业广告 的想法是可笑的;而互联网仅为个别研究者和高等学校学生所知。但是,在 不到 20 年的时间里,所有这些(甚至更多)已经成为现实。计算机软件已经成为一种驱动力。它是进行商业决策的引擎;它是现代 科学研究和工程问题解决的基础;它也是区分现代产品和服务的关键因素。 它在各种类型的系统中应用,如交通、医药、通讯、军事、产业化过程、娱 乐、办公难以穷举。软件在现代社会中的确是必不可少的
20、。而且当我们 进入 21 世纪 , 软件将成为从基础教育到基因工程的所有各领域新进展的驱动 器。所有这一切已经改变了软件的常见概念。计算机软件是无所不在的,人 们把软件看作是生活中现实的技术。在很多情况下,人们把他们的工作、他 们的舒适、他们的安全、他们的娱乐、他们的决策、甚至他们的整个生活都 依赖于计算机软件。软件千万可不能出错。本书介绍的若干技术是那些想要建造正确的计算机软件的人们需要用到 的 。 这 些 技 术 包 括 一 个 过 程 , 一 组 方 法 和 一 系 列 工 具 , 我 们 称 之 为 软 件 工 程 。1.1 软 件 的 发 展今天,软件担任着双重角色。它是一种产品,同
21、时又是开发和运行产品 的载体。作为一种产品,它表达了由计算机硬件体现的计算潜能。不管它是 驻 留 在 蜂 窝 电 话 中 , 还 是 操 作 在 主 机 上 , 软 件 就 是 一 个 信 息 转 换 器 产 生 、 管理、获取、修改、显示或转换信息,这些信息可以很简单,如一个单个的 位 (bit), 或 很 复 杂 , 如 多 媒 体 仿 真 信 息 。 作 为 开 发 运 行 产 品 的 载 体 , 软 件 是 计算机控制(操作系统)的基础、信息通信(网络)的基础,也是创建和控制其 他程序(软件工具和环境)的基础。许多人相信 21 世纪最重要的产品是信息,软件充分体现了这一观 点。它处理个
22、人数据(如个人的金融事务),使得这些数据在局部范围中更为 有 用 ; 它 管 理 商 业 信 息 增 强 了 商 业 竞 争 力 ; 它 提 供 了 通 往 全 球 信 息 网 络 (如 Internet)的途径;它也提供了以各种形式获取信息的手段。计算机软件的角色在 20 世纪后半叶发生了很大的变化。 硬件性能的极大 提高,计算机体系结构的不断变化,内存和硬盘容量的快速增加,以及大量 输入输出设备的多种选择,均促进了更为成熟和更为复杂的基于计算机的软 件系统的出现。如果一个系统是成功的,那么这种成熟性和复杂性能够产生 出奇迹般的结果,但是它们也给建造这些复杂系统的人员带来很多的问题。 在 7
23、0 年代和 80 年代出版的受欢迎的书对于计算机、软件和它们对我们 文化的影响等方面提供了有用的历史的视角。 OsborneOSB79称之为一次 “新 的工业革命” 。TofflerTOF80称微电子的发展是人类历史上的“第三次 浪 潮 ”, Naisbitt NAI82 则 预 言 了 从 工 业 社 会 向 “信 息 社 会 ”的 转 变 。Feigenbaum 和 McCorduckFEI83认为由计算机控制的信息和知识将是 20 世纪中表现能力的焦点,StollSTO89则提出由网络和软件产生的“电子社 会”将是全球知识交换的关键。进入 90 年 代 , Toffler TOF90 描
24、 述 了 “权 利 的 转 移 ”, 因 为 计 算 机 和 软件导致了 “知 识 的 民 主 化 ”, 因 而 旧 的 权 利 结 构 (政 府 , 教 育 , 工 业 , 经 济 , 及军事)将要瓦解。 YourdonYOU92 担 心 美 国 公 司 在 软 件 相 关 的 业 务 中 会 失 去 竞 争 力 , 并 预 言 “美 国 程 序 员 的 衰 落 和 下 降 ”。 Hammer 和 ChampyHAM93 提出信息技术将在“公司的再工程”中起到很关键的作用。在 90 年代中期, 计算机和软件的流行产生了大量 “新劳工运动” 的书籍(例如: 由 James Brook 和 Ia
25、in Boal 编辑的“抵制虚拟的生活”,以及 Stephen Talbot 写的“未来 不是计算” )。 这 些 作 者 把 计 算 机 看 成 是 魔 鬼 , 强 调 了 其 合 法 性 , 而 忽 略 了 已 被人们意识到的巨大的利益LEV95问题。在 计 算 机 发 展 的 早 期 阶 段 , 大 多 数 人 把 软 件 看 成 是 不 需 预 先 计 划 的 事 情 。 计 算 机 编 程 很 简 单 , 没 有 什 么 系 统 化 的 方 法 。 软 件 的 开 发 没 有 任 何 管 理 , 一旦计划延迟了或成本提高了,程序员才开始手忙脚乱地弥补,而他们的努 力一般情况下也会取得
26、成功。在通用的硬件已经非常普遍的时候,软件却相反,对每一类应用均需自 行再设计,应用范围很有限。软件产品还在婴儿阶段,大多数软件均是由使 用它们的人员或组织自己开发的,如你写软件,使其运行,如果它有问题, 你负责改好。工作的可变性很低,管理者必须得到保证:一旦发生了错误你 必须在那里。因为这种个人化的软件环境,设计往往仅是人们头脑中的一种 模糊想法,而文档就根本不存在。在早期,我们了解了很多关于计算机系统的实现,但对于计算机系统工 程几乎一无所知。但是公平地讲,我们应该感谢这个时期开发的许多卓越的 计算机系统,其中不少一直到今天还在使用,并继续发挥着巨大的作用。计算机系统发展的第二阶段跨越了从
27、 60 年代中期到 70 年代末期的十余 年(如图 1 1)。 多 道 程 序 设 计 、 多 用 户 系 统 引 入 了 人 机 交 互 的 新 概 念 。 交 互 技术打开了计算机应用的新世界,以及硬件和软件配合的新层次。实时系统 能够从多个源收集、分析和转换数据,从而使得进程的控制和输出的产生以 毫秒而不是分钟来进行。在线存储的发展导致了第一代数据库管理系统的出 现。第二阶段还有一个特点就是软件产品的使用和“软件作坊”的出现。软 件被开发,使得它们可以在很宽的范围中应用。主机和微机上的程序能够有 数百甚至上千的用户。来自工业界、政府和学术界的企业家们纷纷开始开发 各类软件包,并赚了大笔钱
28、财。早期 第二阶段 第三阶段 第四阶段面向批处理 多用户 分布式系统 强 大 的 桌 面 系 统有限的分布 实时 嵌入“智能” 面向对象技术自定义软件 数据库 低成本硬件 专家系统软件产品 消费者的影响 人工神经网络并行计算网络计算机随着计算机系统的增多,计算机软件库开始扩展。内部开发的项目产生了上万行的源程序,从外面购买的软件产品加上几千行新代码就可以了。这 时 , 一 团 黑 云 出 现 在 地 平 线 上 , 当 发 现 错 误 时 需 要 纠 正 所 有 这 些 程 序 (所 有 这 些源代码);当用户需求发生变化时需要修改;当硬件环境更新时需要适应。 这些活动统称为软件维护。在软件维
29、护上所花费的精力开始以惊人的速度消 耗资源。更糟糕的是,许多程序的个人化特性使得它们根本不能维护。“软件危 机”出现了。计算机系统发展的第三阶段始于 70 年代中期并跨越了整整十年。 分布式 系统多台计算机,每一台都在同时执行某些功能,并与其他计算机通讯极大地提高了计算机系统的复杂性。广域网和局域网、高带宽数字通讯 以及对“即时”数据访问需求的增加都对软件开发者提出了更高的要求。然 而,软件仍然继续应用于工业界和学术界,个人应用很少。第三阶段的主要特点是微处理器的出现和广泛应用。微处理器孕育了一 系列的智能产品从汽车到微波炉,从工业机器人到血液诊断设备但 那一个也没有个人计算机那么重要,在不到
30、十年时间里,计算机真正成为大 众化的东西。计算机系统发展的第四个阶段已经不再是着重于单台计算机和计算机程 序,而是面向计算机和软件的综合影响。由复杂的操作系统控制的强大的桌 面机,广域和局域网络,配合以先进的软件应用已成为标准。计算机体系结 构迅速地从集中的主机环境转变为分布的客户机/服务器环境。 世界范围的信 息 网 提 供 了 一 个 基 本 结 构 , 使 得 学 者 和 政 治 家 可 以 同 样 考 虑 “信息高速公路” 和 “网 际 空 间 连 通 ”的 问 题 。 事 实 上 , Internet 可以看作是能够被单个用户 访问的“软件”。软件产业在世界经济中不再是无足轻重的。由
31、产业巨子如微软做的一个 决定可能会带来成百上千亿美元的风险。随着第四阶段的进展,一些新技术 开始涌现。面向对象技术(本书第四部分)在许多领域中迅速取代了传统软件 开发方法。虽然关于“第五代”计算机的预言仍是一个未知数,但是软件开 发的“第四代技术”确实改变了软件界开发计算机程序的方式。专家系统和 人工智能软件终于从实验室里走了出来,进入了实际应用,解决了现实世界 中的大量问题。结合模糊逻辑应用的人工神经网络软件揭示了模式识别和类 似人的信息处理能力的可能性。虚拟现实和多媒体系统使得与最终用户的通 讯可以采用完全不同的方法。 “遗传算法” BEG95 则 提 供 了 可 以 驻 留 于 大 型并
32、行生物计算机上的软件的潜在可能性。但是,一系列软件相关的问题在计算机系统的整个发展过程中一直存在 着,而且这些问题还会继续恶化:1.硬件的发展一直超过软件,使得我们建造的软件难以发挥硬件的所有 潜能。2.我们建造新程序的能力远远不能满足人们对新程序的需求,同时我们 开发新程序的速度也不能满足商业和市场的要求。3.计算机的普遍使用已使得社会越来越依赖于可靠的软件。如果软件失 败,会造成巨大的经济损失,甚至有可能给人类带来灾难。4.我们一直在不断努力建造具有高可靠性和高质量的计算机软件。5.拙劣的设计和资源的缺乏使得我们难以支持和增强已有软件。 为了解决这些问题,整个产业界开始采用了软件工程实践。
33、1.1.1 产 业 的 观 点在 计 算 机 发 展 的 早 期 , 计 算 机 系 统 是 采 用 面 向 硬 件 的 管 理 方 法 来 开 发 的。项目管理者着重于硬件,因为它是系统开发中最大的预算项。为了控制 硬件成本,管理者建立了规范的控制和技术的标准。他们要求在真正开始建 造系统之前,进行详尽的分析和设计,他们度量过程,以发现哪里还可以进 一步改进,他们坚持质量控制和质量保证,他们设立规程,以管理变化。简 言之,他们应用了控制、方法和工具,我们可以称之为硬件工程。但遗憾的 是软件只不过是事后才考虑的事情。在早期,程序设计被看作是一门“艺术”。几乎没有规范化的方法,也 没有人使用它们
34、。程序员往往从试验和错误中积累经验。建造计算机软件的 专业性和挑战性,使其披上了一种神密的面纱,管理者们很难了解它。软件 世界真是完全无序这是一个开发者的为所欲为的时代。今天,计算机系统开发成本的分配发生了戏剧性的变化。软件,而不是 硬件,是最大的成本项。在近二十年里,管理者和很多开发人员在不断地问 以下的问题:为什么需要那么长时间才能结束开发?为什么成本如此之高?为什么我们不能在把软件交给客户之前就发现所有的错误?为什么在软件开发过程中我们难以度量其进展? 这些问题以及其他许多问题都表明了对软件及其开发的方式是必须关注了这种关注最终导致了软件工程实践的出现。1.1.2 老 化 的 软 件 工
35、 厂在 50 和 60 年代, 许多评论家批评美国的钢铁产业缺少对其工厂的投入。 工 厂 开 始 恶 化 , 现 代 化 的 方 法 很 少 被 采 纳 , 最 终 产 品 的 质 量 和 成 本 难 以 容 忍 , 外来的竞争开始赢得市场份额。这些企业在管理中确定把主要的投资投入到 其主营业务中,以保持竞争力。随着时间的推移,美国的钢铁产业蒙受了巨 大损失,大量市场份额被外来竞争者占领这些企业拥有新工厂,采用更 为现代化的技术,并且得到政府的资助,使得他们极具价格优势。在那个时期,羽翼未丰的计算机产业中的很多人都以蔑视的态度评价钢 铁产业,“如果它们不愿在自己的业务上投入,那当然会失去市场份
36、额”。 这些话现在轮到说我们自己了。听上去很戏剧化,今天的软件产业就像五、六十年代的钢铁产业,无论 大公司还是小公司,都有一个老化的“软件工厂”有成千上万的重要的 基于软件的应用程序急待更新: 20 年前开发的信息系统应用程序经过了几十次的修改,已经真正不 可维护了。即使是最小的修改也会引起整个系统失败。一 些 用 于 生 成 关 键 设 计 数 据 的 工 程 应 用 程 序 , 由 于 不 断 的 修 改 和 老 化 , 已经没有人真正了解其内部结构。嵌 入 式 系 统 (有 成 千 上 万 的 这 类 应 用 程 序 , 其 中 包 括 核 电 站 控 制 、 航 空 调度和工厂管理)表
37、现出奇怪的有时甚至是无法解释的行为, 但又不能不用它们,因为目前还没有其他方法可以替代它们。 有问题就“打补丁”,并给这些应用程序一个时髦的界面,仅仅如此是不够的。软件工厂的许多构件需要再生产,否则它们就不再具有竞争力了。 但不幸的是,许多企业的管理者并不愿投入资源去进行再生产,他们辩解: “这些应用程序仍能工作,投入资源去使得它们更好是不经济的”。1.1.3 软 件 的 竞 争许多年来,大、小公司雇佣的软件开发人员仅仅在公司内部服务,而且 他们也愿意这样。因为每一个计算机程序都是自行开发的,这些“自家”的 软件人员控制着成本、进度和质量。今天,所有这一切都改变了。软件目前是一个竞争很强的行业
38、。曾经要自行开发的软件现在可以在货 架上买到,许多公司过去雇佣了大量的程序员开发特定的软件,现在它们大 部分的软件工作已交给第三方厂商去完成MIN95。成本、进度和质量将是未来若干年中导致软件激烈竞争的主要因素。美 国 和 西 欧 有 很 成 熟 的 软 件 产 业 , 而 远 东 (如 韩 国 , 新 加 坡 )、 亚 洲 (如 印 度 、 中 国)和东欧的一些国家拥有大量的有天份、 受过良好教育且相对较低廉的专门 人才ECO94。这种压力导致了必须迅速采用现代化的软件工程实践的需要, 同时软件开发也是一个必须认真考虑的因素,因为世界范围的软件从业人员 都在追求尽量少的开发费用。在 关 于
39、信 息 服 务 对 美 国 及 世 界 的 影 响 的 论 著 中 , Feigenbaum 和McCorduckFEI83作了如下陈述:知识就是力量,而计算机是这种力量的倍增器美国的计算机产业是 创新的、充满活力的和成功的。在某种程度上,它是一个理想的产业。它通 过转化知识分子的脑力劳动来产生价值,而几乎不需要什么能源和原材料。 今天,我们在这个最重要的现代技术上领导着世界的想法和市场,但明天会 怎样哪?是的,明天会怎样哪?计算机硬件已经成为一种商品,可从很多渠道得 到。但软件仍然是美国保持着“创新的、充满活力的和成功的”一个产业。 但我们还会继续保持领先吗?至少答案的一部分就在这里:我们将
40、采用什么 样的方法去建造下一代计算机系统的软件。1.2 软 件在 1970 年 , 只 有 不 到 1的人能够比较准确地描述出什么是 “计算机软 件”。而现在,大多数专业人士和许多业外公众都认为他们了解了什么是软 件。但他们真的了解吗?关 于 软 件 , 教 科 书 上 一 般 是 如 下 定 义 的 : 软 件 是 (1)能 够 完 成 预 定 功 能 和 性能的可执行的指令(计算机程序); (2)使得程序能够适当地操作信息的数据 结构; (3)描 述 程 序 的 操 作 和 使 用 的 文 档 。 毫 无 疑 问 , 也 可 以 给 出 其 他 更 详 细 的定义。但我们不只是需要一个形式
41、上的定义。1.2.1 软 件 特 征要理解软件的含义(以及对软件工程有一个全面的理解),首先要了解软 件 的 特 征 是 很 重 要 的 , 据 此 能 够 明 白 软 件 与 人 类 建 造 的 其 他 事 物 之 间 的 区 别。当建造硬件时,人的创造性的过程(分析、设计、建造、测试)能够完全 转换成物理的形式。如果我们建造一个新的计算机,初始的草图、正式的设 计图纸和面板的原型一步步演化成为一个物理的产品(VLSI 芯片、线路板、 电源等等)。而软件是逻辑的而不是物理的产品。因此,软件具有与硬件完全不同的 特征:1.软件是由开发或工程化而形成的,而不是传统意义上的制造产生的。 虽然在软件
42、开发和硬件制造之间有一些相似之处,但两者本质上是不同 的。这两者,都可以通过良好的设计获得高质量,但硬件在制造过程中可能 会引入质量问题,这种情况对于软件而言几乎不存在 (或是很容易改正)。软 件成为产品之后,其制造只是简单的拷贝而已;两者都依赖于人,但参与的 人 和 完 成 的 工 作 之 间 的 关 系 不 同 ; 两 者 都 是 建 造 一 个 产 品 , 但 方 法 不 同 (见 第3 章)。软件成本集中于开发上,这意味着软件项目不能象硬件制造项目那样来 管理。在 80 年代中期, “软 件 工 厂 ”的 概 念 被 正 式 引 入 MAN84 、 YAJ84 。 应该注意到这个术语并
43、没有把硬件制造和软件开发认为是等价的。而是通过 软件工厂这个概念提出了软件开发中应该使用自动化工具(见第 5 部分)。2.软件不会“磨损”。图 12 刻 划 了 随 着 时 间 的 改 变 硬 件 故 障 率 的 变 化 曲 线 图 。 其 关 系 , 常 常 被称作 “浴缸曲线” , 表 明 了 硬 件 在 其 生 命 初 期 有 较 高 的 故 障 率 (这些故障主 要 是 由 于 设 计 或 制 造 的 缺 陷 ); 这 些 缺 陷 修 正 之 后 , 故 障 率 在 一 段 时 间 中 会 降 到一个稳定的曲线上(很低)。随着时间的改变,故障率又提升了,这是因为 硬件构件由于种种原因会
44、不断受到损害,例如灰尘、振动、滥用、温度的急 剧变化以及其他许多环境问题。简单讲,硬件已经开始磨损了。软件并不受到这些引起硬件磨损的环境因素的影响。因此,理论上讲, 软件的故障率曲线呈现出如图 13 所示的形式。 隐藏的错误会引起程序在其 生命初期具有较高的故障率。 但这些错误改正之后(我们假设理想情况下改正 过程中并不引入其他错误),曲线就趋于平稳,如图所示。图 13 给出了实 际软件故障模型的一个总的简化图(第 8 章将给出更多信息)。其意义很清楚软件不会磨损,不过它会退化。这 个 说 法 表 面 上 似 乎 是 矛 盾 的 , 我 们 可 以 通 过 图 14 来 解 释 清 楚 。 在
45、 其 生 命 期 中 , 软 件 会 经 历 修 改 (维 护 ), 随 着 这 些 修 改 , 有 可 能 会 引 入 新 的 错 误 , 使得故障率曲线呈现为图 14 所示的锯齿形。 在该曲线能够恢复到原来的稳 定状态的故障率之前,又需要新的修改,又引起一个新的锯齿。慢慢地,最 小故障率就开始提高了软件的退化由于修改而发生了。关于磨损的另一个侧面也表明了硬件和软件之间的不同。当一个硬件构 件磨损时,可以用另外一个备用零件替换它,但对于软件就没有备用零件可 以替换了。每一个软件故障都表明了设计或是将设计转换成机器可执行代码的过程中存在错误。因此,软件维护要比硬件维护复杂得多。 3.大多数软件
46、是自定的,而不是通过已有的构件组装而来的。 我们先看一看一个基于微处理器的控制硬件是如何设计和建造出来的。设计工程师画一个简单的数字电路图,做一些基本的分析以保证可以实现预 定的功能, 然后查阅所需的数字零件的目录。 每一个集成电路(通常称为 “IC” 或 “芯片” )都 有 一 个 零 件 编 号 、 固 定 的 功 能 、 定 义 好 的 接 口 和 一 组 标 准 的 集 成指南。每一个选定的零件,都可以在货架上买到。而软件设计者就没有上述这种荣幸了。几乎没有软件构件。有可能在货 架上买到的软件,它本身就是一个完整的软件,而不能作为构件再组装成新 的程序 。 虽 然 关 于 “软 件 复
47、 用 ”已 有 大 量 论 著 , 但 这 种 概 念 的 成 功 实 现 还 只 是刚刚开始。1.2.2 软 件 构 件随着工程化的发展,大量标准的设计构件产生了。标准螺丝和货架上的 集成电路芯片仅仅是成千上万的标准构件中的两种,机械和电子工程师在设 计新系统时会用到它们。这些可复用构件的使用使得工程师们能够集中精力 于设计中真正有创造性的部分(如设计中那些新的成分)。在硬件中,构件复 用 是 工 程 化 的 必 然 结 果 。 而 在 软 件 中 , 它 还 仅 仅 是 在 小 范 围 内 取 得 一 定 应 用 。可复用性(Reusability)是高质量软件构件的一个重要特征(第 26
48、 章将 给出更详细的讨论), 一个软件构件应该被设计和实现为能够在多个不同程序 中 复 用 。 在 60 年 代 , 我 们 建 造 了 科 学 计 算 子 程 序 库 , 它 们 能 够 在 很 多 工 程 和 科学应用中复用,这些子程序库可以以一种高效的方式复用,定义明确的算 法,但其应用范围有限。今天,我们已经扩展了复用的概念,不仅是算法, 还可以是数据结构。现代的可复用构件包含了数据以及应用这些数据的处理 过 程 , 使 得 软 件 工 程 师 能 够 从 已 有 可 复 用 构 件 中 创 建 新 的 应 用 。 例 如 , 现 在 交互界面都是通过可复用构件建造的,你可以使用它们创
49、建图形窗口、下拉 式菜单和各种交互机制。建造用户界面所需的数据结构和处理细节均包含在 一个可复用的界面建造构件库中。软件构件使用某种程序设计语言实现,该语言具有一个有限的词汇表、 一个明确定义的文法及语法和语义规则。在最底层,该语言直接反映了硬件 的指令集;在中层,程序设计语言,如 Ada 95、C 或 Smalltalk 可用于创建 程序的过程化描述;在最高层,该语言可使用图形化的图标或其他符号去表 示关于需求的解决方案。由于可执行代码就自动生成了。机器级语言是 CPU 指令集的一个符号表示。当一个好的软件开发者在开 发一个可维护、文档齐全的程序时,使用机器语言能够很高效地利用内存并 优化该程序的执行速度。当程序设计得很差且没有文档时,机器语言就是一 场恶梦。中层语言使得软件开发者和程序可独立于机器。如果使用了很好的翻译 器 , 一 个 中 层 语 言 的 词 汇 表 、 文 法 、 语 法 和 语 义 都 能 够 比 机 器 语 言 高 级 得 多 。 这种状况目前正在迅速改变。面向对象技术的广泛使用已导致了软件构件的生产,本书第 19 至 2