低维护成本的软件开发

低维护成本的软件开发的目标

  • 没有技术债务。

  • 代码可维护,开发者可以在忘记它5年后回来继续改进它。

  • 任何阅读源代码的程序员都可以很快理解整个系统的构造。

  • 软件无限接近完成状态,直到因环境变更而落后或新的需求出现为止,足够令人满意。

  • 可以自信地升级主版本相同的依赖项。

实现低维护成本的软件开发

实现低维护成本的软件开发的关键不在于少犯几个错误,而在于把所有事情做对:

  • 摒弃所有非必要功能。

  • 禁止使用不热门的语言和工具链。

  • 使用具有强表现力的语言,避免在编码过程中扭曲和偏离语言的常见模式。

  • 禁止使用宏。

  • 使用具有类型定义或类型标注的语言。

  • 尽可能使用经过时间检验的技术,因为这些技术有希望存在更长时间。

  • 总是全局性地思考问题,总是重构,允许大量的代码行修改,以降低软件熵。

  • 通过增加使用者的学习成本来砍掉不必要的人性化设计,因为人性化设计往往是难以维护的。让我们考虑一下Markdown编辑器和所见即所得编辑器:前者需要用户付出(极少量的)学习成本,而后者几乎没有学习成本,然而,后者要比前者差得多:

    • Markdown编辑器更容易编写出结构清晰,人类可读的纯文本文件。所见即所得编辑器编写出的要么是难以迁移的内部文档模型,要么是完全陷入混乱的HTML。

    • Markdown文档在2050年还可以使用,Markdown编辑器往往是极简和可替代的。所见即所得编辑器更容易过时,维持向下兼容性更困难,对开发者来说也更难维护,供应商在2050年很可能已经不复存在。

  • 禁止使用重型框架。

  • 尽可能减少依赖低质量的软件包。

  • 不为没有向下兼容性的平台编写软件。

  • 禁止使用任何云计算平台提供的专有服务。

  • 禁止使用不能锁定子依赖项版本的包管理器,禁止使用Git仓库作为软件包的来源。

  • 如非必要,不配合现存的标准和协议:

    • 大多数标准和协议是垃圾,其中大部分甚至没有参考价值,配合它们只会拖累软件的发展。例如,你可能会不幸地遇到无法用这些标准和协议实现的需求,然后陷入进退两难。

    • 那些非常流行以至于无法被忽视的标准和协议,其流行度大多来自于它们的先发优势,以及向后兼容的保证。这使得它们在生产中的实现充斥着各种奇怪的边缘情况,收集和应付这些边缘情况会让人精疲力尽。

  • 关注工具链的抽象水平,停止使用难以迁移或升级的工具链。

  • 保持简单,保持知识共享,降低软件的巴士因子

  • 编写大量自动化集成测试,以提升依赖项升级时的安全感。