写这本书的确是个意外,因为在之前,我和所有的做技术的朋友一样,也是喜欢通过看书学习技术的读者。一直保持着读到好书好句时拍案叫绝、看到无深度或翻译差的书时破口大骂的那种愤青状态。但今年上半年的一次机遇,让我也成为了写技术书给大家分享学习心得的作者,现在想来,多少还是有一些不可思议。《大话设计模式》刚出版,是不是好书需要时间来检验,但的确它是一本很特殊的书。《大话设计模式》为什么要用对话手法写技术书,为什么喜欢用故事引入主题,为什么非常在意代码的演变过程而不是直接讲解结果?关于这些问题,或许下面所写的内容可以给出答案。
我98年师范数学本科毕业,在绝大部分同学的简历里写着要成为一名合格的人民教师的时候,我的简历写着,我的目标是要成为特级教师,要成为教育专家。因为大学四年里,尽管非常喜欢计算机编程,但既然已经学了师范,未来要成为一名教师,所以我就应该要在教育方面努力下些功夫。已经不记得读了多少本关于教育学的专注,花了多少时间来学习最优秀的教育思想,只记得把前苏联教育家马卡连柯、苏霍姆林斯基,国内的魏书生、马明等列为偶像,做了很多本的读书笔记,并立志成为优秀教师。在江苏常州一所重点中学任高中数学教师期间,我开始了自己的理论实践,因材施教、启发式教育、让学生不但“学会”还要“会学”、注重过程、故事性引导、讲课趣味性等等教育理论被我广泛应用于数学教学中。努力是有回报的,在全常州市教学比赛中,我用VB+3DMAX所做的立体几何柱体锥体截面讲解,获得教学大赛一等奖。而我感觉记忆比较深刻的却是讲解数学归纳法的一堂课。当时我从一布口袋里连续拿出两个桔子,让学生猜我将还会拿出什么,个别男生大叫还是桔子时,我拿出了一个机器猫的公仔,全班哄堂大笑,这样引出了凭经验归纳结论的方法是错误的结论,然后我再和学生们一起用几十个磁带盒模拟多米诺骨牌摆放(磁带盒相对较大,容易看到),在不断的摆好再推倒的过程中让学生总结得出,要想它们都倒下,需要两个前提,第一,必须第一个磁带(骨牌)倒下,第二,必须任何一块倒下都得让它下一块跟着倒下。在这些游戏完成后,我才开始讲解数学归纳法的课程。课后许多学生都说,这是他们掌握得最好的一部分知识。这也让我坚信我所学的理论没有错,教学是需要趣味性的引导,需要启发,需要让学生知道思维过程。让其拥有“鱼”(学会),更学会了“渔”(会学)。
由于我是上海知青子女的身份,在2000年我通过努力来在上海找到了学校任教,可惜,那个万恶的“户口”制度,让我的调动失败了。我的特级教师梦也就宣告结束。由于大学到工作其间一直没有停止学习编程,很自然,我就找到了软件开发方面的工作。之后的七年多时间,做了大大小小很多项目,也就积累了一些开发方面的经验。为了不断进步,我看过很多的计算机图书。应该和很多做编程工作的朋友一样,我时常困惑于应该读什么样的书才适合自己,看过不少的好书,当然也经常会购买到对自己收获不大,甚至根本没有用处的图书。好书特点各有不同,而不好的书基本特点就那几种,要么太难看不懂,要么太简单没收获,要么写得不好,要么翻译得太差,这样的技术图书通常都没有看到一半就扔到一边不会再去动它了。过去我一直认为是自己能力不足,水平不够,于是继续寻找着好书,并努力的去阅读它,读懂它。后来我终于明白,原来并非是只要出版的书就是好书,也并非是好书就是适合自己阅读。
2006年,我在一家培训学校做.net的培训讲师,讲到面向对象时,我提了几个问题并做了调查。我问面向对象的好处是什么?为什么要面向对象编程?不面向对象是不是可以?下面大部分都是计算机编程的大学生或有编程工作经验的程序员,竟然没有一个可以完整的把这个问题说清楚。我于是就举了活字印刷的例子,学生们很快就理解了面向对象的好处是让程序可以维护、容易复用、能够扩展、并且灵活性好。而后我又举了会修电脑不会修收音机的例子来强化了对这个知识点的理解,果然在几个月后,再问及学生这个问题时,学生也都可以顺利的回答我的问题。这让我很开心,说明我通过趣味故事引导学生理解技术问题的办法是完全合理的,这和教数学课的道理完全相同。
而后我在《博客园》写了《四大发明之活字印刷——面向对象思想的胜利》一文,没想到引起了很大的反响(事实上我在CSDN的博客里几个月前就写了此文,却没有任何反应),第一篇博客就成了精华帖,并有网友戏言“这是一篇有中国特色的好文”,这的确是园子里朋友的厚爱,也让我很受鼓舞。有了这次激励后,我就在考虑写一个长一些的文章来把面向对象讲好,于是,就有了《小菜编程成长记》构思。我应用了以前数学教学时的一些教育思想,趣味性的话题引导进入课题讲解,不是直接讲结果而是逐步地分析编程的思维过程。表现形式上模仿了《敏捷软件开发:原则、模式与实践》中的对话形式(见其书39-75),在写了一到五篇后,引起很多朋友的认同,并且在网上被广泛转载。之后由于工作较忙,停止了一大段时间。
2007年春节过后,正值我辞了工作正打算着和朋友创业时,由于没有上班,独立时间较多,所以就考虑继续把这个系列写下去。风格一直延续着前五篇的方式,平均一天一篇速度的接着写。这期间发生了一件事情让我很受打击(见《反射——程序员的快乐!》的第11条回复)。一家软件技术杂志的编辑找到我,说和我约稿写杂志的文章,我说我比较擅长写《小菜编程成长记》这种风格的技术文章,他看了后说他们杂志不适合这种风格,希望我改写类似大学论文式的文章,我费了很大力改写了内容差不多的东西,去掉了当中的调侃,给他看后,他很抱歉的对我说,不能采用,原因就是语言不够专业,内容没有深度。而后给了我一篇范文,让我照着那种风格写,我看了后,就委婉的表示,我不会写这样论文式的“专业”文章,这件事就算黄了。
尽管这件事就这么客客气气地过了,其实我很不服气的。因为我觉得,文章写了是给人看的,是用来交流思想,甚至供人学习的。论文式的文章和教材,严肃而枯燥的讲解,难道就是计算机软件教育的唯一标准?难道这种标准的模式就是用来培养学了四年的计算机却连面向对象好处是什么都说不清的大学毕业生的吗?为什么就不可以写得轻松一点、容易一点、有些许人情味呢?当时实在气不过,于是就在《设计模式不能戏说!设计模式怎就不能戏说?》里用调侃的方式表达了我自己的观点,以示发泄。其实过后想想,人家杂志是有定位的,严肃也有严肃的道理,道不同罢了。
也就在同一时间,有两家出版社的编辑找到我,一位就是现在的清华大学出版社的陈冰(另一位由于对方不愿意我提及姓名,我就不公布了),非常感谢他们对我这样文章的认可。经过一段时间的选题申报后,最终我和清华大学出版社签定了出版合同。从这里我想对所有写博客的朋友们说,坚持把博客写下去,并努力把它写好,机遇往往就在你的身边。这里一定还要感谢一下dudu苦心建立起来的博客园这个非常优秀的平台以及众位朋友们对我的博客的支持,这次机遇是完全是你们的积极捧场而获得的。
不过千万别以为写书可以赚到大钱,实际上连中钱都算不上,花同样时间去做项目一定要挣得多得多。我们不是王朔、韩寒这样的作家,也不是易中天、于丹这样的文化名人,如果指望写书赚钱的朋友,建议你还是去写程序的比较好。写书是要学会忍受孤独的,至少我有这样的感觉,因为写博客时,我几乎是写完就可以公布,可以得到反馈,可以从中获得分享的快乐;但写书时,有时我想不出什么构思,很苦恼,但却无法找人讨论,这种无助其实是很孤独的。而当我想到了很多很好的想法,并写了下来,自己很激动时,但却只能自己知道,自己感受思考带来快乐。由于下午和晚上思维效果很差,因此我改为每天早晨六点起床写作,这样一坚持差不多就是半年,辛苦是辛苦,不过每想到自己的想法、创意可以写成书让更多的人了解分享,这辛苦其实也是值得的,快乐也就油然而生了。
由于《大话设计模式》的定位决定了我必须要为每一个模式或原则想一个故事来引导,这说来容易,其实是要经过大量的思考才能获得。不过由于是和现实结合,往往我观察身边的事和物,总会有所发现。比如四五月份正是股票大涨的时间,我就很容易想到在外观模式和观察者模式里提到了与股票相对应的事。那时候正是NBA常规赛和季后赛,我就想到了把姚明和NBA篮球写到了适配器模式里。程序员可能面临求职、面试、申请加薪、与老板沟通等一系列问题,我都有在各个设计模式里去体现。而第二十九章,更是通过小菜做梦,让23个模式变成了模特,以比赛的方式,把23个模式总结了一遍,并与当时比较出名的几大娱乐或IT事件联系在了一起。这些故事如果你仔细阅读,应该就会感受到我当时设计这些章节时的用心良苦,看似不经意,其实都是许多个清晨冥思苦想的结果。就如同你大街上见到一个陌生的漂亮女孩,很想认识她,你是上来就说“做我的女朋友”好呢还是说“今天天气真好”或“小姐真漂亮”等搭讪的话好呢,人际交往需要通过闲聊热身,学习技术同样需要热身,故事的引导就是这个目的。
书中全篇都是小菜与大鸟的对话来组织文字,这其实是有深刻含义的,也是本书的一大价值所在。前面就说过,我是教师出身,并且非常地明白启发式教育的好处,因为只有在不断的提出问题让学生回答,并在不断出错和正确引导中,让学生可以充分了解思维过程,这样的学习对模式的掌握才容易理解,并能深刻记忆。如果我是直接在一开始就给出设计模式的定义,然后是类图,最后给出它的实现代码,这将就会变成一本GoF《设计模式》的盗版图书,没有任何价值。我在前言中就引用了《重构与模式》中的一句经典之语:“如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。”这是我觉得非常精彩的一句话,也是我在《大话》的整本书中所希望去诠释的中心思想。试想一下,我给了你一段很长的代码,并告诉你,这是最优秀的设计,其中用到了种种设计模式和最好的算法,并且也做了注释,让你去看懂它,然后就告诉你,你可以设计出同样精彩的代码了。这好象很合逻辑,其实只是一厢情愿,好比我们都知道并理解李白《静夜思》的古诗,但我们就能很容易的写出“举头望明月,低头思故乡”这样意境的经典名句吗?这样学生学习的结果就可想而知了。
中国有句古话:“养不教,父之过。”而教育界也有一句经典之语:“没有教不好的学生,只有不会教的老师。”而我想说的是,如果你具备相应的基础知识,但却还是读不懂一本技术书中所讲的内容,那不要先着急认为是自己笨、自己差,而要反思一下,这本书的作者是否是真的把问题解释的很清楚,是否只是在告诉你知识经验,而没有教会你去思考,或者这本书是不是本不适合你去阅读,却在书名或宣传上误导了你的判断。总结来说,就是阅读不懂,图书之过也。如果你还是无法了解什么才叫好书的话,建议去看看《Head First》系列的图书,或许你就会知道,真正的好书是什么样的。也可能有人会说,既然有了《Head First Design Patterns》这样的好书,《大话设计模式》还有什么出版的必要吗?这的确是个问题,首先,拿这两本书来做对比本身就存在不公平,看看人家出版此书的阵容,整一个大的团队在运作,花的人力、时间、金钱都是非我这样的低成本投入可以相比,打比方的话,人家是好莱坞大片,而我的《大话设计模式》应该只算国内不知名的小导演的处女作。然后,两本书的侧重点还是不一太一样的。《大话》更注重代码的演变过程,故事也更符合中国人的国情,并且是把23年设计模式都认真的讲解了一遍的。正所谓大片有大片的看头,小成本电影也有它观赏的意义。像《疯狂的石头》这样的低成本电影不也非常优秀吗?哈,如果《大话》可以像它一样成功就好了。我建议,如果你想学设计模式,又手头宽裕,建议先看《Head First》,如果你手头继续宽裕,《大话》也可以考虑。如果手头不宽裕,建议你还是什么也不花,上网学习吧。
另外,这里一定还会有朋友提出异议,如果按照“阅读不懂,图书之过”的说法,同样是讲设计模式的书,《Head First Design Patterns》是好书,GoF的《设计模式》因为很难读懂就不是好书了?这的确是个值得讨论的话题。美国或香港的电影都有严格的分级制度,也正因为此,刚获得金马多项奖项的《色戒》却因删减让我失去了去电影院观看的冲动。如果说中国的电影没有分级制度是爱看电影的老百姓的悲哀,那么中国的计算机图书没有分级绝对是程序员的悲哀。由于没有分级,使得判断是否是好书,是否是适合读者阅读的工作都交给了读者,读者只能通过XX入门、XX起步、XX高级编程、XX21天学会等书名来简单的判断此书是否适合阅读,这其实是很不科学的做法,事实也证明,单从图书标题和目录来判断图书,上当的比例会是非常高的。在我看来,这两本书都是好书,但《Head First Design Patterns》应该算是程序员的初级读物,而GoF的《设计模式》更像是少儿不宜(应该是初级程序员不宜)的高级读物,它根本就不应该让初级程序员去阅读,至少应该明确的大家知道,这本书并不适合初学者阅读,否则浪费金钱还算事小,打击了学习设计模式的自信心或许更加叫人遗憾。我们得感谢像清清月儿所写《asp.net2.0学习历程》和《C#好书盘点》这样的文章,也得感谢豆瓣网上那些分享阅读感受的朋友。但同时也想在这呼吁,若将计算机图书进行官方分级,将更有助于整个民族的软件开发实力的提高。
的确,本文是对《大话设计模式》在做宣传,但同时,本文也是想表达一些我作为作者的一些创作动机和看法。《大话设计模式》已经出版,是否好坏就有待市场的检验,真心的希望阅读过的朋友能对您的开发有所帮助。有不同意见的朋友,也欢迎您真诚的拍砖。