IT技术书籍市场,历来是春秋战国。一般来说,同一个技术领域 总会有那麽数本、十数本、甚至数十本定位相似的书籍相互激烈竞争。其中会有一些大师之作脱颖而出,面南背北,黄袍加身。通常还会有後来者不断挑战,企图以独到特色蠃得自己的一片天地。比如说在演算法与资料结构领域,D. E. Knuth的那套《The Art of Computer Programming》一至三卷,当然是日出东方惟我独尊。但是他老人家的学生Robert Sedgewick凭着一套更贴近实用的《Algorithms in C》系列,也打出自己一片天下,成为很多推荐列表上的首选。就C++ 运用经验类书籍来说,Scott Meyers的《Effective C++》称王称霸已经多年,不过其好友Herb Sutter也能用一本《Exceptional C++》获得几乎并驾齐驱的地位。嗨,这不是很正常的事吗?技术类书籍毕竟不是诗词歌赋。苏轼一首「明月几时有,把酒问青天」,可以达到「咏中秋者,自东坡西江月後,馀词尽废」的程度,但怎麽可能想像一本技术着作达到「我欲乘风归去,又恐琼楼御宇,高处不胜寒」的境界!谁能够写出一本技术书,让同一领域後来者望而却步乾脆死心,那才是大大的奇迹!
然而,您手上这本《The C++ Standard Library》,作为C++ 标准程式库教学和叁考类书籍的定音之作,已经将这个奇迹维持了三年之久。按照IT出版界时钟,三年的时间几乎就是半个世纪,足以锤炼又一传世经典!
1998年C++ Standard通过之後,整个C++ 社群面临的最紧迫任务,就是学习和理解这份标准给我们带来的新观念和新技术。而其中对於C++ 标准程式库的学习需求,最为迫切。C++ 第二号人物Andrew Koenig曾经就C++ 的特点指出:『语言设计就是程式库设计,程式库设计就是语言设计』(注1)。C++ Standard对程式库所做的巨大扩充和明确规范,实际上即相当於对C++ 语言的能力做了全面提升与扩展,意味着你可以站在无数超一流专家的肩上,於轻敲键盘间,将最出色的思想、设计与技术纳入囊中,让经过千锤百炼的精美代码成为自己软体大厦的坚实基础。可以说,对於大多数程式师来说,标准C++ 较诸「ARM时代」之最大进步,不是语言本身,而恰恰是标准程式库。因此,我们可以想像当时人们对C++ 标准程式库教学类书籍的企盼,是何等热切!
注1:”Language design is library design, library design is language design”,叁见Andrew Koenig, Barbara Moo合着《Ruminations on C++》第25, 26章。
一方面是已经标准化了的成熟技术,另一方面是万众期待的眼神,我们完全有理由认为,历史上理应爆发一场鱼龙混杂的图书大战。它的典型过程应该是这样:先是一批快刀手以迅雷不及掩耳盗铃(注2)之势推出一堆敛财废纸,然後在漫长的唾骂与期待中,大师之作渐渐脱颖而出。大浪淘沙,最後产生数本经典被人传颂。後虽偶有新作面世,波光点点已是波澜不兴。
注2:此处非笔误,而是大陆流行的一句 “新俚语”,意思十分明显,就是 “迅雷不及掩耳” 地 “掩耳盗铃”。
然而,这一幕终究没有在「C++ 标准程式库教学与叁考书籍」领域内出现。时至今日,中外技术书籍市场上这一领域内的书籍为数寥寥,与堆积如山的C++ 语言教学类书籍形成鲜明对比。究其原因,大概有二,一是这个领域 的东西毕竟份量太重,快刀手虽然善斩乱麻,对於C++ 标准程式库这样严整而精致的目标,一时也难以下手。更重要的原因则恐怕是1999年8月《The C++ Standard Library》问世,直如横刀立马,震慑天下。自推出之日起至今,本书在所有关於C++ 标准程式库的评论与推荐列表上,始终高居榜首,在Amazon的销量排行榜上名列所有C++ 相关书籍之最前列。作者仅凭一书而为天下知,成为号召力可与Stan Lippman, Hurb Sutter等「经典」C++ 作家比肩的人物。此书之後,虽然仍有不少着作,或深入探讨标准程式库的某些组件,或极力扩展标准库倡导的思想与技术,但是与《The C++ Standard Library》持同一路线的书籍,再没有出现过。所谓泰山北斗已现,後来者已然无心恋战。
於是有了这样的评论:『如果你只需要一本讲述C++ 标准程式库和STL的书籍,我推荐Nicolai Josuttis的《The C++ Standard Library》。它是你能得到的唯一一本全面讲述C++ 标准程式库的书,也是你能想像的最好的一本书。』这种奇异情形在当今技术书坛,虽然不是绝无仅有,也是极为罕见。
究竟这本书好到什麽程度,可以获得这麽高的评价?
我正是带着这分疑问,接受侯捷先生的邀请,着手翻译这本经典之作。随着翻译过程的推进,我也逐渐解开了心中的疑惑。在我看来,这本书的特点有四:内容详实,组织严密,态度诚恳,深入浅出。
首先,作为一本程式库叁考手册,内容详实全面是一项基本要求。但是,本书在这方面所达到的高度可以说树立了一个典范。本书作者一开始就提出一个极高的目标,要帮助读者解决「使用C++ 标准程式库过程中所遇到的所有问题」。众所周知,C++ 标准程式库是大家伙,每一部分又有很精深的思想和技术,既不能有所遗漏,又不能漫无边际地深入下去,何取何舍,何去何从,难度之大可想而知!作者在大局上涵盖了C++ 标准程式库的全部内容,在此基础上又对所有组件都进行细致的、立体式的讲解。所谓立体式讲解,就是对於一个具体组件,作者首先从概念上讲解其道理,然後通过漂亮的范例说明其用法,申明其要点,最後再以图表或详解方式给出叁考描述。有如钱塘江潮,层层叠叠,反反复复,不厌其烦。读完此书,我想您会和我一样感受冲击,并且完全认可作者付出的巨大心血。
C++ 标准程式库本身就是一个巨大的有机整体,加上这本书的立体讲解方式,前後组织和对应的工作如果不做好,很容易会使整部书显得散乱。令人钦佩的是,这本书在组织方面极其严密,几无漏洞。相关内容的照应、交叉索引、前後对应,无一不处理得妥善曼妙。整体上看,整本书就像一张大网,各部分内容之间组织严谨,契合密切,却又头绪清晰,脉络分明,着实难能可贵。我在阅读和翻译过程中,常常诧异於其内容组织的精密程度,简直像德国精密机械一样分毫不差 。後来才想到,本书作者Nicolai Josuttis就是德国人,精密是德意志民族的性格烙印,名不虚传!
说起德意志民族,他们的另一个典型性格就是诚实坦率。这一点在这本书同样有精彩的展现。身为 C++ 标准程式库次委员会成员,作者对於 C++ 标准程式库的理解至深,不但清楚知道其优点何在,更对其缺陷、不足、不完备和不一致的地方了如指掌。可贵的是,在这些地方,作者全不避讳,开诚布公,直言不讳,事实是什麽样就是什麽样,绝不文过饰非,绝不含混过关。作为读者,我们不仅得以学到好东西,而且学到如何绕开陷阱和障碍。一个最典型的例子就是对於valarray的介绍,作者先是清清楚楚地告诉读者,由於负责该组件设计的人中途退场,这个组件没有经过细致的设计,最好不要使用。然後作者一如既往,详细介绍valarray的使用,完全没有因?前面的话而稍微有所懈怠。并且在必要的地方将valarray的设计缺陷原原本本地指出来,让读者口服心服。读到这些地方,将心比心,我不禁感叹作者的坦诚与无私,专精与严谨。
本书最具特色之处,就是其内容选取上独具匠心,可谓深入浅出。本书的目的除了作为手册使用,更是一本供学习者阅读学习的 “tutorial”(自学教本)。也就是说,除了当手册查阅,你也可以捧着它一篇一篇地阅读学习,获得系统化的坚实知识。一本书兼作 “tutorial” 和 “reference”,就好像一本字典兼作「作文指南」,没有极高的组织能力和精当的内容选择,简直难以想像会搞成什麽样子。了不起的是本书不仅做到了,而且让你感觉,学习时它是一本最好的 “tutorial”,查阅时它是一本最好的 “reference”,我要说,这是个奇迹!单从学习角度来说,本书极为实用,通过大量鲜明的例子和切中要害的讲解让你迅速入门,而且绝不仅仅浅尝辄止,而是不失时机地深入进去,把组件的实作技术和扩展方法都展现给读者。单以STL而论,我经常以侯捷先生提出的「STL学习三境界」来描述一本书的定位层次,这本书就像一座金字塔,扎根於实用,尖锋直达「明理」和「扩展」层次。从中你可以学到「reference语意」的STL容器、smart pointer(灵巧指标)的数种实现、扩充的组合型仿函式(composing function object)、STL和IOStream的扩展方法、订制型的配置器(allocator)设计思路等等高级技术,也能学到大量的实践经验,比如vector的使用技巧,STL容器的选择,basic_string<> 作为容器的注意事项等等。可以这麽说,这本书足以将你从入门带到高手层次,可谓深入浅出,精彩至极!
我很高兴自己第一次进行技术书籍翻译,就能够碰到这样一本好书,这 要深深感谢侯捷先生给我一辈子都庆幸的机会。翻译过程出乎意料地艰辛,前後持续将近10个月。我逐字逐句地阅读原文,消化理解,译成自以为合适的中文,然後交给侯先生。侯先生接手後再逐字逐句地阅读原文,对照我的粗糙译文,进行修订和润色,反复品味形成最终译稿。作为译者,侯先生和我所追求的是,原书技术的忠实呈现加上完全中文化、中国式的表达。我们为此花费了巨大的心力,对我来说,付出的心血远远超过一般翻译一本书的范畴。虽然最终结果需要广大读者评论,但今天面对这厚厚的书稿,我问心无愧地享受这份满足感。我最大的希望是,每一位读者在学习和查阅这本中文版的时候,完全忘掉译者曾经的存在,感觉不到语言的隔阂,自由地获取知识和技术。对於一个初涉技术翻译的人来说,这个目标未免太贪心了,可是这始终会是我心 的愿望。一个译者应该是为了被忽略而努力的。
最後,感谢侯先生一直以来对我的欣赏和帮助,感谢您给我的机会,我十分荣幸!感谢华中科技大学出版社的周筠老师,您始终友好地关注着我,鼓励着我。感谢CSDN的蒋涛先生,您的热情鼓励始终是我的动力。感谢我的父母,弟弟,你们是我最爱的人,是我最坚强的支柱!感谢曾经帮助过我,曾经关心过我的每一个人,无论你现在怎样,我为曾经拥有过的,仍然拥有着的每一片快乐和成果,衷心地感谢你!
祝各位读书快乐!
孟岩 2002年5月於北京