第 11 章:设计两次
系列:软件设计的哲学 · 第 11/22 章
全书导读:00-overview.md
一句话总结
实现前用少量时间构思两套以上方案并对比,能以极小成本避开浅模块与错误拆分的深坑。
核心观点浓缩
- 设计两次:非写两遍代码,而是认真考虑多种结构再选定
- 第一方案常受惯性支配;强迫自己想截然不同的第二方案
- 对比维度:接口复杂度、信息隐藏、变更时影响面、测试难度
- 投入常为数小时,收益是数月维护省心——ROI 极高
- 可与战略式编程(第 3 章)结合:在关键模块上强制执行
关键概念 / 金句
| 步骤 | 做法 |
|---|---|
| 方案 A | 惯性方案,快速写下接口草图 |
| 方案 B | 刻意相反:更合/更拆/更通用/更专用 |
| 对比 | 用复杂度症状表(第 2 章)打分,非凭喜好 |
「第二方案的价值常不在于被选中,而在于暴露第一方案的假设。」
本章在全书中的位置
第 11 章收束模块与接口设计篇(第 4–11 章),把原则落到过程。下一章起转入注释、命名等可读性议题——深模块要能被读懂。
个人思考与启发
新导出流水线:方案 A 在 UI 串步骤;方案 B 单一 ExportPipeline::run(Profile)。对比后发现 B 下拉了 80% 分支,虽实现多两天,接口永久简单。两小时草图换来明确选择。
与《程序员修炼之道》对照
- 原型与便笺是探索工具;设计两次是纸面/白板上的低成本原型
- 「曳光弹」验证需求;设计两次在结构层验证,互补、先后可结合
- 结对编程中的设计讨论,可视为设计两次的社交版
重点与注意
重点:关键模块(核心 API、状态机、插件边界)默认设计两次。
重点:第二方案必须认真,不是稻草人陪衬。
注意:不是每个 getter 都要两套设计——对高变更、高扇出处投入。
注意:选定后记录为何不选 B(一两句注释),避免后人重犯。
导航:第 10 章 从设计上消灭错误 · 下一篇:第 12 章 为何写注释