软件工程授课教师:蓝天联系电话:13488929723电子邮箱:lantian1029@uestc.edu.cn第七章软件维护软件维护概述1软件维护技术5软件维护过程模型3应注意的问题2小结6本章学习目标123掌握:软件维护的基本类型;软件的可维护性的决定因素;IEEE软件维护的过程模型。了解:软件维护的困难性所在;软件维护在管理上的要点;软件维护的主要程序理解技术;软件再工程的过程模型。理解:软件维护的基本概念;软件维护在技术上的要点;维护费用的估算;软件逆向工程的概念及主要内容。软件维护概述•软件维护的基本概念•软件维护的基本类型•维护的困难性软件维护的定义•IEEE/EIA12207[ISO/IEC2008]中对软件维护的定义是:软件维护是指由于软件产品出现问题或需要改进而对代码及相关文档的修改,其目的是对现有软件产品进行修改的同时保持其完整性。软件维护的必要性1.软件维护能够改正错误。2.软件维护能够改善设计。3.软件维护能够实现软件的改进4.软件维护能够与其他系统进行交互。5.软件维护能够为使用不同的硬件、软件、系统的新性能以及通讯设备等而对软件进行改进。6.软件维护能够完成遗留程序的移植。7.软件退出使用。软件维护的成本•软件维护阶段一般要消耗软件生命周期中经费开支的大部分。•70年代用于维护已有软件的费用只占软件总预算的35%~40%,80年代上升为40%~60%,90年代已经占70%~80%。软件维护的基本类型•维护的类型有四种:o纠错性维护o适应性维护o完善性维护o预防性维护•国外的统计数字表明,完善性维护占全部维护活动的50%~66%,纠错性维护占17%~21%,适应性维护占18%~25%,其他维护活动只占4%左右纠错性维护•在软件交付使用后,因开发时测试的不彻底、不完全,必然会有部分隐藏的错误遗留到运行阶段。•这些隐藏下来的错误在某些特定的使用环境下就会暴露出来。•为了识别和纠正软件错误、改正软件性能上的缺陷、排除实施中的误用,应当进行的诊断和改正错误的过程就叫做纠错性维护。适应性维护•在使用过程中,o外部环境(新的硬、软件配置)o数据环境(数据库、数据格式、数据输入/输出方式、数据存储介质)o可能发生变化。•为使软件适应这种变化,而去修改软件的过程就叫做适应性维护。完善性维护•在软件的使用过程中,用户往往会对软件提出新的功能与性能要求。•为了满足这些要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性。•这种情况下进行的维护活动叫做完善性维护。•实践表明,在几种维护活动中,完善性维护所占的比重最大。即大部分维护工作是改变和加强软件,而不是纠错。•完善性维护不一定是救火式的紧急维修,而可以是有计划、有预谋的一种再开发活动。•事实证明,来自用户要求扩充、加强软件功能、性能的维护活动约占整个维护工作的50%。预防性维护•预防性维护是为了提高软件的可维护性、可靠性等,为以后进一步改进软件打下良好基础。•预防性维护定义为:采用先进的软件工程方法对需要维护的软件或软件中的某一部分(重新)进行设计、编制和测试。维护的困难性1、配置管理工作不到位2、人员变动造成的影响3、许多软件的可读性差4、任务紧、时间急的情况下处理维护请求软件维护中应注意的问题(一)•技术方面o程序的理解o测试o影响分析o可维护性影响分析的目标•决定改变的范围。这对合理计划和完成工作有重要意义•对完成工作所需的资源进行精确的估计。•分析改变的费用/效益比•由于对软件进行变更往往是牵一发而动全身的,因此如果给出了一个变更,必须考虑到与之相关的其他复杂情况决定软件可维护性的主要因素(1)可理解性(2)可测试性(3)可修改性(4)可移植性(5)可重用性影响软件可维护性的维护环境的因素(1)软件维护的文档(2)软件的运行环境(3)软件的维护组织(4)软件维护质量软件维护中应注意的问题(二)•管理方面o契合组织的目标o人力资源o过程o如何组织维护活动o外包软件维护中应注意的问题(三)•维护费用估算o参数模型M=P+K×exp(c‐d)•M是维护用的总工作量,P是生产性工作量,K是经验常数,•c是复杂程度,d是维护人员对软件的熟悉程度o基于经验•专家判断、类推、工作分解结构软件维护过程模型•IEEE维护模型图分类与鉴别阶段分析阶段设计阶段实现阶段系统测试阶段验收测试阶段交付阶段软件维护技术•程序的理解•软件再工程•软件逆向工程程序的理解•清晰简明的文档•代码浏览工具(SourceInsight)•程序理解的任务:以软件维护、升级和再工程为目的,在不同的抽象级别上建立基本软件的概念模型,包括从代码本身的模型到基本应用领域的模型,即建立从问题/应用域到程序设计/实现域的映射集程序理解的具体任务•通过检查单个的程序设计结构,程序被表示成抽象语法树、符号表或普通源文本•尽量做到程序隐含信息的显性表示及程序内部关系的可视化•从源代码中提取信息,并存放在通用的数据库中,然后通过查询语言对数据库进行查询•检查程序构造过程中的结构关系,明确表示程序组成部分之间的依赖关系。•识别程序的高层概念,如标准算法、数据结构、语法及语义匹配等。软件再工程•定义•软件再工程(Re-engineering)指对现有软件进行仔细审查和改造,对其进行重新构造,使之成为一个新的形式,同时包括随之产生的对新形式的实现。软件再工程模型数据重构正向工程库存目录分析代码重构逆向工程文档重构软件逆向工程•软件逆向工程(SoftwareReverseEngineering)是分析目标系统,识别系统的构件及其交互关系,并且通过高层抽象或其他形式来展现目标系统的过程。•对逆向工程而言,抽象的层次、完备性、工具与分析人员协同工作的程度、过程的方向性等因素是需要考虑的。逆向工程过程逆向工程主要内容一、数据的逆向工程二、处理的逆向工程三、用户界面的逆向工程四、逆向工程的工具数据的逆向过程•数据的逆向工程发生在不同的抽象层次o内部数据结构的逆向工程o数据库结构的逆向工程•对新数据模型实施再工程o构造一个初始的对象模型o确定候选键o精化实验性的类o定义一般化关系o找出关联关系处理的逆向过程•为了理解过程抽象,需要在不同的抽象级别(系统级、程序级、构件级、模式级和语句级)分析代码•对大型系统,通常用半自动方法完成逆向工程。使用自动化工具帮助软件工程师理解现有代码的语义,然后将该过程的结果传递给重构和正向工程工具以完成再工程过程。用户界面的逆向工程弄清几个问题:•界面必须处理的基本动作是什么?•系统对这些动作的行为反应的简要描述是什么?•有哪些界面的等价概念是相关的?逆向过程的工具•静态模型逆向工具oRationalRoseoRigioJBPAS•动态模型逆向工具oSCEDoISVisoBorlandTogether本章小结•软件维护可以分为纠错性维护、适应性维护、完善性维护、预防性维护。•软件维护实践中经常会遇到各种困难,需要在技术、管理方面进行考虑,并对维护费用进行估算。•软件维护按IEEE维护过程模型可以分为七个阶段。•程序的理解对软件维护具有重要意义,程序理解的任务就是要揭示程序的功能与实现机制。•软件的再工程是对现有软件进行仔细审查和改造,进行重新构造,最终成为一个新的形式。六种活动构成了再工程的循环模型。•软件逆向工程包括数据逆向工程、处理逆向工程和用户界面逆向工程。