第七章软件维护与软件再工程§7.1软件维护的概念四类维护活动:•改正性维护•适应性维护•扩充与完善性维护•预防性维护三类维护所占比例:其它维护5%适应性维护25%改正性维护20%扩充与完善性维护50%改正性维护占全部维护量的比率已从80年代初的20%大幅度下降,90年代初一些公司的产品差错率已接近于零各类维护活动的根本目的是延长软件生存期其它维护4%软件生存周期软件诞生计划分析设计编码测试运行和维护(简称维护)改善期稳定期陈旧期1年-10年2个月-2年重构软件工程周期§7.2软件维护的特点MP+Ke=(c-d)M:维护工作总工作量P:生产性工作量K:经验常数c:复杂度d:对该软件熟悉程度的度量7.2.1维护的成本7.2.2维护中的典型问题(1)难以跟踪软件版本的进化过程,软件的变化未在文档中反映出来.(2)难以跟踪软件的创建过程.(3)难以读懂他人程序.(4)无文档或不全.(5)软件人员流动性大.(6)设计时未考虑修改需要,修改困难.(7)维护工作无吸引力,缺乏成就感.§7.3软件的维护任务7.3.1维护组织7.3.2维护报告维护要求表软件维护人员提供给用户的空白的维护要求表,也称为软件问题报告表,这个表格由要求一项维护活动的用户填写。软件维修报告满足维护要求表中的要求所需要的工作量;维护要求的性质;这项要求的优先次序;与修改有关的事后数据。维护阶段的事件流不管维护类型如何,都需要进行同样的技术工作。这些工作包括修改软件设计、复查、必要的代码修改、单元测试和集成测试(包括使用以前的测试方案的回归测试)、验收测试和复审。不同类型的维护强调的重点不同,但是基本路径是相同的。维护事件流中最后一个事件是复审,它再次检验软件配置的所有成分的有效性,并且保证事实上满足了维护要求表中的要求。软件过程的输出信息可以分为3类:①计算机程序(源代码和可执行程序);②描述计算机程序的文档(供技术人员或用户使用);③数据(程序内包含的或在程序外的)。上述这些项组成了在软件过程中产生的全部信息,我们把它们统称为软件配置,而这些项就是软件配置项。7.3.4保存维护记录维护过程中作应记录的数据程序标识源程序语句数目机器代码指令条数..............以收集的数据为基础构造维护数据库,供维护评价使用.7.3.5评价维护活动从七个方面度量(评价)维护工作:(1)每次程序运行平均失效的次数;(2)用于每一类维护活动的总人时数;(3)平均每个程序、每种语言、每种维护类型所做的程序变动数;(4)维护过程中增加或者删除一个源语句平均花费的人时数;(5)维护每种语言花费的平均人时数;(6)一张维护要求表的平均周转时间;(7)不同维护类型所占的百分比。7.4软件可维护性7.4.1软件可维护性的定义软件可维护性是指纠正软件系统出现的错误和缺陷,以及为满足新的要求进行修改、扩充或压缩的难易程度。或者:维护人员理解、改正、改动或者改进这个软件的难易程度。7.4.2可维护性的度量度量程序可维护性的7个特性在各类维护中的侧重点改正性维护适应性维护完善性维护可理解性可测试性可修改性可靠性可移植性可重用性效率§7.5提高可维护性的方法建立明确的软件质量目标和优先级使用提高软件质量的技术和工具进行明确的质量保证审查选择可维护的程序设计语言改进程序的文档维护老化代码§7.6预防性维护维护老程序的方法:(1)反复多次的做修改程序的尝试;(2)仔细分析程序尽可能多得掌握程序的内部工作细节,以便更加有效的修改它;(3)在深入理解原有设计的基础上,用软件工程方法重新设计、重新编码和测试那些需要变更的软件部分;(4)以软件工程方法学为指导,对程序全部重新设计、编码和测试,为此可以使用逆向工程和再工程工具来帮助理解原有的设计。预防性维护:把今天的方法学应用到昨天的系统上,以支持明天的需求。§7.7软件再工程7.7.1软件再工程在软件复用中,有问题是与现有系统密切相关的例如:—现有软件系统如何适应当前技术的发展及需求的变化,采用更易于理解的、适应变化的、可复用的系统软件构架并提炼出可复用的软件构件?—现存大量的遗产软件系统(LegacySoftware)由于技术的发展,正逐渐退出使用,如何对这些系统进行挖掘、整理,得到有用的软件构件?—已有的软件构件随着时间的流逝会逐渐变得不可使用,如何对它们进行维护,以延长其生命期,充分利用这些可复用构件?软件再工程(SoftwareReengineering)正是解决上述问题的主要技术手段。软件再工程是一类软件工程活动,是一个工程过程,它将逆向工程、重构和正向工程组合起来,将现存系统重新构造为新的形式。再工程的基础是系统理解,包括对运行系统、源代码、设计、分析、文档等的全面理解。但在很多情况下,由于各类文档的丢失,只能对源代码进行理解,即程序理解。它能够使我们:增进对软件的理解;提高软件自身的可维护性、复用性或演化性.软件再工程过程模型代码重构数据重构正向工程库存目录分析文档重构逆向工程软件再工程相关术语间关系信息库1类视图:非过程性描述、元描述例:规格说明再工程3类视图:过程性描述例:源程序再工程2类视图:伪过程性描述、结构性描述例:DFD、PDLA2类视图:分析再工程逆向工程设计恢复再工程逆向工程设计恢复再工程A1类视图:分析A3类视图:分析分解综合生成视图软件视图Softwareview有关软件的一种表达形式或报告;视图分类:1类视图:2类视图:3类视图:A类视图:伴随上述各类的分析视图;A1类视图是对1类视图的分析信息;A2类视图是有关2类视图的分析信息;A3类视图是由3类视图得到。软件视图示例信息库视图编辑器DFD视图编辑器Petri网视图编辑器ERA图视图编辑器跟踪矩阵XXXReq1Req2Prog1Prog2Prog3视图编辑器程序结构图视图编辑器流程图视图编辑器规格说明再工程信息库及其产品软件文档分析结果信息库设计成果规格说明各种图度量值分析、分解器源程序或其模板(进入点)源程序自动进行再工程的过程软件软件的新视图语法分析器语义分析器视图合成器信息库其他产品经过再工程过程可获得的信息•格式•图形•文档•度量值•逻辑•报告7.7.2库存目录分析仔细分析库存目录,按照业务重要程度、寿命、当前可维护性、预期的修改次数等标准,把库中的应用系统排序,从中选出再工程的候选者,然后明智地分配再工程所需要的资源。开发和维护者不应等待用户的维护申请,可先选择以下类型程序作为预防性维护对象:(1)预计若干年内将继续使用的程序(2)当今正成功使用的程序(3)最近的将来要进行大修改和完善的程序7.7.3文档重构(1)保持现状(2)针对系统中当前正在修改的那些部分建立完整文档(3)如果某应用系统是完成业务工作的关键,而且必须重构全部文档,则仍然应该设法把文档工作减少到必需的最小量。7.7.4逆向工程逆向工程(反推工程reverseengineering)从现有软件恢复设计信息(有用的维护信息)非结构化、无文档的源代码或目标代码设计的恢复过程软件的全部文档逆向工程恢复信息的级别:(1)实现级:程序的抽象语法树、符号表等信息(2)结构级:反映程序分量之间相互依赖关系的信息,如调用图、结构图等.(3)功能级:反映程序段功能和段间关系的信息(4)领域级:反映程序分量与应用领域概念间对应关系的信息抽象级别低高信息的抽象级别越高,它与代码距离越远,通过逆向工程恢复的难度越大,自动工具支持的可能性变小逆向工程源程序目标代码反汇编、反编译程序分析技术:程序结构分析工具程序功能分析工具源程序概要设计详细设计概要设计需求分析7.7.5正向工程正向工程也称为革新或者改造,这项活动不仅从现有程序中恢复设计信息,而且使用该信息去改变或者重构现有系统,以提高整体质量。正向工程应用软件工程原理、概念、技术和方法来重新开发某个现有的应用系统。在大多数情况下,被再工程的软件不仅能构重新实现现有系统的功能,而且加入了新功能和提高了整体性能。7.7.6代码重构重构可疑模块的代码首先,用重构工具分析源代码,标注出需要重构的代码然后,自动重构有问题的代码;最后,复审和测试生成的重构代码。7.7.7数据重构发生在较低抽象层次上,是一种全范围内的再工程活动。在大多数情况下,数据重构始于逆向工程活动,分解当前使用的数据体系结构,必要时定义数据模型,标识数据对象和属性,并且从软件质量的角度复审现存的数据结构。7.7.3为什么要实施软件再工程•再工程可帮助降低软件演化风险•再工程可帮助补偿软件投资•再工程可使得软件易于进一步变更•再工程有广阔市场•再工程扩大了CASE工具集•再工程是推动自动软件维护的动力第八章软件项目管理估算软件规模工作量估算进度计划人员组织质量保证软件配置管理能力成熟度模型8.1估算软件规模1、代码行技术L=6a+4m+b由多名有经验的软件工程师分别作出估计。每个人都估计程序的最小规模a,最大规模b和最可能的规模m。LOCKLOC2、功能点技术(1)信息域特性输入项数:用户向软件输入的项数,这些输入给软件提供面向应用的数据;输出项数:软件向用户输出的项数,它们向用户提供面向应用的信息;查询数:查询就是一次联机输入,它导致软件以联机输出方式产生某种即时响应;主文件数:逻辑主文件的数目;外部接口数:机器可读的全部接口的数量,用这些接口把信息传送给另一个系统。(2)估算功能点的步骤A、计算未调整的功能点数UFPB、计算技术复杂性因子TCPTCF=0.65+0.01×DI其中,DI是14种技术因素对软件规模的综合影响程度。C、计算功能点数FPFP=UFP×TCF8.2工作量估算静态单变量模型动态多变量模型COCOMO2模型8.3进度计划估算开发时间Gantt图工程网络估算工程进度关键路径机动时间8.4人员组织民主制程序员组主程序员组现代程序员组图Putnam_Norden曲线高低计划需求分析初步设计详细设计编码单元测试整体测试功能测试管理人员高级技术人员初级技术人员8.5质量保证软件质量软件与明确地和隐含地定义的需求相一致的程序。定义强调了三个要点:(1)软件需求是度量软件质量的基础,与需求不一致就是质量不高(2)指定的开发标准定义了一组指导软件开发的准则,如果没有遵守这些准则,几乎肯定会导致软件质量不高(3)通常,有一组没有显式描述的需求,如果软件满足明确描述的需求,却不满足隐含的需求,那么软件的质量仍然是值得怀疑的。产品运行产品转移产品修改可理解性可维修性灵活性可测试性可移植性可再用性互运行性正确性完整性健壮性可用性效率风险软件质量因素与产品活动的关系软件质量保证措施SQA的措施主要有:基于非执行的测试(复审或者评审)基于执行的测试程序正确性证明8.6软件配置管理软件配置管理是在软件的整个生命期内管理变化的一组活动。具体地说,这组活动用来:标识变化控制变化确保适当地实现了变化向需要知道这类信息的人报告变化软件配置软件配置项:计算机程序、描述计算机程序的文档、数据。基线:通过了正式复审的软件配置项。软件配置管理过程软件配置管理可以看作是应用于整个软件过程的软件质量保证活动,是专门用来管理变化的软件质量保证活动。软件配置管理的五项任务:标识、版本控制、变化控制、配置审计、报告。8.7能力成熟度模型能力成熟度模型的主要思想因为问题是管理软件过程的方法不恰当造成的,所以采用新技术并不会自动提高软件生产率和软件质量,应该下大力气改进对软件过程的管理。能力成熟度模型的五个成熟度等级初始级、可重复级、已定义级、已管理级、优化级据美国卡内基.梅隆大学SEI统计,至2001年6月底,CMM的认证情况如下表所示。CMM级别世界软件企业通过CMM的数量世界软件企业通过CMM的份额5级41家3%4级54家4%3级232家17%2级438家32%1级600家44%级别特点1初始级软件开发过程是一个偶然的甚至无序的过程,很少有明确的定义,成功完全依赖于个体的能力.2重复级实施基本的项目管理:跟踪软件成本、进度和功