Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

维护与演化

复习

  • 分解、模块与接口:低耦合便于修改
  • 单元测试:修改不破坏既有功能
  • 版本控制:保存变更历史

TL;DR

  • 软件的大部分成本,花在它上线之后的维护上
  • 需求与环境会不断变化,软件必须随之演化
  • 可读、低耦合、有测试,是能被维护的前提
  • 好的设计,是为了让将来的修改更容易

正文

  很多人以为软件开发到“上线”就结束了。实际上,上线只是它漫长生命的开始。此后它要被使用、被修改、被适应新的需求,这段过程叫维护与演化(maintenance and evolution)。

维护,才是大头

  一个常被提到的观察是:软件生命周期里,大部分成本花在上线之后的维护上,而不是最初的开发。

  为什么?因为软件所处的世界一直在变:

  • 用户想要新功能
  • 环境变了(依赖升级、平台更替)
  • 发现了 bug
  • 业务规则调整了

  于是代码必须不断被修改。而“改得动”本身,就是一种能力。

什么样的软件“改得动”

  回头看前面几章,你会发现它们其实都在为“可维护”服务:

  • 模块化、低耦合:改一处,不会牵动全身
  • 清晰的接口:内部可以换,外部不受影响
  • 单元测试:改完能立刻验证有没有弄坏别的
  • 版本控制:改坏了能回退,历史可追溯

  这些实践,在开发时也许显得“多此一举”,但正是它们,让软件在几年后还有人敢改、改得动可维护性,是设计时埋下的种子。

为变化而设计

  所以,写代码时多花的那点心思——起清楚的名字、划清模块、写好测试——并不是浪费。它们是在为未来的自己和同事铺路。

  这也回到最初的一句话:算法解决“怎么算对”,而软件构造解决“怎么让它长久地用下去”。 一个“能跑”的程序,和一个“能一直改下去”的软件之间,隔着这几章讲的这一切。

  接下来是最后一章。我们将把需求、程序、编译器、操作系统、网络、算法和硬件全部串起来,走完从“一个问题”到“一个软件系统”的完整闭环。

思考题 1

  为什么说软件的大部分成本在“维护”上?

思考题 2

  模块化、测试、版本控制等实践,是怎样帮助“以后更容易修改”的?

小结

知识点

  • 软件的大部分成本在上线后的维护
  • 需求与环境变化迫使软件持续演化
  • 可读、低耦合、有测试是易维护的前提
  • 好设计是为将来的修改铺路

参考资料

  1. Wikipedia(zh):软件维护:软件交付后的修改与演进
  2. Wikipedia(zh):可维护性:软件被修改的容易程度

思考题答案(仅供参考)

思考题 1

  因为软件上线后还要长期被使用和修改:用户要新功能、环境会变化、bug 要修、业务规则会调整。这些持续发生的改动,累积起来占用了软件生命周期中的大部分成本。

思考题 2

  模块化与低耦合让改动局限在一处、不易牵连全局;清晰的接口让内部实现可替换;单元测试让改动后能立刻验证旧功能未被破坏;版本控制让改坏可回退。这些共同使软件在将来“敢改、改得动”。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