第I 部分 奠定基础
第1 章 欢迎来到软件构建的世界 3
第2 章 有助于更充分理解软件开发的隐喻 9
第3 章 谋定而后动:前期准备 23
第4 章 关键的“构建”决策 61
第II 部分 创建高质量的代码
第5 章 软件构建中的设计 73
第6 章 可以工作的类 125
第7 章 高质量的例程 161
第8 章 防御性编程 187
第9 章 伪代码编程过程 215
第III 部分 变量
第10 章 变量中使用的一般性难题 237
第11 章 变量名的力量 259
第12 章 基本数据类型 291
第13 章 不常用的数据类型 319
第IV 部分 语句
第14 章 直线性代码的组织 347
第15 章 条件语句的使用 355
第16 章 控制循环 367
第17 章 不太常见的控制结构 391
第18 章 表驱动的方法 411
第19 章 常见的控制难题 431
第V 部分 代码改进
第20 章 软件质量的全景观 463
第21 章 协同构建代码 479
第22 章 开发人员和测试 499
第23 章 调试 535
第24 章 重构 563
第25 章 代码调优策略 587
第26 章 代码调优技术 609
第VI 部分 系统级考量
第27 章 程序规模对构建的影响 649
第28 章 对软件构建进行管理 661
第29 章 集成 689
第30 章 编程工具 709
第VII 部分 软件匠艺
第31 章 布局和风格 729
第32 章 自带文档说明的代码 777
第33 章 个性 819
第34 章 软件工艺的话题 837
第35 章 更多信息来源 855
参考文献 863
索引 883
详细目录
第I 部分 奠 定 基 础
第1章 欢迎来到软件构建的世界 3
1.1 什么是软件构建? 3
1.2 软件构建的重要性 6
1.3 如何阅读本书 8
第2章 有助于更充分理解软件开发的隐喻 9
2.1 隐喻的重要性 9
2.2 如何使用软件隐喻 11
2.3 常见的软件隐喻 13
第3章 谋定而后动,前期准备 23
3.1 先决条件的重要性 24
3.2 确定要开发什么类型的软件 31
3.3 定义问题的先决条件 36
3.4 需求的先决条件 38
3.5 架构的先决条件 43
3.6 花在事前先决条件上的时间 55
第4章 关键的构建决策 61
4.1 编程语言的选择 61
4.2 编程约定 66
4.3 评估自己在技术浪潮中的位置 66
4.4 选择主流的构建实践 69
第II 部分 创建高质量的代码
第5章 软件构建中的设计 73
5.1 设计挑战 74
5.2 关键的设计概念 77
5.3 设计构建块:启发式 87
5.4 设计实践 110
5.5 点评各种流行的方法论 118
第6章 可以工作的类 125
6.1 类的基础知识 126
6.2 何为好的类的接口 133
6.3 设计和实现有哪些难题 143
6.4 创建类的理由 152
6.5 特定于语言的难题 156
6.6 超越类:软件包 156
第7章 高质量的例程 161
7.1 基于合理缘由来创建例程 164
7.2 在例程层级的设计 168
7.3 何为好的例程名称 171
7.4 一个例程多长为好? 173
7.5 如何使用例程的参数 174
7.6 使用函数时候的特殊考量 181
7.7 宏例程和内联例程 182
第8章 防御性编程 187
8.1 防止程序接收无效输入 188
8.2 断言 189
8.3 错误处理技术 194
8.4 异常 198
8.5 隔离程序,免受误操作所造成的损害 203
8.6 调试帮助 205
8.7 决定产品代码中保留多少防御性编程 209
8.8 关于防御性编程,要慎重 210
第9章 伪代码编程过程 215
9.1 总结构建类和例程的步骤 216
9.2 Pro伪代码 218
9.3 使用PPP构建例程 220
9.4 PPP的备选方案 232
第III 部分 变 量
第10章 变量使用中的一般性难题 237
10.1 数据的含义 238
10.2 让变量声明变得简单一些 239
10.3 初始化变量指导方针 240
10.4 范围 244
10.5 持久化 251
10.6 绑定时间 252
10.7 数据类型和控制结构的关系 254
10.8 变量名称要精准体现其用途 255
第11章 变量名的力量 259
11.1 选择好名称时的注意事项 259
11.2 特定数据类型的命名 264
11.3 命名约定的力量 270
11.4 非正式化命名约定 272
11.5 标准化前缀 279
11.6 名称要言简意赅 282
11.7 要避免哪些类型的名称 285
第12章 基础数据类型 291
12.1 数字 292
12.2 整数 293
12.3 浮点数 295
12.4 字符和字符串 297
12.5 布尔变量 301
12.6 枚举类型 303
12.7 命名常量 307
12.8 数组 310
12.9 创建自己的类型(类型别名) 311
第13章 不常用的数据类型 319
13.1 结构 319
13.2 指针 323
13.3 全局数据 335
第IV 部分 语 句
第14章 直线性代码的组织 347
14.1 必须按特定顺序组织的语句 347
14.2 顺序无所谓的语句 351
第15章 条件语句的使用 355
15.1 if语句 355
15.2 case语句 361
第16章 控制循环 367
16.1 如何选择循环的类型 367
16.2 对循环进行控制 373
16.3 轻松创建循环—由内而外 385
16.4 循环和数组之间的相关性 387
第17章 不太常见的控制结构 391
17.1 子例程的多种返回路径 391
17.2 递归 393
17.3 goto语句 398
17.4 如何看待不同寻常的控制结构 408
第18章 表驱动的方法 411
18.1 常见考量 411
18.2 直接方案表 413
18.3 索引访问表 425
18.4 单步访问表 426
18.5 其他的表查找范例 429
第19章 常见的控制难题 431
19.1 布尔表达式 431
19.2 复合语句(块) 443
19.3 Null语句 444
19.4 搞定危险的深度嵌套 445
19.5 编程基础:结构化编程 454
19.6 控制结构与复杂性 456
第V 部分 代码改进
第20章 软件质量的全景观 463
20.1 软件质量具备哪些特征 463
20.2 软件质量改进技巧 466
20.3 质量技术的相对有效性 469
20.4 质量保障何时做 473
20.5 软件质量的一般性原则 474
第21章 协作构建代码 479
21.1 协作开发实践概览 480
21.2 结对编程 483
21.3 正式检查 485
21.4 其他类型的协作开发实践 492
第22章 开发人员和测试 499
22.1 开发人员的测试角色 500
22.2 建议开发人员如何做测试 503
22.3 测试技巧汇总 505
22.4 典型错误 517
22.5 支持测试的工具 523
22.6 如何改进测试 528
22.7 保留测试记录 529
第23章 调试 535
23.1 调试难题概览 535
23.2 发现缺陷 540
23.3 修复缺陷 550
23.4 调试过程中的心理学考量 554
23.5 调试工具:明显的和不太明显的 556
第24章 重构 563
24.1 软件演进的几种类型 564
24.2 重构介绍 565
24.3 特定类型的重构 571
24.4 以安全的方式重构 579
24.5 重构策略 582
第25章 代码调优策略 587
25.1 性能概览 588
25.2 代码调优简介 591
25.3 蜜糖和哥斯拉 597
25.4 度量 603
25.5 迭代 605
25.6 总结代码调优的几种方式 606
第26章 代码调优技术 609
26.1 逻辑 610
26.2 循环 616
26.3 数据转换 624
26.4 表达式 630
26.5 子例程 639
26.6 用低级别的语言重写代码 640
26.7 变动越大,越要大部分一致 643
第VI 部分 系统级考量
第27章 程序规模对代码构建的影响 649
27.1 通信和大小 650
27.2 项目大小的范围 651
27.3 项目大小对错误的影响 651
27.4 项目大小对生产力的影响 653
27.5 项目大小对开发活动的影响 654
第28章 对软件构建进行管理 661
28.1 鼓励写好代码 662
28.2 配置管理 664
28.3 对构建日程表进行评估 671
28.4 度量 677
28.5 以人为本,程序员首先是人 680
28.6 向上管理 686
第29章 集成 689
29.1 集成方法的重要性不可小觑 689
29.2 集成的频率,按阶段还是按增量? 691
29.3 增量集成策略 694
29.4 每日构建和冒烟测试 702
第30章 编程工具 709
30.1 设计工具 710
30.2 源代码工具 710
30.3 可执行代码工具 716
30.4 面向工具的编程环境 720
30.5 自己构建编程工具 721
30.6 工具魔境 722
第VII 部分 软件匠艺
第31章 布局和风格 729
31.1 布局基础 730
31.2 布局 736
31.3 布局风格 738
31.4 控制结构的布局 745
31.5 单条语句的布局 753
31.6 注释的布局 763
31.7 子例程的布局 766
31.8 类的布局 768
第32章 自带文档说明的代码 777
32.1 内部文档 777
32.2 编程风格也是一种文档 778
32.3 注释,加还是不加,这是个问题 781
32.4 有效注释的关键 785
32.5 加注释的技术 792
32.6 IEEE标准 813
第33章 个性 819
33.1 个性和软件构建主题有关系吗 820
33.2 精明和谦逊 821
33.3 好奇心 822
33.4 睿智的真诚 826
33.5 交流与合作 828
33.6 创造性和规范性 829
33.7 懒有懒的道理 830
33.8 性格其实没有太大关系 830
33.9 习惯 833
第34章 软件匠艺的话题 837
34.1 征服复杂性 837
34.2 选择适合自己的流程 839
34.3 写程序的时候,首先考虑到人,
其次才考虑机器 841
34.4 写程序的时候,思维优先,不要受限于语言 843
34.5 专注于编程约定的帮助文档 844
34.6 以问题域来考虑编程 845
34.7 注意落石 848
34.8 迭代、重复,反复练习 850
34.9 软件与信仰,各自心生欢喜 851
第35章 更多信息来源 855
35.1 与软件构建相关的信息 856
35.2 软件构建之外的话题 857
35.3 期刊 859
35.4 软件开发人员的阅读计划 860
35.5 加入专业组织 862