本书深入探讨了软件设计中的核心问题:如何将复杂的软件系统分解为可以相对独立实现的模块(例如类和方法),从而降低其复杂性并提高开发效率。本书首先介绍了软件设计中的基本问题,即复杂性的本质。其次,讨论了有关如何处理软件设计过程的“哲学”问题,如通用设计的重要性、与《代码整洁之道》中设计哲学的对比,以及如何将重要的东西和不重要的东西区分开等内容。最后,总结了在软件设计过程中应遵循的一系列设计原则,以及一系列识别设计问题的警示信号。
本书适合软件工程师、计算机科学专业的学生、教育者、对软件设计和开发感兴趣的自学者和技术管理者阅读。通过应用本书中的思想,读者可以最大限度地降低大型软件系统的复杂性,从而更快地以更低的成本编写软件,并构建更易于维护和增强的系统。
☆专业书评:
John Ousterhout教授以其敏锐的洞察力,深入剖析了软件设计中的深层逻辑与哲学内涵。本书不仅关注代码的简洁与架构的优雅,还涉及设计原则与实践策略,每一处见解都闪烁着智慧的光芒。本书不仅是技术指导手册,更是一部提升软件设计思维的作品,激励读者重新思考软件设计的本质。无论你是编程新手还是资深工程师,阅读本书都将使你在软件设计的旅途中获得启发,领略软件设计的真谛。
——卢山 腾讯技术工程事业群总裁
无论你是软件工程师还是对软件设计和开发感兴趣的自学者,本书都极具阅读价值。软件作为数字化转型的核心要素,既要兼容过去,又要面向未来。我们总是需要在软件不断增加的功能、开发效率和维护成本之间寻求最佳平衡点。由于我们都不能预知未来,因此当下的最优未必是将来的最优。书中的观点和案例将助力读者确立以战略性编程思维降低软件复杂性的设计原则。
——宋继强 英特尔中国研究院院长
在这个技术迅猛发展的时代,本书为我们提供了一个深入思考的契机。作为软件设计领域的权威著作,本书不仅深入探讨了设计的技术细节,还揭示了背后的哲学思想。它引导我们在复杂的业务需求与设计的优雅之间寻求平衡,并从哲学的角度理解软件设计中的决策与权衡。这是一本值得反复品读的佳作,它将引领我们在软件设计的旅途中不断追求卓越与优雅。
——谢涛 北京大学讲席教授,欧洲科学院外籍院士
软件设计应该是人类所从事的所有工程设计领域中最为复杂的一项活动,其第一性原理即是“最小化复杂性”。本书从剖析和降低软件复杂性的根源入手,精心提炼并总结了软件设计领域几十年来积累的宝贵原则、方法和实践经验。值得一提的是,在大模型快速推动软件开发革新的今天,这些哲学性的思考和实践指导对于人工智能如何应对软件设计的复杂性,仍然具有深远的意义。
——李建忠 CSDN高级副总裁
《重构:改善既有代码的设计》通过大量实例展示了代码微观设计的优化方法,而本书则从更为抽象的角度探讨了优秀与拙劣设计背后的根本差异。软件工程师若能深入学习本书,并思考如何用实例来支持或辩驳书中的观点,将会获得一次极具价值的思维锻炼。
——邹欣 《编程之美》和《构建之法》的作者
......(更多)
约翰·奥斯特豪特(John Ousterhout)
斯坦福大学计算机科学教授,美国国家工程院院士,曾任加州大学伯克利分校的计算机科学教授;获得了包括ACM软件系统奖、ACM Grace Murray Hopper奖、美国国家科学基金会总统青年研究者奖和加州大学伯克利分校杰出教学奖等多项荣誉;聚焦于与构建软件系统的基础设施相关的广泛主题,包括分布式系统、操作系统、存储系统、开发框架和编程语言;在工业界有14年的经验,创办了Scriptics 和Electric Cloud两家公司;Tcl脚本语言的创建者,并且以分布式操作系统和存储系统的相关工作而闻名。
茹炳晟
腾讯Tech Lead(技术经理),腾讯研究院特约研究员,腾讯集团技术委员会委员,中国计算机学会(CCF)TF研发效能SIG主席,“软件研发效能度量规范”团体标准核心编写专家,中国商业联合会互联网应用技术委员会智库专家,中国通信标准化协会TC608云计算标准和开源推进委员会云上软件工程工作组副组长,国内外各大技术峰会的联席主席、出品人和Keynote演讲嘉宾,公众号“茹炳晟聊软件研发”主理人。著有技术畅销书《测试工程师全栈技术进阶与实践》和《现代软件测试技术之美》等,译有《现代软件工程》和《DevOps 实践指南(第2版)》等。
王海鹏
1994年毕业于华东师范大学,获物理学理学学士学位和英国语言文学学士学位;是独立咨询顾问、培训讲师、译者和软件开发者;拥有30年的软件开发经验,专注于软件架构和方法学研究,致力于提高软件开发的品质与效率;翻译了20余本软件开发相关图书,内容涵盖敏捷方法学、需求工程、UML 建模和测试等多个领域。
......(更多)
第1章导言 001
1.1如何使用本书 004
第2章复杂性的本质 007
2.1复杂性的定义 007
2.2复杂性的表现 009
2.3复杂性的原因 012
2.4复杂性是增量的 014
2.5结论 015
第3章能工作的代码是不够的 017
3.1战术性编程 017
3.2战略性编程 019
3.3投资多少? 020
3.4初创企业与投资 022
3.5结论 023
第4章模块应该深 025
4.1模块化设计 025
4.2接口包含哪些内容? 027
4.3抽象 028
4.4深模块 029
4.5浅模块 031
4.6类炎 033
4.7示例:Java和UNIX I/O 033
4.8结论 035
第5章信息隐藏(和泄漏) 037
5.1信息隐藏 037
5.2信息泄漏 039
5.3时序分解 040
5.4示例:HTTP服务器 041
5.5示例:类过多 042
5.6示例:HTTP参数处理 043
5.7示例:HTTP响应中的默认值 045
5.8类内的信息隐藏 046
5.9过犹不及 047
5.10结论 047
第6章通用模块更深 049
6.1让类有点通用 049
6.2示例:为编辑器存储文本 051
6.3更通用的API 052
6.4通用性带来更好的信息隐藏 054
6.5要问自己的问题 055
6.6将专用性向上推(和向下推) 056
6.7示例:编辑器撤销机制 057
6.8消除代码中的特例 060
6.9结论 061
第7章不同层,不同抽象 063
7.1直通方法 064
7.2接口重复何时可行? 066
7.3装饰器 067
7.4接口与实现 069
7.5直通变量 070
7.6结论 073
第8章降低复杂性 075
8.1示例:编辑器文本类 076
8.2示例:配置参数 076
8.3过犹不及 078
8.4结论 078
第9章合并好,还是分开好? 079
9.1如果共享信息,则合并 081
9.2如果可以简化接口,则合并 081
9.3消除重复,则合并 082
9.4区分通用代码和专用代码 085
9.5示例:插入光标和选择区域 086
9.6示例:单独的日志类 087
9.7拆分和连接方法 089
9.8不同意见:《代码整洁之道》 092
9.9结论 093
第10章避免处理异常 095
10.1为何异常会增加复杂性 095
10.2异常太多 098
10.3定义错误不存在 100
10.4示例:Windows中的文件删除 100
10.5示例:Java的substring方法 101
10.6异常屏蔽 103
10.7异常聚合 104
10.8就让它崩溃 109
10.9过犹不及 110
10.10结论 111
第11章设计两次 113
第12章为什么要写注释?4个借口 117
12.1好的代码自己就是文档 118
12.2我没有时间写注释 119
12.3注释会过时,会产生误导 120
12.4我见过的注释都没有价值 121
12.5写好注释的好处 121
12.6不同观点:注释就是失败 122
第13章注释应描述代码中不明显的内容 125
13.1选择约定 126
13.2不要重复代码 127
13.3低层注释增加精确度 130
13.4高层注释增强直观性 133
13.5接口文档 136
13.6实现注释:做什么和为什么,而不是怎么做 144
13.7跨模块设计决策 146
13.8结论 149
13.913.5节问题解答 150
第14章选择名称 151
14.1示例:糟糕的名称会导致缺陷 151
14.2塑造形象 153
14.3名称应精确 153
14.4一致地使用名称 157
14.5避免多余的词 158
14.6不同意见:Go风格指南 159
14.7结论 161
第15章先编写注释 163
15.1拖延的注释是糟糕的注释 163
15.2先编写注释 164
15.3注释是一种设计工具 165
15.4早期注释是有趣的注释 166
15.5早期注释是否昂贵? 167
15.6结论 168
第16章修改现有代码 169
16.1持续使用战略性编程 169
16.2维护注释:让注释靠近代码 171
16.3注释属于代码,而非提交日志 172
16.4维护注释:避免重复 173
16.5维护注释:检查差异 175
16.6更高层次的注释更容易维护 175
第17章一致性 177
17.1一致性的例子 177
17.2确保一致性 178
17.3过犹不及 181
17.4结论 181
第18章代码应显而易见 183
18.1让代码更显而易见 184
18.2让代码不显而易见的因素 186
18.3结论 190
第19章软件发展趋势 191
19.1面向对象编程和继承 191
19.2敏捷开发 193
19.3单元测试 194
19.4测试驱动开发 196
19.5设计模式 197
19.6取值方法和设值方法 197
19.7结论 198
第20章性能设计 199
20.1如何考虑性能 199
20.2修改前(后)的度量 202
20.3围绕关键路径进行设计 203
20.4示例:RAMCloud的Buffer类 204
20.5结论 210
第21章确定什么是重要的 211
21.1如何确定什么是重要的? 211
21.2尽量减少重要的东西 212
21.3如何强调重要的东西 213
21.4错误 213
21.5更广泛的思考 214
第22章结论 215
设计原则总结 217
警示信号总结 219
......(更多)
......(更多)