第1章 务实的哲学 1
1人生是你的 2
提示3:你有权选择 3
2我的源码被猫吃了 3
提示4:提供选择,别找借口 5
3软件的熵 6
提示5:不要放任破窗 7
4石头做的汤和煮熟的青蛙 9
提示6:做推动变革的催化剂 10
提示7:牢记全景 10
5够好即可的软件 11
提示8:将质量要求视为需求问题 12
6知识组合 14
提示9:对知识组合做定期投资 16
提示10:批判性地分析你读到和听到的东西 18
7交流! 20
提示11:英语就是另一门编程语言 20
提示12:说什么和怎么说同样重要 23
提示13:把文档嵌进去,而不要栓在表面 24
第2章 务实的方法 27
8优秀设计的精髓 28
提示14:优秀的设计比糟糕的设计更容易变更 28
9 DRY——邪恶的重复 30
提示15:DRY——不要重复自己 31
提示16:让复用变得更容易 39
10正交性 40
提示17:消除不相关事物之间的影响 41
11可逆性 48
提示18:不设最终决定 50
提示19:放弃追逐时尚 50
12曳光弹 51
提示20:使用曳光弹找到目标 53
13原型与便签 57
提示21:用原型学习 58
14领域语言 60
提示22:靠近问题域编程 61
15估算 67
提示23:通过估算来避免意外 67
提示24:根据代码不断迭代进度表 72
第3章 基础工具 74
16纯文本的威力 75
提示25:将知识用纯文本保存 76
17 Shell游戏 79
提示26:发挥Shell命令的威力 80
18加强编辑能力 82
提示27:游刃有余地使用编辑器 82
19版本控制 85
提示28:永远使用版本控制 87
20调试 90
提示29:去解决问题,而不是责备 91
提示30:不要恐慌 91
提示31:修代码前先让代码在测试中失败 93
提示32:读一下那些该死的出错信息 93
提示33:“select”没出问题 97
提示34:不要假设,要证明 97
21文本处理 99
提示35:学习一门文本处理语言 99
22工程日记 101
第4章 务实的偏执 103
提示36:你无法写出完美的软件 103
23契约式设计 104
提示37:通过契约进行设计 107
24死掉的程序不会说谎 113
提示38:尽早崩溃 114
25断言式编程 115
提示39:使用断言去预防不可能的事情 115
26如何保持资源的平衡 119
提示40:有始有终 119
提示41:在局部行动 122
27不要冲出前灯范围 127
提示42:小步前进——由始至终 127
提示43:避免占卜 129
第5章 宁弯不折 130
28解耦 131
提示44:解耦代码让改变更容易 132
提示45:只管命令不要询问 133
提示46:不要链式调用方法 135
提示47:避免全局数据 137
提示48:如果全局唯一非常重要,那么将它包装到API中 137
29在现实世界中抛球杂耍 139
30变换式编程 149
提示49:编程讲的是代码,而程序谈的是数据 151
提示50:不要囤积状态,传递下去 156
31继承税 162
提示51:不要付继承税 165
提示52:尽量用接口来表达多态 167
提示53:用委托提供服务:“有一个”胜过“是一个” 167
提示54:利用mixin共享功能 169
32配置 170
提示55:使用外部配置参数化应用程序 170
第6章 并发 174
33打破时域耦合 175
提示56:通过分析工作流来提高并发性 176
34共享状态是不正确的状态 179
提示57:共享状态是不正确的状态 180
提示58:随机故障通常是并发问题 186
35角色与进程 187
提示59:用角色实现并发性时不必共享状态 188
36黑板 193
提示60:使用黑板来协调工作流 195
第7章 当你编码时 198
37听从蜥蜴脑 199
提示61:倾听你内心的蜥蜴 201
38巧合式编程 204
提示62:不要依赖巧合编程 207
39算法速度 210
提示63:评估算法的级别 214
提示64:对估算做测试 214
40重构 216
提示65:尽早重构,经常重构 219
41为编码测试 220
提示66:测试与找Bug无关 221
提示67:测试是代码的第一个用户 222
提示68:既非自上而下,也不自下而上,基于端对端构建 225
提示69:为测试做设计 228
提示70:要对软件做测试,否则只能留给用户去做 230
42基于特性测试 231
提示71:使用基于特性的测试来校验假设 231
43出门在外注意安全 238
提示72:保持代码简洁,让攻击面最小 241
提示73:尽早打上安全补丁 243
44事物命名 245
提示74:好好取名;需要时更名 249
第8章 项目启动之前 251
45需求之坑 252
提示75:无人确切知道自己想要什么 252
提示76:程序员帮助人们理解他们想要什么 253
提示77:需求是从反馈循环中学到的 254
提示78:和用户一起工作以便从用户角度思考 255
提示79:策略即元数据 256
提示80:使用项目术语表 259
46处理无法解决的难题 260
提示81:不要跳出框框思考——找到框框 261
47携手共建 264
提示82:不要一个人埋头钻进代码中 267
提示83:敏捷不是一个名词;敏捷有关你如何做事 267
48敏捷的本质 267
第9章 务实的项目 271
49务实的团队 272
提示84:维持小而稳定的团队 272
提示85:排上日程以待其成 274
提示86:组织全功能的团队 276
50椰子派不上用场 277
提示87:做能起作用的事,别赶时髦 279
提示88:在用户需要时交付 281
51 务实的入门套件 281
提示89:使用版本控制来驱动构建、测试和发布 282
提示90:尽早测试,经常测试,自动测试 283
提示91:直到所有的测试都已运行,编码才算完成 283
提示92:使用破坏者检测你的测试 285
提示93:测试状态覆盖率,而非代码覆盖率 286
提示94:每个Bug只找一次 286
提示95:不要使用手动程序 287
52取悦用户 288
提示96:取悦用户,而不要只是交付代码 289
提示97:在作品上签名 290
53傲慢与偏见 290
跋 292
提示98:先勿伤害 293
提示99:不要助纣为虐 294
参考文献 295
练习的参考答案 297
译者跋 312