Code craft:the practice of writing excellent code
副标题:无
分类号:
ISBN:9787121143472
微信扫一扫,移动浏览光盘
简介
《编程匠艺:编写卓越的代码》主要内容简介:如果你可以编写出合格的代码,但是想更进一步、创作出组织良好而且易于理解的代码,并希望成为一名真正的编程专家或提高现有的职业技能,那么《编程匠艺:编写卓越的代码》都会为你给出答案。《编程匠艺:编写卓越的代码》的内容涵盖编程的各个要素,如代码风格、变量命名、错误处理和安全性等。此外,《编程匠艺:编写卓越的代码》还对一些更广泛的编程问题进行了探讨,如有效的团队合作、开发过程和文档编写,等等。《编程匠艺:编写卓越的代码》各章的末尾均提供一些思考问题,这些问题回顾了各章中的一些关键概念,可以促使你像专家一样思考,从而使《编程匠艺:编写卓越的代码》成为那些渴望作为团队的一分子,职业并高效地编程的新手们的一本绝佳的参考书。
目录
《编程匠艺—编写卓越的代码》
第1篇 代码表面第一部分
第1章 善于防守:健壮代码的防御性编程技巧 3
1.1 向优秀的代码前进 3
1.2 设想:最坏的选择 4
1.3 什么是防御性编程? 6
1.4 又大又坏的世界 8
1.5 防御性编程技巧 9
1.5.1 使用好的编码风格和合理的设计 9
1.5.2 不要仓促地编写代码 9
1.5.3 不要相信任何人 10
1.5.4 编码的目标是清晰,而不是简洁 11
1.5.5 不要让任何人做他们不该做的修补工作 11
1.5.6 编译时打开所有警告开关 12
1.5.7 使用静态分析工具 13
1.5.8 使用安全的数据结构 13
1.5.9 检查所有的返回值 14
1.5.10 审慎地处理内存(和其他宝贵的资源) 14
1.5.11 在声明位置初始化所有变量 15
1.5.12 尽可能推迟一些声明变量 15
.1.5.13 使用标准语言工具 15
1.5.14 使用好的诊断信息日志工具 16
1.5.15 审慎地进行强制转换 16
1.5.16 细则 16
1.6 约束 17
1.6.1 约束的内容 19
1.6.2 移除约束 19
1.7 总结 22
1.8 另请参见 22
1.9 思考 24
1.9.1 深入思考 24
1.9.2 结合自己 24
第2章 精心布局:源代码的版面和样式 26
2.1 什么是关键 27
2.2 了解你的读者 27
2.3 什么是好的样式 29
2.4 使用括号 30
2.4.1 k&r括号风格 30
2.4.2 悬挂式的括号风格 31
2.4.3 缩进的括号风格 32
2.4.4 其他的括号风格 33
2.5 主宰一切的风格 33
2.6 内部风格(以及在哪里使用它们) 35
2.7 设立标准 37
2.8 正义的战争 39
2.9 总结 40
2.10 另请参见 42
2.11 思考 42
2.11.1 深入思考 42
2.11.2 结合自己 43
第3章 名正言顺:为有意义的事物起有意义的名称 45
3.1 为什么我们应该恰当地命名呢 47
3.2 我们对什么进行命名 47
3.3 名字游戏 48
3.3.1 描述性 48
3.3.2 技术上正确 48
3.3.3 符合语言习惯 49
3.3.4 恰当 49
3.4 具体细节 50
3.4.1 命名变量 51
3.4.2 命名函数 52
3.4.3 命名类型 53
3.4.4 命名名字空间 54
3.4.5 命名宏 55
3.4.6 命名文件 56
3.5 玫瑰不叫玫瑰 57
3.5.1 保持前后一致 58
3.5.2 利用上下文 58
3.5.3 使用对你有利的名称 59
3.6 总结 59
3.7 另请参见 61
3.8 思考 62
3.8.1 深入思考 62
3.8.2 结合自己 63
第4章 不言自明:编写“自文档化”代码的技巧 64
4.1 自文档化的代码 66
4.2 编写自文档化代码的技术 69
4.2.1 使用好的样式编写简单的代码 69
4.2.2 选择有意义的名称 70
4.2.3 分解为原子函数 70
4.2.4 选择描述性的类型 71
4.2.5 命名常量 71
4.2.6 强调重要的代码 72
4.2.7 分组相关信息 72
4.2.8 提供文件头 72
4.2.9 恰当地处理错误 73
4.2.10 编写有意义的注释 73
4.3 实用的自文档化方法 74
4.3.1 文学性编程 74
4.3.2 文档化工具 76
4.4 总结 78
4.5 另请参见 79
4.6 思考 79
4.6.1 深入思考 79
4.6.2 结合自己 81
第5章 随篇注释:如何编写代码注释 82
5.1 什么是代码注释 83
5.2 注释看上去是什么样的 84
5.3 多少注释是恰当的 84
5.4 注释中应该有些什么 85
5.4.1 解释为什么,而不是怎么样 85
5.4.2 不要描述代码 86
5.4.3 不要取代代码 86
5.4.4 确保注释有用 86
5.4.5 避免分心 88
5.5 实践 88
5.6 从审美的角度看注释 89
5.6.1 一致性 89
5.6.2 清晰的块注释 90
5.6.3 缩进的注释 90
5.6.4 行尾注释 91
5.6.5 帮助你阅读代码 91
5.6.6 选择一种维护成本较低的风格 92
5.6.7 分隔板 92
5.6.8 标志 92
5.6.9 文件头注释 93
5.7 使用注释 94
5.7.1 帮助你编写例行程序 94
5.7.2 错误修正通告 95
5.7.3 注释过时 95
5.7.4 维护和空洞无物的注释 96
5.8 总结 97
5.9 另请参见 98
5.10 思考 98
5.10.1 深入思考 98
5.10.2 结合自己 99
第6章 人非圣贤:处理不可避免的情况——代码中
的错误情形 100
6.1 从何而来 101
6.2 错误报告机制 102
6.2.1 不报告 103
6.2.2 返回值 103
6.2.3 错误状态变量 104
6.2.4 异常 104
6.2.5 信号 106
6.3 检测错误 107
6.4 处理错误 108
6.4.1 何时处理错误 109
6.4.2 可能的反应 110
6.4.3 代码示例 112
6.5 使地狱浮现 116
6.6 管理错误 118
6.7 总结 119
6.8 另请参见 119
6.9 思考 120
6.9.1 深入思考 120
6.9.2 结合自己 121
第2篇 代码的神秘生命第一部分
第7章 欲善其事,先利其器:使用工具构建软件 125
7.1 什么是软件工具 126
7.2 为什么要在意工具 128
7.3 使工具发挥作用 129
7.3.1 了解它能做些什么 130
7.3.2 学习如何驾驭它 130
7.3.3 了解它适合什么任务 131
7.3.4 检查它是否可用 131
7.3.5 找到了解更多信息的途径 131
7.3.6 查明新版本何时出现 132
7.4 哪个工具 132
7.4.1 源代码编辑工具 133
7.4.2 代码构建工具 136
7.4.3 调试和调查工具 138
7.4.4 语言支持工具 140
7.4.5 其他工具 141
7.5 总结 142
7.6 另请参见 143
7.7 思考 144
7.7.1 深入思考 144
7.7.2 结合自己 145
第8章 测试时代:测试代码的魔术 146
8.1 反思现实 148
8.2 谁、是什么、何时以及为什么 149
8.2.1 我们为什么要测试 149
8.2.2 谁来进行测试 150
8.2.3 测试的内容有些什么 150
8.2.4 何时进行测试 151
8.3 测试并不难…… 152
8.4 测试的类型 156
8.5 选择单元测试用例 160
8.6 为测试而设计 163
8.7 看!不要用手 164
8.8 面对故障该怎么办 165
8.9 你能管理它吗 166
8.9.1 缺陷跟踪系统 166
8.9.2 bug审查 168
8.10 总结 169
8.11 另请参见 169
8.12 思考 170
8.12.1 深入思考 170
8.12.2 结合自己 171
第9章 寻找缺陷(调试):当事情进展得不顺利
时该怎么办 172
9.1 生活的真相 173
9.2 bug的种类 174
9.2.1 从远处看 174
9.2.2 从近处看 175
9.2.3 从更近处看 178
9.3 消灭害虫 180
9.3.1 地下之路 181
9.3.2 地上之路 181
9.4 搜寻bug 182
9.4.1 编译时错误 182
9.4.2 运行时错误 184
9.5 如何修正缺陷 188
9.6 预防 190
9.7 除蜂剂、驱虫剂、捕蝇纸 190
9.7.1 调试器 190
9.7.2 内存访问校验器 191
9.7.3 系统调用跟踪 191
9.7.4 内核转储 191
9.7.5 日志 191
9.8 总结 192
9.9 另请参见 193
9.10 思考 194
9.10.1 深入思考 194
9.10.2 结合自己 194
第10章 代码构建:将源代码转换为可执行代码的过程 196
10.1 语言障碍 197
10.1.1 解释型语言 198
10.1.2 编译型语言 199
10.1.3 字节编译型语言 200
10.2 小题大做 201
10.3 构建软件版本 203
10.4 怎样才算是一个优秀的构建系统 206
10.4.1 简洁 206
10.4.2 一致 207
10.4.3 可重复和可靠 207
10.4.4 原子性 208
10.4.5 能够应付错误 209
10.5 技术细节 210
10.5.1 目标的选择 210
10.5.2 内务处理 212
10.5.3 依赖关系 212
10.5.4 自动构建 213
10.5.5 构建配置 214
10.5.6 递归地使用make 215
10.6 请发布我吧 215
10.7 构建大师是全能的吗 218
10.8 总结 218
10.9 另请参见 219
10.10 思考 219
10.10.1 深入思考 220
10.10.2 结合自己 220
第11章 追求速度:优化程序和编写高效的代码 222
11.1 优化是什么 223
11.2 是什么使代码不尽如人意 224
11.3 为什么不进行优化呢 225
11.4 为什么要进行优化 228
11.5 优化的具体细节 229
11.5.1 证明你需要进行优化 230
11.5.2 找出运行得最慢的代码 230
11.5.3 测试代码 232
11.5.4 优化代码 233
11.5.5 优化之后 233
11.6 优化的技术 233
11.6.1 设计更改 234
11.6.2 代码更改 237
11.7 编写高效的代码 241
11.8 总结 243
11.9 另请参见 244
11.10 思考 244
11.10.1 深入思考 244
11.10.2 结合自己 245
第12章 不安全感综合征:编写安全的程序 247
12.1 危险 248
12.2 敌人 250
12.3 借口,都是借口 252
12.4 感到很脆弱 253
12.4.1 不安全的设计和体系结构 253
12.4.2 缓冲溢出 254
12.4.3 嵌入的查询字符串 255
12.4.4 竞争状况 255
12.4.5 整数溢出 256
12.5 防范措施 257
12.5.1 系统安装技术 258
12.5.2 软件设计技术 258
12.5.3 代码实现技术 260
12.5.4 规程技术 261
12.6 总结 261
12.7 另请参见 262
12.8 思考 263
12.8.1 深入思考 263
12.8.2 结合自己 263
第3篇 代码的形成过程第一部分
第13章 崇尚设计:如何创作出优秀的软件设计 267
13.1 边设计边编程 268
13.2 我们要设计什么 269
13.3 为什么这么忙乱 270
13.4 良好的软件设计 271
13.4.1 简洁 272
13.4.2 优雅 273
13.4.3 模块化 274
13.4.4 良好的接口 275
13.4.5 可扩展性 278
13.4.6 避免重复 278
13.4.7 可移植性 279
13.4.8 符合语言习惯 280
13.4.9 良好地文档化 280
13.5 如何设计代码 280
13.5.1 设计方法和过程 281
13.5.2 设计工具 282
13.6 总结 285
13.7 另请参见 285
13.8 思考 286
13.8.1 深入思考 286
13.8.2 结合自己 287
第14章 软件体系结构:奠定软件设计的基础 288
14.1 什么是软件体系结构 289
14.1.1 软件蓝图 289
14.1.2 视图 290
14.1.3 在何时和何处进行体系结构设计 292
14.1.4 用体系结构来做什么 293
14.1.5 关于组件和连接 294
14.2 什么是良好的体系结构 295
14.3 体系结构风格 297
14.3.1 没有体系结构 297
14.3.2 分层的体系结构 298
14.3.3 管道和过滤器体系结构 299
14.3.4 客户端/服务器体系结构 299
14.3.5 基于组件的体系结构 302
14.3.6 框架 303
14.4 总结 303
14.5 另请参见 304
14.6 思考 305
14.6.1 深入思考 305
14.6.2 结合自己 305
第15章 改良与革命:代码是如何成长的 307
15.1 软件腐烂 308
15.2 警告信号 310
15.3 代码是如何成长的 312
15.4 相信不可能之事 315
15.5 对此我们可以做些什么? 316
15.5.1 编写新代码 316
15.5.2 维护现有代码 317
15.6 总结 319
15.7 另请参见 319
15.8 思考 320
15.8.1 深入思考 321
15.8.2 结合自己 321
第4篇 “一群”程序员第一部分
第16章 代码猴子:培养正确的编程态度和方法 325
16.1 各种各样的猴子 326
16.1.1 卖力工作的程序员 327
16.1.2 代码猴子 328
16.1.3 权威 329
16.1.4 半权威 330
16.1.5 傲慢的天才 331
16.1.6 牛仔 333
16.1.7 规划者 334
16.1.8 老前辈 335
16.1.9 狂热者 336
16.1.10 单线条程序员 337
16.1.11 拖沓者 338
16.1.12 勉强的团队领导 339
16.1.13 你 340
16.2 理想的程序员 340
16.3 那么该怎么办 341
16.4 最愚蠢的人 342
16.5 总结 343
16.6 另请参见 343
16.7 行为表格 344
16.8 思考 345
16.8.1 深入思考 345
16.8.2 结合自己 345
第17章 团结就是力量:团队合作与个人程序员 347
17.1 我们的团队——概览 348
17.2 团队组织 350
17.2.1 管理方法 350
17.2.2 责任划分 350
17.2.3 组织和代码结构 352
17.3 团队合作工具 352
17.4 团队疾病 354
17.4.1 巴别塔 354
17.4.2 独裁制 356
17.4.3 民主制 357
17.4.4 卫星站 359
17.4.5 大峡谷 361
17.4.6 流沙 363
17.4.7 旅鼠 365
17.5 良好团队合作的个人技巧和特点 366
17.5.1 沟通 366
17.5.2 谦虚 367
17.5.3 处理冲突 367
17.5.4 学习和适应能力 369
17.5.5 了解你的不足之处 369
17.6 团队合作原则 370
17.6.1 集体代码所有制 370
17.6.2 尊重别人的代码 371
17.6.3 编码准则 371
17.6.4 定义成功 371
17.6.5 定义责任 372
17.6.6 避免倦怠 372
17.7 团队的生命周期 372
17.7.1 团队的创建 373
17.7.2 团队的成长 375
17.7.3 团队合作 377
17.7.4 团队结束 377
17.8 总结 380
17.9 另请参见 381
17.10 行为表格 382
17.11 思考 383
17.11.1 深入思考 383
17.11.2 结合自己 383
第18章 安全措施:源代码控制与自我控制 385
18.1 我们的责任 386
18.2 源代码控制 387
18.2.1 修订控制 388
18.2.2 访问控制 390
18.2.3 处理代码库 390
18.2.4 在代码树上创建分支 391
18.2.5 源代码控制简史 393
18.3 配置管理 393
18.4 备份 395
18.5 发布源代码 396
18.6 应该将源代码放在哪里 397
18.7 总结 398
18.8 另请参见 399
18.9 思考 400
18.9.1 深入思考 400
18.9.2 结合自己 400
第5篇 开发过程的组成部分第一部分
第19章 注意细节:编写软件规范 403
19.1 规范到底是什么 404
19.2 规范的类型 405
19.2.1 需求规范 407
19.2.2 功能规范 409
19.2.3 系统体系结构规范 410
19.2.4 用户界面规范 410
19.2.5 设计规范 411
19.2.6 测试规范 412
19.3 规范应当包含哪些内容 413
19.4 规范编写过程 415
19.5 我们为什么会不编写规范 418
19.6 总结 420
19.7 另请参见 420
19.8 思考 421
19.8.1 深入思考 421
19.8.2 结合自己 421
第20章 代码审查:执行代码审查 423
20.1 什么是代码审查 424
20.2 何时进行审查 425
20.2.1 是否要进行审查 426
20.2.2 审查哪些代码 427
20.3 执行代码审查 427
20.3.1 代码审查会议 428
20.3.2 集成审查 431
20.4 审查你的态度 432
20.4.1 作者的态度 432
20.4.2 审查人员的态度 433
20.5 完美的代码 434
20.6 代码审查之外 435
20.7 总结 436
20.8 另请参见 436
20.9 清单 437
20.10 思考 438
20.10.1 深入思考 438
20.10.2 结合自己 438
第21章 时间估计:软件时间范围估计的魔术 439
21.1 在黑暗中摸索 440
21.2 为什么估计这么困难 441
21.3 压力之下 443
21.4 实用的估计方法 444
21.5 计划游戏 447
21.6 坚持 451
21.7 总结 454
21.8 另请参见 454
21.9 思考 455
21.9.1 深入思考 455
21.9.2 结合自己 455
第6篇 从高处鸟瞰第一部分
第22章 程序秘方:代码开发的方法和过程 459
22.1 编程风格 460
22.1.1 结构化编程 461
22.1.2 面向对象的程序设计 462
22.1.3 函数式编程 463
22.1.4 逻辑编程 464
22.2 烹饪方法:做什么与怎样做 464
22.3 开发过程 465
22.3.1 混乱 466
22.3.2 瀑布模型 468
22.2.3 ssadm和prince 470
22.3.4 v模型 470
22.3.5 原型设计 471
22.3.6 迭代和增量开发 472
22.3.7 螺旋模型 473
22.3.8 敏捷的方法 474
22.3.9 其他开发过程 475
22.4 已经够了 476
22.5 选择一种过程 477
22.6 总结 478
22.7 另请参见 478
22.8 思考 479
22.8.1 深入思考 479
22.8.2 结合自己 479
第23章 编程领域大观:不同的编程分支 481
23.1 应用程序编程 482
23.1.1 塑装软件 483
23.1.2 定制应用程序 484
23.2 游戏编程 485
23.3 系统编程 486
23.4 嵌入式编程 488
23.5 分布式编程 490
23.6 网络应用程序编程 492
23.7 企业编程 494
23.8 数字编程 495
23.9 那又怎样 497
23.10 总结 497
23.11 另请参见 498
23.12 思考 498
23.12.1 深入思考 499
23.12.2 结合自己 499
第24章 下一步呢:结果好就一切都好 500
但下一步该做什么呢? 501
答案和讨论 504
参考书目 607
第1篇 代码表面第一部分
第1章 善于防守:健壮代码的防御性编程技巧 3
1.1 向优秀的代码前进 3
1.2 设想:最坏的选择 4
1.3 什么是防御性编程? 6
1.4 又大又坏的世界 8
1.5 防御性编程技巧 9
1.5.1 使用好的编码风格和合理的设计 9
1.5.2 不要仓促地编写代码 9
1.5.3 不要相信任何人 10
1.5.4 编码的目标是清晰,而不是简洁 11
1.5.5 不要让任何人做他们不该做的修补工作 11
1.5.6 编译时打开所有警告开关 12
1.5.7 使用静态分析工具 13
1.5.8 使用安全的数据结构 13
1.5.9 检查所有的返回值 14
1.5.10 审慎地处理内存(和其他宝贵的资源) 14
1.5.11 在声明位置初始化所有变量 15
1.5.12 尽可能推迟一些声明变量 15
.1.5.13 使用标准语言工具 15
1.5.14 使用好的诊断信息日志工具 16
1.5.15 审慎地进行强制转换 16
1.5.16 细则 16
1.6 约束 17
1.6.1 约束的内容 19
1.6.2 移除约束 19
1.7 总结 22
1.8 另请参见 22
1.9 思考 24
1.9.1 深入思考 24
1.9.2 结合自己 24
第2章 精心布局:源代码的版面和样式 26
2.1 什么是关键 27
2.2 了解你的读者 27
2.3 什么是好的样式 29
2.4 使用括号 30
2.4.1 k&r括号风格 30
2.4.2 悬挂式的括号风格 31
2.4.3 缩进的括号风格 32
2.4.4 其他的括号风格 33
2.5 主宰一切的风格 33
2.6 内部风格(以及在哪里使用它们) 35
2.7 设立标准 37
2.8 正义的战争 39
2.9 总结 40
2.10 另请参见 42
2.11 思考 42
2.11.1 深入思考 42
2.11.2 结合自己 43
第3章 名正言顺:为有意义的事物起有意义的名称 45
3.1 为什么我们应该恰当地命名呢 47
3.2 我们对什么进行命名 47
3.3 名字游戏 48
3.3.1 描述性 48
3.3.2 技术上正确 48
3.3.3 符合语言习惯 49
3.3.4 恰当 49
3.4 具体细节 50
3.4.1 命名变量 51
3.4.2 命名函数 52
3.4.3 命名类型 53
3.4.4 命名名字空间 54
3.4.5 命名宏 55
3.4.6 命名文件 56
3.5 玫瑰不叫玫瑰 57
3.5.1 保持前后一致 58
3.5.2 利用上下文 58
3.5.3 使用对你有利的名称 59
3.6 总结 59
3.7 另请参见 61
3.8 思考 62
3.8.1 深入思考 62
3.8.2 结合自己 63
第4章 不言自明:编写“自文档化”代码的技巧 64
4.1 自文档化的代码 66
4.2 编写自文档化代码的技术 69
4.2.1 使用好的样式编写简单的代码 69
4.2.2 选择有意义的名称 70
4.2.3 分解为原子函数 70
4.2.4 选择描述性的类型 71
4.2.5 命名常量 71
4.2.6 强调重要的代码 72
4.2.7 分组相关信息 72
4.2.8 提供文件头 72
4.2.9 恰当地处理错误 73
4.2.10 编写有意义的注释 73
4.3 实用的自文档化方法 74
4.3.1 文学性编程 74
4.3.2 文档化工具 76
4.4 总结 78
4.5 另请参见 79
4.6 思考 79
4.6.1 深入思考 79
4.6.2 结合自己 81
第5章 随篇注释:如何编写代码注释 82
5.1 什么是代码注释 83
5.2 注释看上去是什么样的 84
5.3 多少注释是恰当的 84
5.4 注释中应该有些什么 85
5.4.1 解释为什么,而不是怎么样 85
5.4.2 不要描述代码 86
5.4.3 不要取代代码 86
5.4.4 确保注释有用 86
5.4.5 避免分心 88
5.5 实践 88
5.6 从审美的角度看注释 89
5.6.1 一致性 89
5.6.2 清晰的块注释 90
5.6.3 缩进的注释 90
5.6.4 行尾注释 91
5.6.5 帮助你阅读代码 91
5.6.6 选择一种维护成本较低的风格 92
5.6.7 分隔板 92
5.6.8 标志 92
5.6.9 文件头注释 93
5.7 使用注释 94
5.7.1 帮助你编写例行程序 94
5.7.2 错误修正通告 95
5.7.3 注释过时 95
5.7.4 维护和空洞无物的注释 96
5.8 总结 97
5.9 另请参见 98
5.10 思考 98
5.10.1 深入思考 98
5.10.2 结合自己 99
第6章 人非圣贤:处理不可避免的情况——代码中
的错误情形 100
6.1 从何而来 101
6.2 错误报告机制 102
6.2.1 不报告 103
6.2.2 返回值 103
6.2.3 错误状态变量 104
6.2.4 异常 104
6.2.5 信号 106
6.3 检测错误 107
6.4 处理错误 108
6.4.1 何时处理错误 109
6.4.2 可能的反应 110
6.4.3 代码示例 112
6.5 使地狱浮现 116
6.6 管理错误 118
6.7 总结 119
6.8 另请参见 119
6.9 思考 120
6.9.1 深入思考 120
6.9.2 结合自己 121
第2篇 代码的神秘生命第一部分
第7章 欲善其事,先利其器:使用工具构建软件 125
7.1 什么是软件工具 126
7.2 为什么要在意工具 128
7.3 使工具发挥作用 129
7.3.1 了解它能做些什么 130
7.3.2 学习如何驾驭它 130
7.3.3 了解它适合什么任务 131
7.3.4 检查它是否可用 131
7.3.5 找到了解更多信息的途径 131
7.3.6 查明新版本何时出现 132
7.4 哪个工具 132
7.4.1 源代码编辑工具 133
7.4.2 代码构建工具 136
7.4.3 调试和调查工具 138
7.4.4 语言支持工具 140
7.4.5 其他工具 141
7.5 总结 142
7.6 另请参见 143
7.7 思考 144
7.7.1 深入思考 144
7.7.2 结合自己 145
第8章 测试时代:测试代码的魔术 146
8.1 反思现实 148
8.2 谁、是什么、何时以及为什么 149
8.2.1 我们为什么要测试 149
8.2.2 谁来进行测试 150
8.2.3 测试的内容有些什么 150
8.2.4 何时进行测试 151
8.3 测试并不难…… 152
8.4 测试的类型 156
8.5 选择单元测试用例 160
8.6 为测试而设计 163
8.7 看!不要用手 164
8.8 面对故障该怎么办 165
8.9 你能管理它吗 166
8.9.1 缺陷跟踪系统 166
8.9.2 bug审查 168
8.10 总结 169
8.11 另请参见 169
8.12 思考 170
8.12.1 深入思考 170
8.12.2 结合自己 171
第9章 寻找缺陷(调试):当事情进展得不顺利
时该怎么办 172
9.1 生活的真相 173
9.2 bug的种类 174
9.2.1 从远处看 174
9.2.2 从近处看 175
9.2.3 从更近处看 178
9.3 消灭害虫 180
9.3.1 地下之路 181
9.3.2 地上之路 181
9.4 搜寻bug 182
9.4.1 编译时错误 182
9.4.2 运行时错误 184
9.5 如何修正缺陷 188
9.6 预防 190
9.7 除蜂剂、驱虫剂、捕蝇纸 190
9.7.1 调试器 190
9.7.2 内存访问校验器 191
9.7.3 系统调用跟踪 191
9.7.4 内核转储 191
9.7.5 日志 191
9.8 总结 192
9.9 另请参见 193
9.10 思考 194
9.10.1 深入思考 194
9.10.2 结合自己 194
第10章 代码构建:将源代码转换为可执行代码的过程 196
10.1 语言障碍 197
10.1.1 解释型语言 198
10.1.2 编译型语言 199
10.1.3 字节编译型语言 200
10.2 小题大做 201
10.3 构建软件版本 203
10.4 怎样才算是一个优秀的构建系统 206
10.4.1 简洁 206
10.4.2 一致 207
10.4.3 可重复和可靠 207
10.4.4 原子性 208
10.4.5 能够应付错误 209
10.5 技术细节 210
10.5.1 目标的选择 210
10.5.2 内务处理 212
10.5.3 依赖关系 212
10.5.4 自动构建 213
10.5.5 构建配置 214
10.5.6 递归地使用make 215
10.6 请发布我吧 215
10.7 构建大师是全能的吗 218
10.8 总结 218
10.9 另请参见 219
10.10 思考 219
10.10.1 深入思考 220
10.10.2 结合自己 220
第11章 追求速度:优化程序和编写高效的代码 222
11.1 优化是什么 223
11.2 是什么使代码不尽如人意 224
11.3 为什么不进行优化呢 225
11.4 为什么要进行优化 228
11.5 优化的具体细节 229
11.5.1 证明你需要进行优化 230
11.5.2 找出运行得最慢的代码 230
11.5.3 测试代码 232
11.5.4 优化代码 233
11.5.5 优化之后 233
11.6 优化的技术 233
11.6.1 设计更改 234
11.6.2 代码更改 237
11.7 编写高效的代码 241
11.8 总结 243
11.9 另请参见 244
11.10 思考 244
11.10.1 深入思考 244
11.10.2 结合自己 245
第12章 不安全感综合征:编写安全的程序 247
12.1 危险 248
12.2 敌人 250
12.3 借口,都是借口 252
12.4 感到很脆弱 253
12.4.1 不安全的设计和体系结构 253
12.4.2 缓冲溢出 254
12.4.3 嵌入的查询字符串 255
12.4.4 竞争状况 255
12.4.5 整数溢出 256
12.5 防范措施 257
12.5.1 系统安装技术 258
12.5.2 软件设计技术 258
12.5.3 代码实现技术 260
12.5.4 规程技术 261
12.6 总结 261
12.7 另请参见 262
12.8 思考 263
12.8.1 深入思考 263
12.8.2 结合自己 263
第3篇 代码的形成过程第一部分
第13章 崇尚设计:如何创作出优秀的软件设计 267
13.1 边设计边编程 268
13.2 我们要设计什么 269
13.3 为什么这么忙乱 270
13.4 良好的软件设计 271
13.4.1 简洁 272
13.4.2 优雅 273
13.4.3 模块化 274
13.4.4 良好的接口 275
13.4.5 可扩展性 278
13.4.6 避免重复 278
13.4.7 可移植性 279
13.4.8 符合语言习惯 280
13.4.9 良好地文档化 280
13.5 如何设计代码 280
13.5.1 设计方法和过程 281
13.5.2 设计工具 282
13.6 总结 285
13.7 另请参见 285
13.8 思考 286
13.8.1 深入思考 286
13.8.2 结合自己 287
第14章 软件体系结构:奠定软件设计的基础 288
14.1 什么是软件体系结构 289
14.1.1 软件蓝图 289
14.1.2 视图 290
14.1.3 在何时和何处进行体系结构设计 292
14.1.4 用体系结构来做什么 293
14.1.5 关于组件和连接 294
14.2 什么是良好的体系结构 295
14.3 体系结构风格 297
14.3.1 没有体系结构 297
14.3.2 分层的体系结构 298
14.3.3 管道和过滤器体系结构 299
14.3.4 客户端/服务器体系结构 299
14.3.5 基于组件的体系结构 302
14.3.6 框架 303
14.4 总结 303
14.5 另请参见 304
14.6 思考 305
14.6.1 深入思考 305
14.6.2 结合自己 305
第15章 改良与革命:代码是如何成长的 307
15.1 软件腐烂 308
15.2 警告信号 310
15.3 代码是如何成长的 312
15.4 相信不可能之事 315
15.5 对此我们可以做些什么? 316
15.5.1 编写新代码 316
15.5.2 维护现有代码 317
15.6 总结 319
15.7 另请参见 319
15.8 思考 320
15.8.1 深入思考 321
15.8.2 结合自己 321
第4篇 “一群”程序员第一部分
第16章 代码猴子:培养正确的编程态度和方法 325
16.1 各种各样的猴子 326
16.1.1 卖力工作的程序员 327
16.1.2 代码猴子 328
16.1.3 权威 329
16.1.4 半权威 330
16.1.5 傲慢的天才 331
16.1.6 牛仔 333
16.1.7 规划者 334
16.1.8 老前辈 335
16.1.9 狂热者 336
16.1.10 单线条程序员 337
16.1.11 拖沓者 338
16.1.12 勉强的团队领导 339
16.1.13 你 340
16.2 理想的程序员 340
16.3 那么该怎么办 341
16.4 最愚蠢的人 342
16.5 总结 343
16.6 另请参见 343
16.7 行为表格 344
16.8 思考 345
16.8.1 深入思考 345
16.8.2 结合自己 345
第17章 团结就是力量:团队合作与个人程序员 347
17.1 我们的团队——概览 348
17.2 团队组织 350
17.2.1 管理方法 350
17.2.2 责任划分 350
17.2.3 组织和代码结构 352
17.3 团队合作工具 352
17.4 团队疾病 354
17.4.1 巴别塔 354
17.4.2 独裁制 356
17.4.3 民主制 357
17.4.4 卫星站 359
17.4.5 大峡谷 361
17.4.6 流沙 363
17.4.7 旅鼠 365
17.5 良好团队合作的个人技巧和特点 366
17.5.1 沟通 366
17.5.2 谦虚 367
17.5.3 处理冲突 367
17.5.4 学习和适应能力 369
17.5.5 了解你的不足之处 369
17.6 团队合作原则 370
17.6.1 集体代码所有制 370
17.6.2 尊重别人的代码 371
17.6.3 编码准则 371
17.6.4 定义成功 371
17.6.5 定义责任 372
17.6.6 避免倦怠 372
17.7 团队的生命周期 372
17.7.1 团队的创建 373
17.7.2 团队的成长 375
17.7.3 团队合作 377
17.7.4 团队结束 377
17.8 总结 380
17.9 另请参见 381
17.10 行为表格 382
17.11 思考 383
17.11.1 深入思考 383
17.11.2 结合自己 383
第18章 安全措施:源代码控制与自我控制 385
18.1 我们的责任 386
18.2 源代码控制 387
18.2.1 修订控制 388
18.2.2 访问控制 390
18.2.3 处理代码库 390
18.2.4 在代码树上创建分支 391
18.2.5 源代码控制简史 393
18.3 配置管理 393
18.4 备份 395
18.5 发布源代码 396
18.6 应该将源代码放在哪里 397
18.7 总结 398
18.8 另请参见 399
18.9 思考 400
18.9.1 深入思考 400
18.9.2 结合自己 400
第5篇 开发过程的组成部分第一部分
第19章 注意细节:编写软件规范 403
19.1 规范到底是什么 404
19.2 规范的类型 405
19.2.1 需求规范 407
19.2.2 功能规范 409
19.2.3 系统体系结构规范 410
19.2.4 用户界面规范 410
19.2.5 设计规范 411
19.2.6 测试规范 412
19.3 规范应当包含哪些内容 413
19.4 规范编写过程 415
19.5 我们为什么会不编写规范 418
19.6 总结 420
19.7 另请参见 420
19.8 思考 421
19.8.1 深入思考 421
19.8.2 结合自己 421
第20章 代码审查:执行代码审查 423
20.1 什么是代码审查 424
20.2 何时进行审查 425
20.2.1 是否要进行审查 426
20.2.2 审查哪些代码 427
20.3 执行代码审查 427
20.3.1 代码审查会议 428
20.3.2 集成审查 431
20.4 审查你的态度 432
20.4.1 作者的态度 432
20.4.2 审查人员的态度 433
20.5 完美的代码 434
20.6 代码审查之外 435
20.7 总结 436
20.8 另请参见 436
20.9 清单 437
20.10 思考 438
20.10.1 深入思考 438
20.10.2 结合自己 438
第21章 时间估计:软件时间范围估计的魔术 439
21.1 在黑暗中摸索 440
21.2 为什么估计这么困难 441
21.3 压力之下 443
21.4 实用的估计方法 444
21.5 计划游戏 447
21.6 坚持 451
21.7 总结 454
21.8 另请参见 454
21.9 思考 455
21.9.1 深入思考 455
21.9.2 结合自己 455
第6篇 从高处鸟瞰第一部分
第22章 程序秘方:代码开发的方法和过程 459
22.1 编程风格 460
22.1.1 结构化编程 461
22.1.2 面向对象的程序设计 462
22.1.3 函数式编程 463
22.1.4 逻辑编程 464
22.2 烹饪方法:做什么与怎样做 464
22.3 开发过程 465
22.3.1 混乱 466
22.3.2 瀑布模型 468
22.2.3 ssadm和prince 470
22.3.4 v模型 470
22.3.5 原型设计 471
22.3.6 迭代和增量开发 472
22.3.7 螺旋模型 473
22.3.8 敏捷的方法 474
22.3.9 其他开发过程 475
22.4 已经够了 476
22.5 选择一种过程 477
22.6 总结 478
22.7 另请参见 478
22.8 思考 479
22.8.1 深入思考 479
22.8.2 结合自己 479
第23章 编程领域大观:不同的编程分支 481
23.1 应用程序编程 482
23.1.1 塑装软件 483
23.1.2 定制应用程序 484
23.2 游戏编程 485
23.3 系统编程 486
23.4 嵌入式编程 488
23.5 分布式编程 490
23.6 网络应用程序编程 492
23.7 企业编程 494
23.8 数字编程 495
23.9 那又怎样 497
23.10 总结 497
23.11 另请参见 498
23.12 思考 498
23.12.1 深入思考 499
23.12.2 结合自己 499
第24章 下一步呢:结果好就一切都好 500
但下一步该做什么呢? 501
答案和讨论 504
参考书目 607
Code craft:the practice of writing excellent code
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×