本书以38个话题的形式,从软件开发的角度讲述了如何成为优秀的程序员,是一份程序员成长课程表。全书内容涵盖程序员职业生涯的方方面面,共分为五大部分:如何编写代码,有益编程的重要实践,如何打造卓越的编程职业生涯,如何采用切实可行的办法按时交付代码,如何与其他从事软件开发的人高效合作。不管你是经验丰富的开发人员,还是开发新手,抑或只是编程爱好者,都可以从本书中找到有价值的提示。
皮特·古德利夫(Pete Goodliffe),是拥有20余年经验的程序员,现任inMusic公司软件开发副总裁。他在软件开发方面涉猎广泛,从操作系统实现到音频编解码器和多媒体应用开发,再到嵌入式固件开发和iOS开发。他为大型程序员社群ACCU撰写杂志专栏Becoming a Better Programmer,另著有《编程匠艺:编写卓越的代码》。
前言 xix
第 1 章 心系代码 1
第 一部分 编码乃余事
第 2 章 保持外观整洁 6
2.1 编码规范不是小事 7
2.2 它关乎沟通 8
2.3 排版 9
2.3.1 结构合理 9
2.3.2 一致性 10
2.4 命名 11
2.4.1 简洁 12
2.4.2 清晰 12
2.4.3 地道 12
2.4.4 准确 12
2.5 得体地修改代码 13
2.6 结论 13
第 3 章 写更少的代码 15
3.1 为什么要关注 16
3.2 不严谨的逻辑判断 16
3.3 重复代码 19
3.4 僵尸代码 20
3.5 注释 21
3.6 喋喋不休 22
3.7 设计缺陷 23
3.8 空白 24
3.9 解决之道 24
3.10 结论 25
第 4 章 删除也是一种优化 27
4.1 代码沉迷 28
4.2 因为无法避免,所以可以接受 28
4.3 那又能怎样呢 29
4.4 唤醒梦中人 30
4.5 动个手术吧 30
4.6 结论 31
第 5 章 代码之背影 33
5.1 编码规范 34
5.2 技术现状 35
5.3 惯用法 36
5.4 设计决策 37
5.5 bug 37
5.6 结论 38
第 6 章 导航路线 41
6.1 朋友的帮助 42
6.2 寻找线索 42
6.3 边干边学 45
6.3.1 低垂的果实 45
6.3.2 代码检测 46
6.3.3 先研究,再行动 46
6.3.4 测试先行 46
6.3.5 整理内务 46
6.3.6 记录你的发现 47
6.4 结论 47
第 7 章 走出泥潭 50
7.1 嗅出问题 50
7.2 走进泥淖 51
7.3 用调查说话 51
7.4 入坑工作 52
7.5 清理混乱 53
7.6 做出改变 53
7.7 编写烂代码就是糟糕的程序员吗 54
第 8 章 不可忽视错误 57
8.1 错误机制 58
8.2 疯狂的举动 59
8.3 托词 59
8.4 结论 60
第 9 章 意料之中的意外 62
9.1 各种错误 62
9.2 线程 63
9.3 关闭系统 63
9.4 话外之意 63
第 10 章 bug追踪 66
10.1 经济考量 67
10.2 预防胜于治疗 67
10.3 bug追踪 68
10.3.1 捕获错误 68
10.3.2 活用二分法 69
10.3.3 软件考古 69
10.3.4 测试,测试,再测试 70
10.3.5 磨刀不误砍柴工 70
10.3.6 用排除法查找问题 71
10.3.7 保持清洁,预防疾病 71
10.3.8 迂回策略 72
10.3.9 不要急于离开 72
10.4 不可复现的bug 72
10.5 结论 74
第 11 章 测试时间 76
11.1 为什么测试 76
11.1.1 缩短反馈循环 77
11.1.2 测试代码的代码 77
11.1.3 谁来编写测试 78
11.2 测试的种类 78
11.3 什么时候编写测试 79
11.4 什么时候运行测试 80
11.5 测试什么 81
11.6 优质的测试 81
11.7 一个具体的测试 83
11.8 测试的结构 84
11.8.1 测试的维护 84
11.8.2 选择测试框架 85
11.9 没有代码是孤岛 85
11.10 结论 87
第 12 章 应对复杂性 89
12.1 圆团 90
12.2 案例学习:降低圆团复杂度 92
12.3 线条 93
12.4 人 96
12.5 结论 96
第 13 章 双城故事 99
13.1 混乱大都市 100
13.1.1 让人无法理解 100
13.1.2 缺乏内聚 101
13.1.3 不必要的耦合 102
13.1.4 代码问题 102
13.1.5 代码之外的问题 103
13.1.6 一张来自大都市的明信片 103
13.2 设计之城 104
13.2.1 合理放置功能 105
13.2.2 一致性 105
13.2.3 架构的演进 105
13.2.4 延缓设计决策 106
13.2.5 保证质量 106
13.2.6 管理技术债 107
13.2.7 测试方案设计 107
13.2.8 设计时间分配 108
13.2.9 与设计同行 108
13.3 那又怎样 109
第二部分 刻意练习,成就卓越
第 14 章 软件开发是…… 114
14.1 软件(食物)那些事 114
14.2 软件开发是……艺术 115
14.3 软件开发是……科学 116
14.4 软件开发是……运动 118
14.5 软件开发是……做游戏 119
14.6 软件开发是……鸡毛蒜皮的琐事 120
14.7 隐喻过多 121
第 15 章 遵守规则 123
15.1 我们需要更多规则! 124
15.2 制定规则 125
第 16 章 保持简单 127
16.1 简单设计 128
16.1.1 简单易用 128
16.1.2 防止误用 128
16.1.3 大小很重要 128
16.1.4 代码调用路径短 129
16.1.5 稳定性 129
16.2 简单代码 129
16.3 保持简单,别做蠢事 130
16.4 假设会损害简单性 130
16.5 避免过早优化 130
16.6 足够简单 131
16.7 简单结论 131
第 17 章 开动脑筋 133
17.1 别犯傻 133
17.2 避免盲目 134
17.3 你可以思考! 135
第 18 章 没有一成不变 137
18.1 大胆地改 138
18.2 改变态度 139
18.3 做出改变 140
18.3.1 规划改变 140
18.3.2 改变的工具 140
18.3.3 慎重地选择战场 141
18.4 万变不离其宗 141
第 19 章 代码复用案例 143
19.1 代码复用案例1:复制?C粘贴 143
19.2 代码复用案例2:为复用进行设计 144
19.3 代码复用案例3:提升和重构 145
19.4 代码复用案例4:购买或重新发明轮子 145
第 20 章 高效版本控制 148
20.1 用进废退 149
20.2 随便选一个 150
20.3 存储正确之物 150
20.3.1 答案一:存储所有 150
20.3.2 答案二:存储尽可能少的文件 151
20.3.3 存储软件版本 152
20.3.4 代码库的布局 152
20.4 用好版本控制系统 152
20.4.1 原子提交 152
20.4.2 提供正确的信息 153
20.4.3 精心创建代码提交 153
20.5 分支:只见树木不见森林 154
20.6 代码的家园 155
20.7 结论 155
第 21 章 让球越过门柱 158
21.1 软件开发:充满有机肥料的管道 159
21.2 错误的非黑即白 160
21.3 通过解决团队问题来修复代码问题 161
21.4 将构建发送给QA人员 162
21.4.1 首先进行自测 163
21.4.2 明确发布意图 163
21.4.3 欲速则不达 164
21.4.4 自动化 164
21.4.5 尊重 164
21.5 当你收到故障报告时 165
21.6 差异使我们更强大 166
21.7 拼图的碎片 166
第 22 章 冻结代码奇事 169
22.1 寻找代码冻结 169
22.2 世界新秩序 170
22.3 冻结的类型 171
22.4 采用分支解决问题 172
22.5 不是真正冻结 172
22.6 代码冻结的时间 173
22.7 感受代码冻结 173
22.8 就快结束了 174
22.9 反代码冻结 174
22.10 结论 175
第 23 章 软件发布 177
23.1 流程的一部分 178
23.2 机器上的一个齿轮 179
23.2.1 第 1 步:初始化发布 179
23.2.2 第 2 步:准备发布 179
23.2.3 第 3 步:构建发布 180
23.2.4 第 4 步:打包 181
23.2.5 第 5 步:部署 181
23.3 早发布、勤发布 182
23.4 还有更多…… 182
第三部分 束身修行
第 24 章 做一个乐知者 186
24.1 学习什么 187
24.2 学习如何学习 188
24.3 学习模型 190
24.4 以教促学 192
24.5 知行合一 192
24.6 我们学到了什么 193
第 25 章 考试驱动型程序员 195
25.1 把问题讲清楚 196
25.2 成功使人自满 196
25.3 考试时光 197
25.4 考试驱动型程序员 197
25.5 结论 198
第 26 章 享受挑战 200
26.1 激励 200
26.2 有哪些挑战 201
26.3 是谁在说:不要这么做! 201
26.4 接受挑战 202
26.5 结论 203
第 27 章 避免停滞 204
27.1 技能就是你的投资 205
27.2 为本书读者准备的一个练习 205
27.3 职业安全 206
第 28 章 程序员的道德规范 209
28.1 对代码的态度 210
28.2 法律问题 211
28.3 对人的态度 211
28.3.1 队友 212
28.3.2 管理者 213
28.3.3 雇主 213
28.3.4 你自己 214
28.4 希波克拉底誓言 214
28.5 结论 214
第 29 章 热爱编程语言 217
29.1 热爱所有的语言 217
29.2 热爱你的语言 219
29.3 与编程语言磨合 220
29.3.1 爱和尊重 220
29.3.2 承诺 220
29.3.3 沟通 221
29.3.4 耐心 221
29.3.5 共同的价值观 222
29.4 这是一个完美的比喻吗 222
29.5 结论 222
第 30 章 程序员的姿态 224
30.1 基本的计算机操作姿态 224
30.1.1 调试代码时的姿态 226
30.1.2 当情况恶化时 227
30.1.3 通宵加班 227
30.1.4 高层介入干预 228
30.1.5 警报解除 228
30.1.6 设计阶段 229
30.2 视觉疲劳 229
30.3 结论 230
第四部分 计日程功
第 31 章 用智不用力 234
31.1 慎选战场 235
31.2 战斗策略 235
31.2.1 复用智慧 235
31.2.2 转变成别人的问题 235
31.2.3 只做必须做的 236
31.2.4 使用探针试验 236
31.2.5 排优先级 236
31.2.6 确认什么是真正需要的 237
31.2.7 一次只做一件事 237
31.2.8 保持简单 237
31.2.9 不要拖延和积累问题 238
31.2.10 自动化 238
31.2.11 预防错误 238
31.2.12 沟通 239
31.2.13 避免过度疲劳 239
31.2.14 强大的工具 239
31.3 结论 239
第 32 章 完成之际即完成 242
32.1 我们还没到吗 242
32.2 逆向开发:分解 243
32.3 定义完成 244
32.4 说干就干 246
第 33 章 这次我明白了…… 249
33.1 荒岛式开发 251
33.2 站在山脚下 252
第五部分 觅良师益友
第 34 章 他人之力 256
34.1 如何实现 257
34.2 你心目中的专家 258
34.3 事后诸葛亮 258
第 35 章 至关重要的一个认知 261
35.1 拓展这个隐喻 262
35.2 责任感是关键 262
35.3 代码评审 263
35.4 落地 263
35.5 定标准 264
35.6 后续行动 264
35.7 结论 265
第 36 章 说出来! 267
36.1 编写代码就是沟通 267
36.1.1 和机器说话 267
36.1.2 和生灵说话 268
36.1.3 和工具说话 270
36.2 人与人之间的沟通 270
36.2.1 交谈方式 270
36.2.2 注意你的言辞 271
36.2.3 肢体语言 271
36.2.4 并行沟通 272
36.3 团队之间的沟通 272
36.4 与客户沟通 273
36.5 其他沟通 273
36.6 结论 273
第 37 章 各种宣言 276
37.1 软件开发通用宣言 277
37.2 就此打住 277
37.3 一些宣言 277
37.4 真是这样吗 277
37.5 画龙点睛 278
第 38 章 代码赋 281
后记 285