——《C++程序设计语言》(特别版)与《C++编程思想》(第2版)阅读心得,兼谈国内技术书籍市场
肖德时
本文作者是一位网络开发工程师,现就职于一家网络游戏公司,技术专长是动态网站架设、MSSQL数据库维护。当然其本人也是一位正在进修C++个人编程观的编程爱好者。欢迎读者来信对此文进行讨论[email protected]。
互联网发展神速,信息获得的手段变的越来越简单,不知道的事物通过搜索引擎,以简单罗列的数个搜索关键字就能获得大量相关资料。实际上获得信息的方式太容易也未必是一件好事,以编程界的观点来看就是冗余代码太多,你需要花大量的时间、精力整理分析以获得有用信息,需要自己有一个清晰明确的思路去组织这些信息,这就是自我的编程观了。技术书籍也是同样的道理,如果不使用科学有效的读书方法,任何一种现今流行的新技术、新思想都可能撑破你的大脑,让你应接不暇。对,正是因为缺少一种科学的学习方法——整理资料的循序性。循序性就是反复,古人常说温故而知新就是这个道理。但是我们不应该没头脑的死读,需要一个读书思路,或者说是一个线索。本文的目的是,一方面希望能帮助你快速地从TC++PL和TIC++II之中获得你所想要的知识,其实更希望的是大家能够通过这篇文章的一些提示以及自己对这两本经典的亲身阅读,认识到树立自己独特的编程观的重要性。即使已经看过这两本书的读者,通过这个线索重读一遍那些曾经没有看懂的地方,必定会有收获。最后,我也会对国内技术书籍的市场提一些个人的看法。
注1:TIC++II是Thinking in C++ 2nd Edition的简写,中文版名《C++编程思想》(第2版)。作者Bruce Eckel(个人主页http://www.mindview.net/),他是“C++标准委员会”有表决权的成员之一,曾就“面向对象的程序设计”的主题连续写过其他5本书,发表过150多篇文章,并且还是多家计算机杂志的专栏作家,他还曾经担任过“软件开发者大会”C++和Java的主席。Thinking in Java 2nd Edition(《Java编程思想》)一书也出自Bruce Eckel之手,《C++编程思想》和《Java编程思想》两书第2版的中文版也即将由机械工业出版社推出。
注2:TC++PL是The C++ Programming Language(Special Edition)的简写,中文版名《C++程序设计语言》(特别版),作者Bjarne Stroustrup博士是C++语言的设计者和最初实现者,现任AT&T实验室的大型程序设计研究部的主管,个人网址http://www.research.att.com/~bs/)
不知道大家对于读书的心得有没有总结过,我想你应该先自已总结一下再继续看下文。古人曾言:“迷时师渡,悟时自渡。”以编程学习为例,我理解为遇到问题犹豫的时候,应该让老师(实际上并不是每个人都有老师时时在身边帮忙解决问题,有的就自个儿偷着乐吧。)点拨你;当你顿悟知识的时候,应该把自已的读书心得好好整理一翻,等以后查找或参考技术资料时自会受益多多。提醒一下,书籍永远是你最好的老师,你应铭记于心。有人看到现今微软推出.NET后,把宣传重点放在C# 之类新语言的技术推广上,就对微软会不会在一两年里放弃C++语言产生顾虑,实际上有此顾虑的人没有抓住最核心的问题,那就是业界会在什么时候放弃OO编程思想。事实上C++/OOP/OOD编程世界中的OO思想在最近三十年里的软件业界获得广泛的成功绝非偶然,有其根深蒂固的群众基础。讨论太多关于C# 和C++之间哪个语言最先进实为黔驴技穷之技,不堪一提。我坚信只要软件业界OO编程思想存在,C++就会有其存在的价值。即使以后随着计算机软硬件结构的变化而演化出来的新编程思想,那也一定会是OO编程思想的延续,C++也正在延续并扩充新功能,所有这一切需要一个过程,决非一日之寒。
事实上我的编码水平也就是半瓶醋,摇个半天也只能图个声音响而已。那我能为读者做什么呢?只希望通过我这半瓶醋为TC++PL和TIC++II这两盘“美味大餐”调出最完美的风味——所以我能做的就是帮助你怎样“看”书,怎样体会大师们的个人编程观。高兴吧,建议看完此篇书评后无论什么想法都请拿出笔来写两句,批评、错误、理解一并发给编辑,谢谢。
以下,我对这两本书的异同进行一下总结,首先是两本书的相近之处。
首先,TC++PL和TIC++II,都是按照ISO/ANSI C++标准重新修定出版的重量级技术书籍,首先应该记住的一点就是它们决不是入门书。你不要指望什么(即计算机科学与技术基础)都不懂就捧着看。别说我打击你,即使你硬着头皮看完这两本书,相信看到最多的也就是繁杂交错的C++语法公式上的细枝末节,每章节背后隐藏的技术真理是不可能领会的。当然事情并不是绝对的,如果遇上哪位大师级人物能有耐心在你身边和你一起阅读,也是有可能让你大有收获,但这种事可遇不可求。事实上这种获得知识的手段是一种硬式教育,有利有弊,需要读者的实践才能得出真理。最重要的就是编程思想可以多样化,万变不离其宗的目的就是提高工作效率,让软件业生产力最大化,为人类创造更多财富。其实软件业界的大师们并没有限制编程爱好者的创造性,Bjarne Stroustrup在其TC++PL的前言中就希望读者能带着健康的怀疑态度去看待他在书中论述的观点,Bruce Eckel的TIC++II则更多的是以普通程序员的视野帮助读者解决编程过程中所遇到的技术难题或技术要点。两本书作者都有曾经经历或主持过大型软件开发项目的背景,思考解决问题的思路是高度模块化的,高效率的。读者应该认识到两位作者对C++编程技术的阐述方法背后是有其作者自已独特视野的。我们应该在阅读时反复揣摩推敲并在适当时机应用于实践中,只有这样才能让自已在体会他们编程理念的同时树立自已的编程观。
其次,锦上添花——技术术语索引表的功效。两本书之所以被无数业界杂志书评认可为技术人员的必备参考书,其索引表(TC++PL见p968页,TIC++II见p783页)也是功不可没的,也是两本书最最实用的工具。国内技术书籍大多没有,英文版技术书籍大多都有。这说明国内技术书籍市场有二个特点:第一点就是针对高阶的书籍不多,大多出版社都以低阶的程序员为主要服务对象,看看你经常去的技术书店的畅销排行榜,就知道高阶读者的苦衷了。针对程序员的高阶技术书籍太少,只希望出版社和国内有实力的技术作家多关注一下这类中高阶专业技术类读者,出一些有份量的中高阶书籍满足广大读者朋友的需要。第二点就是国内技术术语的中英文词汇表繁杂交错,每个著译作者都有自已的一套术语词汇表,可以理解。但创作或翻译完成一部著作后,请一定把相关的技术术语收集整理成中英文对照术语索引表放在著作附录中,让读者在参考和整理学习资料的过程中得到更多的便利。
整理完两本书的近似之处以后,以下我还打算从个人编程观的角度去分析一下两本书的相异之处。从根本上看,TC++PL和TIC++II两本书所演绎的是两位程序设计领域的巨人不同的编程理念。TC++PL是由“C++之父”Bjarne Stroustrup亲自操笔著作,首先为读者提供C++语言和C++标准库的概略,并提供了详尽的参考资料,是最具权威性的学习C++语言的指南;接着从最基本的语言要素(C++语法及基本概念)讲起(体现在Part I: Basic Facilities),使你快速掌握其语言编程方法;再从抽象机制(C++的基础)阐明C++语言机制(参考 Part II:Abstraction Mechanisms),这部分内容是C++语言独有的特征,涉及面相当广博,深度非凡,需要读者深入实践慢慢体会才能大有收获;继续的章节是C++领域中最重要的C++标准库分析(参考 Part III:The Standard Library),实际上是软件业界不断发展过程中的产物,是对C++语言机制的高度实现;最后部分是C++程序设计的编程思想(参考 Part IV:Design Using C++),涉及软件开发全过程,需要实践才能获得新知。最后是份量实足的附录和索引(参考 Appendices),对读者的体贴入微全部体现在这里,方便查阅的好处不必多说。参见图1。
图1 TC++PL阅读线索
而TIC++II中作者另有高招,以解决程序员编程过程中遇到的实际技术难题和技术要点为基本写作思路,并进行各章节的重新组合。各章节的标题及排列顺序是比较新颖的,但此书终究是C++相关的技术书籍,讨论的内容涉及的知识点面和TC++PL是一致的。通过以下读书线索的分析,能迅速了解此书背后隐藏着的个性化的编程思想。C++作为当今软件业界普遍使用的开发语言,此书当然最需要让读者知道其语言的一般性特征(Objects,参考1:Introduction to Objects,2:Making & Using Objects),了解和掌握此要点有助于让编程爱好者快速树立面向对象编程观念;然后详细解说读者最容易混淆概念的技术话题,那就是阐述C++中的C(参考3:The C in C++)。接着是此书最主要、最核心的部分(即第4章到第15章),把应用在面向对象编程过程中此语言所涉及到的技术要点逐个分析到位。TIC++II阅读线索参见图2。
1: Introduction to Objects
2: Making & Using Dbjects
3: The C in C++
4: Data Abstraction
5: Hiding the Implementation
6: Initialization & Cleanup
7: Function Overloading
8: Constants
9: Inline Functions
10: Name Control
11:References & the Copy-Constructor
12: Operator Overloading
13: Dynamic Object Creation
14: Inheritance & Composition
15: Polymorphism & Virtual Functions
16:Introduction to Templates
图2 TIC++II阅读线索
以我学习C++编程思想的经验来看,TIC++II骨子里的线索是这样贯穿全文的,开篇直接讲述C++ semantics 和 C++ object model,接着不断地给读者充实语言机制方面的知识点,目的就是让你到最后能最终理解和掌握polymorphism的演化过程,这也是此语言应用在面向对象编程技术里的核心,你看出来了吧。第1到第2章是体现C++ semantics 和 C++ object model,第4到第15章节是讲述实现polymorphism的各个要素。第16章则单独介绍Templates,更是polymorphism在C++编程领域里的具体实现。通过以上分析,你会对掌握此书大体结构的信心倍增,结合读者自已的实际编程实力,针对作者的编程观点一一研习实践,必能大有斩获。当然此类技术知识的累积决不是一周半月所能解决,经常推敲实践才能够让知识了然于胸,并且与你所花时间和精力成正比。
在OOP/OOD/OOA的学习过程中,大家经常会饱受exception handling 、 Function Overloading 、Virtual Function、Templates等多方概念及使用方法的重重困扰,总想找到最佳解决方法。在没有机会遇到名师高人点拨你之前,我想还是实实在在的看完以下推荐书籍,这些书籍皆为编程爱好者的必备好书。在这些大师级程序员的编程思想上搭建起你的个人编程观,定会让你的编程视野变的更开拓、更深远——
广博如四库全书者有之(如 The C++ Programming Language、C++ Primer),
深奥宛如山重水复有之(如 Inside The C++ Object Model),
独沽一味者有之(如 C++ Programming Style、More Effective C++),
独树一帜者有之(如 The Design and Evolution of C++),
入门捷径者有之(如Essential C++),
另辟蹊径者亦有之(如 STL tutorial Reference Guide),
当然更少不了你的智囊团(如Thinking in C++ 2nd edition)
一一编程成长的历程,是在高阶(polymorphism)和低阶(object model)之间反复学习,积累了厚实的技术基础之后自然能够领会到更高的阶层,而不是平平庸庸地困在中阶(C++ syntax)的漩涡之中。过程式语言尚有自修学会的可能,面向对象语言嘛,以大学生的程度来讲,我认为自修实在困难,只会修出个四不像、半瓶水。我们怎么办呢?我想到的唯一办法就是能精读几本好书。
TC++PL和TIC++II影印版最近都由国内出版社从海外引入,好事。就事论事,在海外图书市场中,凡是在编程技术类畅销书籍中占有重要地位的著作,引入国内后(包括其简体中文版)都无一例外地会畅销。但是,英文影印版在国内好销,并不见得咱们编程爱好者的水平有多高,我想大部分读者买英文影印版多半是为了满足自己的好奇心,但未必能坚持读完一两本英文影印版。毕竟外国人与我们的语言和文化背景有极大的差异,要读懂读透,时间和精力也需要有很大的额外付出。实际上国内是有一批有实力的技术作家,他们也在快速成长之中。作为国内读者真是应该把更多的目光投向原创中文技术书籍当中。国内技术作家的成功与否,不但与自身实力有关,还与出版社自身的实力有着直接的关系。通过有实力的出版社牵头,才能让更多的读者知道、看到更多国内优秀的技术著作。没有他们在背后为国内技术作家推波助澜,读者将很难在国内找到自己想要的书,自然也会把自己的目光投向国外书籍。由此而生的想法就是希望有更多出版社能理性地关注国内实力技术作家,带动读者购买国内原创中文技术书籍的欲望。还有想提到的就是最近在技术类畅销书书籍市场中脱颖而出的侯捷系列丛书。我认为侯捷是一位会“思考”的技术作家,其文章浅显易懂,能让读者看完书后产生共鸣,说明确实能让读者看懂他想说的编程思想。我本人就是侯捷书籍的忠实读者,阅读侯捷系列丛书的经历更加让我相信一点,侯捷的简体中文版技术书籍对于国内C++/OOP/OOD求知若渴的编程爱好者来说,确是不可多得地好书,我个人推荐大家购买。但还是要提醒一句的是侯捷本人的文化背景有着极深的“台湾味”,一定要带着健康的怀疑态度去看。技术方面的新潮流,不可不信,但不必全信。理论和实践结合起来,就是最有效的辨别技术真伪的方法。不管侯捷系列技术书籍今后质量如何,但其个人的翻译理念还是值得国内技术作家吸收的:“让那些购买了英文书的读者后悔去吧”。如果技术书籍市场真的变成那样,我们将皆大欢喜。
TC++PL中文版的译者裘宗燕是位态度认真、办事严谨的北大数学系教授(裘宗燕,北京大学数学学院信息科学系教授,关心的主要学术领域包括计算机软件理论、程序设计方法学、程序设计语言和符号计算,个人主页http://www.math.pku.edu.cn/teachers/qiuzy/cpp.htm)。将TC++PL的简体中文版与英文原文比照进行阅读,我认为裘老师的确在翻译水平上有一定高度。但当时我对此书的中文翻译方法是有着自已的一些看法,于是我就在国内还没有C++中英术语翻译标准的情况下,是否应该在关键性术语旁边加上英文注释这个问题给裘老师去信进行探讨。裘老师很快就给我回了一封信,这封回信使我对他的翻译理念有了更深一层的理解,由此我的看法发生了改变。此处登出信中能代表裘老师观点的部分内容,以让更多的读者了解这位国内知名技术译者的心声:
“一点提请你注意。有许多技术概念是舶来品,而与之对应的中文技术术语则是我们自己创造的。这一区分也请你看清楚。我们(每个做这些事情的人)都或多或少涉足其间,不时需要去选择甚至“创造”。当然,由于台湾等地信息的拥入,确实也出现了一些“舶来”的术语,其正面与反面影响都有。最明显的荒唐词语是“电脑”。我们只能接受这一现实,但未必就应该跟随它。你说是吗?”
读完TIC++II的英文版之后,感觉此书的内容更能让读者接受,其教育的价值比起TC++PL,是有过之而无不及的。关心此书简体中文版的读者可以通过http://www.china-pub.com获得最新消息。TIC++II简体中文版也将于近期由合肥工业大学微机所高技术研究室主任、研究员兼博士生导师刘宗田教授完成翻译并由机械工业出版社出版,期望刘老师能带给大家一个优秀的译本。