第七章软件维护 复习要求 1.了解软件质量定义和软件质量度量。 2.了解软件维护的类型与策略 3.了解软件维护的过程与管理方法。 4.了解可维护性的概念 5.了解提高可维护性的方法 6.了解软件逆向工程与再工程的概念 二、内容提要 1.软件质量的概念 (1)软件质量的定义 关于软件质量的定义,曾给出过多种定义 ANSI/ IEEE Std729-1983定义软件质量为“与软件产品满足规定的和隐含的需求的能 力有关的特征或特性的全体” MJ. Fisher定义软件质量为“所有描述计算机软件优秀程度的特性的组合” 也就是说,为满足软件的各项精确定义的功能、性能需求,符合文档化的开发标准,需 要相应地给出或设计一些质量特性及其组合,作为在软件开发与维护中的重要考虑因素。如 果这些质量特性及其组合都能在产品中得到满足,则这个软件产品质量就是高的 软件质量反映了以下三方面的问题: 软件需求是度量软件质量的基础。不符合需求的软件就不具备质量。 规范化的标准定义了一组开发准则,用来指导软件人员用工程化的方法来开发软件 如果不遵守这些开发准则,软件质量就得不到保证。 ■往往会有一些隐含的需求没有显式地提出来。如软件应具备良好的可维护性。如果软 件只满足那些精确定义了的需求而没有满足这些隐含的需求,软件质量也不能保证 软件质量是各种特性的复杂组合。它随着应用的不同而不同,随着用户提出的质量要求 不同而不同。因此,有必要讨论各种质量特性,以及评价质量的准则,还要介绍为保证质量 所进行的各种活动。 (2)软件质量特性与质量模型 质量特性 软件质量特性,反映了软件的本质。讨论一个软件的质 量,问题最终要归结到定义软件的质量特性。而定义一个软 件的质量,就等价于为该软件定义一系列质量特性 评价门评价评价 准则义准则又准则 人们通常把影响软件质量的特性用软件质量模型来描 述。已有多种有关软件质量模型的方案。它们共同的特点是 量度量 把软件质量特性定义成分层模型。最基本的叫做基本质量特 性,它可以由一些子质量特性定义和度量。子质量特性在必图71MCl质量模型框架
1 第七章 软件维护 一、复习要求 1. 了解软件质量定义和软件质量度量。 2. 了解软件维护的类型与策略。 3. 了解软件维护的过程与管理方法。 4. 了解可维护性的概念。 5. 了解提高可维护性的方法。 6. 了解软件逆向工程与再工程的概念 二、内容提要 1. 软件质量的概念 (1) 软件质量的定义 关于软件质量的定义,曾给出过多种定义。 ▪ ANSI/IEEE Std 729-1983 定义软件质量为“与软件产品满足规定的和隐含的需求的能 力有关的特征或特性的全体”。 ▪ M.J. Fisher 定义软件质量为“所有描述计算机软件优秀程度的特性的组合”。 也就是说,为满足软件的各项精确定义的功能、性能需求,符合文档化的开发标准,需 要相应地给出或设计一些质量特性及其组合,作为在软件开发与维护中的重要考虑因素。如 果这些质量特性及其组合都能在产品中得到满足,则这个软件产品质量就是高的。 软件质量反映了以下三方面的问题: ▪ 软件需求是度量软件质量的基础。不符合需求的软件就不具备质量。 ▪ 规范化的标准定义了一组开发准则,用来指导软件人员用工程化的方法来开发软件。 如果不遵守这些开发准则,软件质量就得不到保证。 ▪ 往往会有一些隐含的需求没有显式地提出来。如软件应具备良好的可维护性。如果软 件只满足那些精确定义了的需求而没有满足这些隐含的需求,软件质量也不能保证。 软件质量是各种特性的复杂组合。它随着应用的不同而不同,随着用户提出的质量要求 不同而不同。因此,有必要讨论各种质量特性,以及评价质量的准则,还要介绍为保证质量 所进行的各种活动。 (2) 软件质量特性与质量模型 软件质量特性,反映了软件的本质。讨论一个软件的质 量,问题最终要归结到定义软件的质量特性。而定义一个软 件的质量,就等价于为该软件定义一系列质量特性。 人们通常把影响软件质量的特性用软件质量模型来描 述。已有多种有关软件质量模型的方案。它们共同的特点是: 把软件质量特性定义成分层模型。最基本的叫做基本质量特 性,它可以由一些子质量特性定义和度量。子质量特性在必 图 7.1 McCall 质量模型框架 评价 准则 度量 质量特性 评价 准则 评价 准则 度量 度量
要时又可由它的一些子质量特性定义和度量。 早在1976年,由 Boehm等提出软件质量模型的分层方案。1979年 Mccall等人改进 Boehm 质量模型又提出了一种软件质量模型。模型的三层次式框架如图7.1所示。质量模型中的质 量概念基于11个特性之上。而这11个特性分别面向软件产品的运行、修正、转移。它们与 特性的关系如图72所示。 McCal等认为,特性是软件质量的反映,软件属性可用做评价准 则,定量化地度量软件属性可知软件质量的优劣。 可维护性 可移植性 可测试性 可复用性 灵活性 产品修正产品转移 互连性 产品运行 正确性可靠性效率可使用性完整性 图72 McCall软件质量模型 Mccall等人的质量特性定义如下: 正确性在预定环境下,软件满足设计规格说明及用户预期目标的程度。它要求软件本身没 可靠性软件按照設计要求,在规定时间和条件下不出故障,持续运行的程度 效率为了完成预定功能,软件系统所需的计算机资源的多少。 完整性为某一目的而保护数据,避免它受到偶然的或有意的破坏、改动或遗失的能力 可使用性对于一个软件系统,用户学习、使用软件及为程序准备输入和解释输出所需工作量的 可维护性为满足用户新的要求,或当环境发生了变化,或运行中发现了新的错误时,对一个已 投入运行的软件进行相应诊断和修改所需工作量的大小 可测试性测试软件以确保其能够执行预定功能所需工作量的大小 灵活性修改或改进一个已投入运行的软件所需工作量的大小 可移植性将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行时所 需工作量的大小 可复用性一个软件(或软件的部件)能再次用于其它应用(该应用的功能与此软件或软件部件的 互连性又称相互操作性。连接一个软件和其它系统所需工作量的大小。如果这个软件要联网 或与其它系统通信或要把其它系统纳入到自己的控制之下,必须有系统间的接口,使 对以上各个质量特性直接进行度量是很困难的,有些情况下甚至是不可能的。因此 Mccall定义了一些评价准则,使用它们对反映质量特性的软件属性分级,以此来估计软件质 量特性的值。软件属性一般分级范围从0(最低)到10(最高)。各评价准则定义如下。 可跟踪性在特定的开发和运行环境下跟踪设计表示或实际程序部件到原始需求的(可追溯)能 完备性软件需求充分实现的程度。 致性在整个软件设计与实现的过程中技术与记号的统一程度。 安全性防止软件受到意外的或蓄意的存取、使用、修改、毁坏,或防止泄密的程度。 容错性系统出错(机器临时发生故障或数据输入不合理)时,能以某种预定方式,做出适当处 理,得以继续执行和恢复系统的能力。它又称健壮性
2 要时又可由它的一些子质量特性定义和度量。 早在1976年,由Boehm等提出软件质量模型的分层方案。1979年McCall等人改进Boehm 质量模型又提出了一种软件质量模型。模型的三层次式框架如图 7.1 所示。质量模型中的质 量概念基于 11 个特性之上。而这 11 个特性分别面向软件产品的运行、修正、转移。它们与 特性的关系如图 7.2 所示。McCall 等认为,特性是软件质量的反映,软件属性可用做评价准 则,定量化地度量软件属性可知软件质量的优劣。 图 7.2 McCall 软件质量模型 McCall 等人的质量特性定义如下: 正 确 性 在预定环境下,软件满足设计规格说明及用户预期目标的程度。它要求软件本身没有 错误。 可 靠 性 软件按照设计要求,在规定时间和条件下不出故障,持续运行的程度。 效 率 为了完成预定功能,软件系统所需的计算机资源的多少。 完 整 性 为某一目的而保护数据,避免它受到偶然的或有意的破坏、改动或遗失的能力。 可使用性 对于一个软件系统,用户学习、使用软件及为程序准备输入和解释输出所需工作量的 大小。 可维护性 为满足用户新的要求,或当环境发生了变化,或运行中发现了新的错误时,对一个已 投入运行的软件进行相应诊断和修改所需工作量的大小。 可测试性 测试软件以确保其能够执行预定功能所需工作量的大小。 灵 活 性 修改或改进一个已投入运行的软件所需工作量的大小。 可移植性 将一个软件系统从一个计算机系统或环境移植到另一个计算机系统或环境中运行时所 需工作量的大小。 可复用性 一个软件(或软件的部件)能再次用于其它应用(该应用的功能与此软件或软件部件的 所完成的功能有关)的程度。 互 连 性 又称相互操作性。连接一个软件和其它系统所需工作量的大小。如果这个软件要联网 或与其它系统通信或要把其它系统纳入到自己的控制之下,必须有系统间的接口,使 之可以联结。 对以上各个质量特性直接进行度量是很困难的,有些情况下甚至是不可能的。因此, McCall 定义了一些评价准则,使用它们对反映质量特性的软件属性分级,以此来估计软件质 量特性的值。软件属性一般分级范围从 0 (最低)到 10 (最高)。各评价准则定义如下。 可跟踪性 在特定的开发和运行环境下跟踪设计表示或实际程序部件到原始需求的(可追溯)能 力。 完 备 性 软件需求充分实现的程度。 一 致 性 在整个软件设计与实现的过程中技术与记号的统一程度。 安 全 性 防止软件受到意外的或蓄意的存取、使用、修改、毁坏,或防止泄密的程度。 容 错 性 系统出错(机器临时发生故障或数据输入不合理)时,能以某种预定方式,做出适当处 理,得以继续执行和恢复系统的能力。它又称健壮性。 可维护性 可测试性 灵活性 产品修正 产品转移 可移植性 可复用性 互连性 正确性 可靠性 效率 可使用性 完整性 产品运行
准确性能达到的计算或控制精度。它又称精确性 简单性在不复杂、可理解的方式下,定义和实现软件功能的程度。 执行效率为了实现某个功能,提供使用最少处理时间的程度。 存储效率为了实现某个功能,提供使用最少存储空间的程度 存取控制软件对用户存取权限的控制方式达到的程度。 存取审查软件对用户存取权限的检查程度 操作性操作软件的难易程度。它通常取决于与软件操作有关的操作规程,以及是否提供有用 的输入/输出方法。 易训练性软件辅助新的用户使用系统的能力。这取决于是否提供帮助用户熟练掌握软件系统的 。它又称可培训性或培训性。 简明性软件易读的程度。这个特性可以帮助人们方便地阅读本人或他人编制的程序和文档。 它又称可理解性。 模块独立性软件系统内部接口达到的高内聚、低耦合的程度 自描述性对软件功能进行自我说明的程度。亦称自含文档性。 结构性软件能达到的结构良好的程度。 文档完备性软件文档齐全、描述清楚、满足规范或标准的程度。 通用性软件功能覆盖面宽广的程度 可扩充性软件的体系结构、数据设计和过程设计的可扩充的程度。 可修改性软件容易修改,而不致于产生副作用的程度 自检性软件监测自身操作效果和发现自身错误的能力,又称工具性。 机器独立性不依赖于某个特定设备及计算机而能工作的程度,又称硬件独立性。 软件独立性软件不依赖于非标准程序设计语言特征、操作系统特征,或其它环境约束,仅靠自身 能实现其功能的程度,又称自包含性 通信共享性使用标准的通信协议、接口和带宽的标准化的程度。 数据共享性使用标准数据结构和数据类型的程度 通信性提供有效的I/O方式的 正确性和容错性是相互补充的。正确的程序不一定是可容错的程序。反过来,可容错的 程序不一定是完全正确的程序。我们要求一个可靠的软件应当在正常的情况下能够正确地工 作;而在意外的情况下,也能做出适当的处理,隔离故障,尽快地恢复。这才是一个好的程 序。此外,有人在灵活性中加了一个评价准则,叫做“可重配置特性”,它是指软件系统本身 各部分的配置能按用户要求实现的容易程度。在简明性中也加了一个评价准则,即“清晰性 它是指软件的内部结构、内部接口要清晰,人一机界面要清晰 (3)ISO的软件质量评价模型 ISO/IEC9126-1991标准规定的软件质量模型由三层组成。在这个标准中,三层次中的 第一层为称为质量特性,第二层称为质量子特性,第三层称为度量。如图7.3所示。该标准 定义了6个质量特性,即功能性、可靠性、可维护性、效率、可使用性、可移植性;并推荐 了21个子特性,如适合性、准确性、互操作性、依从性、安全性、成熟性、容错性、易恢复 性、易理解性、易学习性、易操作性、时间特性、资源特性、易分析性、易变更性、稳定性、 易测试性、适应性、易安装性、遵循性、易替换性,但不做为标准。用于评价质量子特性的 度量没有统一的标准,由各使用单位视实际情况制定 (4)软件质量特性之间的竞争 在软件的质量特性与质量特性之间、质量特性与子特性之间存在着有利影响和不利影 响,若用“△”表示该质量特性对质量特性有有利影响;用“V”表示该质量特性对质量特 性有不利影响。则有下面表7.1所示的关系。例如,由于效率的要求,应尽可能采用汇编语
3 准 确 性 能达到的计算或控制精度。它又称精确性。 简 单 性 在不复杂、可理解的方式下,定义和实现软件功能的程度。 执行效率 为了实现某个功能,提供使用最少处理时间的程度。 存储效率 为了实现某个功能,提供使用最少存储空间的程度。 存取控制 软件对用户存取权限的控制方式达到的程度。 存取审查 软件对用户存取权限的检查程度。 操 作 性 操作软件的难易程度。它通常取决于与软件操作有关的操作规程,以及是否提供有用 的输入/输出方法。 易训练性 软件辅助新的用户使用系统的能力。这取决于是否提供帮助用户熟练掌握软件系统的 方法。它又称可培训性或培训性。 简 明 性 软件易读的程度。这个特性可以帮助人们方便地阅读本人或他人编制的程序和文档。 它又称可理解性。 模块独立性 软件系统内部接口达到的高内聚、低耦合的程度。 自描述性 对软件功能进行自我说明的程度。亦称自含文档性。 结 构 性 软件能达到的结构良好的程度。 文档完备性 软件文档齐全、描述清楚、满足规范或标准的程度。 通 用 性 软件功能覆盖面宽广的程度。 可扩充性 软件的体系结构、数据设计和过程设计的可扩充的程度。 可修改性 软件容易修改,而不致于产生副作用的程度。 自 检 性 软件监测自身操作效果和发现自身错误的能力,又称工具性。 机器独立性 不依赖于某个特定设备及计算机而能工作的程度,又称硬件独立性。 软件独立性 软件不依赖于非标准程序设计语言特征、操作系统特征,或其它环境约束,仅靠自身 能实现其功能的程度,又称自包含性。 通信共享性 使用标准的通信协议、接口和带宽的标准化的程度。 数据共享性 使用标准数据结构和数据类型的程度。 通 信 性 提供有效的 I/O 方式的程度。 正确性和容错性是相互补充的。正确的程序不一定是可容错的程序。反过来,可容错的 程序不一定是完全正确的程序。我们要求一个可靠的软件应当在正常的情况下能够正确地工 作;而在意外的情况下,也能做出适当的处理,隔离故障,尽快地恢复。这才是一个好的程 序。此外,有人在灵活性中加了一个评价准则,叫做“可重配置特性”,它是指软件系统本身 各部分的配置能按用户要求实现的容易程度。在简明性中也加了一个评价准则,即“清晰性”, 它是指软件的内部结构、内部接口要清晰,人―机界面要清晰。 (3) ISO 的软件质量评价模型 ISO/IEC 9126-1991 标准规定的软件质量模型由三层组成。在这个标准中,三层次中的 第一层为称为质量特性,第二层称为质量子特性,第三层称为度量。如图 7.3 所示。该标准 定义了 6 个质量特性,即功能性、可靠性、可维护性、效率、可使用性、可移植性;并推荐 了 21 个子特性,如适合性、准确性、互操作性、依从性、安全性、成熟性、容错性、易恢复 性、易理解性、易学习性、易操作性、时间特性、资源特性、易分析性、易变更性、稳定性、 易测试性、适应性、易安装性、遵循性、易替换性,但不做为标准。用于评价质量子特性的 度量没有统一的标准,由各使用单位视实际情况制定。 (4) 软件质量特性之间的竞争 在软件的质量特性与质量特性之间、质量特性与子特性之间存在着有利影响和不利影 响,若用“△”表示该质量特性对质量特性有有利影响;用“▽”表示该质量特性对质量特 性有不利影响。 则有下面表 7.1 所示的关系。例如,由于效率的要求,应尽可能采用汇编语
言。但是用汇编语言编制出的程序,可靠性、可移植性以及可维护性都很差。在进行软件质 量设计时,必须考虑利弊,全面权衡,根据质量需求,适当合理地选择/设计质量特性,并 进行评价。 质量特性 质量子特性 度量 适合性 准确性 功能性 互操作性 依从性 安全性 成熟性 可靠性 易恢复性 软件质量 易理解性 可使用性 易学习性 易操作性 度量由使用单位自 时间特性 资源特性 易分析性 稳定性 可维护性 变更性 易测试性 适应性 易安装性 可移植性 遵循性 易替换性 图7.3ISO软件质量度量模型 表71各质量特性与质量特性之间的关系 功能性可靠性可使用性效 可维护性可移植性 功能性 可靠性 可使用性 △△V△ 可维护性 △ 可移植性 (5)质量活动 产品的高质量将导致成本的下降。质量活动开始于20世纪40年代E. Edwards deming 的开创性工作,由日本人发扬广大,他们开发了一种系统化的方法以从根本上消除造成产品 缺陷的原因。1970年代到1980年代,他们的工作移植到西方,称为“全面质量管理(TQC)”。 该活动采用的是4个步骤的过程 ①开展:是一个连续的过程改进体系,其目的是开发一个看得见的可重复的和可度量 的过程
4 言。但是用汇编语言编制出的程序,可靠性、可移植性以及可维护性都很差。 在进行软件质 量设计时,必须考虑利弊,全面权衡,根据质量需求,适当合理地选择/设计质量特性,并 进行评价。 质量特性 质量子特性 度量 图 7.3 ISO 软件质量度量模型 表 7.1 各质量特性与质量特性之间的关系 功能性 可靠性 可使用性 效 率 可维护性 可移植性 功能性 △ △ 可靠性 ▽ △ 可使用性 ▽ △ △ 效 率 ▽ ▽ ▽ 可维护性 △ ▽ △ 可移植性 ▽ ▽ (5) 质量活动 产品的高质量将导致成本的下降。质量活动开始于 20 世纪 40 年代 E. Edwards Deming 的开创性工作,由日本人发扬广大,他们开发了一种系统化的方法以从根本上消除造成产品 缺陷的原因。1970 年代到 1980 年代,他们的工作移植到西方,称为“全面质量管理(TQC)”。 该活动采用的是 4 个步骤的过程: ① 开展:是一个连续的过程改进体系,其目的是开发一个看得见的可重复的和可度量 的过程; 适合性 准确性 互操作性 依从性 安全性 成熟性 容错性 易恢复性 易理解性 易学习性 易操作性 时间特性 资源特性 易分析性 稳定性 易变更性 易测试性 适应性 易安装性 遵循性 易替换性 功能性 可靠性 可使用性 效 率 可维护性 可移植性 软 件 质 量 度 量 由 使 用 单 位 自 行 规 定
②当然的质量:只有在前一步完成之后才可启动。这一步将检查影响过程的无形因素, 并优化这些因素对过程的影响。例如,软件过程可能受到高层职员流动的影响,而这又是由 于公司内部不断重组引起的。公司组织的稳定对于软件质量的提高有很大帮助,因此在这 步可以对公司的重组提出建议。 ③感性:意指“第五感觉”。这一步从过程转到用户身上。通过检查用户使用软件产品 的情况,改进产品本身,并(潜在地)改进软件产品的生产过程。 ④有魅力的质量:通过观察产品在市场上的使用,寻找产品在相关领域发展的方向 从而开发出有预见性的新产品。 2.软件维护的概念 (1)软件维护的定义 我们称在软件运行/维护阶段对软件产品所进行的修改就是所谓的维护。要求进行维护 的原因多种多样,归结起来有三种类型: 改正在特定的使用条件下暴露出来的一些潜在程序错误或设计缺陷 因在软件使用过程中数据环境发生变化或处理环境发生变化,需要修改软件以适应 种变化。 用户和数据处理人员在使用时常提出改进现有功能,增加新的功能,以及改善总体性 能的要求,为满足这些要求,就需要修改软件把这些要求纳入到软件之中 由这些原因引起的维护活动可以归为以下几类: ①改正性维护 在软件交付使用后,必然会有一部分隐藏的错误被带到运行阶段来。这些隐藏下来的错 误在某些特定的使用环境下就会暴露出来。为了识别和纠正软件错误、改正软件性能上的缺 陷、排除实施中的误使用,应当进行的诊断和改正错误的过程,就叫做改正性维护。 ②适应性维护 随着计算机的飞速发展,外部环境(新的硬、软件配置)或数据环境(数据库、数据格式 数据输入/输出方式、数据存储介质)可能发生变化,为了使软件适应这种变化,而去修改软 件的过程就叫做适应性维护 ③完善性维护 在软件的使用过程中,用户往往会对软件提出新的功能与性能要求。为了满足这些要求, 需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维 护性。这种情况下进行的维护活动叫做完善性维护。 在维护阶段的最初一、二年,改正性维护的工作量较大。随着错误发现率急剧降低,并 趋于稳定,就进入了正常使用期。然而,由于改造的要求,适应性维护和完善性维护的工作 量逐步增加。实践表明,在几种维护活动中,完善性维护所占的比重最大,来自用户要求扩 充、加强软件功能、性能的维护活动约占整个维护工作的50%。 适应 改正 性维护性维护其 5%护 完善性维护 护 50%
5 ② 当然的质量:只有在前一步完成之后才可启动。这一步将检查影响过程的无形因素, 并优化这些因素对过程的影响。例如,软件过程可能受到高层职员流动的影响,而这又是由 于公司内部不断重组引起的。公司组织的稳定对于软件质量的提高有很大帮助,因此在这一 步可以对公司的重组提出建议。 ③ 感性:意指“第五感觉”。这一步从过程转到用户身上。通过检查用户使用软件产品 的情况,改进产品本身,并(潜在地)改进软件产品的生产过程。 ④ 有魅力的质量:通过观察产品在市场上的使用,寻找产品在相关领域发展的方向, 从而开发出有预见性的新产品。 2. 软件维护的概念 (1) 软件维护的定义 我们称在软件运行∕维护阶段对软件产品所进行的修改就是所谓的维护。要求进行维护 的原因多种多样,归结起来有三种类型: ▪ 改正在特定的使用条件下暴露出来的一些潜在程序错误或设计缺陷; ▪ 因在软件使用过程中数据环境发生变化或处理环境发生变化,需要修改软件以适应这 种变化。 ▪ 用户和数据处理人员在使用时常提出改进现有功能,增加新的功能,以及改善总体性 能的要求,为满足这些要求,就需要修改软件把这些要求纳入到软件之中。 由这些原因引起的维护活动可以归为以下几类: ① 改正性维护 在软件交付使用后,必然会有一部分隐藏的错误被带到运行阶段来。这些隐藏下来的错 误在某些特定的使用环境下就会暴露出来。为了识别和纠正软件错误、改正软件性能上的缺 陷、排除实施中的误使用,应当进行的诊断和改正错误的过程,就叫做改正性维护。 ② 适应性维护 随着计算机的飞速发展,外部环境(新的硬、软件配置)或数据环境(数据库、数据格式、 数据输入∕输出方式、数据存储介质)可能发生变化,为了使软件适应这种变化,而去修改软 件的过程就叫做适应性维护。 ③ 完善性维护 在软件的使用过程中,用户往往会对软件提出新的功能与性能要求。为了满足这些要求, 需要修改或再开发软件,以扩充软件功能、增强软件性能、改进加工效率、提高软件的可维 护性。这种情况下进行的维护活动叫做完善性维护。 在维护阶段的最初一、二年,改正性维护的工作量较大。随着错误发现率急剧降低,并 趋于稳定,就进入了正常使用期。然而,由于改造的要求,适应性维护和完善性维护的工作 量逐步增加。实践表明,在几种维护活动中,完善性维护所占的比重最大,来自用户要求扩 充、加强软件功能、性能的维护活动约占整个维护工作的 50%
图74三类维护占总维护比例 图75维护在软件生存期所占比例 ④预防性维护 除了以上三类维护之外,还有一类维护活动,叫做预防性维护。这是为了提高软件的可 维护性、可靠性等,为以后进一步改进软件打下良好基础。通常,预防性维护定义为:“把今 天的方法学用于昨天的系统以满足明天的需要”。也就是说,采用先进的软件工程方法对需要 维护的软件或软件中的某一部分(重新)进行设计、编制和测试 在整个软件维护阶段所花费的全部工作量中,预防性维护只占很小的比例,而完善性维护占 了几乎一半的工作量。参看图74。从图75中可以看到,软件维护活动所花费的工作占整个 生存期工作量的70%以上 (2)影响维护工作量的因素 在软件维护中,影响维护工作量的程序特性有以下6种。 系统大小:系统越大,理解掌握起来越困难。系统越大,所执行功能越复杂。因而需 要更多的维护工作量。 程序设计语言:语言的功能越强,生成程序所需的指令数就越少;语言的功能越弱, 实现同样功能所需语句就越多,程序就越大。有许多软件是用较老的程序设计语言书写的 程序逻辑复杂而混乱,且没有做到模块化和结构化,直接影响到程序的可读性。 ■系统年龄:老系统随着不断的修改,结构越来越乱;由于维护人员经常更换,程序又 变得越来越难于理解。而且许多老系统在当初并未按照软件工程的要求进行开发,因而没有 文档,或文档太少,或在长期的维护过程中文档在许多地方与程序实现变得不一致,这样在 维护时就会遇到很大困难。 数据库技术的应用:使用数据库,可以简单而有效地管理和存储用户程序中的数据, 还可以减少生成用户报表应用软件的维护工作量 先进的软件开发技术:在软件开发时,若使用能使软件结构比较稳定的分析与设计技 术,及程序设计技术,如面向对象技术、复用技术等,可减少大量的工作量 ■其它:例如,应用的类型、数学模型、任务的难度、开关与标记、IF嵌套深度、索引 或下标数等,对维护工作量都有影响 此外,许多软件在开发时并未考虑将来的修改,这就为软件的维护带来许多问题 3)软件维护的策略 根据影响软件维护工作量的各种因素,针对三种典型的维护, James martin等提出了一 些策略,以控制维护成本。 ①改正性维护 要生成100%可靠的软件成本太高,不一定合算。但通过使用新技术,可大大提高可靠 减少进行改正性维护的需要。这些技术包括:数据库管理系统、软件开发环境、程序自 生成系统、较高级(第四代)的语言,应用以上4种方法可产生更加可靠的代码。此外 利用应用软件包,可开发出比由用户完全自己开发的系统可靠性更高的软件。 结构化技术,用它开发的软件易于理解和测试 防错性程序设计。把自检能力引入程序,通过非正常状态的检査,提供审査跟踪。 通过周期性维护审査,在形成维护问题之前就可确定质量缺陷 ②适应性维护 这一类的维护不可避免,但可以控制。 在配置管理时,把硬件、操作系统和其它相关环境因素的可能变化考虑在内,可以减 少某些适应性维护的工作量。 把与硬件、操作系统,以及其它外围设备有关的程序归到特定的程序模块中。可把因
6 图 7.4 三类维护占总维护比例 图 7.5 维护在软件生存期所占比例 ④ 预防性维护 除了以上三类维护之外,还有一类维护活动,叫做预防性维护。这是为了提高软件的可 维护性、可靠性等,为以后进一步改进软件打下良好基础。通常,预防性维护定义为:“把今 天的方法学用于昨天的系统以满足明天的需要”。也就是说,采用先进的软件工程方法对需要 维护的软件或软件中的某一部分(重新)进行设计、编制和测试。 在整个软件维护阶段所花费的全部工作量中,预防性维护只占很小的比例,而完善性维护占 了几乎一半的工作量。参看图 7.4。从图 7.5 中可以看到,软件维护活动所花费的工作占整个 生存期工作量的 70%以上。 (2) 影响维护工作量的因素 在软件维护中,影响维护工作量的程序特性有以下 6 种。 ▪ 系统大小:系统越大,理解掌握起来越困难。系统越大,所执行功能越复杂。因而需 要更多的维护工作量。 ▪ 程序设计语言:语言的功能越强,生成程序所需的指令数就越少;语言的功能越弱, 实现同样功能所需语句就越多,程序就越大。有许多软件是用较老的程序设计语言书写的, 程序逻辑复杂而混乱,且没有做到模块化和结构化,直接影响到程序的可读性。 ▪ 系统年龄:老系统随着不断的修改,结构越来越乱;由于维护人员经常更换,程序又 变得越来越难于理解。而且许多老系统在当初并未按照软件工程的要求进行开发,因而没有 文档,或文档太少,或在长期的维护过程中文档在许多地方与程序实现变得不一致,这样在 维护时就会遇到很大困难。 ▪ 数据库技术的应用:使用数据库,可以简单而有效地管理和存储用户程序中的数据, 还可以减少生成用户报表应用软件的维护工作量。 ▪ 先进的软件开发技术:在软件开发时,若使用能使软件结构比较稳定的分析与设计技 术,及程序设计技术,如面向对象技术、复用技术等,可减少大量的工作量。 ▪ 其它:例如,应用的类型、数学模型、任务的难度、开关与标记、IF 嵌套深度、索引 或下标数等,对维护工作量都有影响。 此外,许多软件在开发时并未考虑将来的修改,这就为软件的维护带来许多问题。 (3) 软件维护的策略 根据影响软件维护工作量的各种因素,针对三种典型的维护,James Martin 等提出了一 些策略,以控制维护成本。 ① 改正性维护 要生成 100%可靠的软件成本太高,不一定合算。但通过使用新技术,可大大提高可靠 性,减少进行改正性维护的需要。这些技术包括:数据库管理系统、软件开发环境、程序自 动生成系统、较高级(第四代)的语言,应用以上 4 种方法可产生更加可靠的代码。此外, ▪ 利用应用软件包,可开发出比由用户完全自己开发的系统可靠性更高的软件。 ▪ 结构化技术,用它开发的软件易于理解和测试。 ▪ 防错性程序设计。把自检能力引入程序,通过非正常状态的检查,提供审查跟踪。 ▪ 通过周期性维护审查,在形成维护问题之前就可确定质量缺陷。 ② 适应性维护 这一类的维护不可避免,但可以控制。 ▪ 在配置管理时,把硬件、操作系统和其它相关环境因素的可能变化考虑在内,可以减 少某些适应性维护的工作量。 ▪ 把与硬件、操作系统,以及其它外围设备有关的程序归到特定的程序模块中。可把因
环境变化而必须修改的程序局部于某些程序模块之中 ■使用内部程序列表、外部文件,以及处理的例行程序包,可为维护时修改程序提供方 ③完善性维护 利用前两类维护中列举的方法,也可以减少这一类维护。特别是数据库管理系统、程序 主成器、应用软件包,可减少系统或程序员的维护工作量。 此外,建立软件系统的原型,把它在实际系统开发之前提供给用户。用户通过研究原型, 进一步完善他们的功能要求,就可以减少以后完善性维护的需要 (4)维护成本 有形的软件维护成本是花费了多少钱,而其它非直接的的维护成本有更大的影响。例如 无形的成本可以是 些看起来是合理的修复或修改请求不能及时安排,使得客户不满意 变更的结果把一些潜在的错误引入正在维护的软件,使得软件整体质量下降: 当必须把软件人员抽调到维护工作中去时,就使得软件开发工作受到干扰 软件维护的代价是在生产率方面的惊人下降。有报告说,生产率将降到原来的40分之 。维护工作量可以分成生产性活动(如分析和评价、设计修改和实现)和“轮转”活动(如力 图理解代码在做什么、试图判明数据结构、接口特性、性能界限等)。下面的公式给出了一个 维护工作量的模型: M=p+ke 其中,M是维护中消耗的总工作量,p是上面描述的生产性工作量,K是一个经验常数,c 是因缺乏好的设计和文档而导致复杂性的度量,d是对软件熟悉程度的度量。 这个模型指明,如果使用了不好的软件开发方法(未按软件工程要求做),原来参加开发 的人员或小组不能参加维护,则工作量(及成本)将按指数级增加。 3.软件维护活动 (1)维护机构 除了较大的软件开发公司外,通常在软件维护工作方面,不保持正式的维护机构。维护 往往是在没有计划的情况下进行的。虽然不要求建立一个正式的维护机构,但是在开发部门, 确立一个非正式的维护机构则是非常必要的。例如图76就是一个维护机构的组织方案 修改负责人 申请维护 维护管理员 系统监督员 配置管理员 维护人员
7 环境变化而必须修改的程序局部于某些程序模块之中。 ▪ 使用内部程序列表、外部文件,以及处理的例行程序包,可为维护时修改程序提供方 便。 ③ 完善性维护 利用前两类维护中列举的方法,也可以减少这一类维护。特别是数据库管理系统、程序 生成器、应用软件包,可减少系统或程序员的维护工作量。 此外,建立软件系统的原型,把它在实际系统开发之前提供给用户。用户通过研究原型, 进一步完善他们的功能要求,就可以减少以后完善性维护的需要。 (4) 维护成本 有形的软件维护成本是花费了多少钱,而其它非直接的的维护成本有更大的影响。例如, 无形的成本可以是: ▪ 一些看起来是合理的修复或修改请求不能及时安排,使得客户不满意; ▪ 变更的结果把一些潜在的错误引入正在维护的软件,使得软件整体质量下降; ▪ 当必须把软件人员抽调到维护工作中去时,就使得软件开发工作受到干扰。 软件维护的代价是在生产率方面的惊人下降。有报告说,生产率将降到原来的 40 分之 一。维护工作量可以分成生产性活动(如分析和评价、设计修改和实现)和“轮转”活动(如力 图理解代码在做什么、试图判明数据结构、接口特性、性能界限等)。下面的公式给出了一个 维护工作量的模型: c d M p Ke − = + 其中,M 是维护中消耗的总工作量,p 是上面描述的生产性工作量,K 是一个经验常数,c 是因缺乏好的设计和文档而导致复杂性的度量,d 是对软件熟悉程度的度量。 这个模型指明,如果使用了不好的软件开发方法(未按软件工程要求做),原来参加开发 的人员或小组不能参加维护,则工作量(及成本)将按指数级增加。 3. 软件维护活动 (1) 维护机构 除了较大的软件开发公司外,通常在软件维护工作方面,不保持正式的维护机构。维护 往往是在没有计划的情况下进行的。虽然不要求建立一个正式的维护机构,但是在开发部门, 确立一个非正式的维护机构则是非常必要的。例如图 7.6 就是一个维护机构的组织方案
图76软件维护的机构 维护申请提交给一个维护管理员,他把申请交给某个系统监督员去评价。一旦做出评价, 由修改负责人确定如何进行修改。在维护人员对程序进行修改的过程中,由配置管理员严格 把关,控制修改的范围,对软件配置进行审计。 维护管理员、系统监督员、修改负责人等,均代表维护工作的某个职责范围。修改负责 人、维护管理员可以是指定的某个人,也可以是一个包括管理人员、高级技术人员在内的小 组。系统监督员可以有其他职责,但应具体分管某一个软件包。 在开始维护之前,就把责任明确下来,可以大大减少维护过程中的混乱。 (2)软件维护工作流程 先确认维护要求。这需要维护人员与用户反复协商,弄清错误概况以及对业务的影响 大小,以及用户希望做什么样的修改。然后由维护组织管理员确认维护类型。 对于改正性维护申请,从评价错误的严重性开始。如果存在严重的错误,则必须安排 人员,在系统监督员的指导下,进行问题分析,寻找错误发生的原因,进行“救火”性的紧 急维护;对于不严重的错误,可根据任务、机时情况、视轻重缓急,进行排队,统一安排时 对于适应性维护和完善性维护申请,需要先确定每项申请的优先次序。若某项申请的 优先级非常高,就可立即开始维护工作,否则,维护申请和其它的开发工作一样,进行排队, 统一安排时间 尽管维护申请的类型不同,但都要进行同样的技术工作。这些工作有:修改软件需求 说明、修改软件设计、设计评审、对源程序做必要的修改、单元测试、集成测试(回归测试) 确认测试、软件配置评审等 ■在每次软件维护任务完成后,最好进行一次情况评审,确认:在目前情况下,设计、 编码、测试中的哪一方面可以改进?哪些维护资源应该有但没有?工作中主要的或次要的障 碍是什么?从维护申请的类型来看是否应当有预防性维护? (3)维护评价 评价维护活动比较困难,因为缺乏可靠的数据。但如果维护记录做得比较好,就可以得 出一些维护“性能”方面的度量值。可参考的度量值如: 每次程序运行时的平均出错次数 花费在每类维护上的总“人时”数 每个程序、每种语言、每种维护类型的程序平均修改次数 因为维护,增加或删除每个源程序语句所花费的平均“人时”数: 用于每种语言的平均“人时”数 维护申请报告的平均处理时间 各类维护申请的百分比。 这七种度量值提供了定量的数据,据此可对开发技术、语言选择、维护工作计划、资源 分配、以及其它许多方面做出判定。因此,这些数据可以用来评价维护工作 4.程序修改的步骤及修改的副作用 (1)分析和理解程序 经过分析,全面、准确、迅速地理解程序是决定维护成败和质量好坏的关键。在这方面, 软件的可理解性和文档的质量非常重要。必须: 理解程序的功能和目标 掌握程序的结构信息,即从程序中细分出若干结构成分。如程序系统结构、控制结
8 图 7.6 软件维护的机构 维护申请提交给一个维护管理员,他把申请交给某个系统监督员去评价。一旦做出评价, 由修改负责人确定如何进行修改。在维护人员对程序进行修改的过程中,由配置管理员严格 把关,控制修改的范围,对软件配置进行审计。 维护管理员、系统监督员、修改负责人等,均代表维护工作的某个职责范围。修改负责 人、维护管理员可以是指定的某个人,也可以是一个包括管理人员、高级技术人员在内的小 组。系统监督员可以有其他职责,但应具体分管某一个软件包。 在开始维护之前,就把责任明确下来,可以大大减少维护过程中的混乱。 (2) 软件维护工作流程 ▪ 先确认维护要求。这需要维护人员与用户反复协商,弄清错误概况以及对业务的影响 大小,以及用户希望做什么样的修改。然后由维护组织管理员确认维护类型。 ▪ 对于改正性维护申请,从评价错误的严重性开始。如果存在严重的错误,则必须安排 人员,在系统监督员的指导下,进行问题分析,寻找错误发生的原因,进行“救火”性的紧 急维护; 对于不严重的错误,可根据任务、机时情况、视轻重缓急,进行排队,统一安排时 间。 ▪ 对于适应性维护和完善性维护申请,需要先确定每项申请的优先次序。若某项申请的 优先级非常高,就可立即开始维护工作,否则,维护申请和其它的开发工作一样,进行排队, 统一安排时间。 ▪ 尽管维护申请的类型不同,但都要进行同样的技术工作。这些工作有:修改软件需求 说明、修改软件设计、设计评审、对源程序做必要的修改、单元测试、集成测试( 回归测试)、 确认测试、软件配置评审等。 ▪ 在每次软件维护任务完成后,最好进行一次情况评审,确认:在目前情况下,设计、 编码、测试中的哪一方面可以改进?哪些维护资源应该有但没有?工作中主要的或次要的障 碍是什么?从维护申请的类型来看是否应当有预防性维护? (3) 维护评价 评价维护活动比较困难,因为缺乏可靠的数据。但如果维护记录做得比较好,就可以得 出一些维护“性能”方面的度量值。可参考的度量值如: ▪ 每次程序运行时的平均出错次数; ▪ 花费在每类维护上的总“人时”数; ▪ 每个程序、每种语言、每种维护类型的程序平均修改次数; ▪ 因为维护,增加或删除每个源程序语句所花费的平均“人时”数; ▪ 用于每种语言的平均“人时”数; ▪ 维护申请报告的平均处理时间; ▪ 各类维护申请的百分比。 这七种度量值提供了定量的数据,据此可对开发技术、语言选择、维护工作计划、资源 分配、以及其它许多方面做出判定。因此,这些数据可以用来评价维护工作。 4. 程序修改的步骤及修改的副作用 (1) 分析和理解程序 经过分析,全面、准确、迅速地理解程序是决定维护成败和质量好坏的关键。在这方面, 软件的可理解性和文档的质量非常重要。必须: ▪ 理解程序的功能和目标; ▪ 掌握程序的结构信息,即从程序中细分出若干结构成分。如程序系统结构、 控制结
构、数据结构和输入/输出结构等 了解数据流信息,即所涉及到的数据来源何处,在哪里被使用 了解控制流信息,即执行每条路径的结果; 理解程序的操作(使用)要求 为了容易地理解程序,要求自顶向下地理解现有源程序的程序结构和数据结构,为此可 采用如下方法 ①分析程序结构图: 分析各个过程的源代码,建立一个直接调用矩阵D或调用树。 建立过程的间接调用矩阵 分析各个过程的接口,估计更改的复杂性。 ②数据跟踪 建立各层次的程序级上的接口图,展示各模块或过程的调用方式和接口参数 ■利用数据流分析方法,对过程内部的一些变量进行跟踪:维护人员通过这种数据流跟 可获得有关数据在过程间如何传递,在过程内如何处理等信息 ③控制跟踪 控制流跟踪同样可在结构图基础上或源程序基础上进行。可采用符号执行或实际动态跟 踪的方法,了解数据如何从一个输入源到达输出点的 ④在分析的过程中,充分阅读和使用源程序清单和文档,分析现有文档的合理性。 ⑤充分使用由编译程序或汇编程序提供的交叉引用表、符号表、以及其它有用的信息。 ⑥如有可能,积极参加开发工作。 (2)修改程序 对程序的修改,必须事先做出计划,有预谋地、周密有效地实施修改。 ①设计程序的修改计划 程序的修改计划要考虑人员和资源的安排。修改计划的内容主要包括: 规格说明信息:数据修改、处理修改、作业控制语言修改、系统之间接口的修改等; ■维护资源:新程序版本、测试数据、所需的软件系统、计算机时间等 人员:程序员、用户相关人员、技术支持人员、厂家联系人、数据录入员等; 提供:纸面、计算机媒体等 针对以上每一项,要说明必要性、从何处着手、是否接受、日期等。通常,可采用自顶 向下的方法,在理解程序的基础上, i)研究程序的各个模块、模块的接口、及数据库,从全局的观点,提出修改计划。 ⅱ)依次地把要修改的、以及那些受修改影响的模块和数据结构分离出来。为此,要 识别受修改影响的数据 识别使用这些数据的程序模块 对于上面程序模块,按是产生数据、修改数据、还是删除数据进行分类 识别对这些数据元素的外部控制信息; 识别编辑和检查这些数据元素的地方 隔离要修改的部分 i)详细地分析要修改的、以及那些受变更影响的模块和数据结构的内部细节,设计修 改计划,标明新逻辑及要改动的现有逻辑。 iv)向用户提供回避措施。用户的某些业务因软件中发生问题而中断,为不让系统长时 间停止运行,需把问题局部化,在可能的范围内继续开展业务。可以采取的措施有 在问题的原因还未找到时,先就问题的现象,提供回避的操作方法 如果弄清了问题的原因,可通过临时修改或改变运行控制以回避在系统运行时产生
9 构、数据结构和输入/输出结构等; ▪ 了解数据流信息,即所涉及到的数据来源何处,在哪里被使用; ▪ 了解控制流信息,即执行每条路径的结果; ▪ 理解程序的操作(使用)要求; 为了容易地理解程序,要求自顶向下地理解现有源程序的程序结构和数据结构,为此可 采用如下方法: ① 分析程序结构图: ▪ 分析各个过程的源代码,建立一个直接调用矩阵 D 或调用树。 ▪ 建立过程的间接调用矩阵。 ▪ 分析各个过程的接口,估计更改的复杂性。 ② 数据跟踪 ▪ 建立各层次的程序级上的接口图,展示各模块或过程的调用方式和接口参数; ▪ 利用数据流分析方法,对过程内部的一些变量进行跟踪;维护人员通过这种数据流跟 踪,可获得有关数据在过程间如何传递,在过程内如何处理等信息。 ③ 控制跟踪 控制流跟踪同样可在结构图基础上或源程序基础上进行。可采用符号执行或实际动态跟 踪的方法,了解数据如何从一个输入源到达输出点的。 ④ 在分析的过程中,充分阅读和使用源程序清单和文档,分析现有文档的合理性。 ⑤ 充分使用由编译程序或汇编程序提供的交叉引用表、符号表、以及其它有用的信息。 ⑥ 如有可能,积极参加开发工作。 (2) 修改程序 对程序的修改,必须事先做出计划,有预谋地、周密有效地实施修改。 ① 设计程序的修改计划 程序的修改计划要考虑人员和资源的安排。修改计划的内容主要包括: ▪ 规格说明信息:数据修改、处理修改、作业控制语言修改、系统之间接口的修改等; ▪ 维护资源:新程序版本、测试数据、所需的软件系统、计算机时间等; ▪ 人员:程序员、用户相关人员、技术支持人员、厂家联系人、数据录入员等; ▪ 提供:纸面、计算机媒体等。 针对以上每一项,要说明必要性、从何处着手、是否接受、日期等。通常,可采用自顶 向下的方法,在理解程序的基础上, ⅰ) 研究程序的各个模块、模块的接口、及数据库,从全局的观点,提出修改计划。 ⅱ) 依次地把要修改的、以及那些受修改影响的模块和数据结构分离出来。为此,要 ▪ 识别受修改影响的数据; ▪ 识别使用这些数据的程序模块; ▪ 对于上面程序模块,按是产生数据、修改数据、还是删除数据进行分类; ▪ 识别对这些数据元素的外部控制信息; ▪ 识别编辑和检查这些数据元素的地方; ▪ 隔离要修改的部分; ⅲ) 详细地分析要修改的、以及那些受变更影响的模块和数据结构的内部细节,设计修 改计划,标明新逻辑及要改动的现有逻辑。 ⅳ) 向用户提供回避措施。用户的某些业务因软件中发生问题而中断,为不让系统长时 间停止运行,需把问题局部化,在可能的范围内继续开展业务。可以采取的措施有: ▪ 在问题的原因还未找到时,先就问题的现象,提供回避的操作方法。 ▪ 如果弄清了问题的原因,可通过临时修改或改变运行控制以回避在系统运行时产生
的问题 ②修改代码,以适应变化 正确、有效地编写修改代码 要谨慎地修改程序,尽量保持程序的风格及格式,要在程序清单上注明改动的指令 不要删除程序语句,除非完全肯定它是无用的 不要试图共用程序中已有的临时变量或工作区,为了避免冲突或混淆用途,应自行设 置自己的变量 插入错误检测语句 在修改过程中做好修改的详细记录,消除变更中任何有害的副作用(波动效应) ③修改程序的副作用 所谓副作用是指因修改软件而造成的错误或其它不希望发生的情况,有三种副作用: 修改代码的副作用。在使用程序设计语言修改源代码时,都可能引入错误。例如,删 除或修改一个子程序、删除或修改一个标号、删除或修改一个标识符、改变程序代码的时序 关系、改变占用存储的大小、改变逻辑运算符、修改文件的打开或关闭、改进程序的执行效 率,以及把设计上的改变翻译成代码的改变、为边界条件的逻辑测试做出改变时,都容易引 入错误 ■修改数据的副作用。在修改数据结构时,有可能造成软件设计与数据结构不匹配,因 而导致软件出错。数据副作用就是修改软件信息结构导致的结果。例如,在重新定义局部的 或全局的常量、重新定义记录或文件的格式、增大或减小一个数组或高层数据结构的大小 修改全局或公共数据、重新初始化控制标志或指针、重新排列输入/输出或子程序的参数时, 容易导致设计与数据不相容的错误。数据副作用可以通过详细的设计文档加以控制。在此文 档中描述了一种交叉引用,把数据元素、记录、文件和其它结构联系起来 文档的副作用。对数据流、软件结构、模块逻辑或任何其它有关特性进行修改时, 必须对相关技术文档进行相应修改。否则会导致文档与程序功能不匹配,缺省条件改变,新 错误信息不正确等错误。使得软件文档不能反映软件的当前状态。对于用户来说,软件事实 上就是文档。如果对可执行软件的修改不反映在文档里,就会产生文档的副作用。例如,对 交互输入的顺序或格式进行修改,如果没有正确地记入文档中,就可能引起重大的问题。过 时的文档内容、索引和文本可能造成冲突,引起用户的失败和不满。因此,必须在软件交付 之前对整个软件配置进行评审,以减少文档的副作用。 为了控制因修改而引起的副作用,要做到: i)按模块把修改分组 ⅱ)自顶向下地安排被修改模块的顺序: ⅲi)每次修改一个模块; iv)对于每个修改了的模块,在安排修改下一个模块之前,要确定这个修改的副作用 可以使用交叉引用表、存储映象表、执行流程跟踪等。 (3)重新验证程序 在将修改后的程序提交用户之前,需要用以下的方法进行充分的确认和测试,以保证整 个修改后的程序的正确性 ①静态确认 修改软件,伴随着引起新的错误的危险。为了能够做出正确的判断,验证修改后的程序 至少需要两个人参加。要检查 ■修改是否涉及到规格说眀?修改结果是否符合规格说明?有没有歪曲规格说明? 程序的修改是否足以修正软件中的问题?源程序代码有无逻辑错误?修改时有无修补 失误?
10 的问题。 ② 修改代码,以适应变化 ▪ 正确、有效地编写修改代码; ▪ 要谨慎地修改程序,尽量保持程序的风格及格式,要在程序清单上注明改动的指令; ▪ 不要删除程序语句,除非完全肯定它是无用的; ▪ 不要试图共用程序中已有的临时变量或工作区,为了避免冲突或混淆用途,应自行设 置自己的变量; ▪ 插入错误检测语句; ▪ 在修改过程中做好修改的详细记录,消除变更中任何有害的副作用(波动效应); ③ 修改程序的副作用 所谓副作用是指因修改软件而造成的错误或其它不希望发生的情况,有三种副作用: ▪ 修改代码的副作用。在使用程序设计语言修改源代码时,都可能引入错误。例如,删 除或修改一个子程序、删除或修改一个标号、 删除或修改一个标识符、改变程序代码的时序 关系、改变占用存储的大小、改变逻辑运算符、修改文件的打开或关闭、改进程序的执行效 率,以及把设计上的改变翻译成代码的改变、为边界条件的逻辑测试做出改变时,都容易引 入错误。 ▪ 修改数据的副作用。在修改数据结构时,有可能造成软件设计与数据结构不匹配,因 而导致软件出错。数据副作用就是修改软件信息结构导致的结果。例如,在重新定义局部的 或全局的常量、 重新定义记录或文件的格式、增大或减小一个数组或高层数据结构的大小、 修改全局或公共数据、重新初始化控制标志或指针、重新排列输入/输出或子程序的参数时, 容易导致设计与数据不相容的错误。数据副作用可以通过详细的设计文档加以控制。在此文 档中描述了一种交叉引用,把数据元素、记录、文件和其它结构联系起来。 ▪ 文档的副作用。对数据流、软件结构、 模块逻辑或任何其它有关特性进行修改时, 必须对相关技术文档进行相应修改。否则会导致文档与程序功能不匹配,缺省条件改变,新 错误信息不正确等错误。使得软件文档不能反映软件的当前状态。对于用户来说,软件事实 上就是文档。如果对可执行软件的修改不反映在文档里,就会产生文档的副作用。例如,对 交互输入的顺序或格式进行修改,如果没有正确地记入文档中,就可能引起重大的问题。过 时的文档内容、索引和文本可能造成冲突,引起用户的失败和不满。因此,必须在软件交付 之前对整个软件配置进行评审,以减少文档的副作用。 为了控制因修改而引起的副作用,要做到: ⅰ) 按模块把修改分组; ⅱ) 自顶向下地安排被修改模块的顺序; ⅲ) 每次修改一个模块; ⅳ) 对于每个修改了的模块,在安排修改下一个模块之前,要确定这个修改的副作用。 可以使用交叉引用表、存储映象表、执行流程跟踪等。 (3) 重新验证程序 在将修改后的程序提交用户之前,需要用以下的方法进行充分的确认和测试,以保证整 个修改后的程序的正确性。 ① 静态确认 修改软件,伴随着引起新的错误的危险。为了能够做出正确的判断,验证修改后的程序 至少需要两个人参加。要检查 ▪ 修改是否涉及到规格说明? 修改结果是否符合规格说明? 有没有歪曲规格说明? ▪ 程序的修改是否足以修正软件中的问题? 源程序代码有无逻辑错误? 修改时有无修补 失误?