第一部分 搜寻和使用证据的一般原则 2
第1章 探寻有力的证据 2
1.1起步阶段 2
1.2当今证据的状态 3
1.2.1精确性研究的挑战 3
1.2.2统计强度的挑战 3
1.2.3结果可复制性的挑战 4
1.3我们可以相信的改变 5
1.4背景的影响 7
1.5展望未来 7
1.6参考文献 9
第2章 可信度,为什么我坚决要求确信的证据 12
2.1软件工程中的证据是如何发现的 12
2.2可信度和适用性 13
2.2.1适用性,为什么使你信服的证据不能使我信服 14
2.2.2定性证据对战定量证据:错误的二分法 15
2.3整合证据 16
2.4证据的类型以及它们的优缺点 17
2.4.1对照实验和准实验 18
2.4.2问卷调查 19
2.4.3经验汇报和案例研究 20
2.4.4其他方法 20
2.4.5报告中的可信度(或缺乏可信度)的标识 21
2.5社会、文化、软件工程和你 23
2.6致谢 24
2.7参考文献 24
第3章 我们能从系统性评审中学到什么 25
3.1系统性评审总览 26
3.2系统性评审的长处和短处 27
3.2.1系统性评审的流程 28
3.2.2开展一项评审所牵连的问题 30
3.3软件工程中的系统性评审 31
3.3.1成本估算研究 32
3.3.2敏捷方法 33
3.3.3检验方法 35
3.4结论 35
3.5参考文献 36
第4章 用定性研究方法来理解软件工程学 40
4.1何为定性研究方法 41
4.2如何解读定性研究 42
4.3在工作中运用定性研究方法 44
4.4推广应用定性研究的结果 45
4.5定性研究方法是系统的研究方法 46
4.6参考文献 46
第5章 在实践中学习成长:软件工程实验室中的质量改进范式 47
5.1软件工程研究独有的困难之处 47
5.2实证研究的现实之路 48
5.3 NASA软件工程实验室:一个充满活力的实证研究测试平台 48
5.4质量改进范式 49
5.4.1表征 51
5.4.2设立目标 51
5.4.3选择流程 51
5.4.4执行流程 53
5.4.5分析 53
5.4.6封装 53
5.5结论 55
5.6参考文献 55
第6章 性格、智力和专业技能对软件开发的影响 57
6.1如何辨别优秀的程序员 58
6.1.1个体差异:固定的还是可塑造的 58
6.1.2个性 59
6.1.3智力 63
6.1.4编程任务 65
6.1.5编程表现 65
6.1.6专业技能 66
6.1.7软件工作量估算 68
6.2环境因素还是个人因素 68
6.2.1软件工程中应该提高技能还是提高安全保障 69
6.2.2合作 69
6.2.3再谈个性 72
6.2.4从更广的角度看待智力 72
6.3结束语 74
6.4参考文献 75
第7章 为什么学编程这么难 81
7.1学生学习编程有困难吗 82
7.1.1 2001年McCracken工作小组 82
7.1.2 Lister工作小组 83
7.2人们对编程的本能理解是什么 83
7.3通过可视化编程来优化工具 85
7.4融入语境后的改变 86
7.5总结:一个新兴的领域 88
7.6参考文献 89
第8章 超越代码行:我们还需要其他的复杂度指标吗 92
8.1对软件的调查 92
8.2计算源代码的指标 93
8.3指标计算案例 94
8.3.1源代码行数(SLOC ) 96
8.3.2代码行数(LOC) 96
8.3.3 C函数的数量 96
8.3.4 McCabe圈复杂度 96
8.3.5 Halstead软件科学指标 97
8.4统计分析 98
8.4.1总体分析 98
8.4.2头文件和非头文件之间的区别 99
8.4.3干扰效应:文件大小对相关性的影响 100
8.5关于统计学方法的一些说明 103
8.6还需要其他的复杂度指标吗 103
8.7参考文献 104
第二部分 软件工程的特有话题 106
第9章 自动故障预报系统实例一则 106
9.1故障的分布 106
9.2故障高发文件的特征 109
9.3预测模型概览 109
9.4预测模型的复验和变体 110
9.4.1开发人员的角色 111
9.4.2用其他类型的模型来预测故障 113
9.5工具的设计 115
9.6一些忠告 115
9.7参考文献 117
第10章 架构设计的程度和时机 119
10.1修正缺陷的成本是否会随着项目的进行而增加 119
10.2架构设计应该做到什么程度 120
10.3架构设计的成本-修复数据给予我们的启示 123
10.3.1关于COCOMO Ⅱ架构设计和风险解决系数的基础知识 123
10.3.2 Ada COCOMO及COCOMO II中的架构设计以及风险应对系数 125
10.3.3用于改善系统设计的投入的ROI 130
10.4那么到底架构要做到什么程度才够 132
10.5架构设计是否必须提前做好 135
10.6总结 135
10.7参考文献 136
第11章 康威推论 138
11.1康威定律 138
11.2协调工作、和谐度和效率 140
11.3微软公司的组织复杂度 143
11.4开源软件集市上的小教堂 148
11.5总结 152
11.6参考文献 152
第12章 测试驱动开发的效果如何 153
12.1 TDD药丸是什么 153
12.2 TDD临床试验概要 154
12.3 TDD的效力 156
12.3.1内部质量 156
12.3.2外部质量 157
12.3.3生产力 157
12.3.4 测试质量 158
12.4在试验中强制TDD的正确剂量 158
12.5警告和副作用 159
12.6结论 160
12.7致谢 160
12.8参考文献 160
第13章 为何计算机科学领域的女性不多 163
13.1为什么女性很少 163
13.1.1能力缺陷,个人喜好以及文化偏见 164
13.1.2偏见、成见和男性计算机科学文化 166
13.2值得在意吗 168
13.2.1扭转这种趋势,我们可以做些什么 170
13.2.2跨国数据的意义 171
13.3结论 172
13.4参考文献 172
第14章 两个关于编程语言的比较 175
14.1一个搜索算法决定了一种语言的胜出 175
14.1.1编程任务:电话编码 176
14.1.2比较执行速度 176
14.1.3内存使用情况的比较 178
14.1.4比较效率和代码长度 178
14.1.5比较可靠性 180
14.1.6比较程序结构 180
14.1.7我可以相信吗 181
14.2 Plat Forms:网络开发技术和文化 182
14.2.1开发任务:人以类聚 182
14.2.2下注吧 183
14.2.3比较工作效率 184
14.2.4比较软件工件的大小 185
14.2.5比较可修改性 186
14.2.6比较稳健性和安全性 187
14.2.7嘿,“插入你自己的话题”如何 189
14.3那又怎样 189
14.4参考文献 189
第15章 质量之战:开源软件对战专有软件 191
15.1以往的冲突 192
15.2战场 192
15.3开战 195
15.3.1文件组织 196
15.3.2代码结构 200
15.3.3代码风格 204
15.3.4预处理 209
15.3.5数据组织 211
15.4成果和结论 213
15.5致谢 215
15.6参考文献 215
第16章 码语者 219
16.1程序员的一天 219
16.1.1日记研究 220
16.1.2观察研究 220
16.1.3程序员们是不是在挣表现 220
16.2说这么多有什么意义 221
16.2.1问问题 221
16.2.2探寻设计理念 223
16.2.3工作的中断和多任务 223
16.2.4程序员都在问什么问题 224
16.2.5使用敏捷方法是不是更利于沟通 227
16.3如何看待沟通 228
16.4参考文献 229
第17章 结对编程 230
17.1结对编程的历史 230
17.2产业环境中的结对编程 232
17.2.1结对编程的行业实践 232
17.2.2业内使用结对编程的效果 233
17.3教育环境中的结对编程 234
17.3.1教学中特有的实践 234
17.3.2教学中使用结对编程的效果 235
17.4分布式结对编程 235
17.5面对的挑战 236
17.6经验教训 237
17.7致谢 237
17.8参考文献 237
第18章 现代化代码审查 243
18.1常识 243
18.2程序员独立进行小量代码审查 243
18.2.1防止注意力疲劳 244
18.2.2切忌速度过快 244
18.2.3切忌数量过大 245
18.2.4上下文的重要性 246
18.3团队影响 247
18.3.1是否有必要开会 247
18.3.2虚假缺陷 247
18.3.3外部审查真的需要吗 248
18.4结论 249
18.5参考文献 249
第19章 公共办公室还是私人办公室 251
19.1私人办公室 251
19.2公共办公室 253
19.3工作模式 255
19.4最后的忠告 257
19.5参考文献 257
第20章 识别及管理全球性软件开发中的依赖关系 258
20.1为什么协调工作对于GSD来说是挑战 258
20.2依赖关系及其社会/技术二重性 259
20.2.1技术方面 261
20.2.2社会/组织结构方面 263
20.2.3社会-技术方面 266
20.3从研究到实践 267
20.3.1充分使用软件储存库中的数据 267
20.3.2团队领导和管理者在依赖关系管理中的角色 268
20.3.3开发人员、工作项目和分布式开发 269
20.4未来的方向 269
20.4.1适合GSD的软件架构 269
20.4.2协作软件工程工具 270
20.4.3标准化和灵活度的平衡 271
20.5参考文献 271
第21章 模块化的效果如何 274
21.1所分析的软件系统 275
21.2如何定义“修改” 276
21.3如何定义“模块” 280
21.4研究结果 281
21.4.1修改的范围 281
21.4.2需要参考的模块 283
21.4.3自发式的模块化 284
21.5有效性的问题 286
21.6总结 287
21.7参考文献 287
第22章 设计模式的证据 289
22.1设计模式的例子 290
22.2为什么认为设计模式可行 292
22.3第一个实验:关于设计模式文档的测试 293
22.3.1实验的设计 293
22.3.2研究结果 295
22.4第二个实验:基于设计模式的解决方案和简单解决方案的对比 297
22.5第三个试验:设计模式之于团队沟通 300
22.6经验教训 302
22.7总结 304
22.8致谢 304
22.9参考文献 305
第23章 循证故障预测 306
23.1简介 306
23.2代码覆盖率 308
23.3代码变动 308
23.4代码复杂度 311
23.5代码依赖 312
23.6人与组织度量 312
23.7预测缺陷的综合方法 315
23.8结论 317
23.9致谢 319
23.10参考文献 319
第24章 采集缺陷报告的艺术 322
24.1缺陷报告的优劣之分 322
24.2优秀缺陷报告需要具备的要素 323
24.3调查结果 325
24.3.1开发人员眼中的缺陷报告内容 325
24.3.2报告者眼中的缺陷报告内容 326
24.4来自不一致信息的证据 327
24.5缺陷报告的问题 329
24.6重复缺陷报告的价值 330
24.7 并非所有的缺陷都被修复了 332
24.8结论 333
24.9致谢 334
24.10参考文献 334
第25章 软件的缺陷都从哪儿来 335
25.1研究软件的缺陷 335
25.2本次研究的环境和背景 336
25.3第一阶段:总体调查 337
25.3.1调查问卷 337
25.3.2数据的总结 339
25.3.3第一部分的研究总结 342
25.4第二阶段:设计/代码编写类故障调查 342
25.4.1调查问卷 342
25.4.2统计分析 345
25.4.3界面故障与实现故障 358
25.5研究结果可靠吗 360
25.5.1我们调查的对象是否正确 360
25.5.2我们的方法是否正确 361
25.5.3我们能用这些结果做什么 362
25.6我们明白了什么 362
25.7致谢 364
25.8参考文献 364
第26章 新手专家:软件行业的应届毕业生们 367
26.1研究方法 368
26.1.1研究对象 369
26.1.2任务分析 370
26.1.3任务案例 370
26.1.4做回顾的方法 371
26.1.5有效性问题 371
26.2软件开发任务 372
26.3新手开发人员的优点和缺点 374
26.3.1优点分析 375
26.3.2缺点分析 375
26.4回顾 376
26.4.1管理层的介入 377
26.4.2毅力、疑惑和新人特质 377
26.4.3大型的软件团队环境 378
26.5妨碍学习的误解 378
26.6教育方法的反思 379
26.6.1结对编程 380
26.6.2合理的边际参与 380
26.6.3导师制 380
26.7改变的意义 381
26.7.1新人培训 381
26.7.2学校教育 382
26.8参考文献 383
第27章 挖掘你自己的证据 385
27.1对什么进行数据挖掘 385
27.2设计你的研究 386
27.3数据挖掘入门 387
27.3.1第一步:确定要用哪些数据 387
27.3.2第二步:获取数据 388
27.3.3第三步:数据转换(可选) 389
27.3.4第四步:提取数据 389
27.3.5第五步:解析bug报告 390
27.3.6第六步:关联数据 390
27.3.7第六步:找出漏掉的关联 391
27.3.8第七步:将bug对应到文件 391
27.4下面怎么办 392
27.5致谢 394
27.6参考文献 394
第28章 正当使用“复制粘贴”大法 396
28.1代码克隆的示例 396
28.2寻找软件中的克隆代码 398
28.3对代码克隆行为的调查 399
28.3.1分叉 400
28.3.2模板 401
28.3.3定制 402
28.4我们的研究 403
28.5总结 405
28.6参考文献 406
第29章 你的API有多好用 407
29.1为什么研究API的易用性很重要 407
29.2研究API易用性的首次尝试 409
29.2.1研究的设计 410
29.2.2第一次研究的结论摘要 411
29.3如果一开始你没有成功 412
29.3.1第二次研究的设计 412
29.3.2第二次研究的结论摘要 412
29.3.3认知维度 414
29.4使用不同的工作风格 418
29.5结论 421
29.6参考文献 422
第30章“10倍”意味着什么?编程生产力的差距测量 423
30.1软件开发中的个人效率的变化 423
30.1.1巨大的差距带来的负面影响 424
30.1.2什么造就了真正的“10倍程序员” 424
30.2测量程序员的个人生产力的问题 424
30.2.1生产力=每月产出的代码行数吗 424
30.2.2生产力=功能点吗 425
30.2.3复杂度呢 425
30.2.4到底有没有办法可以测量个人生产力 425
30.3软件开发中的团队生产力差距 426
30.4参考文献 427
撰稿人 429