知识卡片
可维护性的三根支柱可操作性简单性可演化性
内容
软件的大部分开销不在最初开发阶段而在持续维护阶段,”可维护性”这个笼统的目标可以拆成 三根相对独立的支柱分别优化。可操作性关注的是运维团队能否轻松地保持系统平稳运行: 良好监控让系统内部状态可见、对自动化和标准化工具友好、不依赖单台机器使停机维护 不影响整体运行、有良好文档和可预测的行为模型、提供合理默认值同时允许管理员按需 覆盖。简单性关注的是消除额外复杂度(accidental complexity)——这里有个关键区分: 简化系统不等于减少功能,而是要区分”用户视角看问题本身固有的复杂度”和”由具体实现方式 带来的、非必要的额外复杂度”,后者才是简化的目标;消除额外复杂度最好的工具是抽象, 好的抽象(如高级编程语言隐藏机器码和寄存器细节、SQL隐藏磁盘/内存数据结构和并发 细节)能把大量实现细节收纳到一个干净的外观之下,让系统可以被更多人理解和复用,但 要找到真正好的抽象非常困难。可演化性关注的是系统能否轻松适应变化的需求——需求几乎 不可能一成不变,敏捷方法论、测试驱动开发、重构这些技术工具本来是为单个应用的代码 层面服务的,但同样的”轻松适应变化”的诉求,在整个数据系统层面(可能由多个应用/服务 组成)同样重要,这也是为什么要单独用”可演化性”这个词来指代数据系统层面的敏捷性, 而不是简单套用应用代码层面的敏捷实践。
结构图:
flowchart LR
A[可维护性] --> B[可操作性: 运维能否轻松保持系统运行]
A --> C[简单性: 消除额外复杂度]
A --> D[可演化性: 能否轻松适应需求变化]
B --> B1[监控可见性+自动化友好+不依赖单机+良好文档]
C --> C1[区分问题固有复杂度 vs 实现带来的额外复杂度]
C1 --> C2[抽象是消除额外复杂度的核心工具]
D --> D1[数据系统层面的敏捷性, 不只是单个应用代码层面]
参考来源
- 位置:《数据密集型应用系统设计》第一章《可靠性、可伸缩性、可维护性》"可维护性"
(源文件:_epub-src/ch1_split_006.html)
- 结论依据:原文明确给出可操作性、简单性、可演化性三个设计原则的定义,说明简单性
的核心是消除额外复杂度而非减少功能、抽象是消除额外复杂度的工具,可演化性是数据
系统层面的敏捷性,直接支撑本卡片的三支柱结构梳理。
- 原始内容:可操作性(Operability)便于运维团队保持系统平稳运行……简单性
(Simplicity)从系统中消除尽可能多的复杂度……可演化性(evolability)使工程师在
未来能轻松地对系统进行更改……简化系统并不一定意味着减少功能;它也可以意味着
消除额外的复杂度……用于消除额外复杂度的最好工具之一是抽象。