《代码大全 : 英文限量珍藏版》作为名家经典著作,是一本完整的软件构建手册,涵盖软件构建过程中的所有细节。它从软件质量和编程思想等方面论述软件构建的各个主题,并详细论述主流的新技术、高屋建瓴的观点和通用的概念,还含有丰富而典型的程序示例。本书所论述的技术不仅填补了初级与中高级编程技术之间的空白,同时还为程序员提供了一个有关编程技巧的信息来源。
《代码大全 : 英文限量珍藏版》对经验丰富的程序员、技术带头人、自学的程序员及几乎不懂太多编程技巧的学生大有帮助。无论是什么背景的读者,都可以通过以阅读和领会本书,在更短的时间内更轻松地写出更好、更简洁和更优雅的程序。
史蒂夫·麦康奈尔 (Steve McConnell)
与比尔·盖茨和Linux之父林纳斯·托瓦兹齐名
《软件开发》杂志两届技术类图书震撼大奖得主
《软件开发》杂志两届生产力效率大奖得主
华盛顿西雅图大学校友会专业成就奖
IEEE计算机学会金牌核心奖章得主
《普吉特商业杂志》杰出青年人物奖
硅谷工程领导力峰会常年演讲嘉宾
前言
最佳软件工程实践与一般软件工程实践,两者的差异非常大,用“一个在天上,一个在地上”这样的比喻来形容,恐怕也不夸张,而且远远超过其他任何工程学科。从这一点看,用于传播优秀软件工程实践的工具,其重要性不言而喻。
——弗雷德·布鲁克斯
在写作本书的过程中,我主要考虑的是缩短同一个行业中两端的差距,一端是权威、专业人士,另一端是普通的商用实践人员。在如涓涓细流一般“浸润”并被普及成为业内知晓的通用实践之前,许多强大的编程技术其实早已经隐身于期刊杂志和学术论文中很多年。
在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。有些是压根儿没有写过产品代码的教授写的。教授们写的技术书适用于学生的项目,但对于这些技术在整个大规模软件开发环境中是否玩得转,他们并没有多少概念。还有一些书呢,则鼓吹作者最新最爱的方法体系,完全忽略那些庞大的、经年累月沉淀下来的实践知识宝库。
结构与意义
当艺术家们扎堆儿的时候,
他们谈的是可以从哪里买到便宜的松脂油。
——巴勃罗? 毕加索
简而言之,从来没有任何一本书像本书一样,从专业经验、行业研究和学术成果中萃取出这样一套实用的编程技术体系,包含当前的编程语言、面向对象的编程语言以及前沿的开发实践。显然,以编程为主题的书需要由知晓最新理论发展水平的人来写,而不是真正动手写代码构建软件产品并以实践为乐的人来写。对于本书,我的设想是全面而完整地讨论如何构建代码,是一本由程序员写给程序员看的书。