我认为学习任何东西,最重要的就是书了。我不否认一位良师益友在你学习的过程中也能发挥不小的作用,但是你唯一能随时请教的只有书。
会看书的人,一般都有很好的自学能力,可以很容易地获取前人的知识。很多人只有听别人讲解后才能领悟,那只是因为他看的书不好,或者他根本不看书。一本好书能带给你的收获,远非一个老师能比的。因为老师的讲解,可能会产生各种错误或表述不清的情况;而一本好书,它必须在编著时不断斟酌,以纠正大部分错误和改善它的用语。要知道,它可不像老师,说错了可以随意更改,没说清楚你可以发表疑问;它必须有正确和清晰的思路,才能引导你踏上学习的旅途。
所谓“慢工出细活”,一本好书是需要时间去斟酌的,也是需要时间去品味的。相对而言,我最欣赏的是关于某方面入门的书籍,因为它最能看出作者的用心。一本入门的书,它应该引领你进入这个领域的大门,让你看到这个领域的美好。什么是美好?它应该是优雅的、幽默的、有生命力的和简单的。其中,最难实现的往往是简单。在描述面向对象时,将对象、类、继承和封装等概念解释一遍,随便举几个例子,这可能是大多数书籍的做法。它简单吗?确实简单,看过后感觉什么都懂了,可是你知道面向对象究竟有什么用呢?可如果用生活中的例子,推导出面向对象的方法,以展示它的优点,你就能真正懂得它——而这样做一般会让你感觉更简单。而我更欣赏的是,好的入门书籍懂得应该怎样将有难度的地方有选择地隐藏起来;因为很多作者本身就是面向对象的专家,自然懂得如何将“封装”这个概念引入写作中。
书当然也有不好的,你必须学会分辨书的好坏。分辨的途径只有一条:对照这个领域的其他书籍。书读多了,你往往在几分钟内,就能弄清一本书的档次了。我读的书不多,大大小小加起来估计一万多本;虽然偶尔也有失误,但大部分时候我已经能很快分辨书的好坏了。爱因斯坦说过一句我很赞同的话,可惜记不清了,意思和“学而不思则罔”差不多。读书的时候,如果只是不假思索地接受,那就正如“尽信书不如无书”这句了。我读过不少坏书,印象最深的大部分都是教科书,这让我对教科书没有好感。其他的倒也不至于深恶痛绝,但有一本例外,我忍不住拿出来说说。《编程高手箴言》(注1)这本书就是曾经让我判断失误的一本。作者以一个专家的身份来标榜自己,却又到处充斥着对初学者的误导。读它的时候我对他的很多观点很反感,也懂得了该如何批判地接受书中的观点。而我的一个同学却全盘接受他那过分强调底层,并且虚无空洞的理论,然后和我来探讨作者的这些观点。要知道,这可花了我不少时间来向我同学阐述他的哪些观点不太正确的原因。最后我还得说,从这本书里我还是学到了一些有用的东西(比如一些底层的机理),而且纸张确实不错;可见再差劲的书,也有它的价值。
并且,书也不会告诉你所有的细节,你还需要自己去探索。不知道各位在学习C++中的引用时,对它的原理有没有进行研究。我的老师和一般的教科书上都说,引用只是一个别名或替代名,就如“C++之父”是Bjarne Stroustrup的别名一样。这样说来,引用应该不会占用内存空间的。那么你是否考虑过,这样的话,函数应该怎么传引用呢?难道直接把对象全部传递过去?在学习了汇编语言后,我在VC++6.0中查看了反汇编后的代码,发现引用其实是一个dereference了的常量指针,即相当于使用的是(*p)这样一个整体,并且更改了定义引用的语法规则。当然,你也不一定非要学习汇编才能理解引用实际是指针。你可以创建2个类,A类有一个char型的变量,B类有一个char&型的变量。然后,你可以输出sizeof(A)和sizeof(B)各是多少。在我的电脑上,前者是1,即一个char的长度;而后者是4,即一个指针的长度(VC++6.0是32位的编译器)。虽然这类底层实现对于我们而言并不是必须要知道的,但是在我学习Java时,它帮助我很轻易地就弄懂了Java中的引用。
另外想说的就是读书的顺序了。各人有各人的读书习惯:有的人喜欢每个领域的书都翻翻,浅尝即止;有的人喜欢钻研一个领域,从入门经典到高级应用,弄得差不多快成半个专家了再转向下一个领域……我不否认别人的习惯,因为各人有各人的理由。我只举自然界中的一个例子:一粒种子能长成一颗大树,它必须埋在泥土里,但又不能太深;在它发芽后,它的枝叶不断地向上发展,同时它的根也在不断地向下延伸,于是它暴露在空气中的部分和埋在泥土的部分是差不多大小的;它虽然会向各个方向生长,但它的枝叶会偏向有阳光的地方,它的根会偏向有水份的地方。不知道你有没有读懂我的意思:一个人要想从初学者成为专家,他的起步不能太高,也不能太低;在他起步后,他不单要向高层发展,同时也要向底层发展,两边的发展应该是差不多的;在他发展的过程中,可以向各个领域发展,但应该有一个最主要的发展方向。
顺便说说我怎么读书的,和大家交流交流读书经验。我读书很杂,也经常跳过很多不太关心的内容;但我会对很多领域都有暂时算是足够多的了解,也就是“知其然”的境界。我并不觉得这样不好,因为在我对各个领域都有所了解后,如果我在一个领域遇到了问题,我会很快地知道我该在哪个领域找寻解决它的方案,然后去学习它。我也会很认真地钻研我喜欢的内容:在一种或各种不同的书中找寻感兴趣的内容,发现它的原理,享受那种顿悟的快感,慢慢接近“知其所以然”的境界。在这个过程中,我最容易对睿智的作者佩服之至。而且我读书经常是多线程的,一本书看到意犹未尽时又换上另一本。不要以为从一本讲述IA-64(Intel Architecture,Intel64位架构)的书突然跳到讲述AI(artificial intelligenc,人工智能)的书时,大脑会接受不了;其实它比电脑先进多了。经常这样干,思维的切换速度就会很快。所以我经常在上课的时候看其他的书(貌似初中时看漫画养成的习惯^^),而老师提问时却往往只有我能回答。另外,不断换着读,有时候会有额外的收获。在刚学习Decorator模式时,我被书中那一串对象链给弄糊涂了;可突然想起前一天晚上看到的如何在Java中new一个对象,于是豁然开朗了。
最后给出我喜欢的一些关于编程的书,希望大家也能喜欢它们并从中获益。不过太过有名的书就暂时不推荐了。另外有的书没找到资料,以后陆续补上吧。
注1:
《编程高手箴言》
梁肇新 著
电子工业出版社
2003年10月第1版
ISBN:7-5053-9141-0/TP.5283
字数:453千字
定价:50.00元(1CD)
书名:You Can Do It!——C++编程新手互动教程
原版书名:You Can Do It: A Beginner's Introduction to Computer Programming
作者:Francis Glassborow, Roberta Allen
翻译:徐波
审校:荣耀
出版社:人民邮电出版社
原版出版社:John Wiley & Sons
出版时间:2005年4月第1版
原版出版时间:2003年12月2日
ISBN:7-115-13252-6/TP.4566
EISBN::0470863986
字数:563千字
定价:45.00元(附光盘)
网站:http://www.spellen.org/youcandoit/index.htm
难度:★
评价:★★★★☆
本书和《Accelerated C++》(以下简称《AC》)是我读过最好的C++入门书籍了,没给出5星的原因仅仅是因为中文版的10多处印刷错误,以及某些练习和问题表述不太清晰。
用一句话评价就是,如果你要开始学习C++,那么这本书绝对应该是你读的第一本书。
与《AC》相比,本书更为浅显易懂,甚至只会进行简单的计算机操作的用户都能很好地领会和掌握。毕竟,本书的第一作者用这本书,让一个普通的50多岁的女士(感觉这个词一下就让她年轻了不少^^)都能很好地利用C++做出很棒的程序了。作者的写作方式(注2)我非常欣赏,给了我很大的启迪。
和《AC》一样,本书抛弃了传统的以语法为主的教学,而采用了直接上手编程的方法,使学习过程不再枯燥。尤其是各个练习和任务都颇具趣味性,让你充分感受到编程是件快乐的事。同时作者优秀的编程习惯也将使初学者从开始学习就致力于写出优雅和可维护的代码。而最可贵的是作者细致的教学,将会使你了解到也许从未注意到的细节。
我最欣赏的是作者把学习C++的精髓,在不知不觉中就灌输给读者了。其实C++并不难,你所需要的就是利用别人的东西(如工具和库等),然后组合成你自己需要的功能。没错,简单来说就是重用。其实程序员都是很懒的,整天就思考如何让自己更懒而已~~。
正如开始所说的,本书中文版有不少印刷错误,也许会阻碍你的学习。但没必要去看英文版,那样会使你学习起来慢很多的。而且这些印刷错误安排得还很合理,前面几章很少(印象中有处把“==”印刷成“=”),后面则比较多(有好几处把“(”印刷成“C”,“A”印刷成“4”,还有参数遗漏“&”的等),这样有助于你逐步培养debug的能力,并养成不要迷信书的习惯。(这个理由我也想得出,太强了=。=)
另外,本书有配套光盘,含很多工具和库。你在学习时将会用到它们,而且会大大增加你编程的兴趣和乐趣。可惜当时我在图书馆没能借到,只能进行抽象思维,想像运行结果将会是怎样了=。=对于初学者,建议还是要弄到光盘(实在不行就买书吧=。=),或者去网上下载。我强烈建议完成本书所有的练习和任务(至少在脑海里想像一遍流程);因为C++是一门需要动手的语言,不动手是永远学不会的,何况这些题都非常不错。
不过,因为是入门书籍,不可能把C++所有的特性都说到,所以学完这本后你还有很长的路要走(作者说还将出版这个系列后续的书(注3))。但是你会发现其他的也会很容易学会了,因为你在本书的学习过程中,已经养成了很好的思维习惯和编程习惯;而这些几乎在国内所有的教科书中,都是不可能给你的(至少我没发现)。
最后,请相信这本书,当你可以从学习中获取大量快乐时,它就会成为你的习惯~~。
注2:这种写作方式的第一次出现,应该是在Steve Heller的《C++: A Dialog, Programming with the C++ Standard Library》(中文版叫《C++编程基础——标准库编程》)中。作者和他教的女孩Susan最终成为了夫妻^^。这本书对初学者来说还是有点难的,但是讲述了很多其他书很少提到的细节,值得一读。
注3:我在amazon.com看到书名叫《You Can Program in C++ : A Programmer's Introduction》,将于2006年7月5日出版。
书名:Accelerated C++中文版
原版书名:Accelerated C++: Practical Programming by Example
作者:Andrew Koenig, Barbara E. Moo
翻译:覃剑锋,柯晓江,蓝图 等
审校:王昕
出版社:中国电力出版社
原版出版社:Addison-Wesley Professional
出版时间:2003年12月第1版
原版出版时间:2000年1月15日
ISBN:7-5083-1819-6
EISBN:0-201-70353-X
字数:482千字
定价:39.50元
难度:★★☆
评价:★★★☆
除了《You Can Do It!》以外,我认为最好的C++入门书籍。
很喜欢这种重点教授如何使用,而非讲解语法的书。毕竟编程语言是门实践的语言,只有使用它,你才能真正掌握它。
作者将使用标准库作为重点,很早就开始了STL的使用,提示初学者多考虑使用标准库。而作者良好编程风格,对初学者也有很好的引导作用。
不过,我感觉了解STL需要一定的基础。因为初读这本书是在火车上,翻弄了半天还是没完全搞清楚iterator是什么。后来学了数据结构,看了专门讲述STL的书后,再看懂这些内容就很轻松了。
此外,部分习题比较难看懂意思,也许作者或翻译需要加强表述能力吧。
这2点也是我没有给更高评价的原因。
书名:设计模式精解
原版书名:Design Patterns Explained: A New Perspective on Object Oriented Design, 1st edition
作者:Alan Shallowway, James R. Trott
翻译:熊节
出版社:清华大学出版社
原版出版社:Addison-Wesley Professional
出版时间:2004年12月第1版
原版出版时间:2001年7月9日
ISBN:7-302-09841-7/TP.6786
EISBN:0201715945
字数:361千字
定价:35.00元
难度:★★
评价:★★★★☆
要学习面向对象的(和)设计模式,这本书可以算最好的入门书籍了。没给5星的原因是:有的部分理解和掌握起来对于初学者来说稍难了。但是,它不得不算一本值得你多次研读的好书。
在读这本书之前,我只知道面向对象是个很美好的东西;读了之后,我才知道它是个很美妙的东西。感谢它以一种简单易懂的方式,让我明白了面向对象真正的威力不是继承,而是封装。
另外,这本书的第2版已在2004年10月12日出版了,暂时只有英文版,网上有CHM格式的电子书下载。
程序开发心理学:银年纪念版
The Psychology of Computer Programming, Silver Anniversary Edition
作者:Gerald M. Weinberg
翻译:邓俊辉
出版社:清华大学出版社
原版出版社:Dorset House Publishing Company, Incorporated
出版时间:2003年9月第1版
原版出版时间:1998年9月
ISBN:7-302-07026-1/TP.5167
EISBN:0-932633-42-0
字数:400千字
39.00元
难度:★
评价:★★★☆
很难想像作者在30多年前就选择了如此独特的角度来研究程序,实在赞。
我是很喜欢心理学的,选修课大部分都花在心理学上了;而这本书也没有让我对其失望。作者的睿智和幽默,让你读此书就像看小说般惬意。而作者那时的观点,大部分被证明是很有预见性的。如作者提到的“无私式开发”,看上去似乎是25年后极限编程的雏形。
只可惜卖了30多年的畅销书,还不到谭浩强先生《BASIC语言》的销量的1/20。至于后者是否是本好书,我没看过,也没权利评论。但他卖了500万册的《C程序设计》,让我第一次知道了什么叫误人子弟。