新書推薦:
《
津巴多时间心理学:挣脱束缚、改写命运的6种时间观
》
售價:NT$
352.0
《
大英博物馆东南亚简史
》
售價:NT$
806.0
《
纯粹·我只要少许
》
售價:NT$
367.0
《
经济史的趣味(全新增订版)(经济史与思想史丛书)
》
售價:NT$
383.0
《
中国古代鬼神录
》
售價:NT$
866.0
《
投机苦旅:一位投机客的凤凰涅槃
》
售價:NT$
403.0
《
重返马赛渔场:社会规范与私人治理的局限
》
售價:NT$
316.0
《
日子慢慢向前,事事慢慢如愿
》
售價:NT$
254.0
|
編輯推薦: |
1. 作者专业,内容靠谱:约翰·奥斯特豪特,斯坦福大学计算机科学教授,具有丰富的工业界经验和学术成就,是Tcl脚本语言的创建者,曾获多个技术奖项。 2. 系统化解决软件复杂性:全面探讨软件设计中的复杂性管理,提供具体方法以实现复杂软件系统的有效模块化。 3. 实用的设计哲学:与热销书的《代码整洁之道》进行对比,强调通用设计的选择,教导读者如何区分软件设计中的重要事项。 4. 内容全面更新:第二版在前一版基础上增加了新的设计策略和案例,提供更多实用的设计知识和技巧。
|
內容簡介: |
本书深入探讨了软件设计中的核心问题:如何将复杂的软件系统分解为可以相对独立实现的模块(例如类和方法),从而降低其复杂性并提高开发效率。本书首先介绍了软件设计中的基本问题,即复杂性的本质。其次,讨论了有关如何处理软件设计过程的“哲学”问题,如通用设计的重要性、与《代码整洁之道》中设计哲学的对比,以及如何将重要的东西和不重要的东西区分开等内容。最后,总结了在软件设计过程中应遵循的一系列设计原则,以及一系列识别设计问题的警示信号。 本书适合软件工程师、计算机科学专业的学生、教育者、对软件设计和开发感兴趣的自学者和技术管理者阅读。通过应用本书中的思想,读者可以最大限度地降低大型软件系统的复杂性,从而更快地以更低的成本编写软件,并构建更易于维护和增强的系统。
|
關於作者: |
[美]约翰·奥斯特豪特(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/O033 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 更通用的API052 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.9 13.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
|
|