总结
设计原则小结
以下是本书讨论的最重要的软件设计原则:
- 复杂性逐步累积,因此必须认真对待每个小问题(请参阅 第 2.4 节)。
- 能工作的代码是不够的(请参阅 第 3.2 节)。
- 持续进行小额投资以改善系统设计(请参阅 第 3.3 节)。
- 模块应该是深的(请参阅 第 4.4 节)。
- 接口的设计应尽可能简化其最常见的用法(请参阅 第 4.7 节)。
- 让模块的接口简单比让其实现简单更为重要(请参阅 第 8 章 和 第 9.7 节)。
- 通用模块是更深的(请参阅 第 6 章)。
- 分开通用代码和专用代码(请参阅 第 6.6 节 和 第 9.4 节)。
- 不同的层级应具有不同的抽象(请参阅 第 7 章)。
- 下沉复杂性(请参阅 第 8 章)。
- 通过定义来规避错误(请参阅 第 10.3 节)。
- 设计两次(请参阅 第 11 章)。
- 注释应该描述从代码中不易看出的信息(请参阅 第 13 章)。
- 软件设计应以易于阅读为目标,而非易于编写(请参阅 第 18.2 节)。
- 软件开发的增量应该是抽象而不是功能(请参阅 第 19.2 节)。
- 区分重要的和不重要的事情,并强调重要的事情(请参阅 第 21 章)。
危险信号小结
以下是本书讨论的一些最重要的危险信号。系统中出现其中任何一种,都提示设计可能存在问题:
- 浅模块:类或方法的接口并不比其实现简单得多(请参阅 第 4.5 节 和 第 13.5 节)。
- 信息泄露:设计决策反映在多个模块中(请参阅 第 5.2 节)。
- 时间分解:代码结构基于执行操作的顺序,而不是基于信息隐藏的原则(请参阅 第 5.3 节)。
- 过度暴露:API 迫使调用者为了使用常用功能,先了解很少使用的功能(请参阅 第 5.7 节)。
- 透传方法:除了将参数传给另一个签名相似的方法,几乎不做其他事情的方法(请参阅 第 7.1 节)。
- 重复:一段并不简单的代码反复出现在多个地方(请参阅 第 9.4 节)。
- 通用专用混合体:专用代码与通用代码没有清晰地分开(请参阅 第 9.5 节)。
- 连体方法:两个方法之间存在太多依赖,以至于不理解其中一个的实现,就很难理解另一个的实现(请参阅 第 9.7 节)。
- 注释重复了代码:注释中的所有信息在旁边的代码里显而易见(请参阅 第 13.2 节)。
- 实现文档污染了接口:接口注释描述了其用户不需要了解的实现细节(请参阅 第 13.5 节)。
- 模糊的名称:变量或方法的名称不够精确,无法传达多少有用信息(请参阅 第 14.3 节)。
- 难以选取名称:很难为一个实体找到精确、直观的名称(请参阅 第 14.3 节)。
- 难以描述:必须写很长的文档,才能把变量或方法描述完整(请参阅 第 15.3 节)。
- 难以理解的代码:一段代码的行为或含义不容易被理解(请参阅 第 18.2 节)。
关于作者
John Ousterhout 是斯坦福大学的 Bosack Lerner 计算机科学教授。他目前的研究重点是在软件栈中构建新的层次,让数据中心应用程序能够利用微秒级延迟的通信和存储技术。Ousterhout 此前在工业界工作了 14 年,其间创办了 Scriptics 和 Electric Cloud 两家公司;再往前,他曾在加州大学伯克利分校担任计算机科学教授,同样为期 14 年。他是 Tcl 脚本语言的创建者,也以在分布式操作系统和存储系统领域的工作而闻名。Ousterhout 在耶鲁大学获得物理学学士学位,在卡内基梅隆大学获得计算机科学博士学位。他是美国国家工程院院士,曾获多项荣誉,包括美国计算机协会(ACM)软件系统奖、ACM Grace Murray Hopper 奖、美国国家科学基金会(NSF)总统青年研究奖,以及加州大学伯克利分校(UC Berkeley)杰出教学奖。