代码之美Beautiful Code(中文版)(china-pub全国独家首发)(09年度畅销榜TOP50)(08年度畅销榜NO.5)
基本信息
- 作者: (美)Andy Oram Grey Wilson [作译者介绍]
- 译者: BC Group
- 出版社:机械工业出版社
- ISBN:9787111251330
- 上架时间:2008-9-22
- 出版日期:2009 年1月
- 开本:16开
- 页码:599
- 版次:1-1
- 所属分类:
计算机 > 软件与程序设计 > 综合 > 程序(设计)理论
计算机 > 软件工程及软件方法学 > 软件方法/软件工程
编辑推荐
即日起至2010.6.15日,本书参加买书立减现金活动,详情请查看
38位大师级的程序员,一步步讲解他们的项目架构,开发时的种种折中考虑(tradeoffs)以及何时必须打破常规,寻求突破。
代码之美官方网站 ,
代码之美QQ群:51968553
专家推荐序:熊节
潘加宇
周爱民
徐继哲
韩磊
霍泰稳
孟岩
博客园鼎力推荐《代码之美》!
推荐阅读
内容简介回到顶部↑
本书介绍了人类在一个奋斗领域中的创造性和灵活性:计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人忽视的需求以及找出令人叹为观止的问题解决方案。
本书33章,有38位作者,每位作者贡献一章。每位作者都将自己心目中对于“美丽的代码”的认识浓缩在一章当中,张力十足。38位大牛,每个人对代码之美都有自己独特的认识,现在一览无余的放在一起,对于热爱程序的每个人都不啻一场盛宴。 虽然本书的涉猎范围很广,但也只能代表一小部分在这个软件开发这个最令人兴奋领域所发生的事情。
本书33章,有38位作者,每位作者贡献一章。每位作者都将自己心目中对于“美丽的代码”的认识浓缩在一章当中,张力十足。38位大牛,每个人对代码之美都有自己独特的认识,现在一览无余的放在一起,对于热爱程序的每个人都不啻一场盛宴。 虽然本书的涉猎范围很广,但也只能代表一小部分在这个软件开发这个最令人兴奋领域所发生的事情。
目录回到顶部↑
第1章 正则表达式匹配器
1.1 编程实践
1.2 实现
1.3 讨论
1.4 其他的方法
1.5 构建
1.6 小结
第2章 subversion中的增量编辑器:像本体一样的接口
2.1 版本控制与目录树的转换
2.2 表达目录树的差异
2.3 增量编辑器接口
2.4 但这是不是艺术?
2.5 像体育比赛一样的抽象
2.6 结论
第3章 我从未编写过的最漂亮代码
3.1 我编写过的最漂亮代码
3.2事倍功半
3.3 观点
3.4 本章的中心思想是什么?
3.5 结论
1.1 编程实践
1.2 实现
1.3 讨论
1.4 其他的方法
1.5 构建
1.6 小结
第2章 subversion中的增量编辑器:像本体一样的接口
2.1 版本控制与目录树的转换
2.2 表达目录树的差异
2.3 增量编辑器接口
2.4 但这是不是艺术?
2.5 像体育比赛一样的抽象
2.6 结论
第3章 我从未编写过的最漂亮代码
3.1 我编写过的最漂亮代码
3.2事倍功半
3.3 观点
3.4 本章的中心思想是什么?
3.5 结论
译者序回到顶部↑
去年8月份,我正在为自己的第—篇国际会议论文热身,机械工业出版社华章分社的陈冀康先生把《Beautiful Code》的电子版发给我,问我能否接下这本书的翻泽工作。在粗略阅读之后,我的第一个感觉就是这本书绝对是一本“重量级”的好书,这一点从各个章节作者的名气就可以看出来,未鹏在之前已经解释得比较清楚了。第二个感觉就是这本书凭借个人力量是难以完成的,书中的每一章节都涉及某个领域中较深的研究主题,如果没有相关的知识,很堆把作者意图完整无误地表达出来。于是,我建议冀康征集一些有实力的译者或者有经验的开发人员,组成一个团队来完成这本书的翻译工作。.
然而,团队的组建并不顺利。冀康在一些比较知名的论坛上发布了征求译者的信息,但响应者不多,而我能够找到的合适人选也只有老同学王昕。正当我犹豫着如何把翻译工作继续进行下去时,事情出现了转机。未鹏在看到征集译者的帖子后提出加入翻译团队,我们在MSN上一起讨论起如何开展这本书的翻译工作。我们都认为这本书确实是一本难得的奸书,建议在翻译团队中再增加一些有实力的人。于是,我们趁热打铁把自己熟悉的一些同学和同事都拉进MSN聊天室里,然后动员他们再推荐一些合适的译者。
事实证明,群众的力量是巨大的。当天讨论的结果很成功,我们最终组成了一个翻译团队,取名为“BC Group”,其中的BC即为“Beautiful Code”的缩写。我们根据每个人的技术专长和感兴趣领域来分配翻译任务,并且为了保证翻译风格的一致性,我们规定了在译稿中要统一专业术语,叙述浯态要保持中文习惯等。在随后的翻译过程中,我们创建了Google Group专用论坛,定期地在MSN上讨论所遇到的问题,交流翻译过程的体会和心得。功夫不负有心人,在经历半年多的努力之后,本书的中文初稿终于得以完成。
然而,或许是好事多磨,《代码之美》在出版过程中遇到了一些波折。本来计划4月份左右出版的《代码之美》,不得不一直推迟到9月份才确定下来。所幸的是,问题最终得以解决,而BC Group的努力也没有付之东流,因此不久之后本书将与读者见面。
当然,由于时间和精力有限,书中难免会存在一些问题,还望各位读者不吝指正。
致谢
感谢BC Group所有成员的努力。感谢史晓明积极参与翻译工作的讨论。感谢机械工业出版社华章分社的编辑,以及所有为本书付出努力的人们。
2008年9月于武汉..
附BC Group成员简介:
王昕:易安信(EMC)中国研发中心高级程序员,感兴趣的技术领域:运用不同的编程技术,搭建大型的、可扩展的、高性能应用程序。译有《C++ STL中文版》,《C++编程惯用法》等。
刘未鹏:南京大学计算机系硕士在读,热爱编程、数学、心理学。个人博客“C++的罗浮宫”(http://blog.csdn.net/pongba),长期关注C++前沿技术。译有《Imperfect C++中文版》、《Exceptional C++ Style中文版》、《修改代码的艺术》等。
袁泳:高级程序员,一直从事IBM WebShere Commerce的开发工作。
王江平:运软网络科技(上海)有限公司高级软件工程师。技术专长为C++,酷喜读书,曾长期从事EDA领域行业应用软件开发,目前的主要工作是Windows系统监控。
史苏:欧特克中国软件研发中心软件开发工程师,主要负责建筑CAD软件相关的研发工作。热衷于C++,算法,数学,程序设计语言理论和社会化网络方面的研究。酷爱读书,参与翻译《游戏编程精粹6》。
华咤镇:2006年加入微软开发工具部中国分部,目前从事微软并行处理平台的研发工作。此前曾参与Visual Studio中WCF模块的开发工作。此前在FujiXerox工作了3年,从事打印机管理软件和文档处理工具的开发。
朱永泰:2007年加入微软服务器与开发工具部中国分部,目前在develop devision从事CLR的相关工作。
聂雪军:华中科技大学计算机学院博土在读,研究方向为存储网络。感兴趣的技术领域包括C++,并行算法,大型软件的协作开发等。译有《Windows编程启示录》,《Exceptional C++中文版》,《C++编程风格》等。...
然而,团队的组建并不顺利。冀康在一些比较知名的论坛上发布了征求译者的信息,但响应者不多,而我能够找到的合适人选也只有老同学王昕。正当我犹豫着如何把翻译工作继续进行下去时,事情出现了转机。未鹏在看到征集译者的帖子后提出加入翻译团队,我们在MSN上一起讨论起如何开展这本书的翻译工作。我们都认为这本书确实是一本难得的奸书,建议在翻译团队中再增加一些有实力的人。于是,我们趁热打铁把自己熟悉的一些同学和同事都拉进MSN聊天室里,然后动员他们再推荐一些合适的译者。
事实证明,群众的力量是巨大的。当天讨论的结果很成功,我们最终组成了一个翻译团队,取名为“BC Group”,其中的BC即为“Beautiful Code”的缩写。我们根据每个人的技术专长和感兴趣领域来分配翻译任务,并且为了保证翻译风格的一致性,我们规定了在译稿中要统一专业术语,叙述浯态要保持中文习惯等。在随后的翻译过程中,我们创建了Google Group专用论坛,定期地在MSN上讨论所遇到的问题,交流翻译过程的体会和心得。功夫不负有心人,在经历半年多的努力之后,本书的中文初稿终于得以完成。
然而,或许是好事多磨,《代码之美》在出版过程中遇到了一些波折。本来计划4月份左右出版的《代码之美》,不得不一直推迟到9月份才确定下来。所幸的是,问题最终得以解决,而BC Group的努力也没有付之东流,因此不久之后本书将与读者见面。
当然,由于时间和精力有限,书中难免会存在一些问题,还望各位读者不吝指正。
致谢
感谢BC Group所有成员的努力。感谢史晓明积极参与翻译工作的讨论。感谢机械工业出版社华章分社的编辑,以及所有为本书付出努力的人们。
2008年9月于武汉..
附BC Group成员简介:
王昕:易安信(EMC)中国研发中心高级程序员,感兴趣的技术领域:运用不同的编程技术,搭建大型的、可扩展的、高性能应用程序。译有《C++ STL中文版》,《C++编程惯用法》等。
刘未鹏:南京大学计算机系硕士在读,热爱编程、数学、心理学。个人博客“C++的罗浮宫”(http://blog.csdn.net/pongba),长期关注C++前沿技术。译有《Imperfect C++中文版》、《Exceptional C++ Style中文版》、《修改代码的艺术》等。
袁泳:高级程序员,一直从事IBM WebShere Commerce的开发工作。
王江平:运软网络科技(上海)有限公司高级软件工程师。技术专长为C++,酷喜读书,曾长期从事EDA领域行业应用软件开发,目前的主要工作是Windows系统监控。
史苏:欧特克中国软件研发中心软件开发工程师,主要负责建筑CAD软件相关的研发工作。热衷于C++,算法,数学,程序设计语言理论和社会化网络方面的研究。酷爱读书,参与翻译《游戏编程精粹6》。
华咤镇:2006年加入微软开发工具部中国分部,目前从事微软并行处理平台的研发工作。此前曾参与Visual Studio中WCF模块的开发工作。此前在FujiXerox工作了3年,从事打印机管理软件和文档处理工具的开发。
朱永泰:2007年加入微软服务器与开发工具部中国分部,目前在develop devision从事CLR的相关工作。
聂雪军:华中科技大学计算机学院博土在读,研究方向为存储网络。感兴趣的技术领域包括C++,并行算法,大型软件的协作开发等。译有《Windows编程启示录》,《Exceptional C++中文版》,《C++编程风格》等。...
前言回到顶部↑
《Beautiful Code》是由Greg Wilson在2006年构思的,本书的初衷是希望从优秀的软件开发人员和计算机科学家中提炼出一些有价值的思想。他与助理编辑Andy Oram一起走访了世界各地不同技术背景的专家。.
本书章节内容的组织
第1章,正则表达式匹配器,作者Brian Kernighan,介绍了对一种语言和一个问题的深入分析以及由此产生的简洁而优雅的解决方案。
第2章,Subversion中的增量编辑器:像本体一样的接口,作者Karl Fogel,首先介绍了一个精心设计的抽象,然后证明了这种抽象能够在系统将来的开发中带来一致性。
第3章,我编写过的最漂亮代码,作者Jon Bentley,介绍了如何在无需执行函数的情况下测试函数的性能。
第4章,查找,作者Tim Bray,应用了计算机科学中的多种技术来研究一个对许多计算任务来说都很重要的问题。
第5章,正确、优美、迅速(按重要性排序):从设计XML验证器中学到的经验,作者Elliotte Rusty Harold,解决了程序在完备性和高性能之间的冲突。
第6章,集成测试框架:脆弱之美,作者Michael Feathers,介绍了一个打破常规并获得优雅解决方案的示例。
第7章,美丽的测试,作者Alberto Savoia,介绍了一种全新的测试方法,不仅能够消除bug,还可以使你成为一个更优秀的程序员。
第8章,图像处理中的即时代码生成,作者Charles Petzold,介绍了一种在维护可移植性的同时还能够提高性能的方法。
第9章,自顶向下的运算符优先级,作者Douglas Crockford,介绍了一种几乎被人们遗忘的解析技术,并且给出了它与JavaScript语言的最新相关性。
第10章,寻求快速的种群计数,作者Henry S. Warren, Jr.,揭示了在一个看似简单的问题上如何应用一些巧妙的算法。
第11章,安全通信:自由的技术,作者Ashish Gulhati,讨论了一个安全消息应用程序的发展过程,这个程序被设计用来使用户能够直观地访问那些成熟但却经常产生误解的密码技术。
第12章,BioPerl中不断增长的漂亮代码,作者Lincoln Stein,介绍了如何通过将一种灵活的语言和客户定制的模块组合在一起,从而使编程技术一般的开发人员能够为他们的数据创建出功能强大的虚拟化形式。
第13章,基因排序器的设计,作者Jim Kent,将简单的构件组合起来从而为基因研究人员生成稳定并且有价值的工具。
第14章,优雅代码随硬件发展的演化,作者Jack Dongarra和Piotr Luszczek,介绍了LINPACK及其相关主要软件包的发展历史,从而给出了在面对新的计算架构时,应该如何对假设条件进行重新评估。
第15章,漂亮设计的长远益处,作者Adam Kolawa,阐述了数十年前所使用的良好设计原则如何帮助CERN中广泛应用的数学库(LINPACK的前身)经受住时间的考验。
第16章,Linux内核驱动模型:协作的好处,作者Greg Kroah-Hartman,阐述了不同的协作者在解决不同难题上所做出的努力以及如何来推动一个多线程复杂系统的成功发展。
第17章,另一种层次的间接,作者Diomidis Spinellis,介绍了如何对多数驱动程序和文件模块中的常见操作进行抽象以及如何通过这种抽象来提升FreeBSD内核的灵活性和可维护性。
第18章,Python的字典类:如何打造全能战士,作者Andrew Kuchling,介绍了一个能够适应某些特殊情况的完备设计‚以及如何通过这种设计来使一种语言特性支持许多不同的用途。
本书章节内容的组织
第1章,正则表达式匹配器,作者Brian Kernighan,介绍了对一种语言和一个问题的深入分析以及由此产生的简洁而优雅的解决方案。
第2章,Subversion中的增量编辑器:像本体一样的接口,作者Karl Fogel,首先介绍了一个精心设计的抽象,然后证明了这种抽象能够在系统将来的开发中带来一致性。
第3章,我编写过的最漂亮代码,作者Jon Bentley,介绍了如何在无需执行函数的情况下测试函数的性能。
第4章,查找,作者Tim Bray,应用了计算机科学中的多种技术来研究一个对许多计算任务来说都很重要的问题。
第5章,正确、优美、迅速(按重要性排序):从设计XML验证器中学到的经验,作者Elliotte Rusty Harold,解决了程序在完备性和高性能之间的冲突。
第6章,集成测试框架:脆弱之美,作者Michael Feathers,介绍了一个打破常规并获得优雅解决方案的示例。
第7章,美丽的测试,作者Alberto Savoia,介绍了一种全新的测试方法,不仅能够消除bug,还可以使你成为一个更优秀的程序员。
第8章,图像处理中的即时代码生成,作者Charles Petzold,介绍了一种在维护可移植性的同时还能够提高性能的方法。
第9章,自顶向下的运算符优先级,作者Douglas Crockford,介绍了一种几乎被人们遗忘的解析技术,并且给出了它与JavaScript语言的最新相关性。
第10章,寻求快速的种群计数,作者Henry S. Warren, Jr.,揭示了在一个看似简单的问题上如何应用一些巧妙的算法。
第11章,安全通信:自由的技术,作者Ashish Gulhati,讨论了一个安全消息应用程序的发展过程,这个程序被设计用来使用户能够直观地访问那些成熟但却经常产生误解的密码技术。
第12章,BioPerl中不断增长的漂亮代码,作者Lincoln Stein,介绍了如何通过将一种灵活的语言和客户定制的模块组合在一起,从而使编程技术一般的开发人员能够为他们的数据创建出功能强大的虚拟化形式。
第13章,基因排序器的设计,作者Jim Kent,将简单的构件组合起来从而为基因研究人员生成稳定并且有价值的工具。
第14章,优雅代码随硬件发展的演化,作者Jack Dongarra和Piotr Luszczek,介绍了LINPACK及其相关主要软件包的发展历史,从而给出了在面对新的计算架构时,应该如何对假设条件进行重新评估。
第15章,漂亮设计的长远益处,作者Adam Kolawa,阐述了数十年前所使用的良好设计原则如何帮助CERN中广泛应用的数学库(LINPACK的前身)经受住时间的考验。
第16章,Linux内核驱动模型:协作的好处,作者Greg Kroah-Hartman,阐述了不同的协作者在解决不同难题上所做出的努力以及如何来推动一个多线程复杂系统的成功发展。
第17章,另一种层次的间接,作者Diomidis Spinellis,介绍了如何对多数驱动程序和文件模块中的常见操作进行抽象以及如何通过这种抽象来提升FreeBSD内核的灵活性和可维护性。
第18章,Python的字典类:如何打造全能战士,作者Andrew Kuchling,介绍了一个能够适应某些特殊情况的完备设计‚以及如何通过这种设计来使一种语言特性支持许多不同的用途。
序言回到顶部↑
我在1982年夏天获得了第一份程序员工作。在我工作了两个星期后,一位系统管理员借给了我两本书:Kernighan和Plauger编写的《The Elements of Programming Style》(McGraw—Hill出版社)和Wirth编写的《Algorithms+Data Structures=Programs》(Prentice Hall出版社)。这两本书让我大开眼界——我第一次发现程序并不仅仅只是一组计算机执行的指令。它们可以像做工优良的橱柜一样精致,像悬索吊桥一样漂亮,或者像George Orwell的散文一样优美。.
自从那个夏天以来,我经常听到人们感叹我们的教育并没有教会学生看到这一点。建筑师们需要观摩建筑物,作曲家们需要研习他人的作品,而程序员——他们只有在需要修改bug时才会去阅读其他人的代码;即使在这个时候,他们也会尽可能减少阅读量。我们曾告诉学生使用有意义的变量名,曾向他们介绍过一些基本的设计模式,但很奇怪,为什么他们编写的大多数代码都很难看呢!..
本书将试图改变这种状况。2006年5月,我邀请了一些著名的(以及不太著名的)软件设计师来分析和讨论他们所知道的漂亮代码。正如在本书中将要介绍的,他们在许多不同的地方发现了代码的漂亮性。有些漂亮性存在于手工精心打造软件的细微之处,而有些漂亮性蕴涵在大局之中——那些使程序能够持续发展的架构,或者用来构造程序的技术。
无论他们是在什么地方发现的这些漂亮性,我都非常感谢我们的投稿人抽出时间为我们奉献了这样的一次学习旅程。我希望你能够享受阅读此书的乐趣,就像Andy和我非常享受编辑这本书的过程,此外,我还希望这本书能激发你创建出一些漂亮的作品。...
自从那个夏天以来,我经常听到人们感叹我们的教育并没有教会学生看到这一点。建筑师们需要观摩建筑物,作曲家们需要研习他人的作品,而程序员——他们只有在需要修改bug时才会去阅读其他人的代码;即使在这个时候,他们也会尽可能减少阅读量。我们曾告诉学生使用有意义的变量名,曾向他们介绍过一些基本的设计模式,但很奇怪,为什么他们编写的大多数代码都很难看呢!..
本书将试图改变这种状况。2006年5月,我邀请了一些著名的(以及不太著名的)软件设计师来分析和讨论他们所知道的漂亮代码。正如在本书中将要介绍的,他们在许多不同的地方发现了代码的漂亮性。有些漂亮性存在于手工精心打造软件的细微之处,而有些漂亮性蕴涵在大局之中——那些使程序能够持续发展的架构,或者用来构造程序的技术。
无论他们是在什么地方发现的这些漂亮性,我都非常感谢我们的投稿人抽出时间为我们奉献了这样的一次学习旅程。我希望你能够享受阅读此书的乐趣,就像Andy和我非常享受编辑这本书的过程,此外,我还希望这本书能激发你创建出一些漂亮的作品。...
媒体评论回到顶部↑
重新擦亮思考的火花
《代码之美》这本书已经成为经典。关于它本身的赞美之辞已经不少了,不过到底从这本书里该读些什么东西,我倒是有些思考。
上世纪九十年代初期,当时正在加州大学埃尔文分校攻读博士学位的Douglas Schmidt在观察了他所参与的软件项目开发实践之后,得出一个结论,即未来的软件开发将越来越多地体现为整合(integration),而不是传统意义上的编程(programming)。换言之,被称为 “软件开发者” 的这个人群,将越来越明显地分化:一部分人开发核心构件和基础平台,而更多地人将主要是配置和整合现有构件以满足客户的需求,类似现代汽车、机床和家用电器制造业的产业格局即将到来。面对这一前景,博士生Schmidt一方面写文章对于其进步意义大加赞扬,另一方面毫不犹豫地投入到核心构件及平台的开发阵营中去。他很清楚,在这样一种分工体系中,由于软件整合产业很难出现垄断局面,因此大多数利润总是被截留在上游,人当然要往高处走,整合是好事,但他老兄宁可让别人来做这个好事。
事实上,软件产业中大多数看上去挺靠谱的预测都被历史的发展无情地抛到垃圾堆里了,然而Schmidt博士生的这个预测却惊人的准确,其后十几年软件工业的发展完美地印证了他当年的判断。因此,他本人基于这一预测所选择的人生道路也一帆风顺。如今已经是教授的Douglas Schmidt先后创造了ACE、TAO、CIAO等一系列分布式计算基础件,先后主导了美国学界和国防领域内若干重大科研与实际开发项目,称为世人公认的分布式计算架构领导者。
抛开他个人的辉煌不说,“整合化”趋势实际上已经深刻地改变了世界软件工业的面貌,从而也影响了身为晚进者的我们的命运。如今大部分的程序员实际上是在整合与配置现有资源以满足需求,而不是真正意义上的“编程”。这当然是一件好事,整合同样需要深刻的洞察力和创新精神,优秀的整合者与天才的程序员一样不可多得,甚至更加罕见。然而我们也不能不承认,大多数整合性的工作是机械的,简单的,重复的,欠缺创意的,深入的思考往往不必要。因此,在这个整合为王的时代里,思考的精神在钝化。更有甚者,互联网和搜索引擎的出现大大加速了这种钝化,几乎所有的问题都有人解决并且张贴在互联网上了,因此独自思考和解决问题已经成了不必要的、降低效率的行为,不但不时髦,而且不经济。软件开发迅速成为一个强调搜索和短期记忆力的技能,我想这是50年前第一代程序员们做梦也没有想到的。
老实讲,就整体而言,我仍然认为这是一种进步。任何一个产业的成熟,无不伴随着分工的明晰、技能的简化和从业门槛的降低。与少数人享受思考乐趣的需求相比,大多数人享受便宜而无处不在的软件服务的需求显然远为重要。但是,对于身处软件行业中的个体来说,思考力的削弱和丧失却是不折不扣的悲剧。这一点不必过多解释,正在苦苦寻找自己核心竞争力的开发者们都知道我说的是什么意思。几年来对中国开发者社群的近距离观察使我确信,尽管作为一个产业,中国软件一直享受着比较快的成长,但是总体而言,中国的软件开发者越来越迷惘、焦躁和不自信。这一情况当然是由多种原因导致的,但开发者们每念及此,多抱怨体制、产业、市场等身外之物,实在也有失偏颇。评心而论,这几年中国软件技术界的生存环境还是有了很大改善,对于那些真正出类拔萃的程序员来说,过上一种充实自信的生活并不困难。摆在每一个个体面前的主要问题还是在于能否出类拔萃,而这就需要我们重新找回思考的能力。具备强悍思考能力的人,也就具备强悍的解决问题的能力,而这样的开发者永远都是产业中的稀缺资源。
我认为这正是《代码之美》这本书的一个重要价值。合作的诸位大师级作者,给我们一个很好的机会,让我们能够一边阅读,一边思考,找回深思熟虑的智慧火花。这本书里所讲的每一个问题,可以说都是程序员在工作中会遇到或者至少会擦边的问题,既没有故弄玄虚的文字游戏,也没有携带了领域知识的私货,只有朴实而实际的一个个问题。虽然不是以提问的方式给出,但在整个阅读的过程中,我们还是能够找到很多机会与大师互动,不断地发现问题和解决问题。我在阅读中经常感到,看上去一个很简单的问题,却被这些大师们一层一层挖掘的如此深入,到最后阶段不由得令人感到战栗和震撼。看着这些智慧的光芒,我们不但可以领略大师之所谓称为大师的秘密,而且也认识到思考的真谛。因此,千万不要想看小说一样一带而过,那样会错过本书95%的价值!我们不是要阅读这些文字,而是要与文字背后的作者交流学习,一点一点把自己的心得记下来,对于作者提出的新问题,先自己思考,直接写程序尝试,争取跟上大师的思路,甚至可能需要反复几遍,才能真正读通这本书。这样的精力不会是白费的,读者应当认识到,当我们拥有这本书的时候,我们获得了怎样宝贵的机会,可以在相对比较短的时间里有效地提升自己的思考能力。这是一个机会,也是一次考验,我绝对相信,通过了这次考验的读者,会在思考和解决问题的能力上有一个大的进步。
我希望自己能够以这样的态度读这本了不起的书,以此文与其他读者朋友共勉之。
——孟岩
《代码之美》这本书已经成为经典。关于它本身的赞美之辞已经不少了,不过到底从这本书里该读些什么东西,我倒是有些思考。
上世纪九十年代初期,当时正在加州大学埃尔文分校攻读博士学位的Douglas Schmidt在观察了他所参与的软件项目开发实践之后,得出一个结论,即未来的软件开发将越来越多地体现为整合(integration),而不是传统意义上的编程(programming)。换言之,被称为 “软件开发者” 的这个人群,将越来越明显地分化:一部分人开发核心构件和基础平台,而更多地人将主要是配置和整合现有构件以满足客户的需求,类似现代汽车、机床和家用电器制造业的产业格局即将到来。面对这一前景,博士生Schmidt一方面写文章对于其进步意义大加赞扬,另一方面毫不犹豫地投入到核心构件及平台的开发阵营中去。他很清楚,在这样一种分工体系中,由于软件整合产业很难出现垄断局面,因此大多数利润总是被截留在上游,人当然要往高处走,整合是好事,但他老兄宁可让别人来做这个好事。
事实上,软件产业中大多数看上去挺靠谱的预测都被历史的发展无情地抛到垃圾堆里了,然而Schmidt博士生的这个预测却惊人的准确,其后十几年软件工业的发展完美地印证了他当年的判断。因此,他本人基于这一预测所选择的人生道路也一帆风顺。如今已经是教授的Douglas Schmidt先后创造了ACE、TAO、CIAO等一系列分布式计算基础件,先后主导了美国学界和国防领域内若干重大科研与实际开发项目,称为世人公认的分布式计算架构领导者。
抛开他个人的辉煌不说,“整合化”趋势实际上已经深刻地改变了世界软件工业的面貌,从而也影响了身为晚进者的我们的命运。如今大部分的程序员实际上是在整合与配置现有资源以满足需求,而不是真正意义上的“编程”。这当然是一件好事,整合同样需要深刻的洞察力和创新精神,优秀的整合者与天才的程序员一样不可多得,甚至更加罕见。然而我们也不能不承认,大多数整合性的工作是机械的,简单的,重复的,欠缺创意的,深入的思考往往不必要。因此,在这个整合为王的时代里,思考的精神在钝化。更有甚者,互联网和搜索引擎的出现大大加速了这种钝化,几乎所有的问题都有人解决并且张贴在互联网上了,因此独自思考和解决问题已经成了不必要的、降低效率的行为,不但不时髦,而且不经济。软件开发迅速成为一个强调搜索和短期记忆力的技能,我想这是50年前第一代程序员们做梦也没有想到的。
老实讲,就整体而言,我仍然认为这是一种进步。任何一个产业的成熟,无不伴随着分工的明晰、技能的简化和从业门槛的降低。与少数人享受思考乐趣的需求相比,大多数人享受便宜而无处不在的软件服务的需求显然远为重要。但是,对于身处软件行业中的个体来说,思考力的削弱和丧失却是不折不扣的悲剧。这一点不必过多解释,正在苦苦寻找自己核心竞争力的开发者们都知道我说的是什么意思。几年来对中国开发者社群的近距离观察使我确信,尽管作为一个产业,中国软件一直享受着比较快的成长,但是总体而言,中国的软件开发者越来越迷惘、焦躁和不自信。这一情况当然是由多种原因导致的,但开发者们每念及此,多抱怨体制、产业、市场等身外之物,实在也有失偏颇。评心而论,这几年中国软件技术界的生存环境还是有了很大改善,对于那些真正出类拔萃的程序员来说,过上一种充实自信的生活并不困难。摆在每一个个体面前的主要问题还是在于能否出类拔萃,而这就需要我们重新找回思考的能力。具备强悍思考能力的人,也就具备强悍的解决问题的能力,而这样的开发者永远都是产业中的稀缺资源。
我认为这正是《代码之美》这本书的一个重要价值。合作的诸位大师级作者,给我们一个很好的机会,让我们能够一边阅读,一边思考,找回深思熟虑的智慧火花。这本书里所讲的每一个问题,可以说都是程序员在工作中会遇到或者至少会擦边的问题,既没有故弄玄虚的文字游戏,也没有携带了领域知识的私货,只有朴实而实际的一个个问题。虽然不是以提问的方式给出,但在整个阅读的过程中,我们还是能够找到很多机会与大师互动,不断地发现问题和解决问题。我在阅读中经常感到,看上去一个很简单的问题,却被这些大师们一层一层挖掘的如此深入,到最后阶段不由得令人感到战栗和震撼。看着这些智慧的光芒,我们不但可以领略大师之所谓称为大师的秘密,而且也认识到思考的真谛。因此,千万不要想看小说一样一带而过,那样会错过本书95%的价值!我们不是要阅读这些文字,而是要与文字背后的作者交流学习,一点一点把自己的心得记下来,对于作者提出的新问题,先自己思考,直接写程序尝试,争取跟上大师的思路,甚至可能需要反复几遍,才能真正读通这本书。这样的精力不会是白费的,读者应当认识到,当我们拥有这本书的时候,我们获得了怎样宝贵的机会,可以在相对比较短的时间里有效地提升自己的思考能力。这是一个机会,也是一次考验,我绝对相信,通过了这次考验的读者,会在思考和解决问题的能力上有一个大的进步。
我希望自己能够以这样的态度读这本了不起的书,以此文与其他读者朋友共勉之。
——孟岩
书摘回到顶部↑
第3章 我从未编写过的最漂亮的代码
Jon Bentley
我曾经听一位大师级的程序员这样称赞到,“我通过删除代码来实现功能的提升。”而法国著名作家兼飞行家Antoine de Saint-Exupéry的说法则更具代表性,“只有在不仅没有任何功能可以添加,而且也没有任何功能可以删除的情况下,设计师才能够认为自己的工作已臻完美。” 某些时候,在软件中根本就不存在最漂亮的代码,最漂亮的函数,或者最漂亮的程序。
当然,我们很难对不存在的事物进行讨论。本章将对经典Quicksort(快速排序)算法的运行时间进行全面的分析,并试图通过这个分析来说明上述观点。在第一节中,我将首先根据我自己的观点来回顾一下Quicksort,并为后面的内容打下基础。第二节的内容将是本章的重点部分。我们将首先在程序中增加一个计数器,然后通过不断地修改,从而使程序的代码变得越来越短,但程序的功能却会变得越来越强,最终的结果是只需要几行代码就可以使算法的运行时间达到平均水平。在第三节将对前面的技术进行小结,并对二分搜索树的运行开销进行简单的分析。最后的两节将给出学完本章得到的一些启示,这将有助于你在今后写出更为优雅的程序。
3.1我编写过的最漂亮代码
当Greg Wilson最初告诉我本书的编写计划时,我曾自问编写过的最漂亮的代码是什么。这个有趣的问题在我脑海里盘旋了大半天,然后我发现答案其实很简单:Quicksort算法。但遗憾的是,根据不同的表达方式,这个问题有着三种不同的答案。
当我撰写关于分治(divide-and-conquer)算法的论文时,我发现C.A.R. Hoare的Quicksort算法(“Quicksort”,Computer Journal 5)无疑是各种Quicksort算法的鼻祖。这是一种解决基本问题的漂亮算法,可以用优雅的代码实现。我很喜欢这个算法,但我总是无法弄明白算法中最内层的循环。我曾经花两天的时间来调试一个使用了这个循环的复杂程序,并且几年以来,当我需要完成类似的任务时,我会很小心地复制这段代码。虽然这段代码能够解决我所遇到的问题,但我却并没有真正地理解它。
我后来从Nico Lomuto那里学到了一种优雅的划分(partitioning)模式,并且最终编写出了我能够理解,甚至能够证明的Quicksort算法。William Strunk Jr.针对英语所提出的“良好的写作风格即为简练”这条经验同样适用于代码的编写,因此我遵循了他的建议,“省略不必要的字词”(来自《The Elements of Style》一书)。我最终将大约40行左右的代码缩减为十几行的代码。因此,如果要回答“你曾编写过的最漂亮代码是什么?”这个问题,那么我的答案就是:在我编写的《Programming Pearls, Second Edition》(Addison-Wesley)一书中给出的Quichsort算法。在示例3-1中给出了用C语言编写的Quicksort函数。我们在接下来的章节中将进一步地研究和改善这个函数。
【示例】 3-1 Quicksort函数
void quicksort(int l, int u)
{int i, m;
if (l ]= u) return;
swap(l, randint(l, u));
m = l;
for (i = l+1; i [= u; i++)
if (x[i] [ x[l])
swap(++m, i);
swap(l, m);
quicksort(l, m-1);
quicksort(m+1, u);}
Jon Bentley
我曾经听一位大师级的程序员这样称赞到,“我通过删除代码来实现功能的提升。”而法国著名作家兼飞行家Antoine de Saint-Exupéry的说法则更具代表性,“只有在不仅没有任何功能可以添加,而且也没有任何功能可以删除的情况下,设计师才能够认为自己的工作已臻完美。” 某些时候,在软件中根本就不存在最漂亮的代码,最漂亮的函数,或者最漂亮的程序。
当然,我们很难对不存在的事物进行讨论。本章将对经典Quicksort(快速排序)算法的运行时间进行全面的分析,并试图通过这个分析来说明上述观点。在第一节中,我将首先根据我自己的观点来回顾一下Quicksort,并为后面的内容打下基础。第二节的内容将是本章的重点部分。我们将首先在程序中增加一个计数器,然后通过不断地修改,从而使程序的代码变得越来越短,但程序的功能却会变得越来越强,最终的结果是只需要几行代码就可以使算法的运行时间达到平均水平。在第三节将对前面的技术进行小结,并对二分搜索树的运行开销进行简单的分析。最后的两节将给出学完本章得到的一些启示,这将有助于你在今后写出更为优雅的程序。
3.1我编写过的最漂亮代码
当Greg Wilson最初告诉我本书的编写计划时,我曾自问编写过的最漂亮的代码是什么。这个有趣的问题在我脑海里盘旋了大半天,然后我发现答案其实很简单:Quicksort算法。但遗憾的是,根据不同的表达方式,这个问题有着三种不同的答案。
当我撰写关于分治(divide-and-conquer)算法的论文时,我发现C.A.R. Hoare的Quicksort算法(“Quicksort”,Computer Journal 5)无疑是各种Quicksort算法的鼻祖。这是一种解决基本问题的漂亮算法,可以用优雅的代码实现。我很喜欢这个算法,但我总是无法弄明白算法中最内层的循环。我曾经花两天的时间来调试一个使用了这个循环的复杂程序,并且几年以来,当我需要完成类似的任务时,我会很小心地复制这段代码。虽然这段代码能够解决我所遇到的问题,但我却并没有真正地理解它。
我后来从Nico Lomuto那里学到了一种优雅的划分(partitioning)模式,并且最终编写出了我能够理解,甚至能够证明的Quicksort算法。William Strunk Jr.针对英语所提出的“良好的写作风格即为简练”这条经验同样适用于代码的编写,因此我遵循了他的建议,“省略不必要的字词”(来自《The Elements of Style》一书)。我最终将大约40行左右的代码缩减为十几行的代码。因此,如果要回答“你曾编写过的最漂亮代码是什么?”这个问题,那么我的答案就是:在我编写的《Programming Pearls, Second Edition》(Addison-Wesley)一书中给出的Quichsort算法。在示例3-1中给出了用C语言编写的Quicksort函数。我们在接下来的章节中将进一步地研究和改善这个函数。
【示例】 3-1 Quicksort函数
void quicksort(int l, int u)
{int i, m;
if (l ]= u) return;
swap(l, randint(l, u));
m = l;
for (i = l+1; i [= u; i++)
if (x[i] [ x[l])
swap(++m, i);
swap(l, m);
quicksort(l, m-1);
quicksort(m+1, u);}


点击看大图







加载中...