描述
开 本: 32开纸 张: 字典纸包 装: 精装是否套装: 否国际标准书号ISBN: 9787302546283
“自从有了她,程序员就分两种……
一种是看过《代码大全2》的,一种是没有看过的。”
犹如蒙娜丽莎的微笑,本书从语言基础到创建高质量代码,到变量、语句、代码优化、系统考量和软件工艺,全方面涵盖关于软件构建的种种细节,细节是决定卓越与平庸的分水岭,不管是卢浮宫琥珀色的古老建筑与钻石般夺目的玻璃金字塔,还是卓有成效的程序员。
《代码大全 : 英文限量珍藏版》作为名家经典著作,是一本完整的软件构建手册,涵盖软件构建过程中的所有细节。它从软件质量和编程思想等方面论述软件构建的各个主题,并详细论述主流的新技术、高屋建瓴的观点和通用的概念,还含有丰富而典型的程序示例。本书所论述的技术不仅填补了初级与中高级编程技术之间的空白,同时还为程序员提供了一个有关编程技巧的信息来源。 《代码大全 : 英文限量珍藏版》对经验丰富的程序员、技术带头人、自学的程序员及几乎不懂太多编程技巧的学生大有帮助。无论是什么背景的读者,都可以通过以阅读和领会本书,在更短的时间内更轻松地写出更好、更简洁和更优雅的程序。
第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
软件工程实践与一般软件工程实践,两者的差异非常大,用“一个在天上,一个在地上”这样的比喻来形容,恐怕也不夸张,而且远远超过其他任何工程学科。从这一点看,用于传播优秀软件工程实践的工具,其重要性不言而喻。
——弗雷德·布鲁克斯
在写作本书的过程中,我主要考虑的是缩短同一个行业中两端的差距,一端是权威、专业人士,另一端是普通的商用实践人员。在如涓涓细流一般“浸润”并被普及成为业内知晓的通用实践之前,许多强大的编程技术其实早已经隐身于期刊杂志和学术论文中很多年。
在21 世纪的前十年,处于前沿的软件开发实践已经得到了突飞猛进的发展。然而,通用实践却一直裹足不前。Bug 随处可见,交付时间一拖再拖,超出预算,等等,这样的情形在很多软件项目中仍然屡见不鲜,甚至还有很多软件根本无法满足其用户的要求。来自软件行业和学术机构的研究人员发现,早在20 世纪70 年代,就有许多足以消除大多数编程难题的高效实践。然而,这些高效实践的报道并没有走出专业技术期刊的影响圈,以至于还有相当一部分软件组织在21 世纪的前十几年,仍然没有采用这些高效的编程实践。研究还发现,一项研究进展走向商用实践,一般需要5~10 年甚至更多的时间(Raghavan and Chand 1989, Rogers 1995, Parnas 1999)。这本书初的写作动机就是以高效的方式缩短这个过程,使这些关键的发现可以马上供大多数程序员采用。
哪些人适合阅读本书?
本书中包含的研究和编程轶事将帮助大家创建高质量的软件,更轻松、更快速地做好自己的工作。本书将帮助你洞若观火,看清楚过去存在的难题,从而知道未来如何避免。书中描述的编程实践将帮助你从容掌控大型项目,帮助你成功维护和修改软件,直到足以满足项目变更的需求。
有经验的程序员
作为一本内容全面和容易上手的软件开发实践指南,本书适合有经验的程序员阅读。本书聚焦于软件构建(软件生命周期内程序员熟悉的部分)因而本书的初衷是让自学的程序员以及受过正规训练的程序员能够透彻理解功能强大的软件开发技术。
技术带头人
许多技术带头人都用《代码大全2》来培训过团队中资历较浅的程序员。不过,也可以用本书来填补自己的知识空白。如果是有经验的程序员,也许不会完全认同书中得出的结论(如果会,我反而会觉得意外),但如果仔细阅读本书并认真思考每个难题后,你会发现自己从此以后可以从容解答别人提出的任何一个软件构建方面的难题了,因为这些问题你都认真思考过。
自学的程序员
如果没有接受过太多正规培训,那么这本书将会是你如影随形的良伴。每年有近5 万名新手进入软件开发行业(BLS 2004, Hecker 2004),但每年实际只有3.5 万人有软件相关的学位(NCES 2002)。根据这些数字,很快可以得出一个结论,有很多程序员都没有接受过正规的软件开发教育。在新兴的专业人士团体中——工程师、会计、科学家、教师和小企业主——出现了自学成才的程序员,编程是他们日常工作中的一部分,但他们并不认为自己就是程序员。无论受过什么程度的编程开发培训,本书都可以帮助你见微知著,洞悉高效的编程实践。
学生
前面提到经验丰富但缺乏正规专业教育的程序员,与其相对应的便是年轻的大学毕业生。作为职场新人,他们往往理论知识丰富,但缺乏构建软件产品的实际动手经验。那些实用的、关于好代码的学问和知识,通常传递得很慢,在软件架构师、项目主管、业务分析和资深程序员共同参与的形如宗教仪式的“舞蹈”中,真正传承下来的有用实践,可谓少之又少。留下来的往往都是个别程序员的试验品和错误。本书的目的是代替这些传统智慧盛宴的慢传递方式,通过精挑细选,将之前就有的技巧提示和有效的开发策略高度整合到一起。对学生而言,本书可以帮助他们从学术环境轻松迁移到专业开发环境。
还可以从哪些地方找到更多相关信息?
本书综合介绍大量软件构建技术,这些技术的来源很广泛。多年以来,除了广泛散落在很多地方以外,关于软件构建的大部分智慧结晶并没有作为书面参考被记录下来(Hildebrand 1989, McConnell 1997a)。其实呢,专业程序员用的那些高效、高能的编程技术并不神秘。只不过,在日复一日埋头于眼前项目的奔波和劳累中,真的几乎没有几个专家还能够有时间公开分享自己习得的经验和教训。于是呢,导致广大程序员很难找到一个好的资源集中介绍编程相关信息。
本书描述的编程技术正好可以填补入门级教科书和高级编程教科书之间的空白。在你读过Java 编程入门、高级Java 编程和高级高级Java 编程之后,你会读哪一本关于编程的书呢?你会读详细介绍英特尔或摩托罗拉硬件的书,介绍Windows 或Linux 操作系统功能以及其他编程语言的书,没有详细参考书的编程语言或程序,是不会有人用的。但是,本书是少数几本只讨论编程本身的书。有些总能让人受益匪浅的编程技术就是适用于任何环境或者语言的通用实践。对于这样的实践,别的书一般都略过不提,本书则不同,偏偏就要集中介绍这些通用实践。
本书可谓博采众长,选材来源广泛,如下图所示。要想获得本书包含的所有信息,另一个可取的方式是遍历浩如烟海的文字,在汗牛充栋的书山和几百册技术类期刊中寻宝,同时你本人还需要加持丰富的开发实践经验。如果这些都没问题,你仍然可以从本书中受益,因为它“海纳百川”,把所有精华汇聚于一处,非常方便你随时参考。
本书的关键收益
不管背景如何,本书都可以帮助你以更少的时间和更少的痛苦写出更好的程序。
一本完整的软件构建参考
本书讨论了软件构建的方方面面,比如软件质量和编程思维。它直击软件构建的真实细节,比如构建类的步骤,抽丝剥茧阐述数据和控制结构的使用、调试、重构和代码调优技术及策略等。对于这些主题,你不必按顺序从头读到尾。因为本书在设计的时候,已经优先考虑到要让大家更容易找到自己感兴趣的具体信息。
随时可用的核查清单
本书包含了二十多个核对清单,可以用来评估软件架构、设计方法、类& 例程的质量、变量名称、控制结构、代码版式和测试用例等。
时新的信息
本书描述当下前沿的技术,许多都还没有普及成为商业开发实践。本书的素材取自行业实践和研究机构,描述的很多开发技术在未来很多年都普遍适用。
从更广的视角来看待软件开发
通过本书,你将有机会隔岸观火,不再疲于奔命,而是冷静下来搞清楚哪些行得通,哪些行不通。实干派的程序员基本上没有时间读上几百本书籍和专业技术期刊上发表的文章(其中的精华都包含在本书中)。纳入本书的研究经验和开发经验将帮助你打开脑洞,启发你对项目的思考,让你能够选择策略性的行动,从而使自己不至于反反复复地掉入同样的坑中。
句句珠玑,全是干货
有些技术书籍华而不实,废话十之八九,仅有一两成的真知灼见。本书兼容并蓄,会讲到每种编程技术的利与弊。对于特定项目的具体要求,你显然比旁观者更为清楚。所以,为了帮助你在特定条件下做出更好的决策,本书提供了你需要掌握的客观信息。
可以应用于大多数常见编程语言的概念
本书描述的技术可以用于充分运用你所选择的编程语言,不管是C 、C#、Java 还是其他什么类似的语言。
大量代码范例
本书包含将近500 个代码范例,好的代码有,差的代码也有。之所以包含这么多代码范例,是因为我个人从这些代码范例中受益匪浅。推己及人,我希望其他程序员也能够从中收获良多。这些代码范例涉及多种编程语言,因为至少掌握两种语言通常是区分专业和非专业程序员的分水岭。作为一名程序员,一旦意识到编程准则超越于任何一种特定语言的语法,就意味着专业知识的殿堂已经向他敞开大门,质量和生产力从此以后将出现质的飞跃。为了尽可能减轻多种编程语言所带来的负担,我有意回避了只有真正内行才看得懂的语言特性(除非还有具体展开的讨论)。你不需要通过理解不同代码片段之间的每个细微差异来理解它们的意义。如果把注意力集中在要阐述的关键点上,你会发现自己完全能够读懂代码,不管它是用什么语言来写的。为了让你更容易理解,我特别针对代码范例中的重要部分增加了注释。
访问其他信息来源
本书收集了大部分以软件构建为主题的信息,但这还没完。每一章的“更多资源”小节还给出了其他书籍和文章,以方便你进一步了解自己感兴趣的主题。
为什么要写这本书
软件工程领域已经充分意识到,迫切需要一本全面包含高效开发实践的软件开发参考手册。
计算机科学与技术委员会有一份报告指出,软件开发质量和生产力要想取得的效益,只能来自于对现有高效软件工程实践相关知识进行编纂、分类并广泛传播(CSTB 1990, McConnell 1997a)。该委员会后得出一个结论:这些软件工程实践相关知识的传播策略要植根于“软件工程参考手册”这个基本概念。
软件构建是一个长期被忽略的主题
有那么一段时间,软件开发和写代码被混为一谈。但在软件开发周期中一些独特的活动被识别出来之后,圈子中有些思想领袖就开始花时间分析项目管理、需求、设计和测试,并掀起一场轰轰烈烈的方法论之争。对这些新领域进行研究的热潮,把原本一脉相承的代码构建冷落在一旁,就像它和软件开发没有什么关系一样。
对代码构建的讨论之所以冷门,还有一个原因。有人建议,如果把代码构建当作独立的软件开发活动,就意味着必须把它当作一个独立的阶段。实际上,软件活动和阶段真的没有必要有任何一一对应的特定关系,不管其他软件活动是以阶段、迭代还是别的什么方式来执行,都不影响我们对代码构建进行讨论,这样做才是“正确”的。
软件构建的重要性不可小觑
软件构建长期被研究人员和技术作家忽略的另一个原因是,他们错误地认为,相较于其他软件开发活动,代码构建是一个相对机械的过程,几乎没有任何改进的机会。然而,事实并非如此。
在小型项目中,代码构建的投入占比一般为65% 左右,中型项目为50%。对于错误,小型项目中代码构建所产生的占比75%,中型和大型项目则为50% ~ 75%。显然,错误占比为50% ~ 75% 的任何活动都有机会得以显著改进(第27 章包含更详细的统计数据和分析)。
有评论人士指出,尽管代码构建错误在总的错误中占比很高,但其修复成本低于需求和架构错误。言下之意,代码构建的重要性也就不该那么高。没错,构建错误的修复成本实际上并不高。但研究人员发现,一直以来,一些不起眼的代码错误却是终造成修复成本高达几亿美元的一些软件错误(Weinberg 1983, SEN 1990)。显然,修复成本不高,并不意味着它们就应该优先级低。
具有讽刺意味的是,软件构建之所以不受重视,另一个原因居然是它是软件生命周期中一个笃定要认真完成的活动。需求可以靠假设,用不着认真开发;架构可以打折扣,用不着认真设计;测试可以缩水或者略过不做,用不着做全盘计划和执行。但是,如果要开发一个程序,一定得好好构建代码,这样一来,构建便在改进开发实践中成为一个独特而富有成效的领域。
关于高效构建实践,还没有一本理想的同类书
软件构建的重要性既然那么明显,所以我理所当然地认为我在构思这本书的时候,肯定已经有别的人写过高效构建实践的书。
显然,业界需要一本介绍如何进行高效编程的书。但我发现,软件构建方面的书乏善可陈,而且都不全面。有些书写于20 世纪90 年代之前甚至更早,讲的是只有真正内行才看得懂的小众语言,比如ALGOL、PL/I、Ratfor 和Smalltalk。有些是压根儿没有写过产品代码的教授写的。教授们写的技术书适用于学生的项目,但对于这些技术在整个大规模软件开发环境中是否玩得转,他们并没有多少概念。还有一些书呢,则鼓吹作者爱的方法体系,完全忽略那些庞大的、经年累月沉淀下来的实践知识宝库。
结构与意义
当艺术家们扎堆儿的时候,
他们谈的是可以从哪里买到便宜的松脂油。
——巴勃罗• 毕加索
简而言之,从来没有任何一本书像本书一样,从专业经验、行业研究和学术成果中萃取出这样一套实用的编程技术体系,包含当前的编程语言、面向对象的编程语言以及前沿的开发实践。显然,以编程为主题的书需要由知晓理论发展水平的人来写,而不是真正动手写代码构建软件产品并以实践为乐的人来写。对于本书,我的设想是全面而完整地讨论如何构建代码,是一本由程序员写给程序员看的书。
作者说明
欢迎来信讨论本书讨论的任何一个主题,勘误建议和其他相关话题都可以。请通过电子邮件[email protected] 联系,或者访问网站www.stevemcconnell.com。
评论
还没有评论。