1、1软件维护技术软件维护技术 学习目标u掌握软件维护的概念及类型 u掌握软件维护的过程 u掌握软件维护的可维护性 u掌握提高软件可维护性的途径 2软件维护技术软件维护技术 教学内容: 1 软件维护概述 2 软件维护的过程 3 软件的可维护性 4 提高可维护性的途径 5 逆向工程和再工程 31 软件维护概述软件维护概述1.1 软件维护的基本概念 把软件运行/维护阶段对软件产品所作的修改定义为软件维护。 进行软件维护的原因有很多,主要有以下几个方面:u改正在特定的使用条件下暴露出来的一些潜在的程序错误或程序设计缺陷。u在软件使用过程中数据环境发生了变化(如事务处理代码发生改变)或处理环境发生了变化(
2、如安装了新的硬件或操作系统),需要对软件进行修改以适应这种变化的需求。u用户和数据处理人员在使用软件时需要改进现有的功能、增加新的功能、改善总体性能等,为满足这些要求,需要对软件进行修改以便把这些要求纳入到软件之中。返回目录41 软件维护概述软件维护概述1.2 软件维护的种类 软件维护是为了满足用户对已开发产品的性能与运行环境不断提高的需要,达到延长软件的寿命的目的。按照这一目标,维护分如下几类:1改正性维护(Corrective Maintenance) 为了识别和纠正软件错误、改正软件性能上的缺陷、排除实施中的误使用,而应当进行的诊断和改正错误的过程,就叫做改正性维护。2适应性维护(Ada
3、ptive Maintenance) 随着计算机技术的飞速发展,外部环境(新的硬、软件配置)或数据环境(数据库、数据格式、数据输入/输出方式、数据存储介质)可能发生变化,为了使软件适应变化,修改软件的过程叫做适应性维护。返回目录51 软件维护概述软件维护概述3完善性维护(Perfective Maintenance) 软件在使用的过程中,用户常常会对软件提出新的功能与性能的要求。为了满足这些要求,需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维护性,这种情况下进行的维护活动叫做完善性维护。4预防性维护(Preventive Maintenance) 为了提高软件
4、的可维护性、可靠性等,为以后进一步改进软件打下良好基础。通常,预防性维护定义为:“把今天的方法学用于昨天的系统以满足明天的需要”。也就是说,采用先进的软件工程方法对需要维护的软件或软件中的某一部分进行(重新)设计、编制和测试。返回目录61 软件维护概述软件维护概述 在整个软件维护阶段所花费的全部工作量中,预防性维护只占很小的比例,而完善性维护占了几乎一半的工作量,参看图1。图1 三类维护占总维护比例 图2 维护在软件生存期所占比例 从图2中可以看到,软件维护活动所花费的工作占整个生存期工作量的70%以上。返回目录71 软件维护概述软件维护概述1.3 影响软件维护工作量的因素 维护中,影响维护工
5、作量的程序特性有以下几种:(1)系统的大小(2)程序设计语言 (3)系统年龄 (4)数据库技术的应用 (5)先进的软件开发技术 (6)其他方面 此外,许多软件在开发时并未考虑将来的修改,这就为软件的维护带来 许多问题。返回目录81 软件维护概述软件维护概述1.4 软件维护的策略 James Martin等提出了一些维护策略,以控制维护成本。1改正性维护 要生成100%可靠的软件,成本太高。可通过新技术提高可靠性,减少进行改正性维护的需要。这些技术包括:数据库管理系统、软件开发环境、程序自动生成系统、较高级(第四代)的语言。应用以上4种方法可产生更加可靠的代码。此外:(1)利用应用软件包,可开发
6、出可靠性更高的软件。(2)结构化技术。用它开发的软件易于理解和测试。(3)防错性程序设计。把自检能力引入程序,通过检查,提供审查跟踪。(4)通过周期性维护审查,在形成维护问题之前就可确定质量缺陷。 返回目录91 软件维护概述软件维护概述2适应性维护 这一类维护不可避免,但可以控制。(1)在配置管理时,把硬件、操作系统和其他相关环境因素的可能变化考虑在内,可以减少某些适应性维护的工作量。(2)把与硬件、操作系统,以及其他外围设备有关的程序归到特定的程序模块中;把因环境变化而必须修改的程序局部于某些程序模块之中。(3)使用内部程序列表、外部文件,以及处理的例行程序包,可为维护时修改程序提供方便。返
7、回目录101 软件维护概述软件维护概述3完善性维护 利用前两类维护中列举的方法,也可以减少这一类维护。特别是数据库管理系统、程序生成器、应用软件包,可减少系统或程序员的维护工作量。此外,建立软件系统的原型,把它在实际系统开发之前提供给用户。用户通过研究原型,进一步完善他们的功能要求,就可以减少以后完善性维护的需要。返回目录111 软件维护概述软件维护概述1.5 修改程序的副作用 所谓副作用是指因修改软件而造成的错误或其它不希望发生的情况,有三种副作用: (1)修改代码的副作用。在使用程序设计语言修改源代码时,都可能引入错误。例如,删除或修改一个子程序、删除或修改一个标号、 删除或修改一个标识符
8、、改变程序代码的时序关系、改变占用存储的大小、改变逻辑运算符、修改文件的打开或关闭、改进程序的执行效率,以及把设计上的改变翻译成代码的改变、为边界条件的逻辑测试做出改变时,都容易引入错误。返回目录121 软件维护概述软件维护概述(2)修改数据的副作用。在修改数据结构时,有可能造成软件设计与数据结构不匹配,因而导致软件出错。数据副作用就是修改软件信息结构导致的结果。例如,在重新定义局部的或全局的常量、 重新定义记录或文件的格式、增大或减小一个数组或高层数据结构的大小、修改全局或公共数据、重新初始化控制标志或指针、重新排列输入输出或子程序的参数时,容易导致设计与数据不相容的错误。数据副作用可以通过
9、详细的设计文档加以控制。在此文档中描述了一种交叉引用,把数据元素、记录、文件和其它结构联系起来。返回目录131 软件维护概述软件维护概述(3)文档的副作用。对数据流、软件结构、 模块逻辑或任何其它有关特性进行修改时,必须对相关技术文档进行相应修改。否则软件文档不能反映软件的当前状态。 如果对可执行软件的修改不反映在文档里,就会产生文档的副作用。例如,对交互输入的顺序或格式进行修改,如果没有正确地记入文档中,就可能引起重大的问题。过时的文档内容、索引和文本可能造成冲突,引起用户的失败和不满。因此,必须在软件交付之前对整个软件配置进行评审,以减少文档的副作用。返回目录141 软件维护概述软件维护概
10、述 为了控制因修改而引起的副作用,要做到:u按模块把修改分组;u自顶向下地安排被修改模块的顺序;u每次修改一个模块;u对于每个修改了的模块,在安排修改下一个模块之前,要确定这个修改的副作用。可以使用交叉引用表、存储映象表、执行流程跟踪等。返回目录152 软件维护的过程软件维护的过程 为了有效地进行软件维护,应事先就开始做组织工作。首先需要建立维护的机构,申明提出维护申请报告的过程及评价的过程;为每一个维护申请规定标准的处理步骤;还必须建立维护活动的登记制度以及规定评价和评审的标准。 2.1 维护机构 如图3就是一个维护机构的组织方案。 返回目录162 软件维护的过程软件维护的过程图3 软件维护
11、的机构 返回目录172 软件维护的过程软件维护的过程 维护申请提交给一个维护管理员,他把申请交给某个系统监督员去评价。系统监督员是一位技术人员,他必须熟悉产品程序的每一部分。一旦做出评价,由修改负责人确定如何进行修改。在维护人员对程序进行修改的过程中,由配置管理员严格把关,控制修改的范围,对软件配置进行审计。 修改负责人、维护管理员可以是指定的某个人,也可以是一个包括管理人员、高级技术人员在内的小组。系统监督员可以有其他职责,但应具体分管某一个软件包。在开始维护之前,就把责任明确下来,可以大大减少维护过程中的混乱。返回目录182 软件维护的过程软件维护的过程2.2 软件维护申请报告 所有软件维
12、护申请应按规定的方式提出。软件维护组织通常提供维护申请报告(MRP,Maintenance RequestForm),或称软件问题报告,由申请维护的用户填写。 如果遇到一个错误,用户必须完整地说明产生错误的情况,包括输入数据、错误清单以及其他相关材料。如果申请的是适应性维护或完善性维护,用户必须提供一份修改说明书,列出所有希望的修改。维护申请报告将由维护管理员和系统监督员来研究处理。返回目录192 软件维护的过程软件维护的过程 维护申请报告是由软件组织外部提交的文档,它是计划维护工作的基础。软件组织内部应相应地做出软件修改报告(SCR,Software Change Report),指明:u所
13、需修改变动的性质;u申请修改的优先级;u为满足某个维护申请报告,所需的工作量;u预计修改后的状况。 软件修改报告应提交修改负责人,经批准后才能开始进一步安排维护工作。 返回目录202 软件维护的过程软件维护的过程2.3 软件维护工作流程 图4 软件维护的工作流图 返回目录212 软件维护的过程软件维护的过程 首先,第一步是先确认维护要求。然后由维护组织管理员确认维护类型。对于改正性维护申请,从评价错误的严重性开始。对于适应性维护和完善性维护申请,需要先确定每项申请的优先次序。 尽管维护申请的类型不同,但都要进行同样的技术工作。这些工作有:修改软件需求说明、修改软件设计、设计评审、对源程序做必要
14、的修改、单元测试、集成测试(回归测试)、确认测试、软件配置评审等。 返回目录222 软件维护的过程软件维护的过程 在每次软件维护任务完成后,最好进行一次情况评审,对以下问题做一总结:(1)在目前情况下,设计、编码、测试中的哪一方面可以改进?(2)哪些维护资源应该有但没有?(3)工作中主要的或次要的障碍是什么?(4)从维护申请的类型来看是否应当有预防性维护? 情况评审对将来的维护工作如何进行会产生重要的影响,并可为软件机构的有效管理提供重要的反馈信息。返回目录232 软件维护的过程软件维护的过程2.4 软件维护记录及评价 在维护的过程中做好维护档案记录。其内容包括程序名称、源程序语句条数、机器代
15、码指令条数、所用的程序设计语言、程序安装的日期、程序安装后的运行次数、与程序安装后运行次数有关的处理故障次数、程序改变的层次及名称、修改程序所增加的源程序语句条数、修改程序所减少的源程序语句条数、每次修改所付出的“人时”数、修改程序的日期、软件维护人员的姓名、维护申请报告的名称、维护类型、维护开始时间和维护结束时间、花费在维护上的累计“人时”数、维护工作的净收益等。对每项维护任务都应该收集上述数据。返回目录242 软件维护的过程软件维护的过程 维护完成后,还需要对维护的结果进行评价。可参考的度量值如下:u每次程序运行时的平均出错次数;u花费在每类维护上的总“人时”数; u每个程序、每种语言、每
16、种维护类型的程序平均修改次数; u用于每种语言的平均“人时”数;u因为维护,增加或删除每个源程序语句所花费的平均“人时”数; u维护申请报告的平均处理时间;u各类维护申请的百分比。 这七种度量值提供了定量的数据,据此可对开发技术、语言选择、维护工作计划、资源分配、以及其他许多方面做出判定。因此,这些数据可以用来评价维护工作。返回目录253 软件的可维护性软件的可维护性 为了使得软件能够易于维护,必须考虑使软件具有可维护性。3.1 可维护性的定义 软件可维护性是指纠正软件系统出现的错误和缺陷,以及为满足新的软件可维护性是指纠正软件系统出现的错误和缺陷,以及为满足新的要求而进行修改、扩充或压缩的容
17、易程度。要求而进行修改、扩充或压缩的容易程度。 可维护性、可使用性、可靠性是衡量软件质量的几个主要质量特性,也是用户十分关心的几个方面。由于影响软件质量的这些重要因素,目前还没有对它们定量度量的普遍适用方法。但是就它们的概念和内涵来说则是很明确的。软件的可维护性是软件开发阶段各个时期的关键目标。返回目录263 软件的可维护性软件的可维护性 目前广泛使用的是用如下的七个特性来衡量程序的可维护性。而且对于不同类型的维护,这七种特性的侧重点也不相同。表1显示了在各类维护中应侧重哪些特性。表中的“”表示需要的特性。 改正性维护适应性维护完善性维护 可理解性 可测试性 可修改性 可 靠 性 可移植性 可
18、使用性 效 率 表1 在各类维护中的侧重点返回目录273 软件的可维护软件的可维护性性3.2 可维护性的度量 度量一个可维护的程序的七种特性时常用的方法就是质量检查表、质量测试、质量标准。 质量检查表是用于测试程序中某些质量特性是否存在的一个问题清单。评价者针对检查表上的每一个问题,依据自己的定性判断,回答“Yes”或者“No”。 质量测试与质量标准则用于定量分析和评价程序的质量。 由于许多质量特性是相互抵触的,要考虑几种不同的度量标准,相应地去度量不同的质量特性。 返回目录283 软件的可维护性软件的可维护性1可理解性 可理解性表明人们通过阅读源代码和相关文档,了解程序功能及其如何运行的容易
19、程度。一个可理解的程序主要应具备以下一些特性:模块化(模块结构良好、功能完整、简明),风格一致性(代码风格及设计风格的一致性),不使用令人琢磨不定或含糊不清的代码,使用有意义的数据名和过程名,结构化,完整性(对输入数据进行完整性检查)等。 对于可理解性,可以使用一种叫做“90-10测试”的方法来衡量。即把一份待测试的源程序清单拿给一位有经验的程序员阅读10分钟,然后把这个源程序清单拿开,让这位程序员凭自己的理解和记忆,写出该程序的90%。如果程序员真的写出来了,则认为这个程序具有可理解性,否则这个程序要重新编写。 返回目录293 软件的可维护性软件的可维护性2可靠性 可靠性表明一个程序按照用户
20、的要求和设计目标,在给定的一段时间内正确执行的概率。关于可靠性,度量的标准主要有: 平均失效间隔时间MTTF(Mean Time To Failure) 平均修复时间MTTR(Mean Time To Repair Error) 有效性A=(MTBD/(MTBD+MDT)。 度量可靠性的方法,主要有两类: (1)根据程序错误统计数字,进行可靠性预测。 (2)根据程序复杂性,预测软件可靠性。返回目录303 软件的可维护性软件的可维护性3可测试性 可测试性表明论证程序正确性的容易程度。程序越简单,证明其正确性就越容易。设计合适的测试用例,取决于对程序的全面理解。因此,一个可测试的程序应当是可理解的
21、、可靠的、简单的。 对于程序模块,可用程序复杂性来度量可测试性。程序的环路复杂性越大,程序的路径就越多。因此,全面测试程序的难度就越大。4可修改性 可修改性表明程序容易修改的程度。一个可修改的程序应当是可理解的、通用的、灵活的、简单的。其中,通用性是指程序适用于各种功能变化而无需修改。灵活性是指能够容易地对程序进行修改。返回目录313 软件的可维护性软件的可维护性5可移植性 可移植性表明程序转移到一个新的计算环境的可能性的大小。或者它表明程序可以容易地、有效地在各种各样的计算环境中运行的容易程度。一个可移植的程序应具有结构良好、灵活,不依赖于某一具体计算机或操作系统的性能。6效率 效率表明一个
22、程序能执行预定功能而又不浪费机器资源的程度。这些机器资源包括内存容量、外存容量、通道容量和执行时间。返回目录323 软件的可维护性软件的可维护性7可使用性 从用户观点出发,把可使用性定义为程序方便、实用、易于使用的程度。一个可使用的程序应当是易于使用的,能允许用户出错和改变,并尽可能不使用户陷入混乱状态的程序。8其他间接定量度量可维护性的方法。 Gilb提出了与软件维护期间工作量有关的一些数据,可以使用它们间接地对软件的可维护性做出估计。返回目录333 软件的可维护性软件的可维护性3.3 软件文档 文档是影响软件可维护性的决定因素。由于长期使用的大型软件系统在使用过程中必然会经受多次修改,所以
23、文档比程序代码更重要。 软件系统的文档可以分为用户文档和系统文档两类。用户文档主要描述系统功能和使用方法,并不关心这些功能是怎样实现的;系统文档描述系统设计、实现和测试等各方面的内容。 总的说来,软件文档应该满足下述要求: (1) 必须描述如何使用这个系统,没有这种描述时即使是最简单的系统也无法使用; (2) 必须描述怎样安装和管理这个系统; (3)必须描述系统需求和设计; (4) 必须描述系统的实现和测试,以便使系统成为可维护的。 返回目录343 软件的可维护性软件的可维护性1用户文档用户文档至少应该包括下述5方面的内容:(1) 功能描述,说明系统能做什么;(2) 安装文档,说明怎样安装系统
24、以及怎样使系统适应特定的硬件配置;(3) 使用手册,简要说明如何使用这个系统;(4) 参考手册,详尽描述用户可以使用的所有系统设施以及它们的使用方法,还应该解释系统可能产生的各种出错信息的含义;(5) 操作员指南,说明操作员应该如何处理使用中出现的各种情况。上述内容可以分别作为独立的文档,也可以作为一个文档的不同分册,具体做法应该由系统规模决定。返回目录353 软件的可维护性软件的可维护性2系统文档 所谓系统文档指从问题定义、需求说明到验收测试计划这样一系列和系统实现有关的文档。描述系统设计、实现和测试的文档对于理解程序和维护程序来说是极端重要的。和用户文档类似,系统文档的结构也应该能把读者从
25、对系统概貌的了解,引导到对系统每个方面每个特点的更形式化更具体的认识。返回目录364 4 提高可维护性的途径提高可维护性的途径 4.1 建立明确的软件质量目标和优先级 一个可维护的程序应是可理解的、可靠的、可测试的、可修改的、可移植的、效率高的、可使用的。但要实现所有的目标,需要付出非常大的代价,而且也不一定行得通。尽管可维护性要求每一种质量特性都要得到满足,但它们的相对重要性应随程序的用途及计算环境的不同而不同。所以,应当对程序的质量特性,在提出目标的同时还必须规定它们的优先级。这样有助于提高软件的质量,并对软件生存期的费用产生很大的影响。返回目录374 4 提高可维护性的途径提高可维护性的
26、途径4.2 使用提高软件质量的技术和工具1模块化 是提高软件质量,降低成本的有效方法之一。也是提高可维护性的有效技术。它的优点是:u如果需要改变某个模块的功能,则只要改变这个模块,对其他模块影响很小;u如果需要增加程序的某些功能,则仅需增加完成这些功能的新的模块或模块层;u程序的测试与重复测试比较容易;u程序错误易于定位和纠正;u容易提高程序效率。返回目录384 4 提高可维护性的途径提高可维护性的途径2结构化程序设计 结构化程序设计使模块结构及模块间的相互作用都标准化了。采用结构化程序设计可以获得良好的程序结构。3使用结构化程序设计技术,提高现有系统的可维护性(1)采用备用件的方法(2)采用
27、自动重建结构和重新格式化的工具(结构更新技术) (3)改进现有程序不完善的文档(4)使用结构化程序设计方法实现新的子系统(5)采用结构化程序设计的思想和结构文档工具返回目录394 4 提高可维护性的途径提高可维护性的途径4.3 进行明确的质量保证审查为了保证软件的可维护性,有四种类型的软件审查:(1)在检查点进行复审 。如图5所示。图5 软件开发期间各个检查点的检查重点 返回目录404 4 提高可维护性的途径提高可维护性的途径(2)验收检查u需求和规范标准 u设计标准 u源代码标准 u文档标准(3)周期性的维护审查 检查点复查和验收检查,可用来保证新软件系统的可维护性。对已有的软件系统,则应当
28、进行周期性的维护检查。 (4)对软件包进行检查 软件包是一种标准化了的,可为不同单位、不同用户使用的软件。软件包开发者考虑到他的专利权,一般不会提供给用户他的源代码和程序文档。因此,要采用一定的方法对软件包进行维护。 返回目录414 4 提高可维护性的途径提高可维护性的途径4.4 选择可维护的程序设计语言 程序设计语言的选择,对程序的可维护性影响很大。低级语言,即机器语言和汇编语言,难于理解和掌握,因此很难维护。高级语言比低级语言容易理解,具有更好的可维护性。但同是高级语言,可理解的程度也不一样。 总之,从维护角度来看,第四代语言比其他语言更容易维护。 返回目录424 4 提高可维护性的途径提
29、高可维护性的途径4.5 改进程序的文档 程序文档是对程序总目标、程序各组成部分之间的关系、程序设计策略、程序实现过程的历史数据等的说明和补充。程序文档对提高程序的可理解性有着重要作用。 好的文档是建立可维护性的基本条件。它的作用和意义有三点:(1)文档好的程序比没有文档的程序容易操作。(2)好的文档意味着简洁、风格一致、且易于更新。(3)程序应当成为其自身的文档。 另外,在软件维护阶段,利用历史文档,可以大大简化维护工作。历史文档有三种:系统开发日志、错误记载和系统维护日志。返回目录435 逆向工程和再工程逆向工程和再工程 软件的逆向工程是分析程序,力图在比源代码更高抽象层次上建立程序表示的过程。逆向工程是设计恢复的过程。逆向工程工具可以从已存在程序中抽取数据结构、体系结构和程序设计信息。 再工程,也叫做复壮(修理)或再生。它不仅能从已存在的程序中重新获得设计信息,而且还能使用这些信息来改建或重构现有的系统,以改进它的综合质量。一般软件人员利用再工程重新实现已存在的程序,同时加进新的功能或改善它的性能。 大的软件开发机构有着上百万行的老代码,是逆向工程或再工程的可能对象。 逆向工程和再工程的工具还处于摇篮时代,对每一个程序都做逆向工程或再工程是不现实的。 逆向工程和再工程可用于执行这种维护任务。 返回目录