发布于 2026-01-06 1 阅读
0

软件维护,了解其四种类型

软件维护,了解其四种类型

本文最初以《软件维护:理解四种类型》为题,全文发表于CoderHood网站。CoderHood 是一个专注于软件工程中人文因素的博客。


软件系统是存储在存储设备上的一系列比特。人们可能会认为,一旦软件应用程序运行正常,只要它运行的硬件也正常工作,它就应该永远运行下去。那么,为什么还需要“软件维护”呢?软件系统不会像物理设备那样磨损,也没有任何材料会腐烂或生锈。它不受大气、污染、天气的影响,也没有任何物理部件会损坏。然而,这种说法忽略了一个关键因素:运行环境。

软件应用程序虽然没有会因物理磨损而损坏的活动部件,但它们通常依赖于其运行环境。除极少数例外情况外,随着运行环境的不可避免地发生变化,应用程序赖以构建的假设也会随之瓦解。最终,应用程序会停止运行或失去其价值。

上下文变化示例

让我举几个例子来说明哪些环境变化会导致软件系统失去价值或崩溃:

  • 当谷歌更改其身份验证协议时,允许用户使用谷歌身份验证登录的网站将停止工作。(外部依赖项发生变化)
  • 当天气预报软件系统所使用的数学天气模型过时时,该系统也会过时。(最新知识的更新换代)
  • 当竞争对手推出的新款导航软件产品性能显著优于原有产品时,原有车载导航软件就会过时。(市场预期变化)
  • 当金融机构用于管理银行账户的软件运行的硬件出现故障,且兼容的硬件不再可用时,该软件必须进行更新。(硬件变更)
  • 当应用程序使用的某个第三方库需要更新到不向下兼容的新版本时,应用程序将停止工作。(软件依赖项变更)
  • 需要对应用程序进行修改以符合新的法律法规。(合规性变更)
  • 由于闰年的定义发生了变化,应用程序需要进行修复。(外部概念和定义发生了变化)
  • 一款应用程序需要与一款新兴且流行的第三方系统集成。(市场环境变化)
  • 网站流量不断增长,网站软件需要重新架构才能适应新的流量水平。(用户模式发生变化)

因此,原则上,软件应用程序确实不会像物理磨损那样损耗。然而,如果维护不当,非物理因素也会导致软件应用程序老化并最终失效。

软件维护的不同类型

软件系统维护分为四种类型:适应性维护、纠正性维护、完善性维护和预防性维护。请注意,这些名称并非我杜撰。如果是我,我会选择不同的名称。例如,我觉得“完善性”这个词有点别扭,但为了与行业标准术语保持一致,我还是会沿用它。

维护操作始终属于软件变更,但其分类取决于触发原因。让我们深入了解四种维护类型以及如何识别它们。

软件纠正性维护

纠正性维护措施是指您因以下原因而进行的软件更改:

  1. 存在一个严重问题,导致软件无法按预期运行。
  2. 问题正在切实影响用户,或者您怀疑问题正在影响用户。

例如,如果您发布了一个软件系统,而用户遇到了一个漏洞,则需要采取纠正性维护措施来修复它。请注意,如果用户从未受到该漏洞的影响,并且您在任何人注意到之前就解决了它,则该维护措施属于预防性或适应性维护。但是,如果即使只有一个用户可能受到影响,那么修复该问题就属于纠正性维护。

如果你大部分时间都花在处理纠正性维护任务上,那么你的工程团队就一直处于疲于奔命的状态。要重视这种情况,因为这可能表明你的测试流程、预测问题的能力、团队的资历和技能水平、代码质量或工程能力都存在问题。

自适应软件维护

自适应维护是指在软件系统发生变更时进行的维护,原因如下:

  1. 您已掌握确凿信息,表明您的软件所处的运行环境正在发生变化(例如,市场、技术、法律等)。
  2. 您对景观变化的方向和时间线有很好的理解。
  3. 您的客户在未来某个可预见的时间点将会受到影响,或者他们现在就已经受到影响,但可以通过一些简单且成本低廉的变通方法来解决。

例如,假设你正在运营一个网站,并且发现它与苹果公司提前发布的仅限开发者使用的测试版 Safari 新版本不兼容。根据以往经验,你知道苹果公司会在未来几个月内发布正式版 Safari。如果你在新版 Safari 正式发布之前解决了这个问题,那么你就是在执行一项适应性维护任务。原因如下:

  1. Safari 正在发生变化
  2. 你对它的发布时间有一个很好的猜测
  3. 您的客户没有使用 Safari 的开发者版本;如果他们正在使用,他们可能已经意识到其中的风险,并且可以切换到正式版。

