第8章软件维护软件维护的基本概念软件维护是指软件系统交付使用以后,为了改正错误或满足新的需求而修改软件的过程。软件维护工作处于软件生命期的最后阶段,维护阶段是软件生存期中最长的一个阶段,其费用高达整个软件生命期花费的约60%-70%。生命周期工程周期运行维护周期完善性维护(PerfectiveMaintenance)纠错性维护(CorrectiveMaintenance)适应性维护(AdaptiveMaintenance)预防性维护(PreventiveMaintenance)按照不同的维护目的,维护工作可分成4类。软件维护的类型完善性维护(PerfectiveMaintenance)纠错性维护(CorrectiveMaintenance)适应性维护(AdaptiveMaintenance)预防性维护(PreventiveMaintenance)按照不同的维护目的,维护工作可分成4类。软件维护的类型扩充原有系统的功能,提高系统的性能,提高软件运行的效率,满足用户的实际需要而进行的维护活动。当一个软件系统投入使用和成功地运行时,用户会根据业务发展的实际需要,提出增加新功能、修改已有功能以及性能的改进要求等。完善性维护(PerfectiveMaintenance)纠错性维护(CorrectiveMaintenance)适应性维护(AdaptiveMaintenance)预防性维护(PreventiveMaintenance)按照不同的维护目的,维护工作可分成4类。软件维护的类型软件测试不可能找出一个软件系统中所有潜伏的错误,所以当软件在特定情况下运行时,这些潜伏的错误可能会暴露出来。对在测试阶段未能发现的,在软件投入使用后才逐渐暴露出来的错误的测试、诊断、定位、纠错以及验证、修改的回归测试过程,称为纠错性维护。完善性维护(PerfectiveMaintenance)纠错性维护(CorrectiveMaintenance)适应性维护(AdaptiveMaintenance)预防性维护(PreventiveMaintenance)按照不同的维护目的,维护工作可分成4类。软件维护的类型计算机的软、硬件环境,数据环境在不断的变化,使运行的软件能适应运行环境或者数据的变动而修改软件的过程称为适宜性维护。完善性维护(PerfectiveMaintenance)纠错性维护(CorrectiveMaintenance)适应性维护(AdaptiveMaintenance)预防性维护(PreventiveMaintenance)按照不同的维护目的,维护工作可分成4类。软件维护的类型为了进一步改善软件的可靠性和易维护性,或者为预见的将来软件运行和维护打下更好的基础而对软件进行修改。由于对于该类维护工作必须采用先进的软件工程方法,对需要修改的软件或部分进行设计、编码和测试。对该类维护工作的必要性有争议,它所占的比例较小。纠错性维护适应性维护完善性维护预防性维护纠错性维护25%适应性维护21%完善性维护50%预防性维护4%各类维护所占的比例针对以上几种类型的维护,可采取相应的维护策略,以提高维护效率,降低维护成本。图中表示各种维护所占的比例,显然完善性维护所占的比例最大。软件维护策略软件维护的策略软件维护的特性一、时间长、工作量大、成本高维护阶段是软件生存期中最长的一个阶段,软件维护的工作量占整个软件生存期的70%以上,而且还在逐年增加。二、维护的副作用维护的副作用是指由于修改程序而导致新的错误或者新增加一些不必要的活动。1、修改代码的副作用在修改源代码时,可能引起的错误。2、修改数据的副作用在修改数据结构时,有可能造成软件设计与数据结构不匹配,因而导致软件出错。数据副作用就是修改软件信息结构导致的结果。3、修改文档的副作用对软件的数据流、软件结构、模块逻辑等进行修改时,必须对相关技术文档进行相应修改。但修改文档过程会产生新的错误,导致文档与程序功能不匹配,缺省条件改变等错误,产生文档的副作用。三、软件维护的困难由于软件维护工作通常并不由软件的设计和开发人员来完成,维护人员首先要对软件各阶段的文档和代码进行分析、理解。因而出现了理解别人的程序困难、文档不齐等问题,尤其是对大型、复杂系统的维护,更加困难和复杂,甚至是不可能的!结构化维护与非结构化维护非结构化维护—缺乏必要的文档说明,文档缺少或者不一制,难于确定数据结构、系统接口等特性,这样的维护工作令人生畏,事倍功半。太累了!受不了啦!几万行程序怎么改哦???结构化维护—指软件开发过程是按照软件工程方法进行的,开发各阶段的文档齐全,软件的维护过程,有一整套完整的方案、技术、审定过程及文档。可以看到,维护工作的难度及工作量的大小,明显与前期的开发工作密切相关。软件维护的困难软件维护的特性软件维护的工作量模型维护活动分为生产性活动和非生产性活动。生产性活动包括分析评价、修改设计和编写程序代码等。非生产性活动包括理解程序代码,解释数据结构,接口特点和设计约束等。Belady和Lehman提出软件维护工作模型:M=P+K*EXP(C-D)其中:M—维护工作的总工作量P—生产性活动的工作量K—经验常数C—程序复杂度(由非结构化维护引起的)D—对维护软件熟悉程度的度量显然,若C越大,D越小,则维护工作量成指数增长,为此,必须防止出现非结构化维护并尽可能由熟悉软件的原开发人员参加维护。软件维护的工作量模型软件维护的过程软件维护是一件复杂而困难的事,必须在相应的技术指导下,按照一定的步骤进行。•组织•流程•管理维护组织下图给出了一种典型的维护组织方式。维护申请维护管理员系统管理员维护人员配置管理员修改批准人员软件系统软件维护组织其中,维护管理员可以是某个人,也可以是一个包括管理人员、高级技术人员等在内的小组。用户维护人员确认维护类型维护实施评价优先级进行问题分析复审评价错误严重程度进行问题分析确定更改要求维护要求完美性适应性将安排好的工作量列入计划低高纠错性严重不严重安排改正性维护将改正错误列入计划人员安排交付使用的软件理解分析程序安排计划修改程序测试程序软件维护的工作流程图修改过的软件维护工作的流程下图描述了实施软件维护的工作流程,一个维护申请经过评审后,首先要确定维护的类型,还要分辨错误的严重程度或修改优先级的高低,分别处理。人员安排维护工作的组织管理软件维护工作不仅是技术性的,它还需要大量的管理工作与之相配合,才能保证维护工作的质量。下图描述了软件维护的管理流程。维护修改建议分析修改建议是否合理提交管理部门审查是否同意修改撤销NYNY进行测试提交管理部门审批是否批准更新主文档Y更新其他文档提交使用修改N软件维护的管理流程•许多软件的维护十分困难,原因在于这些软件的文档不全、质量差、开发过程不注意采用好的方法,忽视程序设计风格等。•许多维护要求并不是因为程序中出错而提出的,而是为适应环境变化或需求变化而提出的。•为了使得软件能够易于维护,必须考虑使软件具有可维护性软件可维护性的定义软件可维护性是指纠正软件系统出现的错误和缺陷,以及为满足新的要求进行修改、扩充或压缩的容易程度。可维护性、可使用性、可靠性是衡量软件质量的主要质量特性,也是用户十分关心的几个方面。软件的可维护性是软件开发阶段各个时期的关键目标。软件可维护性目前广泛使用的是用如下的七个特性来衡量程序的可维护性。可理解性可使用性可测试性可移植性可修改性效率可靠性而且对于不同类型的维护,这七种特性的侧重点也不相同。表各类维护中的侧重点改正性维护适应性维护完善性维护可理解性√可测试性√可修改性√√可靠性√可移植性√可使用性√√效率√这些质量特性通常体现在软件产品的许多方面;为使每一个质量特性都达到预定的要求,需要在软件开发的各个阶段采取相应的措施加以保证。这些质量要求要渗透到而各开发阶段的各个步骤当中。因此,软件的可维护性是产品投入运行以前各阶段面向上述各质量特性要求进行开发的最终结果。可维护性的度量质量检查表是用于测试程序中某些质量特性是否存在的一个问题清单。评测者针对检查表上的每一个问题,依据自己的定性判断,回答“Yes”或者“No”。质量测试和质量标准用于定量分析和评价程序的质量。由于许多质量特性是相互抵触的,可用以下度量标准,去度量不同的质量特性。可维护性可理解性可靠性可测试性可修改性可移植性可使用性效率可维护性的度量标准⑴可理解性文档化;模块化;“90-10测试法”:Shneiderman提出一种的一种衡量维护可理解性的方法,即让有经验的程序员阅读10分钟要测试的程序,然后如能凭记忆和理解写出90%的程序,则称该程序是可理解的。⑵可靠性度量的主要标准有:平均失效间隔时间、平均修复时间、有效性。植入模型:根据程序错误统计数字,进行可靠性预测。根据程序文本复杂性,预测软件可靠性。⑶可测试性表明论证软件正确性的容易程度。对于程序模块,可用程序复杂性来度量可测试性。可维护性的度量1可维护性的度量⑷可修改性一个可修改的软件应当是可理解的、通用的、灵活的、简单的。测试可修改性的一种定量方法是修改练习,其基本思想是通过做几个简单的修改,来评价修改难度D:D=A*n/C其中C是程序中各个模块的平均复杂性,A是要修改的n个模块的平均复杂性。A和C可用任何一种度量程序复杂性的方法计算。⑸可移植性表明软件转移到一个新的计算环境的可能性的大小;或者软件能有效地在各种环境中运行的容易程度。⑹效率包括时间和空间的效率。⑺可使用性从用户的角度出发,将可使用性定义为程序方便、实用及易于使用的程度。可维护性的度量提高可维护性的方法提高软件系统的可维护性,并不是维护阶段才进行的过程,而是贯穿于整个软件分析、开发实现的全过程:建立明确的软件质量目标使用提高软件质量的技术和工具进行明确的质量保证审查选择可维护的程序设计语言改进程序的文档建立明确的软件质量目标和优先级一个可维护的程序应是可理解的、可靠的、可测试的、可修改的、可移植的、效率高的、可使用的。要实现这所有的目标,需要付出很大的代价,而且也不一定行得通。某些质量特性是相互促进的,例如可理解性和可测试性、可理解性和可修改性。•另一些质量特性是相互抵触的,如效率和可移植性、效率和可修改性等。•每一种质量特性的相对重要性应随程序的用途及计算环境的不同而不同。例如,对编译程序来说,可能强调效率;但对管理信息系统来说,则可能强调可使用性和可修改性。•应当对程序的质量特性,在提出目标的同时还必须规定它们的优先级。使用提高软件质量的技术和工具•模块化–如果需要改变某个模块的功能,则只要改变这个模块,对其它模块影响很小;–如果需要增加程序的某些功能,则仅需增加完成这些功能的新的模块或模块层;–程序的测试与重复测试比较容易;–程序错误易于定位和纠正结构化程序设计程序被划分成分层的模块结构;–模块调用控制必须从模块的入口点进入,从出口点退出。–模块的控制结构仅限于顺序、选择、重复三种,且没有GOTO语句。–每个程序变量只用于唯一的程序目的,而且变量的作用范围应是明确的、有限制的。用结构化程序设计技术,提高现有系统的可维护性•采用备用件的方法──用一个新的结构良好的模块替换掉整个要修改的模块。–采用自动重建结构和重新格式化的工具(结构更新技术)──把非结构化代码转换成良好结构代码。–改进现有程序不完善的文档─建立或补充系统说明书、设计文档、模块说明书、以及在源程序中插入必要注释。进行明确的质量保证审查质量保证审查对于获得和维持软件的质量,是一个很有用的技术。审查可以用来检测在开发和维护阶段内发生的质量变化。一旦检测出问题来,就可以采取措施来纠正,以控制不断增长的软件维护成本,延长软件系统的有效生命期。软件开发期间各个检查点的检查重点•在设计阶段,检查重点是可理解性、可修改性、可测试性。•可理解性检查的重点是程序的复杂性。对每个模块可用McCabe环路来计算模块复杂性,若大于10,则需重新设计。•可以用各种质量特性检查表,或用度量标准来检查可维护性。•审查小组可以采用人工测试一类的方式,进行审查。2.验收检查验收检查是一个特殊的检查点的检查,