新書推薦:
《
与骸骨交谈:我希望每一个真相都被发现
》
售價:NT$
347.0
《
人体使用手册3:自愈力的逻辑(全面解读身体面对疾病时的反应逻辑,学习更多有效的系列家庭按摩)
》
售價:NT$
281.0
《
素描简史:从文艺复兴到现代艺术
》
售價:NT$
1989.0
《
智慧宫丛书028·神工智能 诸神与古代世界的神奇造物
》
售價:NT$
398.0
《
街头健身训练指南
》
售價:NT$
1214.0
《
留学早规划
》
售價:NT$
347.0
《
文化的演化:民众动机正在重塑世界
》
售價:NT$
403.0
《
布鲁克林有棵树(孩子喜欢的阅读经典读本 基于真实生活的全球经典成长小说 走出成长困境 追逐梦想 人生励志 自我塑造小说)
》
售價:NT$
347.0
|
編輯推薦: |
史蒂夫·麦康奈尔(Steve McConnell)的《代码大全》是全球公认的编程最佳实用指南,十多年来一直帮助开发人员写出更好的软件。这本经典书籍包含行之有效的实践和数百个范例代码,充分展现了软件构建的艺术和科学。史蒂夫对学术界和日常商业实践进行了广泛的研究,从中萃取出精华,通过通俗易懂的表达方式和体例,形成了一套行之有效的技术、原理和实践体系,旨在帮助广大程序员以最快的速度、更少的时间、更少的预算,来写出质量更高、更优美的代码。
作为一本综合性强和实用性高的经典参考书,本书适合任何一个程序员阅读,无论经验水平、开发环境或项目规模如何,都可以从中得到启发,构建出高质量的代码,真正做到代码完成的境界。
透过本书,发现经得起时间考验的技巧和策略,从而帮助读者:
& 实现大道至简和更有创新的设计
& 收获合作开发的好处
& 应用防御性编程技术来减少和清除错误
& 利用机会来以安全的方式重构或演化代码
& 使用适合具体项目的构建实践
& 快速有效地调试问题
& 尽早正确地解决关键的构建问题
& 质量内建贯穿于整个项目周期,无论开始、中间和结尾
压力大,
|
內容簡介: |
《代码大全2(纪念版)》作为名家经典著作,是一本完整的软件构建手册,涵盖软件构建过程中的所有细节。它从软件质量和编程思想等方面论述软件构建的各个主题,并详细论述主流的新技术、高屋建瓴的观点和通用的概念,还含有丰富而典型的程序示例。本书所论述的技术不仅填补了初级与中高级编程技术之间的空白,同时还为程序员提供了一个有关编程技巧的信息来源。
《代码大全2(纪念版)》对经验丰富的程序员、技术带头人、自学的程序员及几乎不懂太多编程技巧的学生大有帮助。无论是什么背景的读者,都可以通过阅读和领会本书,在更短的时间内更轻松地写出更好、更简洁和更优雅的程序。
进度失控,几乎是每一个软件开发项目挥之不去的噩梦。如何从容赶急,如何通过正确的开发策略和原则,避免典型错误,有效地进行风险管理,从多个方面贯彻执行快速软件开发,都可以从本书中找到答案。《快速开发(纪念版)》借助于实际案例和数据,阐述了快速软件开发方法的要领和精髓。
《快速开发(纪念版)》前两部分描述快速开发的策略和理念,其中的案例讨论有助于读者清楚地领略到策略和理念在实践中的作用。第Ⅲ部分则由27个快速开发实践构成,对于技术领导、程序员和项目经理具有重要的参考和指导意义。
《软件估算的艺术》介绍了如何估算项目进度和成本以及在给定时间框架内可以交付的功能,讲解了如何避免常见的软件估算错误,个人、团队和组织如何估算,介绍了项目中的特定活动,包括开发、管理和缺陷修复等。《软件估算的艺术》共23章,不仅包含严谨的建模技术,还呈现了大量真实的、来自软件行业的实践经验。
作为影响力大的专业估算指南,《软件估算的艺术》为现实世界中的软件项目开发成本估算提供了经济实用的建议,尤其适合软件行业的技术人员和技术管理人员参考与阅读。
|
關於作者: |
史蒂夫·麦康奈尔(Steve McConnell)
屡获殊荣的科技类畅销书作家,他的两部作品《代码大全》和《快速软件开发》被《软件开发》杂志授予卓越产品震撼大奖,他的书被翻译成30种语言,在全球范围内销量超过一百万册。
史蒂夫热衷于通过提高个人和团队的技能来提高软件组织的绩效。他是Construx Software公司的创始人兼首席执行官,该公司提供培训、咨询、辅导和免费资源,专注于更有效的软件开发实践。
译者简介
杨志昂,Doris,男生名女生的命,理工脑文艺心,当过程序媛,做过管理者,时而理性,时而感性,可严密论证,可天马行空,个性既矛盾又综合。好学好问,门门懂样样求精的“万精油”型人才。翻译作品有《同理心:沟通、协作与创造力的奥秘》、《代码大全2》(纪念版)与《向上一步:精益敏捷中的增长思维与实践》。
|
目錄:
|
代码大全2(纪念版)
简 明 目 录
第Ⅰ部分 奠定基础
第1 章 欢迎来到软件构建的世界 003
第2 章 通过隐喻更充分地理解软件开发 009
第3 章 谋定而后动:前期准备 023
第4 章 关键的构建决策 057
第II 部分 高质量的代码
第5 章 软件构建的设计 069
第6 章 可以工作的类 121
第7 章 高质量的子程序 157
第8 章 防御式编程 187
第9 章 伪代码编程过程 215
第Ⅲ部分 变量
第10 章 变量使用中的常规问题 239
第11 章 变量名称的威力 263
第12 章 基本数据类型 295
第13 章 不常见的数据类型 323
第Ⅳ部分 语句
第14 章 直线型代码的组织 353
第15 章 使用条件语句 361
第16 章 控制循环 373
第17 章 不常见的控制结构 395
第18 章 表驱动法 417
第19 章 常规控制问题 437
第Ⅴ部分 代码改进
第20 章 软件质量概述 469
第21 章 协同构建 483
第22 章 开发人员测试 503
第23 章 调试 541
第24 章 重构 569
第25 章 代码调优策略 591
第26 章 代码调优技术 613
第Ⅵ部分 系统化考虑
第27 章 程序规模对构建的影响 651
第28 章 管理构建 663
第29 章 集成 693
第30 章 编程工具 715
第Ⅶ部分 软件匠艺
第31 章 代码的布局和风格 733
第32 章 自文档代码 781
第33 章 个人性格 821
第34 章 关于软件匠艺 837
第35 章 更多信息来源 853
快速开发(纪念版)
第I 部分 有效开发
第1 章 欢迎学习快速开发 3
1.1 什么是快速开发 3
1.2 实现快速开发 4
第2 章 快速开发策略 7
2.1 快速开发的总体策略 10
2.2 开发速度的四个维度 13
2.2.1 人员 14
2.2.2 过程 16
2.2.3 产品 18
2.2.4 技术 19
2.2.5 协同 20
2.3 快速开发的一般分类 20
2.3.1 有效开发 20
2.3.2 侧重于最佳进度的有效开发 22
2.3.3 全面快速开发 22
2.4 哪一个维度更重要 23
2.5 快速开发的权衡策略 24
深入阅读 29
第3 章 典型错误 31
3.1 典型错误案例研究 31
3.2 错误对开发进度的影响 38
3.3 典型错误一览 40
3.3.1 人员 41
3.3.2 过程 45
3.3.3 产品 48
3.3.4 技术 49
3.4 逃离吉利根岛 50
第4 章 软件开发的基本原则 52
4.1 管理原则 56
4.1.1 项目估算和进程安排 56
4.1.2 计划编制 56
4.1.3 跟踪 57
4.1.4 度量 58
深入阅读 59
4.2 技术的基本原则 60
4.2.1 需求管理 62
4.2.2 设计 63
4.2.3 构建 64
4.2.4 软件配置管理 65
深入阅读 66
4.3 质量保证的基本原则 68
4.3.1 易错模块 71
4.3.2 测试 72
4.3.3 技术审查 72
深入阅读 74
4.4 按照指导来做 76
深入阅读 77
第5 章 风险管理 78
5.1 风险管理要素 81
5.1.1 风险评估 82
5.1.2 风险控制 82
5.2 风险识别 82
5.2.1 最常见的进度计划风险 83
5.2.2 进度计划风险的完整列表 83
5.3 风险分析 87
5.3.1 风险暴露量 87
5.3.2 估计损失的大小 88
5.3.3 评估损失发生的概率 89
5.3.4 整个项目的延期和缓冲 89
5.4 风险优先级 90
5.5 风险控制 91
5.5.1 风险管理计划 92
5.5.2 风险化解 92
5.5.3 风险监控 95
5.6 风险、高风险和冒险 97
深入阅读 100
第Ⅱ部分 快速开发
第6 章 快速开发中的核心问题 103
6.1 一个标准是否适合所有情况 103
6.2 你需要什么样的开发方法 105
6.2.1 进度计划有严格限制的产品 105
6.2.2 表面上的快速开发 106
6.2.3 你是否真正需要全力开发 109
6.3 按时完成的可能性 110
6.4 感知与现实 113
6.4.1 不切实际的用户期望 114
6.4.2 克服慢速开发的感觉 115
6.5 时间都去哪儿了 115
6.5.1 典型的观点 115
6.5.2 可以改进的问题 116
6.6 开发速度的平衡 119
6.6.1 进度、费用和产品的平衡 119
6.6.2 质量的权衡 120
6.6.3 个人效率的权衡 121
6.7 典型的进度改进模式 121
6.8 向快速开发前进 123
深入阅读 124
第7 章 生命周期计划 125
7.1 纯瀑布模型 128
7.2 编码修正模型 131
7.3 螺旋模型 132
7.4 经过修改的瀑布模型 134
7.4.1 生鱼片模型 135
7.4.2 具有子项目的瀑布模型 136
7.4.3 能够降低风险的瀑布模型 137
7.5 渐进原型 138
7.6 阶段性交付 139
7.7 面向进度的设计 140
7.8 渐进交付 141
7.9 面向开发工具的设计 142
7.10 商品软件 144
7.11 为项目选择最快速的生命周期 144
深入阅读 150
第8 章 估算 152
8.1 软件估算的故事 154
8.1.1 软件和建筑 154
8.1.2 软件开发是一个改进的过程 155
8.1.3 可能细化的数量 156
8.1.4 估算与控制 158
8.1.5 合作 159
8.1.6 估算实例概要 161
8.2 估算步骤概述 162
8.3 规模估算 162
8.3.1 功能点估算 163
8.3.2 估算技巧 165
8.3.3 估算的表达方式 167
8.4 工作量估算 170
8.5 进度估算 170
8.5.1 基于承诺的进度安排 171
8.5.2 一阶估算实践 172
8.6 大致的进度估算 173
8.6.1 背景 173
8.6.2 可能的最短进度 175
8.6.3 有效进度 180
8.6.4 普通进度 182
8.6.5 对大致的进度首先应怎么办 184
8.7 估算修正 184
深入阅读 189
第9 章 进度计划 191
9.1 过分乐观的进度计划 192
9.1.1 一个关于过分乐观的进度计划的实例 193
9.1.2 产生过分乐观的进度计划的根源 195
9.1.3 过分乐观的进度计划产生的不良后果 196
9.1.4 超负荷的进度压力 200
9.1.5 底线 203
9.2 战胜进度压力 205
9.2.1 原则谈判法 206
9.2.2 将人和问题分开 207
9.2.3 关注于共同利益,不要过分坚持立场 208
9.2.4 提出对双方均有利的备选方案 209
9.2.5 坚持客观标准 211
深入阅读 215
第10 章 面向客户的开发 217
10.1 客户对于快速开发的重要性 220
10.1.1 提高效率 220
10.1.2 减少返工 221
10.1.3 降低风险 221
10.1.4 消除矛盾 221
10.2 面向客户的开发方法 222
10.2.1 规划 222
10.2.2 需求分析 223
10.2.3 设计 225
10.2.4 实现 226
10.3 合理控制客户的期望值 226
深入阅读 230
第11 章 激励机制 231
11.1 开发人员的典型激励 233
11.2 最重要的5 个激励因素 236
11.2.1 成就感 236
11.2.2 发展机遇 238
11.2.3 工作乐趣 239
11.2.4 个人生活 241
11.2.5 成为技术主管的机会 241
11.3 利用其他激励因素 242
11.3.1 奖赏和鼓励 242
11.3.2 试验性项目 244
11.3.3 对业绩的评价 245
11.4 士气杀手 245
11.4.1 保健因素 246
11.4.2 其他士气杀手 247
深入阅读 252
第12 章 团队合作 254
12.1 软件项目中的团队合作 256
12.2 团队合作对快速开发的重要性 257
12.2.1 团队生产率的变化 257
12.2.2 凝聚力和业绩 258
12.3 创建高绩效团队 259
12.3.1 共同的、可提升的愿景或目标 260
12.3.2 团队成员的认同感 261
12.3.3 结果驱动的结构 262
12.3.4 胜任的团队成员 263
12.3.5 对团队的承诺 265
12.3.6 相互信任 265
12.3.7 团队成员间相互依赖 266
12.3.8 有效的沟通 266
12.3.9 自主意识 267
12.3.10 授权意识 267
12.3.11 团队规模较小 268
12.3.12 高层次的乐趣 268
12.3.13 如何管理高绩效团队 268
12.4 团队为什么会失败 269
12.5 长期的团队建设 273
12.6 团队合作指导方针总结 274
深入阅读 275
第13 章 团队结构 277
13.1 团队结构应该考虑的因素 279
13.1.1 团队的种类 280
13.1.2 其他团队设计特征 281
13.1.3 何种类型的团队最适用于快速开发 282
13.2 团队模式 283
13.2.1 业务团队 284
13.2.2 主程序员团队 284
13.2.3 科研项目团队 286
13.2.4 特征团队 286
13.2.5 搜索救援团队 287
13.2.6 SWAT 团队 287
13.2.7 专业运动员团队 288
13.2.8 戏剧团队 289
13.2.9 大型团队 291
13.3 管理者和技术主管 292
深入阅读 295
第14 章 功能限定 297
14.1 项目早期:功能的简化 299
14.1.1 规格说明最小化 299
14.1.2 需求筛选 306
14.1.3 版本化开发 307
14.2 项目中期:功能蔓延的控制 308
14.2.1 变更的根源 308
14.2.2 变更的影响 312
14.2.3 完全停止变更的智慧 313
14.2.4 变更控制的方法 314
14.3 项目后期:功能剪切 318
深入阅读 320
第15 章 生产率工具 321
15.1 快速开发中生产率工具的作用 324
15.1.1 特定应用领域 325
15.1.2 生产率工具的局限性 326
15.1.3 快速开发项目中生产率工具的终极作用 327
15.2 生产率工具的战略 328
15.3 生产率工具的获取 329
15.3.1 获取计划 330
15.3.2 遴选标准 331
15.3.3 承诺 334
15.4 生产率工具的使用 334
15.4.1 何时使用 334
15.4.2 培训的重要性 335
15.4.3 进度缩减的期望值 336
15.5 银弹综合征 339
15.5.1 识别银弹 341
15.5.2 忍辱负重 343
深入阅读 345
第16 章 项目修复 347
16.1 一般的修复方案 349
16.2 修复计划 351
16.2.1 第一步 351
16.2.2 人员 352
16.2.3 过程 355
16.2.4 产品 358
16.2.5 找准时机 361
深入阅读 364
第Ⅲ部分 最佳实践
第17 章 变更委员会 380
第18 章 每日构建和冒烟测试 381
18.1 使用每日构建和冒烟测试 383
18.2 管理每日构建和冒烟测试中的风险 388
18.3 每日构建和冒烟测试的附带效果 389
18.4 每日构建和冒烟测试与其他实践的相互关系 389
18.5 每日构建和冒烟测试的底线 390
18.6 成功使用每日构建和冒烟测试的关键 390
深入阅读 390
第19 章 变更设计 391
19.1 使用面向变更的设计 392
19.2 管理变更设计带来的风险 397
19.3 变更设计的附带效果 398
19.4 变更设计与其他实践的相互关系 398
19.5 变更设计的底线 398
19.6 成功使用变更设计的关键 398
深入阅读 399
第20 章 渐进交付 400
20.1 使用渐进交付 402
20.2 管理渐进交付中的风险 404
20.3 渐进交付的附带效果 405
20.4 渐进交付与其他实践的相互关系 406
20.5 渐进交付的底线 406
20.6 成功使用渐进交付的关键 406
深入阅读 407
第21 章 渐进原型 408
21.1 使用渐进原型 409
21.2 管理渐进原型中的风险 410
21.3 渐进原型的附带效果 415
21.4 渐进原型与其他实践的相互关系 415
21.5 渐进原型的底线 416
21.6 成功使用渐进原型的关键 416
深入阅读 417
第22 章 目标设定 418
第23 章 检查 419
第24 章 联合应用程序开发 420
24.1 使用JAD 421
24.2 管理JAD 中的风险 430
24.3 JAD 的附带效果 431
24.4 JAD 与其他实践的相互关系 431
24.5 JAD 方法的底线 432
24.6 成功使用JAD 的关键 432
深入阅读 433
第25 章 生命周期模型的选择 434
第26 章 度量 435
26.1 使用度量 436
26.2 管理度量中的风险 444
26.3 度量的附带效果 445
26.4 度量与其他实践的相互关系 445
26.5 度量的底线 445
26.6 成功使用度量的关键 446
深入阅读 446
第27 章 小型里程碑 448
27.1 使用小型里程碑 451
27.2 管理小型里程碑中的风险 454
27.3 小型里程碑的附带效果 454
27.4 小型里程碑与其他实践的相互关系 455
27.5 小型里程碑的底线 455
27.6 成功使用小型里程碑的关键 456
深入阅读 456
第28 章 外包 457
28.1 使用外包 458
28.2 管理外包中的风险 464
28.3 外包的附带效果 466
28.4 外包与其他实践的相互关系 466
28.5 外包的底线 466
28.6 成功使用外包的关键 467
深入阅读 467
第29 章 原则谈判法 468
第30 章 高效开发环境 469
30.1 使用高效开发环境 471
30.2 管理高效开发环境中的风险 473
30.3 高效开发环境的附带效果 474
30.4 高效开发环境与其他实践的相互关系 475
30.5 高效开发环境的底线 475
30.6 成功使用高效开发环境的关键 476
深入阅读 476
第31 章 快速开发语言 477
31.1 使用快速开发语言 481
31.2 管理快速开发语言中的风险 481
31.3 快速开发语言的附带效果 483
31.4 快速开发语言与其他实践的相互关系 483
31.5 快速开发语言的底线 484
31.6 成功使用快速开发语言的关键 484
深入阅读 485
第32 章 需求提炼 486
第33 章 重用 487
33.1 使用重用 488
33.2 管理重用中的风险 495
33.3 重用的附带效果 496
33.4 重用与其他实践的相互关系 497
33.5 重用的底线 497
33.6 成功使用重用的关键 498
深入阅读 498
第34 章 签约 499
34.1 使用签约 500
34.2 管理签约中的风险 503
34.3 签约的附带效果 505
34.4 签约与其他实践的相互关系 505
34.5 签约的底线 505
34.6 成功使用签约的关键 505
深入阅读 506
第35 章 螺旋型生命周期模型 507
第36 章 阶段性交付 508
36.1 使用阶段性交付 511
36.2 管理阶段性交付中的风险 514
36.3 阶段性交付的附带效果 515
36.4 阶段性交付与其他实践的相互关系 516
36.5 阶段性交付的底线 517
36.6 成功使用阶段性交付的关键 517
深入阅读 517
第37 章 W 理论管理 518
37.1 使用W 理论管理 520
37.2 管理W 理论管理中的风险 525
37.3 W 理论管理的附带效果 526
37.4 W 理论管理与其他实践的相互关系 526
37.5 W 理论管理的底线 527
37.6 成功使用W 理论管理的关键 527
深入阅读 527
第38 章 舍弃型原型法 528
38.1 使用舍弃型原型法 529
38.2 管理舍弃型原型法中的风险 530
38.3 舍弃型原型法的附带效果 531
38.4 舍弃型原型法与其他实践的相互关系 531
38.5 舍弃型原型法的底线 531
38.6 成功使用舍弃型原型法的关键 532
深入阅读 532
第39 章 限时开发 533
39.1 使用限时开发 535
39.2 管理限时开发中的风险 538
39.3 限时开发的附带效果 539
39.4 限时开发与其他实践的相互关系 539
39.5 限时开发的底线 540
39.6 成功使用限时开发的关键 540
深入阅读 540
第40 章 工具组 541
第41 章 前十大风险清单 542
第42 章 构建用户界面原型 543
42.1 使用用户界面原型 545
42.2 管理用户界面原型中的风险 548
42.3 用户界面原型的附带效果 549
42.4 用户界面原型与其他实践的相互关系 549
42.5 用户界面原型的底线 550
42.6 成功使用用户界面原型的关键 550
深入阅读 550
第43 章 自愿加班 551
43.1 使用自愿加班 552
43.2 管理自愿加班中的风险 557
43.3 自愿加班的附带效果 558
43.4 自愿加班与其他实践的相互关系 558
43.5 自愿加班的底线 558
43.6 成功使用自愿加班的关键 559
深入阅读 559
参考文献 561
软件估算的艺术
目 录
第I部分 估算的关键概念
第1章 什么是估算 3
1.1 估算、目标和承诺 3
1.2 估算与计划的关系 4
1.3 关于估算、目标和承诺的沟通 5
1.4 用概率表述估算 6
1.5 “好的”估算的常见定义 9
1.6 估算和项目控制 12
1.7 估算的真正目的 13
1.8 “好估算”的有效定义 14
更多资源 15
第2章 你的估算能力如何 17
2.1 一个简单的估算测试 17
2.2 探讨测试结果 18
第3章 准确估算的价值 23
3.1 高估和低估,哪个更好? 23
3.2 软件行业中一些估算的跟踪记录 27
3.3 准确估算的益处 30
3.4 相较于其他期望的项目属性,可预测性的价值 31
3.5 常见估算技术的问题 33
更多资源 34
第4章 估算错误从何而来 35
4.1 估算中不确定性的来源 36
4.2 不确定性锥形 37
4.3 混乱的开发过程 43
4.4 不稳定的需求 44
4.5 被遗漏的活动 45
4.6 盲目乐观 48
4.7 主观性和偏见 49
4.8 即兴估算 51
4.9 不适当的数值精度 53
4.10 其他错误来源 54
更多资源 55
第5章 影响估算的因素 57
5.1 项目规模 57
5.2 正在开发的软件类型 64
5.3 人员因素 65
5.4 编程语言 66
5.5 其他影响项目的因素 67
5.6 再论规模不经济效应 72
更多资源 74
第II部分 基本估算技术
第6章 估算技术介绍 79
6.1 选择估算技术时的考虑因素 79
6.2 技术适用性列表 82
第7章 计数,计算,判断 85
7.1 首先计数 86
7.2 计数对象 87
7.3 使用计算将计数结果转换为估算 88
7.4 判断只能作为最后的手段 90
更多资源 91
第8章 校准与历史数据 93
8.1 历史数据的益处:提高准确性以及其他 94
8.2 需要收集的数据 97
8.3 如何校准 100
8.4 使用项目数据改进估算 101
8.5 用行业平均数据进行校准 102
8.6 小结 104
更多资源 104
第9章 个体专家判断 105
9.1 结构化专家判断 106
9.2 将估算与实际进行比较 110
更多资源 112
第10章 分解与重组 113
10.1 准确计算总体期望情况 113
10.2 基于活动的项目工作分解结构进行分解 117
10.3 直接合计最佳情况和最差情况估算的危害 118
10.4 创建有意义的总体最佳和最差情况估算 121
更多资源 126
第11章 类比估算 127
11.1 类比估算的基本方法 128
11.2 关于Triad估算中不确定性的评论 132
第12章 基于代理的估算 135
12.1 模糊逻辑 136
12.2 标准组件 138
12.3 故事点 141
12.4 T恤尺码 145
12.5 基于代理的技术的其他使用 147
12.6 更多资源 147
第13章 群体专家判断 149
13.1 团队评审 149
13.2 宽带德尔菲法技术 150
更多资源 155
第14章 软件估算工具 157
14.1 手工无法完成只能依赖于工具的事情 157
14.2 校准这些工具所需要的数据 162
14.3 无论用不用工具都应该做的事 162
14.4 可用工具总结 162
更多资源 163
第15章 多种方法的综合运用 165
更多资源 169
第16章 一个估算得当的项目的软件 估算流程 171
16.1 估算不当的项目的单次估算流程 171
16.2 良好估算的项目的单次估算流程 172
16.3 随时间推移整个项目的估算流程 173
16.4 估算改进 175
16.5 如何向其他项目干系人展示重估的结果 176
16.6 估算良好的项目的示例 178
第17章 标准化的估算流程 181
17.1 标准化流程的一般要素 181
17.2 在阶段-关卡流程中嵌入估算活动 182
17.3 串行项目的标准化估算流程示例 184
17.4 迭代项目的标准化估算流程示例 187
17.5 来自先进组织的标准化估算流程示例 189
17.6 改进标准化流程 191
更多资源 191
第III部分 估算所面临的具体挑战
第18章 估算项目规模的具体 问题 195
18.1 估算规模的挑战 195
18.2 功能点估算 198
18.3 简化的功能点技术 201
18.4 估算规模的技术总结 203
更多资源 204
第19章 估算工作量的具体问题 205
19.1 影响工作量的因素 205
19.2 根据规模计算工作量 207
19.3 利用估算科学计算工作量估算 208
19.4 行业平均工作量图 209
19.5 ISBSG方法 214
19.6 比较工作量估算结果 216
更多资源 217
第20章 估算进度的具体问题 219
20.1 时间进度基本方程 220
20.2 通过与过去项目的非正式比较来计算进度 221
20.3 琼斯的一阶估算实践 222
20.4 利用估算科学计算进度 估算 223
20.5 进度压缩和尽可能短的 进度 224
20.6 进度和工作量之间的 权衡 227
20.7 进度估算和人员配置 限制 228
20.8 不同进度估算方法的结果比较 229
更多资源 231
第21章 估算项目规划参数 233
21.1 估算项目中的活动分解 233
21.2 估算不同活动的进度 238
21.3 将估算工作量(理想工作量)转为规划工作量 240
21.4 成本估算 241
21.5 估算软件缺陷的产生和消除 242
21.6 估算风险和应急缓冲 245
21.7 其他经验法则 247
更多资源 247
第22章 估算的展示风格 249
22.1 沟通估算假设 249
22.2 表达不确定性 250
22.3 使用范围(任何类型) 256
更多资源 257
第23章 政治、谈判和解决问题 259
23.1 高管的特性 259
23.2 对估算的政治影响 260
23.3 问题的解决和原则谈判方法 263
更多资源 270
附录A 估算完整性检查 271
附录B 第2章小测验的答案 273
附录C 软件估算技巧 275
|
內容試閱:
|
代码大全2(纪念版)
前言
“最佳软件工程实践与一般软件工程实践,两者的差异非常大,用‘一个在天上,一个在地上’这样的比喻来形容,恐怕也不夸张,而且远远超过其他任何工程学科。从这一点来看,用于传播优秀软件工程实践的工具,其重要性不言而喻。”
—布鲁克斯
前 言
在写作本书的过程中,我主要考虑的是缩短同一个行业中两端的差距,一端是权威、专业人士,另一端是普通的商用实践人员。在如涓涓细流一般“浸润”并被普及成为业内知晓的通用实践之前,许多强大的编程技术其实早已经隐身于期刊杂志和学术论文中很多年。
在二十一世纪的前十年,处于前沿的软件开发实践已经得到了突飞猛进的发展。然而,通用实践却一直裹足不前。bug 随处可见,交付时间一拖再拖,超出预算,等等,这样的情形在很多软件项目中仍然屡见不鲜,甚至还有很多软件根本无法满足其用户的要求。来自软件行业和学术机构的研究人员发现,早在二十世纪七十年代,就有许多足以消除大多数编程难题的高效实践。然而,这些高效实践的报道并没有走出专业技术期刊的影响圈,以至于还有相当一部分软件组织在二十一世纪的前十几年,仍然没有采用这些高效的编程实践。研究还发现,一项研究进展走向商用实践,一般需要五到十年甚至更多的时间(Raghavan and Chand 1989, Rogers 1995, Parnas 1999)。这本书最初的写作动机就是以高效的方式缩短这个过程,使这些关键的发现可以马上供大多数程序员采用。
哪些人适合阅读本书
本书中包含的研究和编程逸事将帮助大家创建高质量的软件,更轻松、更快速地做好自己的工作。本书将帮助你看清楚过去存在的难题,从而知道未来如何避免。书中描述的编程实践将帮助你从容掌控大型项目,帮助你成功维护和修改软件,直到满足项目变更的需求。
? 有经验的程序员 作为一本内容全面和容易上手的软件开发实践指南,本书适合有经验的程序员阅读。本书聚焦于软件构建( 软件生命周期内程序员最熟悉的部分),初衷是让自学成才的程序员以及受过正规训练的程序员能够透彻理解功能强大的软件开发技术。
? 技术带头人 许多技术带头人都用《代码大全2》来培训过团队中资历较浅的程序员。不过,那么也可以用本书来填补自己的知识空白。如果是有经验的程序员,也许不会完全认同书中得出的结论,但如果仔细阅读本书并认真思考每个难题后,那么你会发现自己从此以后可以从容解答别人提出的任何一个软件构建方面的难题了,因为这些问题你都认真思考过。
? 自学的程序员 如果没有接受过太多正规培训,那么这本书将会是你如影随形的良伴。每年有近5 万名新手进入软件开发行业(BLS 2004, Hecker 2004),但每年实际只有3.5 万人有软件相关的学位(NCES 2002)。* 根据这些数字,很快可以得出一个结论,有很多程序员都没有接受过正规的软件开发教育。在由工程师、会计、科学家、教师和小企业主组成的新兴专业人士团体中,出现了自学成才的程序员,编程是他们日常工作中的一部分,但他们并不认为自己就是程序员。无论受过什么程度的编程开发培训,本书都可以帮助你见微知著,洞悉高效的编程实践。
? 学生 前面提到经验丰富但缺乏正规专业教育的程序员,与其相对应的便是年轻的学生。作为职场新人,他们往往理论知识丰富,但缺乏构建软件产品的实际动手经验。那些实用的、关于好代码的学问和知识,通常传递得很慢,在软件架构师、项目主管、业务分析和资深程序员共同参与的形如宗教仪式的“舞蹈”中,真正传承下来的有用实践,可谓少之又少。留下来的往往都是个别程序员的试验品和错误。本书的目的是代替这些传统智慧盛宴的慢传递方式,通过精挑细选,将之前就有的技巧提示和有效的开发策略高度整合到一起。对学生而言,本书可以帮助他们从学术环境轻松迁移到专业开发环境。
还可以从哪些地方找到更多相关信息
本书综合介绍大量软件构建技术,这些技术的来源很广泛。多年以来,除了广泛散落在很多地方以外,关于软件构建的大部分智慧结晶并没有作为书面参考被记录下来(Hildebrand 1989, McConnell 1997a)。
译注
这里想谈一下Github 的情况。Github 在2021 年11 月公布的Octoverse报告中指出,Github 开发者数量目前已达到7300 万,其中美国开发者人数约1355 万,中国有755 万。总体而言,2021 年比前一年新增了21.3 万名首次开源项目贡献者。到2025 年,用户数量预计会达到1亿。
其实呢,专业程序员用的那些高效、高能的编程技术并不神秘。只不过,在日复一日埋头于眼前项目的奔波和劳累中,真的几乎没有几个专家还能够有时间公开分享自己的经验和教训,导致广大程序员很难找到一个好的资源集中介绍编程相关信息。
本书描述的编程技术正好可以填补入门级教科书和高级编程教科书之间的空白。在读过Java 编程入门、中高级Java 编程和高级Java 编程之后,你会读哪一本关于编程的书呢?你会读详细介绍英特尔或摩托罗拉硬件的书,介绍Windows 或Linux 操作系统功能以及其他编程语言的书,那些没有详细参考书的编程语言或程序,是没有人会用的。但是,本书是少数几本只专注于讨论编程的书。有些总能让人受益匪浅的编程技术就是适用于任何环境或者语言的通用实践。对于这样的实践,其他的书一般都略过不提,本书则不同,偏偏就要集中介绍这些通用实践。
本书可谓博采众长,选材来源广泛,如下图所示。要想获得本书包含的所有信息,另一个唯一可取的方式是遍历浩如烟海的文字,在汗牛充栋的书山和几百册技术类期刊中寻宝,同时你本人还需要加持丰富的开发实践经验。如果这些都没问题,你仍然可以从本书中受益,因为它“海纳百川”,把所有精华汇聚于一处,非常方便你随时参考。
专业经验
介绍编程
语言的书
其他介绍
软件的书
杂志上
发表的文章
软件构建
技术参考
本书的关键收益
不管背景如何,本书都可以帮助你以更少的时间和更少的痛苦写出更好的程序。
? 一本完整的软件构建参考 本书讨论了软件构建的方方面面,比如软件质量和编程思维。它直击软件构建的真实细节,比如构建类的步骤,抽丝剥茧,阐述数据和控制结构的使用、调试、重构和代码调优技术及策略等。对于这些主题,不必按顺序从头读到尾。因为本书在设计的时候,已经优先考虑到要让大家更容易找到自己感兴趣的具体信息。
? 随时可用的检查清单 全书包含35 个检查清单,可以用来评估软件架构、设计方法、类和子程序的质量、变量名称、控制结构、代码布局和测试用例等。
? 时新的信息 本书描述前沿技术,许多技术都还没有普及成为商业开发实践。本书的素材取自行业实践和研究机构,描述的很多开发技术在未来很多年都普遍适用。
? 从更广的视角来看待软件开发 通过本书,你将有机会以参观者的角度,不再疲于奔命,而是冷静下来搞清楚哪些行得通,哪些行不通。实干派的程序员基本上没有时间读上几百本书籍和专业技术期刊上发表的文章( 其中的精华都包含在本书中)。
纳入本书的研究经验和开发经验将帮助你展开想象,启发你对项目的思考,让你能够选择策略性的行动,从而使自己不至于反反复复地掉入同样的坑中。
? 字字珠玑,全是干货 有些技术书籍华而不实,废话十之八九,仅有一两成的真知灼见。本书兼容并蓄,会讲到每种编程技术的利与弊。对于特定项目的具体要求,你显然比旁观者
更为清楚。所以,为了帮助你在特定条件下作出更好的决策,本书提供了你需要掌握的客观信息。
? 可以应用于大多数常见编程语言的概念 本书描述的技术可以充分用于你所选择的编程语言,不管是C 语言、C# 语言、Java 语言还是其他语言。
? 大量代码示例 本书包含将近500 个代码示例,好代码有,烂代码也有。之所以包含这么多代码示例,是因为我个人从这些代码示例中受益匪浅。推己及人,我希望其他程序员也能够从中收获良多。这些代码范例涉及多种编程语言,因为至少掌握两种语言通常是区分专业程序员和非专业程序员的分水岭。作为一名程序员,一旦意识到编程准则超越于任何一种特定语言的语法,就意味着专业知识的殿堂已经向他敞开大门,质量和生产力从此以后将出现质的飞跃。为了尽可能减轻多种编程语言所带来的负担,我有意回避了只有真正内行才看得懂的语言特性( 除非还有具体展开的讨论)。你不需要通过理解不同代码片段之间的每个细微差异来理解它们的意义。如果把注意力集中在要阐述的关键点上,你会发现自己完全能够读懂代码,不管它是用什么语言来写的。为了让你更容易理解,我特别针对代码范例中的重要部分增加了注释。
? 访问其他信息来源 本书收集了大部分以软件构建为主题的信息,但这还没完。除第1 章外,各章的“更多资源”小节还给出了其他书籍和文章,以方便大家进一步了解最感兴趣的主题。
为什么要写这本书
软件工程领域已经充分意识到,迫切需要一本全面包含高效开发实践的软件开发参考手册。
计算机科学与技术委员会有一份报告指出,软件开发质量和生产力要想取得最大的效益,只能来自于对现有高效软件工程实践相关知识进行编纂、分类并广泛传播(CSTB 1990, McConnell 1997a)。该委员会最后得出一个结论:与这些软件工程实践相关的知识的传播策略要根植于“软件工程参考手册”这个基本概念。
? 软件构建是一个长期不受重视的主题 有那么一段时间,软件开发和写代码被混为一谈。但在软件开发周期中一些独特的活动被识别出来之后,圈子中有些思想领袖就开始花时间分析项目管理、需求、设计和测试,并掀起一场轰轰烈烈的方法论之争。对这些新领域进行研究的热潮,把原本一脉相承的代码构建冷落在一旁,就像它和软件开发没有什么关系一样。
对代码构建的讨论之所以冷门,还有一个原因。有人建议,如果把代码构建当作独立的软件开发活动,就意味着必须把它当作一个独立的阶段。实际上,软件活动和阶段真的没有必要有任何一一对应的特定关系,不管其他软件活动是以阶段、迭代还是其他方式来执行,都不影响我们对代码构建进行讨论,这样做才是“正确”的。
? 软件构建的重要性不可小觑 软件构建长期被研究人员和技术作家忽略的另一个原因是,他们错误地认为,相较于其他软件开发活动,代码构建是一个相对机械的过程,几乎没有任何改进的机会。然而,事实并非如此。
在小型项目中,代码构建的投入占比一般为65% 左右,中型项目为50%。对于错误,小型项目中代码构建所产生的占比为75%,中型和大型项目则为50% ~ 75%。显然,错误占比为50% ~ 75% 的任何活动都有机会得以显著改进( 第27 章包含更详细的统计数据和分析)。
有评论人士指出,尽管代码构建错误在总的错误中占比很高,但其修复成本低于需求和架构错误。言下之意,代码构建的重要性也就不该那么高。没错,构建错误的修复成本实际上并不高。但研究人员发现,一直以来,一些不起眼儿的代码错误却是最终造成修复成本高达几亿美元的一些软件错误(Weinberg 1983, SEN 1990)。显然,修复成本不高,并不意味着它们就应该优先级低。
具有讽刺意味的是,软件构建之所以不受重视,另一个原因居然是它是软件生命周期中唯一一个必须要认真完成的活动。需求可以靠假设,用不着认真开发;架构可以打折扣,用不着认真设计;测试可以缩水或者略过不做,用不着做全盘计划和执行。但是,如果要开发一个程序,那么一定得好好构建代码,这样一来,构建便在改进开发实践中成为一个独特而富有成效的领域。
关于高效构建实践,还没有一本理想的同类书。
软件构建的重要性既然那么明显,我便理所当然地认为我在构思这本书的时候,肯定已经有其他人写过高效构建实践的书。
显然,业界需要一本介绍如何进行高效编程的书。但我发现,软件构建方面的书乏善可陈,而且都不全面。有些书写于二十世纪九十年代之前甚至更早,讲的是只有真正内行才看得懂的小众语言,比如ALGOL、PL/I、Ratfor 和Smalltalk。有些是压根儿没有写过生产代码*
(译注:所谓生产代码,是指包含系统逻辑并在生产环境中运行的那部分代码。)的教授写的。教授们写的技术书适用于学生的项目,但对于这些技术在整个大规模软件开发环境中是否适用,他们并没有多少概念。还有一些书呢,则鼓吹作者最新最爱的方法体系,完全忽略那些庞大的、经年累月沉淀下来的实践知识宝库。
简而言之,从来没有一本书能够像本书一样,从专业经验、行业研究和学术成果中萃取出这样一套实用的编程技术体系,包含当前的编程语言、面向对象的编程语言以及前沿的开发实践。显然,以编程为主题的书需要由知晓最新理论发展水平的人来写,而不是真正动手写代码构建软件产品并以实践为乐的人来写。对于本书,我的设想是全面而完整地讨论如何构建代码,是一本由程序员写给程序员看的书。
作者说明
欢迎来信讨论本书讨论的任何一个主题,勘误建议和其他相关话题都可以。请通过电子邮件stevemcc@construx.com 联系,或者访问网站www.stevemcconnell.com。
史蒂夫·麦康奈尔(Steve McConnell)
2004 年阵亡将士纪念日
于华盛顿贝尔维尤
“当艺术评论家们聚在一起的时候,谈的都是形式啊,结构和意义什么的。当艺术家们聚在一起的时候,谈论的却是在哪里可以买到便宜的松脂油。”
—毕加索
|
|