« Lua GC 的源码剖析 (5) | 返回首页 | Lua GC 的源码剖析 (6) 完结 »

废稿留档:Effective C++ 3rd 的评注版(序)

Effective C++ 3rd 的评注版要出版了。我在这本书上花了不少心血。编辑约我最后写一篇序。我新码了点文字,用了点以前 blog 上写的旧文

今天侠少同学说“现在全文看下来还是有些纠结,反对、支持、再反对,再支持,百转千回的小情绪,读者恐怕会犯晕”。嗯,的确很羞愧的。不应该在这本大牛的书前面发牢骚。打算晚上改稿子。旧稿就贴这里存档吧。


2010 年秋电子社编辑侠少寄给我一本Effective C++(第三版)英文原版书,并托我为这本书写一些评注,希望做成评注版在国内出版。老实说,之前我并无阅读这本书的计划。 通过更深入地理解 C++ 而获得一种喜悦感,是十多年前的事情了。那时我刚刚从 C 语言迁移到 C++ 来做实际的项目。当时,我接触学习 C++已有六七个年头,一直未把它作为主要工作语言来用。

2000 年前后国内突然出版了大批 C++语言相关的著作,我读了一本后便一发不可收拾。之前已有的语言经验,让我的阅读没有太大障碍。而几乎是空白的 C++大型软件项目经验,让我没有各种先入为主的偏见。从纯粹学习语言的角度来讲,Effective C++ 是相当重要的一本书。阅读到这一本时,我已经用 C++ 编写过一个开源的游戏引擎,有数万行代码,书中总结的条款读来总觉得心有戚戚焉。我几乎是在书店驻足读完大半本书,才去收银台买下来的。

之后的几年里,我用 C++ 编写了数十万行代码。写得越多,对之前的作品越不满意,代码风格也随着阅读而变化,而且慢慢产生怀疑,到底是否存在一种普遍合理高效的C++ 使用方法:它可以让其他程序员,或是将来的自己审阅代码后,表示一致赞赏,而不需要用无休止的重构来满足自己的完美主义倾向。

