# 软件维护

> CIE A-Level 计算机科学 · 9618 (2022-2024)
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u12-software-maintenance/

软件维护是软件开发生命周期的部署后阶段，涵盖发布后对运行中系统的所有更新、修复和修改。本指南讲解了该主题的核心类型、成因、成本以及常见考试要求。

**先修:** [软件开发生命周期模型](https://www.owlsprep.com/zh/study/cie-9618-u12-software-development-lifecycle-models/)

## 学习目标

- 区分四种核心软件维护类型
- 在不同场景中识别维护需求的常见原因
- 计算生命周期中用于维护的成本占比
- 解释回归测试等关键维护活动的目的

## 软件维护的核心类型

CIE 9618根据变更目的将软件维护分为四个不同类别。所有维护工作都发生在软件部署给最终用户并投入使用之后。

**软件维护** — 软件产品发布到生产环境后，修改、更新、纠正和改进产品所需的所有活动。

*例:* 为手机银行应用修补新发现的安全漏洞

| 类型 | 核心目的 | 示例 |
| --- | --- | --- |
| 纠错性 | 修复测试中遗漏的现有错误/漏洞 | 修复处理空购物车时结账崩溃的问题 |
| 适应性 | 适应新的外部需求/环境 | 更新应用以在Windows新主版本上运行 |
| 完善性 | 添加新功能或改善用户体验 | 为社交媒体应用添加深色模式 |
| 预防性 | 预防未来问题，提升可维护性 | 在过时无文档的代码引发错误之前对其重构 |

**例题:** 某学校的内部考勤系统为符合政府新的数据保护规则进行了更新。这属于哪类维护？请证明你的答案。

1. 首先，确定变更的驱动因素：此次更新是为了满足系统最初构建时不存在的新外部监管要求。
2. 将变更驱动因素对应到维护类型：适应性维护涵盖满足新外部环境或监管要求的修改。
3. 结论：这是适应性维护的一个示例。

## 软件维护需求的常见原因

维护需求来自软件生命周期中的多个来源。在考试题目中，识别变更的根本原因有助于正确分类维护类型。

- 发布前测试遗漏的未被发现的错误和漏洞
- 运行环境的变化：新硬件、操作系统或第三方API
- 规范软件使用的法律或监管要求变更
- 不断变化的用户和业务需求，需要添加新功能或修改现有工作流
- 提升老化代码库长期可维护性的需求

**例题:** 举出两个纠错性维护的具体常见原因。

1. 首先回忆：纠错性维护修复软件中现有的故障。
2. 第一个常见原因：需求捕获不完整，导致开发过程中未发现错误逻辑。例如，计税程序没有考虑需求确定后新增的税级。
3. 第二个常见原因：测试不完整，导致发布前未发现边界案例漏洞。例如，当1000名用户同时登录时系统崩溃，这种并发量在发布前测试中从未测试过。

## 软件维护的成本

对于大多数生命周期较长的软件产品，维护成本占产品总生命周期成本的60%-80%，远超过初始开发成本。成本包括变更和测试的直接人工成本，以及更新期间停机和用户再培训等间接成本。

> **info**
>
> 考试中常见问题会问为什么维护成本这么高。关键原因包括：代码老化且无文档、人员流动、需求变化，以及每次变更后都需要进行完整回归测试。

**例题:** 一个软件项目的初始开发成本为 \$200,000。在10年生命周期中，每年维护成本为 \$45,000。维护成本占总生命周期成本的百分比是多少？

1. 计算10年生命周期内的总维护成本：
2. $$10 \times 45000 = 450000$$
3. 计算总生命周期成本，即初始开发成本加总维护成本：
4. $$200000 + 450000 = 650000$$
5. 计算维护成本占总成本的百分比：
6. $$\left(\frac{450000}{650000}\right) \times 100 \approx 69.2\%$$
7. 这符合行业经验法则：对于生命周期较长的产品，维护成本占软件总生命周期成本的大部分。

## 关键维护活动

标准维护工作流遵循四个关键步骤：理解现有代码库、实现所需变更、测试变更，以及向最终用户部署更新版本。

回归测试是维护中最关键的测试步骤：它重新运行受影响模块的所有现有测试，以确认新变更没有破坏任何现有正常功能。

**例题:** 解释为什么几乎所有软件维护工作都需要回归测试。

1. 对现有代码的任何变更都可能在系统之前正常运行的部分引入新错误，即使变更本身实现正确。
2. 回归测试重新运行受影响系统模块的现有测试，以确认所有现有功能在变更后仍按预期运行。
3. 如果没有回归测试，修复一个漏洞很容易在系统不相关部分引入多个新漏洞，导致后续更多维护工作。

## 常见错误

- **错误做法:** 混淆适应性维护和完善性维护
  - 原因: 两者都是非纠错性变更，容易导致学生混淆。适应性维护针对新外部条件，完善性维护针对新用户功能。
  - 正确做法: 如果变更是为了适应新外部环境、法规或硬件，则属于适应性维护。如果为满足用户需求添加新功能，则属于完善性维护。
- **错误做法:** 认为维护仅包含修复漏洞
  - 原因: 只有纠错性维护修复漏洞。四种核心维护类型中有三种是非纠错性的。
  - 正确做法: 记住所有四类：纠错性、适应性、完善性和预防性。只有纠错性维护处理现有漏洞。
- **错误做法:** 默认假设维护成本比初始开发更高
  - 原因: 这对于生命周期长的软件成立，但对于生命周期仅1-2年的短期项目不成立。
  - 正确做法: 比较成本时，始终计算产品生命周期内的总维护成本，不要依赖假设。
- **错误做法:** 忘记回归测试是核心维护活动
  - 原因: 学生常将回归测试与发布前单元测试混淆，在维护相关考试题目中遗漏该点。
  - 正确做法: 记住回归测试特指变更后重新测试现有功能，这是几乎所有维护工作都需要的步骤。

## 速查表

| 维护类型 | 核心目的 |
| --- | --- |
| 纠错性 | 修复现有漏洞/缺陷 |
| 适应性 | 适应新环境/法规 |
| 完善性 | 添加新用户功能/提升可用性 |
| 预防性 | 预防未来问题，提升可维护性 |

## 下一步

软件维护是软件开发生命周期的最后一个活跃阶段，在CIE 9618的试卷1中，维护类型分类和解释维护成本的题目十分常见。本主题建立在你对整个软件开发生命周期的理解之上，关联到同样经常考查的测试方法、需求分析和项目管理主题。巩固你对维护分类的知识将帮助你在场景题中轻松得分。你可以查看下方相关资源拓展学习。

- [软件项目管理](https://www.owlsprep.com/zh/study/cie-9618-u12-software-project-management/)
- [计算思维与问题解决（含声明式、面向对象和人工智能）](https://www.owlsprep.com/zh/study/cie-9618-u13-overview/)
- [问题分解](https://www.owlsprep.com/zh/study/cie-9618-u13-problem-decomposition/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u12-software-maintenance/
