图书前言

  最佳软件工程实践与一般软件工程实践,两者的差异不亚于“一个在天上,一个在地上”。这样的比喻毫不夸张,而且其差异性远远大于其他任何工程学科。从这一点看,用于传播优秀软件工程实践的工具,其重要性不言而喻。

  在写作本书的过程中,我主要的考量在于缩短软件行业两端——权威专家与普通从业人员——之间的差距。许多功能强大的编程技术,在如微末之态“滋长”并成为行业通用实践之前,早已经在学术期刊与论文中隐没多年。

  在21世纪的前10年,前沿的软件开发实践取得了突飞猛进的发展。然而,通用实践却止步不前。错误(Bug)随处可见、交付延期、预算超支等现象在许多软件项目中依然屡见不鲜,甚至还有大量的软件根本无法满足用户需求。来自业界与学界的研究人员发现,早在20世纪70年代,便已经有众多能够解决大多数编程难题的高效实践。然而,这些成果的影响力仅限于专业技术期刊,雪藏40年的高效编程实践并没有走出学术圈,被大多数软件组织广泛应用。研究还表明,一项研究成果从诞生到投入商用,通常需要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入门、中高级及高级编程书籍后,接下来该读什么什么书呢?可能读详细介绍英特尔或摩托罗拉硬件、Windows或Linux操作系统功能或介绍其他编程语言的书。没有详细参考书的编程语言或程序,一般无人问津。然而,本书是少数几本专注于讨论编程的书籍。价值高的有些编程技术适用于任何环境或语言的通用实践。其他书籍往往对此一笔带过,《代码大全》则反其道而行,集中探讨这些通用实践。

  本书取材广泛,博采众长,如下图所示。要想获得本书包含的所有信息,另一种可行的办法是遍历浩如烟海的文献,在汗牛充栋的书籍与数百种技术期刊中寻章摘句,同时,“打铁还须自身硬“,自己还必须具备丰富的开发实践经验。即便如此,仍然可以从本书中受益,因为它“海纳百川”,将所有精华汇聚一处,便于大家随时参考。

  本书的关键收益

  无论背景如何,都可以借助于本书以更少时间、更低痛苦,开发出更好的应用。

  一本完整的软件构建参考:书中探讨软件构建的方方面面,包括软件质量与编程思维。在深入构建细节(如类的构建步骤)的同时,详细阐述数据和控制结构的使用、调试、重构及代码调优技术与策略。读者不需要按顺序通读,因为在设计本书内容的时候,我就已经提前想到了如何让大家查找自己感兴趣的特定信息。

  随时可用的检查清单:本书包含35个检查清单,可用于评估软件架构、设计方法、类与子程序质量、变量名、控制结构、代码布局及测试用例等。

  丰富的信息:本书描述的很多技术并没有得到广泛的商用。素材取自行业实践与研究,因而描述的许多开发技术仍然有普遍的适用性。

  更广阔的软件开发视角:通过本书,大家有望以观者的视角,审视哪些方法行之有效,哪些无效。实干派的程序员通常无暇阅读数百本书籍与专业期刊文章(其精华已纳入本书)。书中的研究经验与开发经验将激发大家的想象,启发项目思考,选择战略性的行动,以免重蹈覆辙。

  字字珠玑,全是干货:有些技术类书籍华而不实,水分居多。本书兼容并蓄,论述每种编程技术的利弊。项目具体有哪些要求,旁观者显然不如局内人清楚。本书提供的客观信息,可以帮助大家在特定条件下作出更好的决策。

  适用于多数常见编程语言的概念:本书描述的技术可充分应用于任何编程语言,无论是C++、C#、Java还是其他语言。

  大量代码示例:本书包含近500个代码示例,涵盖好代码与烂代码。我个人从中受益匪浅,故而推己及人,希望其他程序员亦能收获良多。示例涉及多种编程语言,因为掌握至少两种语言通常是区分专业程序员与非专业程序员的分水岭。一旦程序员意识到编程准则超越任何特定语言的语法,便意味着专业殿堂已向其敞开,代码质量与个人生产力有望迎来质的飞跃。为尽可能减轻多种语言带来的负担,我有意回避只供内行人看的晦涩特性(除非另有具体讨论)。无需理解每个代码片段的细微差别,便能领会其要义。如果大家把注意力集中于关键知识点,会发现可以超越于语言来理解代码。为此,我对示例中的关键部分添加了注释。

  获取更多信息的途径:虽然本书已经汇集大部分软件构建信息,但并未止步于此。从第2章开始,每章末尾的“更多资源”小节还列出了相关书籍与文章,供大家进一步探索。

  为什么要写这本书

  软件工程领域迫切需要一本全面涵盖高效开发实践的参考手册。

  计算机科学与技术委员会的一份报告指出,软件开发质量与生产力的最大提升,只能源于对现有高效软件工程实践相关知识进行编纂、分类与广泛传播(CSTB 1990, McConnell 1997a)。该委员会得出结论:与此相关的知识传播策略应植根于“软件工程参考手册”这个基本概念。

  软件构建长期被忽视:曾几何时,软件开发与编码被混为一谈。软件生命周期中这些独特的活动被识别出来之后,有些思想领袖便致力于分析项目管理、需求、设计与测试,由此引发方法论之争。对这些新领域的研究热潮,使得原本一脉相承的代码构建受到冷落,被认为与软件开发无关。代码构建讨论遇冷的另一原因是,有人认为将其视为独立活动,意味着必须将其作为独立的阶段。实际上,软件活动与阶段未必一一对应。无论其他活动是以阶段、迭代还是其他方式执行,都不影响我们把代码构建拿出来进行专题讨论。

  软件构建的重要性不容小觑:研究人员与技术作家忽视代码构建的另一原因,是一个典型的误解:相较于其他活动,代码构建是一个相对机械、改进空间有限的过程。然而,事实并非如此。在小型项目中,代码构建约占65%的投入;中型项目约占50%。在错误占比方面,小型项目中约75%源于构建,中型和大型项目则在50%至75%之间。显然,任何导致50%至75%错误的活动,都有巨大的改进空间(第27章包含更详细的统计与分析)。有评论指出,尽管构建错误在总错误中占比很高,但其修复成本低于需求与架构错误,因而重要性较低。的确,修复单个构建错误的成本通常较低。但研究发现,一些看似不起眼的代码错误,却可能最终导致修复成本高达数亿美元的软件灾难(Weinberg 1983, SEN 1990)。显然,修复成本低,并不意味着其优先级就该低。颇具讽刺意味的是,软件构建不受重视的另一个原因,竟然是它是软件生命周期中唯一必须完成的活动。需求可以模糊假设,架构可以打折设计,测试可以压缩甚至省略。但如果要开发程序,就必须实实在在地构建代码。因此,构建在改进开发实践中成为一个独特而富有成效的领域。

  关于高效构建实践,亟需一本真正意义上的好书

  既然软件构建如此重要,我在构思本书时想当然地认为已经有人写过这方面的书。

  显然,业界需要一本书来阐述高效编程。但我发现,针对软件构建的书,不仅数量有限,而且不够全面。有些书写于20世纪90年代或更早,讨论的是ALGOL、PL/I、Ratfor、Smalltalk等如今已显小众的语言。有些作者没有任何生产代码经验,写的书或许适合学生项目,但不适用于大规模商业环境。还有一些书鼓吹作者偏好的特定方法体系,完全忽视现有庞大的、久经考验的实践知识宝库。

  简而言之,此前不曾有任何一本书像《代码大全》一样,从专业经验、行业研究与学术成果中萃取出一套实用的编程技术体系,涵盖当前主流编程语言、面向对象理念及前沿开发实践。显然,一本以编程为主题的书籍,理应由既知晓最新理论进展又以动手构建软件产品为乐的人来写。对于本书,我的愿景是全面、完整地探讨代码生成实务——一本程序员为程序员写的权威参考。 

  针对本书的主题、勘误建议或其他相关话题,欢迎联系我,电子邮件:stevemcc@construx.com,网站:www.stevemcconnell.com。

史蒂夫·麦康奈尔(Steve McConnell)

2004年阵亡将士纪念日

于华盛顿贝尔维尤