后来,我的日常工作逐步转移回 C 语言开发,并开始大量使用多语言混合编程(使用的最多的是一种动态类型语言 Lua )。网络上对 C++的批评和质疑的声音越来越多。我自己也在 Blog (http://blog.codingnow.com)上写过数篇响应这种声音的文章。我想我对 C++ 已经足够了解,有较为丰富的实践经验,有能力表达自己的看法。

我觉得,作为一个热爱编程的程序员,在职业生涯中,对特性丰富的 C++ 语言没产生过兴趣并为之吸引,是几乎不可能的事情;而始终停留在对 C++ 的热恋中,把它作为解决一切问题的万能钥匙,亦非优秀的程序员。无论是 C++ 的狂热份子,还是希望了解C++不足的一般程序员,这本书都非常值得一读。当我全部读完这本书,深深地感觉到,较之前些年读的第二版,这简直是一本新书。

这本书,我读得很慢,不仅仅是因为这是一本英文书,还因为编辑之托。对于要印成白纸黑字的文章,不得不谨慎一些。所以,我又重温了《C++语言的设计和演化》的几个章节。可能还是因为我对 C++偏见过多,其程度有如前几年对其的推崇备至。总觉得书里讲得太细,有自己的观点本是好的,只是局限在了 C++ 语言中。明明是 C++ 的缺陷,却让人绞尽心力地回避那些问题,或以 C++ 独特的方式回避。在别的语言中不该存在的问题,却成了 C++程序员必备的知识。人生苦短,何苦制造问题来解决之。

可这也正映射了本书的主题:有效使用 C++ 。读下去,感觉能懂 Scott Meyers了。我不相信大牛如厮,这个主题写了十多年,就没有什么可抱怨的。当我读到 Item 25 ,关于对 std::swap 的扩展问题(原书第109页) 引申到特例化 std 名字空间里的方法时,一句“Alas, the form of the prohibition may dismayyou” 尽显无奈,不由会心一笑。

我是在去广州开会的旅途上开始读这本书的。当时飞机晚点,在机场耽搁了四个小时,随身带的就这本书和一支铅笔,连同空中的时间,一共六小时,在书上做了几千字的记录。后来在新西兰,晚上边读边记,磨磨蹭蹭地读了几十页,当是把书越读越厚了。

如果不是为了完成先前百般推脱的这个任务,想来是不会这么有耐心逐字读那些英文句子的。读得越细越发现没啥好评注的。要以我近年对 C++的态度,每篇只读个标题,估计就草草翻过了。都是 C++ 程序员必备的知识,还翻来覆去讲个没完。剩下那些语法细节,属于语言工具相关的知识,不做 C++ 程序员本不必学习了,没太大启发。

结果,评注下来大部分都是对 C++的争议。稿子发给侠少看了,说是缺少一些对“初学者解惑和提速”的部分,而“批判固然是好的”,但比例也太大了。而且大部分页面空空,没落任何文字。

我也认为,无论怎样写下文章,都带有现实的局限性。或许过两年想法就变了。但文字印刷出来,就无法更改。希望不要因我言论误导,而放弃学习 C++。更不希望因为我的评注,影响了书的销量。如果说,我的评注只是对 C++ 的批评,那是一种误解。评注这个工作比翻译难做。作者细节上讲地非常清楚,大部分地方都不觉得有必要再加注解。原文的英文非常流畅,前后反复呼应,让我这个平时英文阅读量并不大的人,也可以舒适阅读。我想跟这本书反复写了十年有关。所以很多页我都没留评注,真的不知道可以写什么。

除了少部分评注,是针对个别代码段,或关键词,大部分都是独立成段的。跟具体原文句子关系不大,只跟篇章段落主题有些许联系。限于水平,有很多地方,我想表达,但依然没讲透彻,感觉是一种遗憾。相对于Scott Meyers 积累了十数年的精彩文字,我这个后学晚辈仓促成文并列其间,实在是诚惶诚恐的。希望其中错误之处,方家看到能一笑了之。

祝各位读者拥有和我一样的愉快阅读体验。

云风 2011 年春 于 杭州

Comments

等了很久,昨晚买到了。先把评注抓出来看了一遍,再重头看英文版,感觉的确要比翻译的读起来……呃,更加舒适,加上评注就更爽了,可惜还是感觉评注太少了,有些地方还可以多加一些的。

写了一个Windows命名空间扩展来虚拟磁盘,用的是default view,在xp上运行正常,但是到win7(32,64bits)上,创建view的API总是返回0x80070002,ERROR_FILE_NOT_FOUND。API原型为:

HRESULT SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv);

这个API既没有让传入文件路径和注册表路径等参数,失败提示却是ERROR_FILE_NOT_FOUND,网上搜了几天还是解决不了,MS真是太邪恶了,要是能看这个API的实现没准几分钟就明白什么回事。

本来不该这里发的,而且违背了云风的“不欢迎在留言中粘贴程序代码”,只是希望有人能提供遇到此类问题时一般的解决思路。

从大一开始就疑惑,难道没有一个完美的语言吗?所以 从大二开始接触C++就一直在祈祷,C++你一定要是啊。虽然个人能力没多少长进,但总算也看到了个事实,那就是,不完美。

从大一开始就疑惑,难道没有一个完美的语言吗?所以 从大二开始接触C++就一直在祈祷,C++你一定要是啊。虽然个人能力没多少长进,但总算也看到了个事实,那就是,不完美。

“厮/斯”要分清啊

C++适和团队开发的项目,在这一点上,绝对是功大于过的.

s/厮/斯/

咦,怎么突然提到这本书了...
有空时我经常会翻看的

Post a comment

非这个主题相关的留言请到:留言本