所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。可以通过描述软件交付使用后可能进行的4项活动,具体地定义软件维护
改正性维护
因为软件测试不可能暴露出一个大型软件系统中所有潜藏的错误,所以必然会有第一项维护活动: 在任何大型程序的使用期间,用户必然会发现程序错误,并且把他们遇到的问题报告给维护人员。把诊断和改正错误的过程称为改正性维护
适应性维护
适应性维护,也就是为了和变化了的环境适当地配合而进行的修改软件的活动,是既必要又经常的维护活动
完善性维护
当一个软件系统顺利地运行时,常常出现第三项维护活动:在使用软件的过程中用户往往提出增加新功能或修改已有功能的建议,还可能提出一般性的改进意见。为了满足这类要求,需要进行完善性维护。这项维护活动通常占软件维护工作的大部分
预防性维护
当为了改进未来的可维护性或可靠性,或为了给未来的改进奠定更好的基础而修改软件时,出现了第四项维护活动。这项维护活动通常称为预防性维护,目前这项维护活动相对比较少
从上述关于软件维护的定义不难看出,软件维护绝不仅限于纠正使用中发现的错误,事实上在全部维护活动中一半以上是完善性维护。 应该注意,上述4类维护活动都必须应用于整个软件配置,维护软件文档和维护软件的可执行代码是同样重要的。
可以把软件的可维护性定性地定义为: 维护人员理解、改正、改动或改进这个软件的难易程度
软件可理解性表现为外来读者理解软件的结构、功能、接口和内部处理过程的难易程度。模块化(模块结构良好,高内聚,松耦合)、详细的设计文档、结构化设计、程序内部的文档和良好的高级程序设计语言等,都对提高软件的可理解性有重要贡献
软件容易修改的程度和本书第5章讲过的设计原理和启发规则直接有关。耦合、内聚、信息隐藏、局部化、控制域与作用域的关系等,都影响软件的可修改性
软件可移植性指的是,把程序从一种计算环境(硬件配置和操作系统)转移到另一种计算环境的难易程度。把与硬件、操作系统以及其他外部设备有关的程序代码集中放到特定的程序模块中,可以把因环境变化而必须修改的程序局限在少数程序模块中,从而降低修改的难度
所谓重用(reuse)是指同一事物不做修改或稍加改动就在不同环境中多次重复使用。大量使用可重用的软件构件来开发软件,可以从下述两个方面提高软件的可维护性。
(1) 通常,可重用的软件构件在开发时都经过很严格的测试,可靠性比较高,且在每次重用过程中都会发现并清除一些错误,随着时间推移,这样的构件将变成实质上无错误的。因此,软件中使用的可重用构件越多,软件的可靠性越高,改正性维护需求就越少。
(2) 很容易修改可重用的软件构件使之再次应用在新环境中,因此,软件中使用的可重用构件越多,适应性和完善性维护也就越容易
文档是影响软件可维护性的决定因素。由于长期使用的大型软件系统在使用过程中必然会经受多次修改,所以文档比程序代码更重要。
软件文档应该满足下述要求: (1) 必须描述如何使用这个系统,没有这种描述时即使是最简单的系统也无法使用。 (2) 必须描述怎样安装和管理这个系统。 (3) 必须描述系统需求和设计。 (4) 必须描述系统的实现和测试,以便使系统成为可维护的
文档可分为用户文档和系统文档
用户文档是用户了解系统的第一步,它应该能使用户获得对系统的准确的初步印象
(1)功能描述 (2) 安装文档 (3) 使用手册 (4) 参考手册(要完整) (5) 操作员指南(如果需要有系统操作员的话)
系统文档是指从问题定义、需求说明到验收测试计划这样一系列和系统实现有关的文档。描述系统设计、实现和测试的文档对于理解程序和维护程序来说是极端重要的。
和用户文档类似,系统文档的结构也应该能把读者从对系统概貌的了解,引导到对系统每个方面每个特点的更形式化更具体的认识
典型的软件再工程过程模型
维护是软件生命周期的最后一个阶段,也是持续时间最长、代价最大的一个阶段。
软件工程学的主要目的就是提高软件的可维护性,降低维护的代价。
软件维护通常包括4类活动:改正性维护、适应性维护、完善性维护、预防性维护。
软件的可理解性、可测试性、可修改性、可移植性和可重用性,是决定软件可维护性的基本因素。 在软件生命周期的每个阶段都必须充分考虑维护问题,并且为软件维护预做准备。
文档是影响软件可维护性的决定因素。
在条件具备时应该主动地进行预防性维护。
预防性维护实质上是软件再工程。
典型的软件再工程过程模型定义了库存目录分析、文档重构、逆向工程、代码重构、数据重构和正向工程6类活动。