第 1 章 概 述
随着计算机系统的发展,计算机的应用日益广泛,计算机软件的开发、维护工作显
得越来越重要。如何才能开发出用户满意的软件;如何以较低的成本开发出高质量的软
件;怎样使所开发的软件在运行过程中容易维护,以延长软件的使用期限;如何提高软
件开发、维护过程中的自动化程度,提高软件开发效率;软件工程如何管理等。这些就
是软件工程研究的问题。软件工程是指导计算机软件开发和维护的学科。软件工程的目
的是在规定的时间、规定的开发费用内,开发出满足用户需要的、质量合格的软件产品。
本章介绍软件工程的发展史,软件危机是如何形成和消除的,软件工程的基本概念、
内容及基本原理等。
本章重点:
软件工程;
软件生命周期。
软件工程的产生
计算机系统的发展、软件应用的日益广泛和软件危机的困扰促使了软件工程的产生和
发展。
软件工程发展史
自从 20 世纪 40 年代电子计算机问世以来,计算机软件随着计算机硬件的发展而逐
步发展起来,软件和硬件一起构成计算机系统。一开始只有程序的概念,后来才出现软件
的概念。
当软件需求量大大增加后,人们把软件视为产品,确定了软件生产的各个阶段必须完
成的有关计算机程序的功能、设计和使用的文字或图形资料,这些资料称为“文档”。软件
是指计算机程序及其有关的数据和文档。
随着计算机系统的发展,软件的生产大体经历了程序设计、软件、软件工程、第四代
技术等阶段。在此过程中,软件危机产生并越来越严重,因而逐步形成了研究如何消除软
件危机,如何合理地开发和维护软件的学科——软件工程学。
1.程序设计阶段
20 世纪 40 年代中期到 20 世纪 60 年代中期,电子计算机价格昂贵、运算速度低、存
储量小。计算机程序是描述计算任务的处理对象和处理规则。早期的程序规模小,程序往
往是个人设计、自己使用。程序设计通常要注意如何节省存储单元、提高运算速度,除了
程序清单之外,没有其他任何文档资料。
实用软件工程(第二版)
2
2.“软件=程序+文档”阶段
20 世纪 60 年代中期到 20 世纪 70 年代中期,集成电路计算机的运算速度和内存容量
大大提高。随着程序的增加,人们把程序区分为系统程序和应用程序,并把它们称为软件。
计算机软件的应用范围更加广泛,当软件需求量大大增加后,许多用户去“软件作坊”购买
软件。
软件产品交付给用户使用之后,为了纠正错误或适应用户需求的改变对软件进行的修
改,称为软件维护(software maintenance)。此时,由于在软件开发过程中很少考虑到它们
的维护问题,软件维护的费用以惊人的速度增长,并且不能及时满足用户的需求,质量也
得不到保证。所谓的“软件危机”由此开始。人们逐渐重视软件的“可维护性”问题,软件开
发开始采用结构化程序设计技术,并规定软件开发时必须书写各种规格书、说明书、用户
手册等文档。
1968 年北大西洋公约组织(NATO)的计算机科学家在联邦德国召开国际会议,讨论
软件危机问题,正式提出了“软件工程”(software engineering)的术语。从此一门新的工程
学科诞生了。
3.软件工程阶段
20 世纪 70 年代中期到 20 世纪 90 年代,大规模集成电路计算机的功能和质量不断提
高,个人计算机已经成为大众化商品,计算机应用不断地扩大。软件开发生产率提高的速
度远远跟不上计算机应用迅速普及深入的速度,软件产品供不应求,软件危机日益严重。
为了维护软件需要耗费大量的成本。美国当时的统计数据表明,对计算机软件的投资占计
算机软件、硬件总投资的 70%,到 1985 年时软件成本大约占总成本的 90%。为了对付不
断增长的软件危机,软件工程学把软件作为一种产品进行批量生产,运用工程学的基本原
理和方法来组织和管理软件生产,以保证软件产品的质量,提高软件产品的生产率。软件
生产使用数据库、软件开发工具、开发环境等,软件开发技术有了很大的进步,开始采用
工程化开发方法、标准和规范,以及面向对象技术等。
4.第四代技术阶段
计算机系统发展的第四阶段不再是单台的计算机和计算机程序,而是面向计算机和软
件的综合影响。复杂的操作系统控制的强大的桌面系统,以及连接局域网和因特网、高带
宽的数字通信与先进的应用软件相互配合,产生了综合的效果。计算机体系结构从主机环
境转变为分布式的客户机/服务器环境。
软件开发的第四代技术有了新的发展:计算机辅助软件工程(Computer Aided Software
Engineering,CASE)将工具和代码生成器结合起来,为许多软件系统提供了可靠的解决方
案;面向对象技术已在许多领域迅速取代了传统的软件开发方法;专家系统和人工智能软
件有了实际应用;人工神经网络软件展示了信息处理的美好前景;并行计算技术、网络计
算机、虚拟现实技术、多媒体技术和现代通信技术使人们开始采用和原来完全不同的方法
进行工作。
此外,光计算机、化学计算机、生物计算机和量子计算机等新一代计算机的研制发展,
必将给软件工程技术带来一场革命。
软件危机
软件危机是指在计算机软件开发和维护时所遇到的一系列问题。软件危机主要包含两
方面的问题:一是如何开发软件以满足社会对软件日益增长的需求,二是如何维护数量不
断增长的已有软件。本节研究软件危机产生的原因、主要表现形式以及解决的途径。
1.软件危机产生的原因
软件危机产生的原因与软件的特点有关,也与软件开发的方式、方法、技术以及软件
开发人员本身有关。
(1)软件是计算机系统中的逻辑部件,软件产品往往规模庞大,给软件的开发和维
护带来客观的困难。
(2)软件一般要使用 5~10 年,在这段时间里,很可能出现开发时没有预料到的问
题,如系统运行的硬件、软件环境发生变化,系统需求变化等,需要及时地维护软件,使
软件可以继续使用。
(3)软件开发技术落后,生产方式和开发工具落后。
(4)软件开发人员忽视软件需求分析的重要性,轻视软件维护,也是造成软件危机
的原因。
2.软件危机主要表现形式
(1)软件发展速度跟不上硬件的发展和用户的需求。计算机硬件成本逐年下降,软
件应用日趋广泛,软件产品“供不应求”,与硬件成本相比,软件成本越来越高。
(2)软件成本高,开发进度不能预先估计,用户不满意。由于软件应用范围越来越
广,很多应用领域往往是软件开发者不熟悉的,加之开发人员与用户之间信息交流不够,
导致软件产品不符合要求,不能如期完成。因而,软件开发成本和进度都与原先的估计相
差太大,引起用户不满。
(3)软件产品质量差,可靠性得不到保证。软件质量保证技术没有应用到软件开发
的全过程,导致软件产品质量问题频频发生。
(4)软件产品可维护性差。软件设计时不注意程序的可读性,不重视程序的可维护
性,程序中存在的错误很难改正。因此软件需求发生变化时,维护相当困难。
(5)软件没有合适的文档资料。软件开发时文档资料不全或文档与软件不一致,会
引起用户不满,同时也会给软件维护带来很大的困难。
3.解决软件危机的途径
目前,计算机的体系结构在硬件上是冯·诺依曼计算机。硬件的基本功能是做简单的运
算与逻辑判断,主要还是适用于数值计算。随着计算机应用的日益广泛,许多企事业单位
80%以上的计算机用于管理方面。管理方面大多为非数值计算问题,需要设计计算机软件
来进行处理,因而可能会使软件变得复杂、庞大,从而导致软件危机的产生。要解决软件
危机问题,需要采用以下措施:
(1)使用好的软件开发技术和方法。
(2)使用好的软件开发工具,提高软件生产率。
(3)有良好的组织、严密的管理,各类人员相互配合共同完成任务。
为了解决软件危机,既要有技术措施(好的方法和工具),也要有组织管理措施。软
件工程正是从技术和管理两方面来研究如何更好地开发和维护计算机软件的。
实用软件工程(第二版)
4
软件工程学
什么是软件
软件是计算机程序及其有关的数据和文档的完整集合。
其中,计算机程序是能够完成预定功能的可执行的指令序列;数据是程序能适当处理
的信息,具有适当的数据结构;软件文档是开发、使用和维护程序所需要的图文资料。
软件文档(software documentation)是以人们可读的形式出现的技术数据和信息。文
档描述或规定软件的设计细节,说明软件具备的能力,或为使用该软件以便从软件系统得
到所期望的结果提供操作指令。
B. Boehm 指出:“软件是程序以及对其进行开发、使用和维护所需要的所有文档。”特
别当软件成为商品时,文档是必不可少的;没有文档,仅有程序是不能称为软件产品的。
什么是软件工程
软件工程是计算机科学中的一个重要分支。按照中华人民共和国国家标准 GB/T
11457—1995《软件工程术语》的定义:软件工程是软件开发、运行、维护和引退的系统
方法。因而,软件工程是指导计算机软件开发和维护的工程学科。软件工程采用工程的概
念、原理、技术和方法来开发与维护软件。软件工程的目标是实现软件的优质高产,软件
工程的目的是在规定的时间、规定的开发费用内,开发出满足用户需求的、高质量的软件
产品。
软件工程学的内容
软件工程学的主要内容是软件开发技术和软件工程管理。
软件开发技术包含软件工程方法学、软件工具和软件开发环境;软件工程管理学包含
软件工程经济学和软件管理学。
1.软件工程方法学
最初,程序设计是个人进行的,只注意如何节省存储单元、提高运算速度。以后,兴
起了结构程序设计,人们采用结构化的方法来编写程序。结构程序设计只有顺序、条件分
支和循环这三种基本结构。这样不仅改善了程序的清晰度,而且能提高软件的可靠性和软
件生产率。
后来,人们逐步认识到编写程序仅是软件开发过程中的一个环节,在典型的软件开发
工作中,编写程序所需的工作量只占软件开发全部工作量的 10%~20%,软件开发工作应
包括需求分析、软件设计、编写程序等几个阶段,于是形成了“结构化分析”、“结构化设
计”、面向数据结构的 Jackson 方法等传统软件开发方法。之后,20 世纪 80 年代广泛应用
了面向对象设计方法。
软件工程方法学是编制软件的系统方法,它确定软件开发的各个阶段,规定每一阶段
的活动、产品、验收的步骤和完成准则。
软件工程方法学有三个要素,包括方法、工具和过程。
方法:完成软件开发任务的技术方法。
工具:为方法的运用提供自动或半自动的软件支撑环境。
过程:规定了完成任务的工作阶段、工作内容、产品、验收的步骤和完成准则。
各种软件工程方法的适用范围不尽相同。目前使用得最广泛的软件工程方法学可以分
为传统方法学和面向对象方法学两类。
(1)传统方法学
传统方法学采用结构化技术,包括结构化分析、结构化设计和结构化实现,来完成软
件开发任务。传统方法把软件开发工作划分成若干个阶段,每个阶段相对独立,也比较简
单,顺序完成各阶段的任务;每个阶段的开始和结束都有严格的标准;每个阶段结束时要
进行严格的技术审查和管理复审。用传统方法学开发软件,首先确定软件功能,再对功能
进行分解,确定怎样开发软件,然后实现软件功能。传统方法提高了软件的可维护性,提
高了软件开发的成功率,软件生产率也明显提高。
传统方法学历史悠久,为广大软件开发人员所熟知,在开发某些软件时十分有效。
传统方法可以再分为面向数据流设计方法和面向数据结构设计方法。
(2)面向对象方法学
面向对象方法学是在传统方法学的基础上发展起来的,把对象作为数据和对数据的操
作相结合的软件构件,用对象分解取代了传统方法的功能分解。该方法把所有对象都划分
为类,把若干个相关的类组织成具有层次结构的系统,下层的子类继承上层的父类所具有
的数据和操作,而对象与对象之间通过发送消息相互联系。
面向对象方法学的要素是对象、类、继承以及消息通信。可以用下列方程来概括:
面向对象 = 对象 + 类 + 继承 + 消息通信
面向对象方法学是多次反复、迭代开发的过程。面向对象方法在分析和设计时使用相
同的概念和相同的表示方法,两个阶段之间没有明显的界限。最终产品是由许多基本独立
的对象组成的,这些对象具有简单、易于理解、易于开发、易于维护的特点,并且具有可
重用性。
本书既介绍传统方法学,使读者掌握软件开发的基本步骤、方法和文档书写规范,也
介绍面向对象方法学。在实际工作中,软件开发人员可以根据具体情况,选择不同的软件
开发方法,也可将不同的方法结合起来,扬长避短,在提高软件开发效率的同时,提高软
件的质量。
2.软件工具
软件工具(software tools)是指为了支持计算机软件的开发和维护而研制的程序系统。
使用软件工具的目的是提高软件设计的质量和软件生产效率,降低软件开发、维护的成本。
软件工具用于软件开发的整个过程。例如,需求分析工具用类生成需求说明;设计阶
段需要使用编辑程序、编译程序、连接程序,有的软件还能自动生成程序;在测试阶段可
使用排错程序、跟踪程序、静态分析工具和监视工具等;软件维护阶段用到版本管理、文
档分析工具等;软件管理方面也有许多软件工具。软件开发人员在软件生产的各个阶段可
根据不同的需要,选择合适的工具使用。目前,软件工具发展迅速,许多用于软件分析和
设计的工具正在建立,其目标是实现软件生产各阶段的自动化。
3.软件开发环境
软件开发方法和软件工具是软件开发的两大支柱,它们之间密切相关。软件开发方法
实用软件工程(第二版)
6
提出了明确的工作步骤和标准的文档格式,这是设计软件工具的基础,而软件工具的实现
又将促进软件开发方法的推广和发展。
软件开发环境是方法和工具的结合。在 1985 年第八届国际软件工程会议上,关于“软
件开发环境”的定义是:“软件开发环境是相关的一组软件工具集合,它支持一定的软件开
发方法或按照一定的软件开发模型组织而成”。
软件开发环境的设计目标是提高软件生产率和改善软件质量。本书将在后续章节介绍
一些常用的软件开发方法、软件工具及软件开发环境。
计算机辅助软件工程(Computer Aided Software Engineering,CASE)是一组工具和方
法的集合,可以辅助软件生命周期各阶段进行的软件开发活动。
CASE 是多年来在软件工程管理、软件开发方法、软件开发环境和软件工具等方面研
究和发展的产物。CASE 吸收了 CAD(计算机辅助设计)、软件工程、操作系统、数据库、
网络和许多其他计算机领域的原理和技术。因而,CASE 领域是一个应用、集成和综合的
领域。其中,软件工具不是对任何软件开发方法的取代,而是对方法的辅助,它旨在提高
软件开发的效率和软件产品的质量。
4.软件工程管理
软件工程管理学包含软件工程经济学和软件管理学。本书只介绍有关软件工程管理的
内容,即对软件开发各阶段的活动进行管理。软件工程管理的目的是按预定的时间和费用,
成功地生产软件产品。软件工程管理的任务是有效地组织人员,按照适当的技术、方法,
利用好的工具来完成预定的软件项目。
软件工程管理的内容包括软件费用管理、人员组织、工程计划管理、软件配置管理等。
(1)费用管理
一般来讲,开发一个软件是一种投资,人们总是期望将来获得较大的经济效益。从经
济角度分析,开发一个软件系统是否划算,是软件使用单位的负责人决定是否开发这个项
目的主要依据,要从软件开发成本、运行费用、经济效益等方面来估算整个系统的投资和
回报情况。
软件开发成本主要包含开发人员的工资报酬,以及开发阶段的各项支出;软件运行费
用取决于系统的操作费用和维护费用,其中操作费用包括操作人员的人数、工作时间、消
耗的各类物资等开支;系统的经济效益是指因使用新系统而节省的费用和增加的收入。
由于运行费用和经济效益两者在软件的整个使用期内都存在,总的效益和软件使用时
间的长短有关,所以,应合理地估算软件的寿命。一般在进行成本/效益分析时一律假设软
件使用期为五年。
(2)人员组织
软件开发不是个体劳动,需要各类人员协同配合,共同完成工程任务,因而应该有良
好的组织、周密的管理。
(3)工程计划管理
软件工程计划是在软件开发的早期确定的。在计划实施过程中,如果有其他需要,应
对工程进度做适当的调整。在软件开发结束后应写出软件开发总结,以便今后能制定出更
切实际的软件开发计划。
(4)软件配置管理
软件工程各阶段所产生的全部文档和软件本身构成软件配置。每完成一个软件工程步
骤,都涉及软件工程配置,必须使软件配置始终保持其精确性。软件配置管理就是在系统
的整个开发、运行和维护时期控制配置的状态和变动,验证配置项的完整性和正确性。
软件过程
国际标准化组织(International Standardization Organization,ISO)是世界性的标准化
专门机构。ISO 9000 把软件过程定义为:“把输入转化为输出的一组彼此相关的资源和
活动”。
软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项
任务的工作步骤。
软件开发过程(software development process)是把用户要求转化为软件需求,把软件
需求转化为设计,用代码来实现设计并对代码进行测试,完成文档编制并确认软件可以投
入运行使用的过程。
软件过程定义了运用方法的顺序、应该交付的文档、开发软件的管理措施和各阶段任
务完成的标志。
软件过程是软件工程方法学的三个要素(方法、工具和过程)之一。软件过程必须科
学、合理才能获得高质量的软件产品。
软件工程基本原理
著名软件工程专家 B. Boehm 综合有关专家和学者的意见并总结了多年来开发软件的
经验,于 1983 年在一篇论文中提出了软件工程的七条基本原理。
(1)用分阶段的生存周期计划进行严格的管理。
(2)坚持进行阶段评审。
(3)实行严格的产品控制。
(4)采用现代程序设计技术。
(5)软件工程结果应能清楚地审查。
(6)开发小组的人员应该少而精。
(7)承认不断改进软件工程实践的必要性。
B. Boehm 指出,遵循前六条基本原理,能够实现软件的工程化生产;按照第七条原理,
不仅要积极主动地采纳新的软件技术,而且要注意不断总结经验。在本课程的学习中,读
者将体会到软件工程基本原理的含义和作用。
软件生命周期
软件生命周期定义
软件生命周期(software life cycle)是从设计软件产品开始到产品不能使用为止的时间
周期。软件产品从问题定义开始,经过开发、使用和维护,直到最后被淘汰的整个过程就
是软件生命周期。
实用软件工程(第二版)
8
一个人从出生开始,经过儿童、青年、中年、老年等时期到死亡。在人的一生中,国
家和社会对他的负担主要体现在儿童、青少年时期的培养及老年丧失劳动能力后的供养方
面。而一个人从参加工作开始就对国家与社会做贡献,贡献越大,人的价值也就越大。
同样,软件生命周期中软件的开发要投资、消耗价值,在软件交付使用后就开始产生
价值,但软件维护又要消耗价值。软件生命周期中,消耗价值越少,即软件开发与维护时
的费用越低,软件的使用寿命越长,产生的价值就越大,这就是掌握软件工程学的目的。
软件生命周期是软件工程的一个重要概念。软件生命周期有时与软件开发周期作为同
义词使用。一个软件产品的生存周期可划分为若干个互相区别而又有联系的阶段。把整个
生存周期划分为若干个阶段,赋予每个阶段相对独立的任务,然后逐步完成每个阶段的任
务。这样,能够简化每个阶段的工作,容易确立系统开发计划,还可明确系统各类开发人
员的分工与职责范围,以便分工协作,保证质量。
每一阶段的工作都以前一阶段的结果为依据,并作为下一阶段的前提。每个阶段结束
时都要有技术审查和管理复审,从技术和管理两方面对这个阶段的开发成果进行检查,及
时决定系统是继续进行,还是停工或是返工。应避免到开发结束时,才发现前期工作存在
问题,造成不可挽回的损失和失败的现象。
每个阶段都要进行的复审,主要检查是否有高质量的文档资料,前一个阶段复审通过
了,后一个阶段才能开始。开发单位的技术人员可根据所开发软件的性质、用途及规模等
因素决定在软件生命周期中增加或减少相应的阶段。
把一个软件产品的生存周期划分为若干个阶段,是实现软件生产工程化的重要步骤。
软件生命周期划分阶段的方法有多种,可按软件规模、种类、开发方式、开发环境等
来划分生存周期。不管用哪种方法划分生存周期,划分阶段的原则是相同的。
软件生命周期划分阶段的原则
软件生命周期划分阶段的原则如下:
(1)各阶段的任务彼此间尽可能相对独立。这样便于逐步完成每个阶段的任务,能
够简化每个阶段的工作,易于确立系统开发计划。
(2)同一阶段的工作任务性质尽可能相同。这样有利于软件工程的开发和组织管理,
明确系统各类开发人员的分工与职责范围,以便协同工作,保证质量。
软件生命周期各阶段的任务
软件生命周期一般由软件计划、软件开发和软件运行维护三个时期组成。软件计划时
期分为问题定义、可行性研究和需求分析三个阶段。软件开发时期可分为软件设计、软件
实现和综合测试三个阶段。其中,软件设计阶段可分为概要设计和软件详细设计阶段,软
件实现阶段进行程序设计和软件单元测试,软件开发的最后阶段是进行综合测试等。软件
交付使用后在运行过程中需要不断地进行维护,才能使软件持久地满足用户的需要。
下面简要介绍软件生命周期各阶段的主要任务。
(1)问题定义
确定系统的目标、规模和基本任务。
(2)可行性研究
从经济、技术、法律等方面分析确定系统是否值得开发,如果不值得开发应及时建议
停止项目开发,避免人力、物力、时间的浪费。
(3)需求分析
确定软件系统应具备的具体功能。通常用数据流图、数据字典和简明算法描述表示系
统的逻辑模型,防止造成系统的设计与用户的实际需求不相符的后果。
(4)概要设计
确定系统设计方案,以及软件的体系结构,即软件由哪些模块组成及这些模块之间的
相互关系。
(5)详细设计
描述应该如何具体地实现系统。详细设计每个模块,确定实现模块所需要的算法和数
据结构。
(6)软件实现阶段
进行程序设计(编码)和模块测试。
(7)综合测试阶段
通过各种类型的测试,查出软件设计中的错误并改正,确保软件质量;还要在用户的
参与下进行验收,才可交付使用。
(8)软件运行、维护
软件运行期间,通过各种必要的维护使系统改正错误或修改扩充功能使软件适应环境
变化,以延长软件的使用寿命,提高软件的效益。每次维护的要求及修改步骤都应详细准
确地记录下来,作为文档保存。
软件开发模型
根据软件生产工程化的需要,软件生命周期的划分也有所不同,从而形成了不同的软
件生命周期模型(software life cycle model),或称软件开发模型。
总体来说,软件开发模型包括传统的瀑布模型和后来兴起的快速原型模型两类。具体
可分为瀑布模型、快速原型模型、增量模型、喷泉模型、螺旋模型和统一过程。下面分别
加以介绍。
瀑布模型
瀑布模型(waterfall model)遵循软件生命周期的划分规划,明确规定每个阶段的任务,
各个阶段的工作以线性顺序展开,恰如奔流不息的瀑布。
瀑布模型把软件生命周期分为计划时期、开发时期、运行时期等三个时期。这三个时
期又可细分为若干个阶段:计划时期可分为问题定义、可行性研究、需求分析三个阶段,
开发时期分为概要设计、详细设计、软件实现、软件测试等阶段,运行时期则需要不断进
行运行维护以延长软件的使用寿命,如图 所示。瀑布模型要求开发过程的每个阶段结
束时要进行复审,复审通过了才能进入下一阶段,复审通不过则要进行修改或回到前面的
阶段进行返工。软件维护时可能需要修改错误、排除故障;也可能是用户的需求改变了,
实用软件工程(第二版)
10
或软件的运行环境改变了,需要修改软件的结构或功能,因而维护工作可能要从修改需求
分析或修改概要设计开始,也可能要从修改软件编码开始。图 中的实线箭头表示开发
工作的流程,每个阶段顺序进行,有时会返工;虚线箭头表示维护工作的流程,根据不同
的情况返回到不同的阶段进行维护。
图 瀑布模型
瀑布模型软件开发有以下几个特点。
1.软件生命周期的顺序性
顺序性是指:只有前一阶段工作完成以后,后一阶段的工作才能开始;前一阶段的输
出文档,就是后一阶段的输入文档。只有前一阶段有正确的输出,后一阶段才可能有正确
的结果。因而,瀑布模型的特点是由文档驱动的。如果在生存周期的某一阶段出现了错误,
往往要追溯到在它之前的一些阶段。
瀑布模型开发适合于在软件需求比较明确,开发技术比较成熟,工程管理比较严格的
场合下使用。
2.尽可能推迟软件的编码
程序设计也称为编码。实践表明,大、中型软件编码开始得越早,完成所需的时间反
而越长。瀑布模型在编码之前安排了需求分析、概要设计、详细设计等阶段,从而把逻辑
设计和编码清楚地划分开来,尽可能推迟编码阶段。
3.保证质量
为了保证质量,瀑布模型坚持两个重要做法:
(1)每个阶段都要完成规定的文档。
(2)每个阶段都要对已完成的文档进行复审,以便及早发现隐患,排除故障。
本书以瀑布模型为典型开发模型,介绍各阶段工作的具体方法、步骤、所需工具,对
其他模型可以参照此模型执行。
快速原型模型
正确的需求定义是系统成功的关键,但是许多用户在开始时往往不能准确地叙述他们
的需求,软件开发人员需要反复和用户交流信息,才能全面、准确地了解用户的需求。当
用户实际使用了目标系统以后,通过对系统的执行、评价,使用户明确对系统的需求。此
时用户常常会改变原来的某些想法,对系统提出新的需求,以便使系统更加符合他们的
需要。
快速原型模型(rapid prototype model)是指快速开发一个可以运行的原型系统,该原
型系统所能完成的功能往往是最终产品能完成的功能的一个子集。请用户试用原型系统,
以便能准确地认识到他们的实际需要是什么,然后书写软件系统的需求规格说明文档,根
据这份文档开发出来的软件可以满足用户的真实需求。这相当于工程上先制作“样品”,试
用后做适当改进,然后再批量生产一样。
创建快速原型从设计用户界面开始,所建立的原型能完成的功能,往往是用户需求的
主要功能。快速原型模型鼓励用户参与开发过程,用户参与原型的运行和评价,能充分地
与开发者协调一致。开发期间,原型还可作为终端用户的教学模型。开发者一边进行软件
开发,一边让用户学习使用,若用户发现软件功能不符合自己的实际要求,可及时提出意
见,开发者应立即进行修改,如此反复进行,直到用户满意为止。
虽然此方法要额外花费一些成本,但是可以尽早获得更符合需求的模型,从而减少测
试和调试的工作量,提高软件质量。因此,只要快速原型法使用得当,就能减少软件的总
成本,缩短开发周期。快速原型模型是目前比较流行的实用开发模型。
根据建立原型的目的不同,实现原型的途径也有所不同,通常有下述三种类型的原型。
1.渐增式的原型
渐增式的原型开发模型也称增量模型。
2.用于验证软件需求的原型
系统分析员在确定了软件需求之后,从中选出某些需要验证的功能,用适当的工具快
速构造出可运行的原型系统,由用户试用和评价。这类原型往往用后就丢弃,因此构造它
们的软件环境不必与目标系统的软件环境一致,通常使用简洁而易于修改的高级语言对原
型进行编码。
3.用于验证设计方案的原型
原型可作为新颖设计思想的实现工具,对于新的设计思想,开发部分软件的原型,可
提高风险开发的安全系数,从而证实设计的可行性。为了保证软件产品的质量,在概要设
计和详细设计过程中,可用原型来验证总体结构或某些关键算法。如果设计方案验证完成
后就将原型丢弃,则构造原型的工具不必与构造目标系统的工具一致。如果想把原型作为
最终产品的一部分,原型和目标系统可使用同样的软件设计工具。
软件快速原型模型的开发过程如图 所示。开发人员听取用户的意见,进行需求分
析,尽快构造出原型,原型的作用是获得用户的真正需求。原型由用户运行、评价和测试,
开发人员根据用户的意见修改原型,再次请用户试用,逐步使其满足用户的需求。产品一
旦交付给用户使用,维护便开始。根据需要,维护工作可能返回到需求分析、设计或编码
等不同的阶段。
实用软件工程(第二版)
12
图 快速原型开发过程
增量模型
增量模型也称渐增模型,先选择一个或几个关键功能,建立一个不完全的系统,此时
只包含目标系统的一部分功能,或对目标系统的功能从某些方面进行简化,通过运行这个
简化后的系统取得经验,加深对软件需求的理解,使系统逐步得到扩充和完善。如此反复
进行,直到用户对所设计的软件系统满意为止。
增量模型是对瀑布模型的改进,增量模型使开发过程具有一定的灵活性和可修改性。
增量模型把软件产品作为一系列增量构件来设计、编码、集成和测试。增量模型开发
的软件系统是逐渐增长和完善的,所以整体结构不如瀑布模型开发的软件那样清晰,但是,
由于增量模型开发过程自始至终都有用户参与,因而能及时发现问题并加以修改,可以更
好地满足用户需求。
增量模型在项目开发过程中,以一系列的增量方式来逐步开发系统。增量方式包括增
量开发和增量提交两个方面。
增量开发:不是整体地开发软件,而是按一定的时间间隔开发部分软件。
增量提交:先提交部分软件给用户试用,听取用户意见,再提交另一部分软件让用
户试用,如此进行,直到全部提交为止。
增量开发和增量提交方式可以同时使用,也可以单独使用。增量开发方式可以在软件
开发的部分阶段采用,也可以在全部开发阶段都采用。
例如,在软件需求分析和设计阶段采用整体开发方式,在编码和测试阶段采用增
量模型开发方式,如图 所示。先对部分功能进行编码、测试,提交给用户试用,听
取用户意见,及早发现问题并解决问题;再对另一部分功能进行编码、测试,提交用户
试用。
图 增量模型
另一种方式是,所有阶段都采用增量模型开发方式。先对某部分功能进行需求分析、
设计、编码和测试,提交给用户试用,充分听取用户意见;再对另一部分功能进行需求分
析、设计、编码和测试,提交给用户试用,直至所有功能开发完毕,如图 所示。用这
种方式开发软件时,不同功能的软件构件可以并行地构建,因此有可能加快工程进度,但
是也存在软件构件无法集成为一个整体的风险。
图 风险更大的增量模型
增量模型的优点是能在较短的时间内向用户提交能完成一定功能的产品,并使用户有
较充裕的时间学习和适应产品。
使用增量模型的难点在于,软件的体系结构设计必须是开放的,要便于向现有结构中
加入新的构件,即每次增量开发的产品都应当是可测试的、可扩充的。从长远来看,具有
开放结构的软件,其可维护性明显好于封闭结构的软件。
喷泉模型
使用传统的瀑布模型开发、维护软件时,需要有以下两个前提:
用户能清楚地提供系统的需求。
开发者能完整地理解这些需求,软件生命周期各阶段能
明确地划分,每个阶段结束时要复审,复审通过后下一
阶段才能开始。
然而,在实际开发软件时,往往用户事先难以说清系统需
求,开发者也由于主客观的原因,缺乏与用户交流的机会,其
结果是系统开发完成后,修改、维护的开销及难度过大。
喷泉模型(fountain model)是典型的面向对象软件开发模
型,着重强调不同阶段之间的重叠。一般认为面向对象软件开
发过程,不需要或不应该严格区分不同的开发阶段,如图
所示。
喷泉模型是一种以用户需求为动力,以对象作为驱动的模
型,适合面向对象的开发方法。它克服了瀑布模型不支持软件重用和多项开发活动集成的
局限性。喷泉模型的开发过程具有迭代性和无间隙性。
基于喷泉模型,Hodge 等人提出将软件开发过程划分为系统分析、系统设计、对象设
计与实现(编程)、测试和系统组装集成等五个阶段,也体现出分析和设计之间的重叠。
1.系统分析
系统模型中的对象是现实世界中的客观对象的抽象,结构清晰、易于理解、易于描述
规范。在分析阶段建立对象模型和过程模型。
图 喷泉模型
实用软件工程(第二版)
14
2.系统设计
给出模型对象和过程的规范描述。
3.对象设计和对象实现(编程)
面向对象设计方法强调软件模块的再用和软件合成,因而在对象设计和实现时,并不
要求所有的对象都从头开始设计,而是充分利用以前的设计工作。在软件开发时检索对象
库,若是对象库中已经存在的,则可不必设计,只需重复使用或加以修改;否则,应定义
新的对象,进行设计和实现。面向对象设计方法要求与用户充分沟通,在用户试用软件的
基础上,根据用户的需求,不断改进、扩充和完善系统功能。
4.测试
测试所有的对象及对象相互之间的关系是否符合要求。
5.系统集成
面向对象软件的特点之一是软件重用和组装技术。对象是数据和操作的封装载体,组
装在一起才能构成完整的系统。模块组装也称为模块集成、系统集成。软件设计是指将对
象模块集成,构造生成所需的系统。
6.演化
由于喷泉模型主张分析和设计过程的重叠,不严格加以区分,模块集成过程要反复经
过分析、设计、测试、集成这几个阶段,每次集成都使系统功能在原有基础上得到扩展,
因而称为系统演化。
螺旋模型
瀑布模型要求在软件开发的初期就完全确定软件的需求,这在很多情况下是做不到的。
螺旋模型试图克服瀑布模型的这一不足之处。
螺旋模型(Spiral Model,SM)是 1986 年由 B. Boehm 提出的。SM 把软件开发过程安
排为逐步细化的螺旋周期序列,每经历一个周期,系统就细化和完善一些。SM 每一螺旋
周期由下列六个步骤组成,如图 所示。
1.确定任务目标
根据初始需求分析项目计划,确定任务目标、可选方案和约束限制。
2.选择对象
对各种软硬件设备、开发方法、技术、开发工具、人员、开发管理等对象进行选择,
并决定软件是进行研制、购买还是利用现有的。
3.分析约束条件
软件开发的时间、经费等限制条件。
4.风险分析
评估目标、对象、约束条件三者之间的联系,列出可能出现的问题及问题的严重程度
等,把最重要的问题作为尚未解决的关键问题,称为风险。
5.制定消除风险的方法
应有详尽的说明和周密的计划,并估计可能产生的后果。依此来开发软件,为制定下
一周期的计划打下基础。
图 螺旋模型
6.制定下一周期的工作计划
在第一个螺旋周期,确定目标、选择对象、分析约束,通过风险分析制定消除风险的
方法,初步开发原型 1,制定系统开发计划。
在第二个螺旋周期,进一步明确系统的目标、开发方案及约束条件,通过风险分析制
定消除风险的方法,在原型 1 的基础上开发原型 2。进一步明确软件需求,进行需求确认,
修改开发计划。
在第三个螺旋周期,再进一步确认系统目标、开发方案及约束条件,进行风险分析,
制定进一步消除风险的方法,在原型 2 的基础上开发原型 3。此时可进行产品设计,再对
设计进行验证和确认,制定集成测试计划。
在第四个螺旋周期,软件开发方案、系统目标和约束条件得到确定,在风险分析的基
础上,开发具有实用价值的可操作原型,此时可对产品进行详细设计,进入编码、单元测
试、集成测试阶段,最后进入验收测试阶段,验收合格后交付用户使用,进入运行、维护
阶段。
统一过程
统一过程是经过 30 多年的发展形成的,它是汲取了各种生存周期模型的先进思想和
丰富的实践经验而产生的。统一过程将成为软件开发的主流过程。
统一过程(Rational Unified Process,RUP)使用统一建模语言(Unified Modeling
Language,UML),采取用例驱动和架构优先的策略,采用迭代增量建造方法。
实用软件工程(第二版)
16
UML 采用了面向对象的概念,引入了各种独立于语言的表示符号。UML 建立用例模
型、静态模型和动态模型完成对整个系统的建模,所定义的概念和符号可用于软件开发过
程的分析、设计和实现的全过程。软件开发人员不必在开发过程的不同阶段进行概念和符
号的转换。
用例(use case)代表某些用户可见的功能,实现一个具体的用户目标。用例代表一类
功能而不是使用该功能的某一具体实例。用例是精确描述需求的重要工具。
统一过程所构造的软件系统,是由软件构件建造而成的。这些软件构件定义了明确的
接口,相互连接成整个系统。在构造软件系统时统一过程采用架构优先的策略。软件构架
概念包含了系统中最重要的静态结构和动态特征,构架体现了系统的整体设计。构架优先
开发的原则是 RUP 开发过程中至关重要的主题。
为了管理软件开发过程和监控软件开发过程,RUP 把软件开发过程划分为多个循环,
每个循环生成产品的一个新版本。每个循环都由初始阶段、细化阶段、构造阶段和提交阶
段等四个阶段组成。每个阶段是一个小的瀑布模型,要经过分析、设计、编码、集成和测
试等步骤。统一过程通过反复多次的循环迭代,来达到预定的目的或完成确定的任务。每
次迭代增加尚未实现的用例,所有用例建造完成后,系统也就建造完成了。
关于统一过程和 UML 将在后面的章节做进一步介绍。
在具体的软件项目开发过程中,可以选用某种生存周期模型,按照某种开发方法,使
用相应的工具进行系统开发。
通常,结构化方法可使用瀑布模型、增量模型和螺旋模型进行开发;面向对象方法可
采用快速原型、增量模型、喷泉模型和统一过程进行开发。
小 结
软件开发的各个阶段必须完成的各种规格书、说明书、用户手册等称为“文档”
(document)。
软件是计算机程序及其有关的数据和文档的结合。
软件危机是指在计算机软件开发和维护时所遇到的一系列问题。
软件危机主要包含两方面的问题:一是如何开发软件以满足对软件日益增长的需求;
二是如何维护数量不断增长的已有软件。
软件工程是软件开发、运行、维护和引退的系统方法。
软件工程是指导计算机软件开发和维护的工程学科。软件工程采用工程的概念、原理、
技术和方法来开发与维护软件。软件工程的目标是实现软件的优质高产。
软件工程学的主要内容是软件开发技术和软件工程管理。
软件开发方法学是编制软件的系统方法,它确定软件开发的各个阶段,规定每一阶段
的活动、产品、验收的步骤和完成准则。常用的软件开发方法有结构化方法、面向数据结
构方法和面向对象方法等。
软件过程是为了获得高质量软件所需要完成的一系列任务的框架,它规定了完成各项
任务的工作步骤。
ISO 9000 把软件过程定义为:“把输入转化为输出的一组彼此相关的资源和活动”。
软件过程定义了运用方法的顺序、应该交付的文档、开发软件的管理措施、各阶段任
务完成的标志。
软件过程必须科学、合理,才能获得高质量的软件产品。
软件产品从问题定义开始,经过开发、使用和维护,直到最后被淘汰的整个过程称为
软件生命周期。
根据软件生产工程化的需要,生存周期的划分有所不同,从而形成了不同的软件生命
周期模型(SW life cycle model),或称软件开发模型。
软件开发模型有以下几种。
瀑布模型:规范的、文档驱动的方法。开发阶段按顺序进行,适用于需求分析较明
确、开发技术较成熟的情况。
快速原型模型:构建原型系统让用户试用并收集用户意见,获取用户真实需求。
增量模型:优点是能在早期向用户提交部分产品和易于维护,缺点是软件的体系结
构必须是开放的。
喷泉模型:适用于面向对象方法。
螺旋模型:适用于大规模内部开发项目,有利于分析风险和排除风险。
统一过程:适用于面向对象方法,使用统一建模语言 UML,采取用例驱动和架构
优先的策略,采用迭代增量的建造方法。
进行软件开发时可把各种模型的特点结合起来,充分利用优点,减少缺点。
习 题 1
1.什么是软件,软件和程序的区别是什么?
2.什么是软件危机,软件危机的主要表现是什么,怎样消除软件危机?
3.什么是软件工程,什么是软件过程,软件过程与软件工程方法学有何关系?
4.软件工程学的主要内容是什么?
5.软件工程学的基本原理是什么?
6.什么是软件生命周期,软件生命周期为什么要划分阶段,划分阶段的原则是什么?
7.什么是软件开发方法,有哪些主要方法?
8.比较各种软件开发模型的特点。
9.选择填空
快速原型方法是用户和设计者之间的一种交互过程,适用于 A 系统。它从设计用
户界面开始,首先形成 B ,然后用户 C 并就 D 提出意见。它是一种 E 型设计
过程。
供选择的答案:
A:① 需求不确定性较高的 ① 需求确定的
A:① 管理信息 ① 决策支持
B:① 用户使用手册 ① 系统界面原型
B:① 界面需求分析说明书 ① 完善用户界面
C:① 阅读文档资料 ① 改进界面的设计
实用软件工程(第二版)
18
C:① 模拟界面的运行 ① 运行界面的原型
D:① 使用哪种编程语言 ① 程序的结构
D:① 同意什么和不同意什么 ① 执行速度是否满足要求
E:① 自外向内 ① 自底向上
E:① 自顶向下 ① 自内向外
10.选择填空
A 是将软件生命周期的各个阶段,依线性顺序连接,用文档驱动的模型。
在 B 中是采取用例驱动和架构优先的策略,并采用迭代增量建造方法,使软件“逐
渐”被开发出来。
C 是一种以用户需求为动力,以对象作为驱动的模型,适合于面向对象的开发
方法。
喷泉模型克服了瀑布模型不支持软件重用和多项开发活动集成的局限性。喷泉模型的
开发过程具有 D 和 E 。
供选择的答案:
A,B,C:① 统一过程 ① 瀑布模型 ① 螺旋模型 ① 喷泉模型
D,E:C:① 迭代性 ① 无间隙 ① 风险性 ① 需求确定性
11.假设你要开发一个软件,它的功能是把 这个数开平方,所得到的结果
精确到小数点后 4 位。一旦实现并测试完之后,该产品将被抛弃。你打算选用哪种软件生
命周期模型?请说明你做这样选择的理由。
12.假设你要为一家生产和销售长筒靴的公司开发一个软件,使用此软件来监控该公
司的存货,并跟踪从购买橡胶开始,到生产长筒靴、发货给各个连锁店,直至卖给顾客的
全部过程。以保证生产、销售过程的各个环节供需平衡,既不会有停工待料现象,也不会
有供不应求现象。你在为这个项目选择生命周期模型时使用什么准则?
13.假设第 12 题中为靴类连锁店开发的存货监控软件很受用户欢迎,现在软件开发公
司决定把它重新写成一个通用软件包,以卖给各种生产并通过自己的连锁店销售产品的公
司。因此,这个新的软件产品必须是可移植的,并且应该能够很容易地适应新的运行环境
(硬件或操作系统),以满足不同用户的需求。你在为本题中的软件选择生命周期模型时,
使用的准则与在第 12 题中使用的准则有哪些不同?