如果您等到新版 Safari 正式发布后再进行维护,而您的客户却遇到了问题,那么您就必须采取纠正性维护措施。故意拖延自适应维护直到需要进行纠正性维护时才进行,成本高昂,应该始终避免。

20 世纪 90 年代末的“千年虫”问题引发了一场全球范围内的大规模自适应维护浪潮,这是一个非常著名的例子。日历年注定会在 2000 年 1 月 1 日从 1999 年变为 2000 年。许多软件系统显然没有做好应对准备,但这些系统的客户当时并未受到影响。然而,到了 2000 年 1 月 1 日午夜,所有没有投入资源进行自适应维护以修复千年虫问题的软件开发商,都将面临紧急的纠正性维护工作。

Perfective 软件维护

当您对软件系统进行更改,旨在通过改进现有功能来提升其价值时,您就执行了完善性维护。完善性维护包括速度优化、用户界面和可用性改进等。完善性维护通常(但不总是)由客户反馈引发。管理良好的软件组织会认真倾听客户的意见,并在完善性维护工作达到收益递减点之前及时加大投入。

预防性软件维护

预防性维护是指为了避免未来可能出现(但不能保证一定会出现)的问题而进行的软件更改。

适应性维护和预防性维护之间的区别有时可能比较模糊。一般来说,预防性维护并非针对因环境变化而必然发生的趋势,而是针对未来可能发生也可能不发生的事件。例如,如果您担心未来不可预见的情况会导致流量激增,并决定加强软件以应对这种情况,那么您就是在进行预防性维护。另一方面,如果您的流量增长模式具有一定的可预测性,并且您能够大致预估系统何时会出现可扩展性问题,那么您为避免这些问题而进行的任何更改都属于适应性维护。

关键概念思维导图

为什么这很重要?

每次对软件系统进行更改时,都必须明确您正在执行的维护类型。跟踪维护情况能够让您深入了解自身的工程实践。例如,您在四种维护类型上花费的时间百分比,可以反映出您的软件工程团队的成熟度和技能水平。此外,它还能帮助您了解产品和代码库的成熟度。

您的工程团队应该在四种类型的维护工作上分别投入多少时间取决于诸多因素。例如,在版本发布后,您可能会看到大量需要纠正的维护工作,这并不奇怪。尽管您尽力确保发布的代码没有缺陷,但发布后总会有一些问题出现。虽然没有硬性规定,但有一些通用的注意事项和原则需要牢记。

  • 软件系统会老化。维护是软件系统拥有成本的一部分。虽然可以在一定程度上控制维护成本,但无法完全避免。
  • 随着软件系统规模扩大、复杂度提高,或者客户群不断增长,所需的维护量也会成比例地增加(但并非线性增长)。如果没有增长(也就是人员增加),不断为软件系统添加新功能或支持不断增长的客户群的工程团队,迟早会把所有时间都投入到维护工作中。我称之为“零增长”阶段,而这绝非理想状态。至于何时会进入这个阶段,则取决于诸多因素。
  • 投资预防性维护就像打赌。要想赢,你必须下注,而且猜对的次数要多于猜错的次数。
  • 不要让问题从“潜在”演变为“可预见”,最终变成“迫在眉睫”。大多数纠正性维护工作成本高昂,因为它们会影响您的品牌形象。如果您足够细心,通常可以通过成本更低的适应性或预测性维护工作来避免这些问题。要敢于冒险,行动迅速,不要忽视任何明确的信号。
  • 如果您没有从事任何自适应或预防性维护任务,您可能没有关注软件运行的环境。
  • 精益求精的维护工作存在收益递减点。就像苹果擦得再好,也只会徒劳无功。
  • 软件系统中总会有一些部分是你不想碰的。这未必是件坏事;但是,你应该注意不要把太多时间浪费在这些部分的问题上。
  • 有时候,维护工作的分类并不那么显而易见,因为它似乎涵盖了多个方面。没关系,尽力而为就好。做得越多,就越容易。

如果您喜欢这篇文章,请保持联系!

文章来源:https://dev.to/lpasqualis/software-maintenance-understanding-the-4-types-53oo