第 2 章:复杂度的本质
系列:软件设计的哲学 · 第 2/22 章
全书导读:00-overview.md
一句话总结
复杂度是理解与修改的负担,由依赖与模糊累积而成,且几乎只会增不会减。
核心观点浓缩
- 复杂度是主观体验:对熟手简单、对新人地狱,仍须为「下一任维护者」优化
- 三大症状:变更放大、认知负荷、未知未知(改完不知还缺什么)
- 两大成因:依赖(改 A 必动 B)与模糊(代码未说清楚意图与约束)
- 复杂度增量累积:每次「先凑合」都加一点,复利可怕
- 消除已有复杂度很难;预防比事后重构便宜一个数量级
关键概念 / 金句
| 症状 | 表现 |
|---|---|
| Change amplification | 小需求牵动大量文件 |
| Cognitive load | 读者需记住过多上下文才能改一行 |
| Unknown unknowns | 改完不敢上线,因影响面不清 |
「复杂度不会自己消失;你每次妥协都在给未来交税。」
本章在全书中的位置
第 2 章是全书度量衡:后文深模块、信息隐藏、分层等,都是降复杂度的手段。没有统一「复杂度」定义,讨论设计容易滑向口味之争。
个人思考与启发
「未知未知」在插件化桌面软件里最常见:改 Session 导出逻辑,却触发 IO 插件与云上传的隐式顺序依赖。症状不是 bug,而是没人能画全依赖图。此时应优先砍依赖、封接口,而非加集成测试了事。
与《程序员修炼之道》对照
- 软件熵与复杂度增量累积:同一现象,本书给出更可操作的诊断表
- DRY 减少重复依赖,直接对抗变更放大
- 「正交」即模块间低依赖——与本书依赖成因论一致
重点与注意
重点:用症状自检系统,比争论「这代码丑不丑」有用。
重点:依赖与模糊是根因,重构应朝这两刀砍。
注意:不能因「反正只有我一个人懂」而放任复杂度——未来的你也是新人。
注意:性能、安全等问题最终也体现为复杂度,勿拆成对立目标。
导航:第 1 章 引言 · 下一篇:第 3 章 能跑还不够