1、第1章 软件工程概述 第1章 软件工程概述 1.1 软件软件1.2 软件危机软件危机1.3 软件工程软件工程1.4 软件工程知识体系软件工程知识体系(SWEBOK)1.5 软件过程软件过程1.6 软件项目管理基础软件项目管理基础1.7 小结小结第1章 软件工程概述 1.1 软软 件件1.1.1 软件的定义软件的定义在软件的发展过程中,软件从手工作坊式的程序演变为工程化的产品,人们对软件的看法也发生了根本性的变化。“软件=程序”显然不能涵盖软件的完整内容,除了程序之外,软件还应包括与之相关的文档和配置数据,用以保证这些程序的正确运行。IEEE Standard Glossary of Softw
2、are Engineering Terminology给出了有关软件的定义:软件是计算机程序、规程以及运行计算机系统可能需要的相关文档和数据。其中:计算机程序是计算机设备可以接受的一系列指令和说明,为计算机执行提供所需的功能和性能;数据是事实、概第1章 软件工程概述 念或指令的结构化表示,能够被计算机设备接受、理解或处理;文档是描述过程、方法及使用的图文材料。然而,软件的真正含义却不是一个形式的定义所能体现的。从软件的内容来看,软件更像是一种嵌入式的数字化知识,其形成是一个通过交互对话和抽象理解而不断演化的过程。软件的应用领域十分广泛,呈现形式也是多种多样的,在某种程度上很难对软件的类型给出一
3、个通用的界定。根据软件服务对象的范围不同,一般可以将软件划分为通用软件和定制软件两种类型。第1章 软件工程概述 1通用软件通用软件(Generic Software)通用软件是由软件开发组织开发,面向市场用户公开销售的独立运行系统,像操作系统、数据库系统、字处理软件、绘图软件包和项目管理工具等都属于这种类型。有时,通用软件也被称为套装软件(Packaged Software)2定制软件定制软件(Customized Software)定制软件是受某个特定客户委托,由软件开发组织在合同的约束下开发的软件,像企业ERP系统、卫星控制系统和空中交通指挥系统等都属于这种类型。第1章 软件工程概述 通用
4、软件由开发组织根据市场调研自主提出产品需求,并以此进行设计和开发。其最大的优势在于,可以通过近乎零成本的复制来分摊最初投入的一次性开发成本,最终使原本昂贵的软件产品的价格降至众多用户可接受的程度,从而有效地提高市场份额和利润。但是,为了分摊最初的开发投入,通用软件必须面对足够大的市场空间,其功能设计也只能面向大规模用户普遍存在的共性需求。对于不同的用户来说,除了共性需求之外还存在着个性化的需求,而这些个性化需求对于很多用户来说,恰恰是应用的关键所在。定制软件完全是订单开发,即按照单个客户的个性化要求,以软件项目的方式为其提交个性化的解决方案,从而更好地满足客户的需求。第1章 软件工程概述 1.
5、1.2 软件的特性软件的特性计算机在使社会生产力得到迅速解放、使人类生活高度自动化和信息化的同时,却没有使计算机本身的软件生产得到类似的巨大进步。软件开发依然面临着过分依赖人工、软件难以重用、大量重复开发和生产率低下等问题,而导致这些问题的关键在于软件本身的特性。(1)软件是复杂的。软件是人类思维和智能的一种延伸和在异体上的再现,远比任何以往人类的创造物都复杂得多。在大型软件系统中,无数种数据、状态和逻辑关系的组合以及人类思维的复杂性和不确定性导致的理解歧义和差异,使整个系统的复杂性急剧增加,也使软件的设计、实现和测试都变得相当困难。第1章 软件工程概述 在著名的没有银弹:软件工程中的根本和次
6、要问题一文中,Fred Brooks认为正是软件固有的复杂性造成了软件开发的诸多问题。由于复杂性,人们难以全面理解问题,团队成员之间的沟通也变得非常困难,从而导致了产品缺陷、成本超支和进度拖延;由于复杂性,描述和理解软件系统所有可能的状态是极其困难的,影响了产品的可靠性;由于软件结构及其依赖关系的复杂性,软件的任何更改和扩充都有可能带来灾难性的后果,形成所谓的“雪崩效应”。第1章 软件工程概述(2)软件是不可见的。一般情况下,人们可以通过几何抽象模型准确地描述有形的物体,例如建筑师可以用平面图描述建筑物的结构,硬件工程师可以用电路图描述计算机的系统结构,甚至化学家也可以用分子模型描述客观事物的
7、微观结构。但是,软件是客观世界空间和计算机空间之间的一种逻辑实体,不具有物理的形体特征。人们一直试图用不同的图形技术来描述软件结构,即便是现在流行的面向对象技术,也仍然无法给出其准确、完整的描述。第1章 软件工程概述(3)软件是不断变化的。软件是纯粹思维活动的产物,它不会像硬件一样发生磨损,而是需要随着应用、硬件、用户和社会等各种因素的变化不断地被修改和扩展。由于软件是人类思维和智能的一种延伸,因此当软件被真正应用之后,人们往往希望超越原有的应用边界进行软件功能的提升或扩展;另外,由于软件必须依附于硬件平台,因此需要随着硬件设备的更新和接口的不同而变化。人们总是认为软件是很容易被修改的,通常忽
8、视了修改带来的副作用,即引入新的错误,造成故障率的升高。图1.1显示了软件修改对其质量带来的冲击,不断的修改最终将导致软件的退化,从而结束其生命周期。第1章 软件工程概述 图1.1 软件的故障率曲线第1章 软件工程概述(4)大多数软件仍然是定制的,而不是通过已有构件组装而成的。在软件的发展历程中,曾经涌现出许多开发技术和开发工具,当前流行的面向对象开发技术也日趋成熟,但是手工作坊式的软件开发方式仍占主导地位。随着数字化、网络化、智能化成为信息产业的发展趋势,软件复用和软件构件技术受到了广泛的关注,并成为一种社会化的开发方法,有助于软件工程化、工厂化生产的实现。第1章 软件工程概述 1.1.3
9、软件的发展软件的发展 伴随着第一台计算机的问世,计算机程序就出现了。在以后几十年的发展过程中,人们逐步认识了软件的本质特性,发明了许多有意义的开发技术与开发工具,同时软件的规模也在不断扩大,其应用几乎渗透到各个领域。纵观整个软件的发展过程,大致可以将其分成以下4个重要的阶段:(1)第一阶段:20世纪5060年代。在计算机发展的早期阶段,计算机的主要应用是快速计算,出现了以Algol、Fortune等编程语言为标志的算法技术。在这一时期,程序设计被认为是一种任人发挥创造才能的活动,不存在什么系统化的方法和开发管理,程序的质量完全依赖于程序员个人的技巧。随着软件规模的扩大,20世纪60年代末期出现
10、了“软件危机”。第1章 软件工程概述(2)第二阶段:20世纪70年代。计算机应用开始涉及各种以非数值计算为特征的商业事务领域,交互技术、多用户操作系统、数据库系统等随之发展起来,出现了以Pascal、Cobol等编程语言和关系数据库管理系统为标志的结构化软件技术。在这一时期,软件的概念不再仅仅是程序,还包括开发、使用、维护程序需求的所有文档,软件的工作范围从只考虑程序的编写扩展到从定义、编码、测试到使用、维护等整个软件生命周期,瀑布模型被普遍使用。第1章 软件工程概述(3)第三阶段:20世纪80年代。微处理器的出现与应用使计算机真正成为大众化的东西,而软件系统的规模、复杂性以及在关键领域的广泛
11、应用,促进了软件开发过程的管理及工程化开发。在这一时期,软件工程开发环境CASE及其相应的集成工具大量涌现,软件开发技术中的度量问题受到重视,出现了著名的软件工作量估计COCOMO模型、软件过程改进模型CMM等。20世纪80年代后期,以Smalltalk、C+等为代表的面向对象技术重新崛起,传统的结构化技术受到了严峻的考验。第1章 软件工程概述(4)第四阶段:20世纪90年代至今。Internet技术的迅速发展使软件系统从封闭走向开放,Web应用成为人们在Internet上最主要的应用模式,异构环境下分布式软件的开发成为一种主流需求,软件复用和构件技术成为技术热点,出现了以Sun公司的EJB/
12、J2EE、Microsoft的COM+和OMG的CORBA/OMA为代表的3个分支。与此同时,需求工程、软件过程、软件体系结构等方面的研究也取得了有影响的成果。第1章 软件工程概述 进入21世纪,Internet正在向智能网络时代发展,以网格计算(Grid Computing)和网络服务(Web Services)为代表的分布式计算日趋成熟,从而实现了信息充分共享和服务无处不在的应用环境;高信度计算(Trustworthy Computing)普遍引起了人们的高度重视,从而为人们创造了一个安全、可靠、值得信赖的环境。第1章 软件工程概述 1.2 软软 件件 危危 机机所谓软件危机,是指在计算机
13、软件的开发和维护过程中遇到的一系列严重问题。软件危机在20世纪60年代末全面爆发,至今四十多年过去了,虽然软件开发的新工具和新方法层出不穷,但是软件危机依然没有消除。(1)软件开发的成本和进度难以准确估计,延迟交付甚至取消项目的现象屡见不鲜。1995年,美国Standish咨询集团公布了题为“混沌”的研究报告,如图1.2所示的研究数据表明:在20世纪90年代初期,软件项目的平均成功率只有16.2%,在这里,成功的含义是指在计划的时间和预算内实现项目目标。仅1995年这一年间,有30%的项目在完工之前第1章 软件工程概述 就被取消了,其余53.8%的项目由于各种原因在开发过程中遇到了这样或那样的
14、问题,在开发成本、交付时间、产品功能或性能等方面没有实现预期的目标。近几年,有关统计资料显示:软件项目的平均成功率上升到26%,但仍有46%的项目超出预算和最后期限,另有28%的项目没有完成。第1章 软件工程概述 图1.2 20世纪90年代初期软件项目的成功率第1章 软件工程概述(2)软件存在着错误多、性能低、不可靠、不安全等质量问题。投入极大努力开发出来的软件常常出现人们无法预料的错误,甚至造成严重的后果。1996年6月,Ariane 5火箭在发射37秒之后突然发生爆炸,其错误原因是浮点数转换成整数时发生溢出,系统对此也没有提供相关的异常处理程序。就这样,一个简单的疏漏造成了这枚耗资70亿美
15、元的火箭发射失败。另一个例子是在1991年的海湾战争期间,美国对抗伊拉克的飞毛腿导弹曾发生过几次对抗失利,其中一枚导弹在沙特阿拉伯的多哈误击了28名美国士兵,而问题的症结在于导弹的软件存在一个累加计时的故障。一个很小的系统时钟错误积累起来就可能产生14个小时的误差,从而使跟踪系统失去准确度。今天,随着计算机网络应用的不断普及,第1章 软件工程概述 计算机病毒的传播、拒绝服务的攻击、网络信息的安全等问题日益突出,软件的质量保证成为人们关注的焦点。(3)软件成本在计算机系统的整个成本中所占比例越来越大。在过去的四十多年里,硬件性能至少跨越了8个重要的阶段,其成本也随着硬件技术的飞速发展而大幅度地下
16、降。但令人遗憾的是,软件开发的能力却未能与硬件的发展保持同步。伴随着软件规模和复杂性的不断增长,软件成本在整个系统成本中所占的比例也持续上升,图1.3显示了软件成本的上升趋势。第1章 软件工程概述 图1.3 软件成本在系统总成本中所占比例第1章 软件工程概述(4)软件维护极其困难,而且很难适应不断变化的用户需求和使用环境。在软件交付使用的初期,需要识别和纠正软件的错误,改正软件性能上的缺陷,避免实施中的错误使用。即使软件进入了正常的使用期,由于计算机新技术的出现和用户新需求的提出,也需要修改和改进软件。然而,软件维护依然是一件非常困难的工作,常常出现诸如错误难以修改或者修改又带来新的错误等现象
17、,长期不断的修改也引起了软件的退化。另外,由于软件开发本身的缺陷和软件维护技术的不成熟,软件维护需要消耗大量的工作量,从而造成维护成本相当昂贵。统计数据表明,软件维护费用占软件整个生存周期总费用的55%70%。第1章 软件工程概述 1.3 软软 件件 工工 程程1.3.1 软件工程的概念软件工程的概念1968年10月,NATO科学委员会在德国的加尔密斯(Garmisch,Germany)开会讨论软件可靠性与软件危机的问题,Fritz Bauer首次提出了“软件工程”的概念,他认为:软件工程是为了经济地获得能够在实际机器上高效运行的可靠软件而建立和使用的一系列好的工程化原则。后来,人们曾经多次给
18、出了有关软件工程的定义。这里引用IEEE Standard Glossary of Software Engineering Terminology给出的一个更为全面的定义:第1章 软件工程概述 软件工程是将系统性的、规范化的、可定量的方法应用于软件的开发、运行和维护,即将工程化应用到软件上;对中所述方法的研究。从上述定义中可以看出,软件工程包括以下两方面的内容:(1)软件工程是工程概念在软件领域里的一个特定应用。与其他工程一样,软件工程是在环境不确定和资源受约束的条件下,采用系统性的、规范化的、可定量的方法进行有关原则的实施和应用,这些原则一般是以往经验的积累和提炼,经过时间检验并证明是正确
19、的。因此,软件工程师需要选择和应用适当的理论、方法和工具,同时还要不断探索新的理论和方法,解决新的问题。第1章 软件工程概述(2)软件工程涉及软件产品的所有环节。人们往往偏重于软件开发技术,忽视软件项目管理的重要性。统计数据表明,导致软件项目失败的主要原因几乎与技术和工具没有任何关系,更多的是由于不适当的管理造成的。1.3.2 软件工程的三要素软件工程的三要素软件工程以关注软件质量为目标,由过程、方法和工具三个要素组成,如图1.4所示。第1章 软件工程概述 图1.4 软件工程的三要素第1章 软件工程概述 软件工程的方法为软件开发提供了“如何做”的技术,通常包括某种语言或图形的模型表示方法、良好
20、的设计实践以及质量保证标准等,其中使用最广泛的两种方法是传统的软件开发方法和当前流行的面向对象方法。软件工程的过程是管理和控制产品质量的关键,它定义了技术方法的采用、工程产品(包括模型、文档、数据、报告、表格等)的产生、里程碑的建立、质量的保证和变更的管理,从而将人员、技术、组织与管理有机地结合在一起,实现在规定的时间和预算内开发高质量软件的目标。第1章 软件工程概述 软件工具为软件工程方法提供了自动的或半自动的软件支撑环境,辅助软件开发任务的完成。现有的软件工具覆盖了需求分析、系统建模、代码生成、程序调试和软件测试等多个方面,形成了集成化的软件工程开发环境CASE(Computer Aide
21、d Software Engineering,计算机辅助软件工程),提高了开发效率和软件质量,降低了开发成本。第1章 软件工程概述 1.3.3 软件质量的特性软件质量的特性软件工程的一个重要目标是“开发出高质量的软件”,那么如何看待“软件质量”的含义呢?简单地说,软件质量是软件产品与明确的和隐含的需求相一致的程度,它通常由一系列的质量特性来描述。例如,除了要求软件正确运行之外,人们可能还希望软件运行的响应时间符合要求、软件使用方便快捷、程序代码易于理解等,而“程序代码易于理解”往往是一种用户没有明确提出的需求,但却是影响软件质量的重要因素。需要强调的是,软件质量并不取决于开发人员的观点,它通常
22、与用户、维护人员等提出的要求密切相关。图1.5显示了不同的软件质量视角。第1章 软件工程概述 图1.5 不同的软件质量视角第1章 软件工程概述 1.3.4 软件工程方法软件工程方法传统的软件开发方法主要是以功能分析和数据分析为基础的结构化方法,它以算法作为基本构造单元,强调自顶向下的功能分解,对功能和数据进行了一定程度的分离。结构化设计要求控制集中在高层模块中,不同模块之间的控制信息需要通过上、下调用来传递。随着软件系统的日益复杂,结构化开发方法暴露出严重的不足,主要体现在以下方面:(1)由于采用功能与数据分离的软件设计结构,它与人类的现实世界环境有着根本性的差别,因此,人们对现实世界的认识与
23、编程之间存在着理解上的鸿沟。第1章 软件工程概述(2)由于强调自顶向下的功能分解,上下层模块存在着十分紧密的依赖关系,因此系统的变动和修改十分困难,而且这也在很大程度上限制了软件的重用。(3)由于控制集中在高层模块中,模块之间的直接通信受到了限制,同时控制信息的传送效率低且易出错,因此,结构化开发方法无法适应需要突出控制特性的系统的要求。第1章 软件工程概述 面向对象方法从现实世界中客观存在的事物(即对象)出发,尽可能地运用人类的自然思维方式来构造软件系统。它运用人类在日常的逻辑思维中经常采用的思想方法与原则,例如抽象、分类、继承、聚合、封装等,将其贯穿于整个分析和设计过程中,实现了客观世界到
24、计算机系统的平滑过渡。当前,面向对象方法已成为软件工程学中的主流方法,其主要优势在于:(1)按照人类的自然思维方式,面对客观世界建立软件系统模型,有利于对问题域和系统责任的理解,也有利于人员的交流。(2)在整个开发过程中采用统一的概念和模型表示,填平了语言之间的鸿沟,使得开发活动之间能够平滑过渡。第1章 软件工程概述(3)在面向对象的方法中,系统由对象构成,对象是一个包含属性和操作的独立单元,对象之间通过消息联系。这样的系统一旦出错,容易定位和修改,系统的可维护性好。(4)对象所具有的封装性和信息隐蔽等特性,使其容易实现软件复用。对象类可以派生出新类,类可以产生实例对象,从而实现了对象类的数据
25、结构和操作代码的软构件的复用。图1.6显示了传统的软件工程方法与面向对象方法的比较。第1章 软件工程概述 图1.6 传统的软件工程方法与面向对象方法的比较第1章 软件工程概述 1.4 软件工程知识体系软件工程知识体系(SWEBOK)1.4.1 SWEBOK项目介绍项目介绍1998年,SWECC发起研究和制定软件工程知识体系(Software Engineering Body of Knowledge,SWEBOK)的项目。整个项目分为草人(Strawman)、石人(Stoneman)和铁人(Ironman)三个阶段。1998年9月完成“草人”版的SWEBOK指南,形成了软件工程知识体系的框架;
26、2001年5月完成“石人”版SWEBOK指南,目前最新发布的是SWEBOK指南V100(试用版)。开展SWEBOK项目的目的是为软件工程学科的边界提供一致确认的特征,为支持该学科的知识体系提供指导,其具体目标如下:第1章 软件工程概述(1)描述软件工程学科的内容和特征;(2)确定软件工程知识体系的各个专题;(3)促进软件工程知识体系在世界范围内的共识;(4)明确软件工程与其他相关学科(诸如计算机科学、项目管理、计算机工程、数学等)的关系,并设定软件工程学科的边界;(5)为软件工程课程计划的开发和职业资格的认证提供依据。第1章 软件工程概述 1.4.2 SWEBOK的组成的组成SWEBOK将软件
27、工程知识分解成若干知识域(Knowledge Areas)及其组成部分,并将其组织成一个多级层次化的体系结构,以此确定软件工程学科的内容和边界。在SWEBOK中,软件工程知识体系被划分为10个知识域,即软件需求、软件设计、软件构造、软件测试、软件维护、软件配置管理、软件工程管理、软件工程过程、软件工程工具与方法、软件质量,其组成结构如图1.7所示。第1章 软件工程概述 图1.7 软件工程知识体系的组成第1章 软件工程概述 1软件需求软件需求(Software Requirements)需求是解决现实世界问题所必须展示的特性。SWEBOK将软件需求知识域进一步划分为6个知识子域,分别是需求工程过
28、程、需求获取、需求分析、需求规格说明、需求验证和需求管理。(1)需求工程过程说明需求工程与整个软件工程过程的吻合程度,包括过程模型、过程参与者、过程支持与管理、过程质量改进等内容;(2)需求获取涉及从何处获取以及如何收集需求,包括需求来源和获取技术等内容;第1章 软件工程概述(3)需求分析涉及分析需求的过程,如发现和解决需求之间的冲突、发现系统边界及其与周围环境的交互、将软件需求细化成系统需求等,包括需求分类、概念模型、体系结构设计以及需求分配和需求协商等内容;(4)需求规格说明描述了需求文档的结构、质量和确认,包括系统需求定义文档和软件需求规格说明书两个部分;(5)需求验证的目的是在提交需求
29、分析结果之前找出问题,保证需求文档正确地定义了正确的系统,包括需求评审、开发原型、模型验证和验收测试等内容;第1章 软件工程概述(6)需求管理是一项跨越整个软件生命周期的活动,主要涉及变更管理和需求维护,以保证需求说明准确地反映了待开发或已开发软件,它包括变更管理、需求属性和需求跟踪等内容。2软件设计软件设计(Software Design)根据IEEE的定义,设计既是定义系统或构件的结构、组成、接口和其他特征的过程,也是该过程的结果。从过程来看,软件设计是软件生命周期中的一个活动,其任务是分析软件需求,从而生成有关系统内部结构与组成的描述,并以此作为软件构造的基础。从结果来看,软件设计必须描
30、述系统的体系结构,即系统被分解和组织成各个构件的方式以及这些构件之间的接口,并且详细描述这些构件以方便后续的构造。第1章 软件工程概述 SWEBOK将软件设计知识域进一步划分为6个知识子域,分别是基本概念、关键问题、构成与体系结构、质量分析与评价、设计符号以及设计策略与方法。(1)软件设计基本概念是理解软件设计的作用和范围的基础,包括软件设计的一般概念、软件设计的内容、设计过程和可采用的技术等;(2)软件设计关键问题包括并发性、事件控制与处理、分布性、错误和异常处理、交互系统和持久性等问题;(3)软件构成与体系结构主要包括体系结构风格、设计模式、程序及其框架的体系;(4)软件设计质量分析与评价
31、包括软件设计的质量属性、质量分析、评估工具与度量;第1章 软件工程概述(5)软件设计符号包括结构描述和行为描述;(6)软件设计策略与方法包括一般设计策略、面向功能的方法、面向对象的方法、以数据结构为中心的设计,以及诸如形式化与转换方法等其他方法。3软件构造软件构造(Software Construction)软件构造是软件工程的基本活动,其任务是通过编码、验证和单元测试构造出有意义的、可工作的软件。进一步分解软件构造知识域的首要方法是认识对软件构造最具影响的4项原则,即降低复杂性、预知多样性、结构化验证和使用外部标准;其次是认识软件构造的3种方法,即语言方法、形式化方法和可视化方法。第1章 软
32、件工程概述(1)降低复杂性涉及软件构造过程中用于减少复杂性的3个主要技术,即消除复杂性、自动消除复杂性以及使复杂性局部化;(2)预知多样性是预测软件在整个生命周期可能发生的变化,包括通用化、实验法和局部化3种技术;(3)结构化验证是指以模块化方式构造软件,以便能够在单元测试和后续的测试活动中容易地发现错误和遗漏;(4)由专用语言构造的软件在长期的使用过程中会遇到严重的障碍,因此,应当采用符合外部标准的构造语言(如一般编程语言),或者提供足够详细的语法说明,以方便人们理解。第1章 软件工程概述 4软件测试软件测试(Software Testing)软件测试是采用从无限执行域中适当挑选有限测试用例
33、集,对照预期指定的行为,动态验证程序实际行为的过程,包括基本概念和定义、测试级别、测试技术、测试相关度量和测试过程管理。(1)基本概念和定义包括测试术语、测试理论基础以及测试与其他活动的关系;(2)测试级别包括单元测试、集成测试和系统测试3个阶段,而从测试的目标划分,还可以分为验收测试、安装测试、a测试与b测试、功能测试、衰退测试、性能测试、压力测试、回归测试、恢复测试、配置测试和可用性测试等;第1章 软件工程概述(3)测试技术包括测试用例选取标准、测试技术以及如何选择和组合这些技术;(4)测试相关度量包括评价所测试的程序和评价所执行的测试;(5)测试过程管理涉及与测试管理相关的问题和测试活动
34、。第1章 软件工程概述 5软件维护软件维护(Software Maintenance)软件一旦交付使用,就进入维护阶段,其任务包括纠正软件运行时出现的错误、改进软件系统以便适应环境的变化和满足用户新的需求等。软件维护包括基本概念、维护过程、关键问题和维护技术这4个知识子域。(1)基本概念涉及软件维护的定义、类型和问题;(2)维护过程描述基于IEEE 1219和ISO/IEC 14764标准的过程模型以及有关活动;(3)关键问题涉及软件维护过程中的技术、管理、成本、预算和度量等方面的问题;(4)维护技术包括程序理解、再工程、逆向工程和影响分析等。第1章 软件工程概述 6软件配置管理软件配置管理(
35、Software Configuration Management)软件配置管理在明确的时间点上确定系统的配置,从而保证在整个系统生命周期中系统地控制配置的变化并维护配置的完整性和可跟踪性。软件配置管理包括配置过程管理、配置识别、配置控制、配置状态报告、配置审计以及软件发布管理与交付6个知识子域。(1)配置过程管理包括配置组织环境、配置约束与指南、配置计划与监督等;(2)配置识别就是确定要控制的配置项,为配置项及其版本建立标识模式,并建立用于采集和管理这些配置项的工具和技术;第1章 软件工程概述(3)配置控制对软件生命周期中的变化进行管理,包括申请、评估和批准软件变更、实施变更以及转移和放弃变
36、更等3个方面;(4)配置状态报告用于记录和报告软件配置管理所需的信息;(5)配置审计由软件功能配置审计、软件物理配置审计和软件基线审计等组成;(6)软件发布管理与交付包括软件建立和软件发布管理。第1章 软件工程概述 7软件工程管理软件工程管理(Software Engineering Management)软件工程管理包括组织管理、过程/项目管理、软件工程度量这3个知识子域。(1)组织管理由策略管理、个人管理、沟通管理、协调管理和采购管理等组成;(2)过程/项目管理包括项目启动和范围定义、计划的制定、规定的建立、项目评审和评价、项目收尾等;(3)软件工程度量涉及软件度量的基本原理,包括度量目标
37、、度量选择、软件度量及其发展、数据收集和软件测量模型。第1章 软件工程概述 8软件工程过程软件工程过程(Software Engineering Process)软件工程过程涉及软件工程过程本身的定义、实施、度量、管理、变更和改进,可进一步分为软件过程概念、过程基础设施、过程度量、过程定义、定性分析以及过程实施与变更这6个知识子域。(1)软件过程概念包括软件工程过程的活动和术语;(2)过程基础设施包括建立软件工程过程小组和经验工厂,从而为过程分析、实施和改进提供有力的支持;(3)过程度量描述软件工程过程的度量方法和范例;(4)过程定义描述过程定义类型、生命周期框架模型和软件过程模型等有关知识,
38、并说明这些定义的符号、方法与自动化;第1章 软件工程概述(5)定性分析主要包括过程定义评审和根本原因分析;(6)过程实施与变更包括过程实施与变更的范例、指南和效果评价。9软件工程工具与方法软件工程工具与方法(Software Engineering Tools and Methods)软件工程工具与方法包括软件开发工具和开发方法。其中:软件开发工具是支持软件开发过程的计算机工具;软件开发方法是指软件开发活动的组织方法,目的是系统化地组织开发活动以实现成功最大化。第1章 软件工程概述(1)软件开发工具包括需求分析、设计、构造、测试、维护、过程、质量、配置、管理、基础设施和其他活动所需的各种工具;
39、(2)软件开发方法包括启发式方法、形式化方法、原型法和其他混合方法等。10软件质量软件质量(Software Quality)软件质量是贯穿于整个软件工程活动的关注焦点,包括软件质量概念、软件质量保证(Software Quality Assurance,SQA)与验证和确认(Verification and Validation,VV)的目的与计划、SQA与V&V的活动与技术适用于SQA与V&V的度量。第1章 软件工程概述(1)软件质量概念包括质量值的度量、ISO 9126的质量描述、可靠性、特殊类型系统与质量要求;(2)SQA与V&V的目的与计划包括通用计划活动、SQA计划和V&V计划;(
40、3)SQA与V&V的活动与技术用于描述SQA与V&V的活动和计划,包括静态技术、动态技术以及其他的SQA与VV测试技术;(4)适用于SQA与V&V的度量描述用于SQA与V&V的度量技术,包括度量原理、测量、度量分析技术、缺陷特征以及有关数据使用等。第1章 软件工程概述 1.4.3 软件工程与其他相关学科的关系软件工程与其他相关学科的关系软件工程是一门交叉性的工程学科,如图1.8所示,它将计算机科学、数学、工程科学和管理科学等基本原理应用于软件开发的工程实践中,并借鉴传统工程的原则和方法,以系统的、可控的、有效的方式产生高质量的软件。第1章 软件工程概述 图1.8 软件工程与其他相关学科的关系第
41、1章 软件工程概述 软件工程以计算机科学和数学为基础,将这些学科的基本原理应用于构造软件的模型与算法,力求提出更系统化和更形式化的软件开发方法,并采用适当的方法验证即将开发的软件。然而,正确的软件开发实践不仅仅需要计算学科的基本原理,更重要的是将工程化的原则和方法应用于软件的分析与评价、规格说明、设计、实现和演化等过程。软件工程运用工程科学的基本原理,结合特定领域的基础知识和相关的专业知识,通过评估成本与确定权衡,提出合理的问题解决方案,在软件开发实践的基础上总结制定标准与规范,重用设计和设计制品。第1章 软件工程概述 事实证明,成功的软件开发往往离不开规范化的开发管理。软件工程将管理科学应用
42、于软件开发的计划、资源、质量、成本等管理,协调和控制整个过程与项目的进展,组织和建设开发团队,实施风险分析和变更管理,最终实现软件开发的目标。需要强调的是,由于软件自身的特殊性,软件工程与传统工程存在着明显的区别,它更强调抽象、建模、信息组织与表示以及变更管理,另外还包括软件开发过程的质量控制活动,而且持续的演变(即“维护”)也尤为重要。第1章 软件工程概述 1.5 软软 件件 过过 程程1.5.1 软件过程的概念软件过程的概念1任务思维与过程思维任务思维与过程思维在软件发展的前期阶段,人们强调软件开发的结果而忽略软件开发的过程,所采用的开发模式如图1.9所示。在这种任务思维的模式中,整个软件
43、开发过程仿佛是一个混沌的“黑盒子”,软件需求必须在开发初期完全确定下来,用户的交互只能发生在确定需求之时和产品发布之后,这种要求显然不符合软件开发的实际情况。软件更像是一种嵌入式的数字化知识,其形成是一个通过交互对话和抽象理解而不断演化的过程,尤其是在软件系统规模日益扩大的情况下,软件开发必须在适应需求不断变化的过程中迭代式地演进。第1章 软件工程概述 图1.9 软件开发的任务思维模式第1章 软件工程概述 Watts Humphrey首先将过程管理的原则和思想引入到软件开发之中,他认为:为了解决软件的问题,首要的步骤是将整个软件开发任务看做是一个可控的、可度量的和可改进的过程。在图1.10所示
44、的过程思维模式中,整个软件开发过程被划分成若干可管理的开发阶段,人们可以“听见”过程的声音,并让用户的声音与过程的声音相吻合。第1章 软件工程概述 图1.10 软件开发的过程思维模式第1章 软件工程概述 2软件过程的定义软件过程的定义在软件工程的三要素中,软件过程将人员、技术、组织与管理有机地结合在一起,下面给出的定义说明了软件过程的“黏合”性质:软件过程是软件工程人员为了获得软件产品而在软件工具的支持下实施的一系列软件工程活动。图1.10显示了软件过程的基本组件与运行机制。其中软件过程的基本元素由一系列软件工程活动和活动之间的关系组成,通过一系列顺序和步骤执行这些活动,可以产生诸如代码、文档
45、和数据等各种过程制品,最终取得预期的过程结果。另外,软件过程需要参与活动的人员和活动工具等过程资源的支持,并通过反馈和度量过程的结果来实现过程的可持续改进。第1章 软件工程概述 3软件过程的基本活动软件过程的基本活动由于软件的复杂性和多样性,软件开发并没有一个理想的过程,不同的开发组织或者不同的软件类型往往存在着完全不同的软件开发过程。尽管如此,一般的软件过程都包括问题提出、软件需求规格说明、软件设计、软件实现、软件确认和软件演化等基本活动。1)问题提出软件产品往往起源于人们的设想或者现实问题,但是这些设想或问题的描述可能是模糊的、不合理的或不可能实现的。因此,人们通过开展技术探索和市场调查等
46、活动,研究系统的可行性和可能的解决方案,确定待开发系统的总体目标和范围。第1章 软件工程概述 在可行性分析过程中,人们需要研究现有的软件和硬件技术是否能够实现待开发系统的要求、实际开发是否亏本等问题,从技术、市场、效益等方面确定该系统是否值得开发。2)软件需求规格说明在完成可行性研究和软件计划之后,系统分析人员开始着手分析、整理和提炼所收集到的客户需求,建立完整的需求分析模型,编写软件需求规格说明。最后,通过评审需求规格说明,确保对用户需求达到共同的理解与认识。软件需求规格说明是将需求分析活动中获得的信息以文档的形式确定下来,它明确地描述了软件的功能,列出软件必须满足的所有约束条件,并定义软件
47、的输入和输出接口。第1章 软件工程概述 3)软件设计软件设计的目标是决定软件怎么做,设计人员根据软件需求规格说明文档,确定软件的体系结构,再进一步设计每个系统部件的实现算法、数据结构和接口等,编写软件设计说明书,并组织进行设计评审。软件设计说明书是将体系结构设计和详细设计的结果以文档的形式描述出来。其中,体系结构设计确定组成该系统的所有子系统及其相互之间的关系,详细设计确定每一个子系统的接口、数据结构和实现算法。4)软件实现软件实现是将所设计的各个子系统编写成计算机可接受的程序代码。与实现相关的文档就是源程序以及合适的注释。第1章 软件工程概述 5)软件确认软件确认是检查和验证所开发的系统是否
48、符合客户的期望,它涉及从用户需求定义到软件实现的每一个阶段的审查和评审,以及程序实现之后的软件测试。软件测试首先测试系统的各个组件,然后将各个组件集成在一起进行测试,最后使用客户的数据测试整个产品的功能和性能是否满足要求。在软件确认的过程中,一旦发现软件有缺陷,开发人员就需要回到前面的开发阶段进行修改,然后再进行修改后的确认,这是一个不断反复的过程。第1章 软件工程概述 6)软件演化人们一直习惯于将软件过程划分为软件开发和软件维护两部分。软件开发覆盖从概念的提出到形成一个可运行系统的整个过程;软件维护则是系统投入使用后所产生的修改。于是,人们总是将软件开发视为一项富有创造性的工作,而认为软件维
49、护工作缺少挑战性和吸引力。今天,大部分的软件都是在已有组件或原有系统的基础上开发出来的,开发与维护的界限越来越不清晰,因此整个软件过程被看做是一个不断演化的过程。第1章 软件工程概述 4软件过程的制品软件过程的制品在软件过程的不同阶段,有可能产生各种不同的软件制品,诸如需求规格说明、设计说明、源程序与构件、测试用例、用户手册以及各种开发管理文档等。图1.11列出了软件过程的一些基本活动以及所产生的主要过程制品。第1章 软件工程概述 图1.11 软件过程的基本活动及其制品第1章 软件工程概述 软件过程制品涉及软件需求、软件设计、软件实现、软件测试和软件实施等活动产生的结果,这些制品通常在不同的开
50、发活动之间进行转移和演进,其主要内容包括:(1)软件需求制品:构想文档描述了所开发系统的整个构想,形成了投资方和开发组织对项目范围的共同认定;需求模型涉及系统原型和描述系统需求的各种模型,诸如用例模型和领域模型等;软件需求规格说明清楚地描述了所开发软件的功能、性能和接口等要求。(2)软件设计制品:软件体系结构文档描述系统的基本构件及其之间的关系;设计模型反映各个构件的内部结构和行为信息。第1章 软件工程概述(3)软件实现制品:源代码表示构件的具体实现;目标代码是源代码编译产生的文件;可执行构件包括定制的组件、商业组件或遗留组件等。(4)软件测试制品:测试规程描述测试运行环境、测试方法和测试步骤