C++5×5断想之一:C++历史上最重要的图书

【Scott Meyers】C++5×5断想之一:C++历史上最重要的图书      CSDN Blog推出文章指数概念,文章指数是对Blog文章综合评分后推算出的,综合评分项分别是该文章的点击量,回复次数,被网摘收录数量,文章长度和文章类型;满分100,每月更新一次。
原文地址:http://www.artima.com/cppsource/top_cpp_books.html。译文发表于《程序员》2006.11。
作者介绍
Scott Meyers C++ 顶级权威之一,为世界各地客户提供培训和咨询服务。出版有畅销的 Effective C++ 系列图书(《 Effective C++ 》、《 More Effective C++ 》和《 Effective STL 》),设计了创新型的 Effective C++ CD Addison Wesley Effective Software Development Series 顾问编辑, The C++ Source (http://www.artima.com/cppsource/) 咨询板块专家。布朗大学计算机科学博士,他的网站是 www.aristeia.com
 
   
1991 年,我写作了《 Effective C++ 》。在此之前,我已学习 C++ 多年。坐下来撰写本文的同时,我相信我的 C++ 学习历程始于 1986 年,现在是 2006 ,正好是我学习 C++20 周年和写作第一本 C++ 图书 15 周年纪念。不过,记忆里——至少在我的记忆里——不敢保证,似乎有历史记录证明过我实际于 1988 年开始接触 C++ 。如果是这样的话,那么现在应该是我与 C++ 19 周年纪念年。虽然这个数字比不得 20 那么完整,但仍然说明 C++ 于我已是多年老友。今年里,无论作何考虑,我都觉得我不应该关注 C++ 的未来,而是回想它的过去。目前, C++ 的未来是热门话题,比如备受关注的下一个版本语言规范( C++0x ),临近最后定稿阶段,首版技术报告已经出炉,二版也正蓄势待发。但我现在想驻足过去,做点与众不同的事:分门别类评选 C++ 历史上最重要的贡献。
首先要公布的是最重要的五本 C++ 图书。公布之前,我想先罗嗦几句。这些 C++ 领域最重要贡献是在我个人阅历和准则基础上评选的,是我的主观看法,这点自不待言。而不得不说的恰恰是我个人的阅历和评选准则。
你们很多人不得不承认:过去 20 年里,我从未开发过商业软件,更遑论用 C++ 写这类程序。不,不光过去,将来我也不会。因此,我不但不是真正的 C++ 开发人员,更说不上是 C++ 崇拜者。如果一定要扯点关系的话,那就是我在 1985 1993 年上大学时,用 C++ 写过一个研究用软件,很小,就几千行代码,我一个人开发,它很快就成了历史的尘埃。自从我十余年前专心作咨询师以来,我的 C++ 编程仅限于玩乐,比如“让我们看看它如何工作”(有时候也“让我们看看它能让多少编译器崩溃”),通常,都是一个文件就可以容纳的程序。 make ?谁需要讨厌的 make ?我以 C++ 为生,但不是写 C++ 程序。
和语言标准化亲密接触,于我的生活也没多大干系,因为我从未成为 C++ 标准委员会成员,未被列入委员会的邮件名单,也从来没有参加过任何标准工作会议。我对委员会内部工作的了解——包括对语言有重大影响的工作——都靠阅读他人的文章,或者从他们那听说。因此我对像我们知道的那样推动了 C++ 发展的那些重大努力知之甚少,可能只有委员会内部的同志对这些努力感受最深。
上面说了,我既不用 C++ 写软件,也没为语言规范贡献力量,那我到底在干嘛呢?你可能满怀疑窦。基本上可以这么讲,我就研究 C++ 本身以及它的应用。尽我所能,通过图书、杂志、新闻组、邮件以及和开发者、标准化委员会成员面对面交流,加上我自己写程序做实验玩儿等,我收集了大量有关 C++ 的资料,然后对它们做整理、分析,最后集中打包(如写书、在杂志上发表文章、作技术报告等)提供给真正使用这门语言的朋友们,比如你。你们的工作是使用 C++ 这个工具,开发有用的软件;我的工作是搜集、整理能帮助你们更好使用这个工具的资料。
我希望将自己定位为局外观察员,既不像程序员那样日复一日辛苦劳作,也不愿为标准化工作的纷繁琐事殚精竭思,但我要对二者都保持熟悉。这一系列的文章,就是我这个自封的局外观察员对 C++ 历史上最重大贡献的总结。
所谓“最重大”,我指的是这些贡献对 C++ 开发人员产生了最重大的影响。我的名单上所列项,很多都发挥了直接性的影响,我们也直接感觉到了。比如广泛使用的编译器、库和读者众多的图书与文章,它们的影响力非常直接。另外一些的影响则是间接的——我是说它们首先对中间渠道产生直接或间接的影响,然后由中间渠道直接影响我们(哈,绕口令,惹你讨厌了吧?)——比如你稍后会看到的、被我列为最重要图书之一的《 ISO C++ Standard 》,对于开发人员,它的影响是间接的,但对编译和库编写者的影响却是直接的。
有些贡献的重要性非常明显,比如和标准有关的。其他的,通常则需要时间老人来验证它们的影响力。因此,在 C++ 圈子里出现相对较晚的,与已经存在较长时间的相比,更不容易列入我的名单。比如我的图书名单里,最晚的只到 2001 年。这倒不是说在过去五年里出版的图书就没有价值,而是说,以我来看,这些图书还没有表现出我名单上所列图书更大的重要性。如果过些年再来问我,或许就会有所变动了。
五本最重要的C++图书
为了让这个名单(也包括后续文章中提到的其他名单)更有价值,我给自己定了两条原则。第一,只挑五本。哪怕多一本,让它共享这份荣誉的位子也没有,也没有为那些差不多靠边者准备优秀奖。五个位子,五本书。第二,我没有将自己的书排除在竞争行列之外。如果我要评判别人的书,当然也不能放过自己的。
    这两个原则已经相当公平而严格了,因此我在其他方面就可以偷点懒:我不打算对名单上的图书按重要性从高到低排座次(其他几个名单也一样)。我的评判粒度是“在名单上”和“不在名单上”。每个名单里,我都以年代为序,本文的单子里,自然就是出版日期。
    言归正传,下面揭晓我评选的过去出版的最重要的五本 C++ 图书:
The C++ Programming Language ,作者 Bjarne Stroustrup Addison-Wesley 出版社。 1986 年首版, 1991 年再版, 1997 年第三版, 2000 年特别版。对于 C++ 老人们来说,此书的首版是打开知识大门的钥匙。目前的版本已经膨胀到千页以上,增加了很多那时候还不存在的特性,如模板、异常、多继承等,不过未提及标准模板库;显然首版——也是我逐页阅读过的唯一版本——更易驯服,只有 328 页。身处 80 年代后半页的 C++ 程序员,对这本书的完全旅行是必不可少的,它对早期的 C++ 从业者和追梦人的重要影响,怎么评价都不过分。即使介绍 C++ 的图书满天飞的现在,我仍然推荐专业开发人员阅读这本书(当前版本),因为我认为无论就 C++ 本身,还是如何用好 C++ 来说,它都是最全面的参考书。
Stroustrup 因为吝于词句的写作风格而遭诟病,大家都知道我说过,如果阅读 TC++PL (译者注:即 The C++ Programming Language 的简称。此书行文简洁)时,你无意忽略了哪怕一个句子,就有可能丢掉了很重要的东西(再想想目前版本千页以上的篇幅,你就能明白我为什么说它是最全面的参考书了)。然而,精炼恰是这本书无与伦比的魅力之一。比如,首版中对自赋值处理方法的说明,就再好不过证明了这一点:
if (this == &a) return;           // beware of s=s;
 
首版《 Effective C++ 》里,我在同样问题上花费了了五页半的篇幅。你不得不为这样一本半行注释就解决问题的图书倾倒。
Effective C++ 》, 作者 Scott Meyers Addison-Wesley 出版社。 1992 年首版, 1998 年再版, 2005 年第三版。它是超级天才的杰作!哦,不要吐,别在意。
我和此书都很幸运,它生逢其时。 1991 年前后,大部分程序员已经掌握了语言基础,能做到根据需求编写 C++ 程序,但同时总觉得自己无法避免看似可以避免的诸多问题。这是业界第一本专注于如何深入使用 C++ ,全力帮助开发者解决常见问题,最好地使用非 C 特性(如构造器、析构器、继承、虚函数和类内存分配器等)的图书。在这本书里,一反常态,不像当时大多数人将重点放在讨论 C++ 的灵活性上,我采用了一种很特别的指导式思路来写作。以我的经验判断,我认为程序员渴望找到强能有力的办法来控制 C++ 的灵活多变,因此我要告诉他们究竟该做什么。这本书做到了。“一定要这么做”,“千万不要那样干”。一代程序员将这些原则熟记于心,也催生了不少协助性工具。比如 Gnu C++ 编译器,甚至设置了《 Effective C++ 》指导原则的检测警告选项 [ 1] 。此书的一个重要特点——直到写作我的第二本书(《 More Effective C++ 》)难以为继时,我才深入领会到——是其条款内容短小精悍,这样,读者坐公交车、火车,等待会议开始,甚至我曾经说过的坐在马桶上时都可以阅读这本书。
Design Patterns ,作者 Erich Gamma Richard Helm Ralph Johnson John Vlissides Addison-Wesley 出版社, 1995 年。它本身不是一本针对 C++ 的书,但它对使用 C++ 以及其他任何面向对象编程语言进行良好设计都产生了深远影响。此书在专业软件开发人员中发起了模式启蒙运动,而且提出了一系列至今仍居常用模式词汇表核心地位的设计模式 [ 2] 。如果你熟悉命令( Command )、访问者( Visitor )、装饰( Decorator )或单例(单态, Singleton )等模式——甚至已经深入掌握了设计模式,那么基本上可以肯定你读过这本书,我们应该感谢它。
此书中提到的模式,至今仍是 C++ 技术界的热门话题。例如 Herb Sutter 2003 9 月,在其 C/C++ Users Journal 专栏提出了观察者( Observer )模式新的实现方法, Andrei Alexandrescu 也分别于 2005 4 月和 6 月,在其 C/C++ Users Journal 专栏对这个模式做过讨论。
International Standard for C++ ISO/IEC 1998 年首版, 2003 年第二版。标准类资料读起来枯燥乏味,但必须有这样的东西去定义什么是 C++ ,什么不是 C++ ,这本书就担此重任。在这以前,若想知道 C++ 的正确实现,最好要读 Margaret Ellis Bjarne Stroustrup 合著的《 The Annotated C++ Reference Manual 》(即著名的 ARM Addison-Wesley1990 年版),并用不同的编译器检查代码,得想方设法理解 Bjarne Stroustrup 的意思(如通过读他的书)。 1998 年版的 C++ 标准不能回答所有问题(任何资料都做不到),比如, vector 的内存布局必须与 C 数组兼容吗? [ 3] 但它仍不失为一本 C++ 权威参考书,无论是为编程实现还是语言使用者,都在标准化上做出了巨大努力。 2003 年出的第二版,实际上是一个 Bug 修复更新版,更像是 1.1 而不是 2.0 版本,但它也是一个语言官方规范修订本。
Modern C++ Design ,作者 Andrei Alexandrescu Addison-Wesley2001 年版。设计模板的初衷是实现类型的容器(“ containers of T ”),但它能做的远不仅仅这点。实际上,在 Alexandrescu 的书出现之前, 1998 C++ 标准的 STL 部分要求的模板实现就远远超出“类型的容器”。但《 Modern C++ Design 》的出现,才真正为 C++ 技术界打破了模板的牢笼。此书影响深远,堪称新旧两代 C++ 程序设计的分水岭;此后,“ modern C++ ”一般都被用来专指采用了因此书而普及的模板技术的代码。通过 Google 搜索包含“ modern C++ ”的新闻组帖子, 1985 2000 年共有 662 个结果,而从 2001 年到现在,则有 3200 个。
尽管无关于这本书在 C++ 历史上的重要性,但我想有一点仍然值得提及,那就是在 Alexandrescu 写这本书的时候,他还找不到一个支持这本书的代码包含的所有 C++ 标准的编译器!
当你再次浏览这个名单的时候,请记得我是 Addison-Wesley 的签约作家,这个身份使我有机会免费获得 Addison-Wesley 出版的任何优秀图书。因此,可能相对于其他出版社来说,我更熟悉的是 Addison-Wesley 的图书。不过,如果其他出版社有图书震撼了 C++ 世界,我想我肯定也会听说过。
在本系列的下一篇文章里,我将选择 C++ 历史上最重要的非图书出版物(如杂志的文章等)。
 
1
即: -Weffc++
2
一直以来,我都有意在 Google 上搜索网页和新闻组最常提及的模式名,结果我发现多年来, 20 个最频繁提及的模式名,绝大部分出自这本书。这充分证明这本 10 年高龄的图书经久不衰。
3
是的。
 
  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值