今天朋友给我微博留言,说我的《大话设计模式》被拍砖了。果不其然,确实是在《放过设计模式吧》的评论第8条中有。还好博主并没有在博文中点名我的书,还算是留了点客气。不过如此轰动的一篇博文(博客园编辑首页推荐),但却传达了一些让初学者困惑的信息——我们初学者在不知道对错的情况下到底还要不要写设计模式的心得文章?针对此我写了一篇吐槽的博文,说说我的想法。
我对《放过设计模式吧》文中所说的技术内容绝大部分认同,这点需要事先明确。作者谈了很多他对设计模式的理解和现在网上很多初学者误用设计模式的现象,这些都是可取的。比如将GoF的《设计模式:可复用面向对象软件的基础》应该翻译为《面向对象设计23招》这样的趣解,比如说策略模式和桥接模式的根本不应该因为UML图的类似而就认为他们容易混淆,他们根本就是讲了两回事等。作者对设计模式理解的高度应该是足够了。
但阅读完毕后,作为一个读者,特别是站在一个初学者的角度,这篇文章却让我感觉很压抑,有一种“他对设计模式理解得这么深,让我都不敢再去讨论设计模式了,真心怕挨骂呀!”的感觉。我不知道别的读者是否是这样,不过对于阅读本文的那些非擅长设计模式的读者来说,应该有类似的想法。
我一直有一个观点:“好的技术文章应该让读者更自信而不是更自卑”。自信是指读者读完之后,感觉很有收获,心情愉悦,有兴趣可以试着照做。自卑是指读完之后,甚为不爽,这个看不懂,那个不理解,有些观点与作者不同,作者解释不能说服自己,感觉看着没劲,学着费力。
这篇文章没有明确的给出最终应该怎么做的建议,给人的感觉可能是:“如果你没有彻底研究明白GoF的《设计模式》之前,最好不要写文章来献丑,那真是很罪恶的。”(希望作者能够声明你其实不是这样的想法,我愿意为这个推论道歉)。难道因为知识理解可能有错误,所以就不要写博客和发表评论了?我觉得不应该是这样的。
虚构一个在小学手工课上给小朋友讲课的场景:今天我们来学习一个新的工具——锤子。锤子是敲打物体使其移动或变形的工具。最常用来敲钉子,矫正或是将物件敲开(锤子的百度百科定义)。……等老师介绍完锤子的作用后,让小朋友练习。面对错误使用锤子的小朋友,老师的可能会有两种态度。
第一种:现在你们手头都有一把锤子,你们只可以用它来敲钉子。锤子就是用来敲钉子的,不允许敲别的东西,那样是不对的。……怎么搞的,你怎么可以用它来敲桌子呢,锤子是用来敲钉子的,你太笨了!……有部分违规的小朋友在挨了批评后失去了使用锤子的信心,不玩它了。还有部分小朋友依然用锤子做着违规的事情,他的眼里所有的物品都成了“钉子”,甚至是用来敲人(鄙视肖传国雇人用锤子伤人),这样的小朋友被老师严厉地批评。整节课下来,大部分小朋友都学会了正确使用锤子,但还是有一些小朋友有些郁闷和叛逆,反正就是——讨厌锤子只能敲钉子。
第二种:小明,你为什么要用锤子敲桌子呢,这样敲后,桌面就会有凹洞,不就不好看了吗?……你为什么要用锤子打人呢?如果是打在自己身上,会不会很疼?……你能不能不用锤子就把钉子钉进木板?不能是吧,用了锤子感觉如何?是不是很容易了?……同样一堂课下来,同样有部分小朋友在使用锤子的目的上犯了错误,同样结束后还是有部分小朋友会用锤子去敲打不该敲击的东西,但是每个小朋友都没有失去学习的兴趣,都在成长过程中。
好了,我虚构的场景介绍完了,这个场景的原型是源自“当你手中有一把锤子,什么问题看起来都像是钉子”的格言。当一个初学者学习设计模式的时候,通常阅读GoF的《设计模式》是效果不好的,一般会打击学习的兴趣,不排除有少部分直接阅读就能理解的初学者,而更多可能是阅读像《Head First设计模式》、《Java与模式》以及我本人写作的《大话设计模式》等等这样的通俗读物来初步了解设计模式。
刚学完一个模式后,等于初学者手里拿了一把“锤子”,此时他是否会希望能在自己的编程项目或者练习中使用到这把“锤子”?当然是希望的。于是他们开始尝试使用,如果用得不好自然就得继续修炼,可也有感觉用得不错的人存在。此时他很希望分享一下自己使用这个设计模式的心得,于是一篇博客就新鲜出炉了。他写得好吗?或许应该这样问,对于一个初学设计模式的人来说,他写的心得可能会很好吗?显然大部分情况是不好的,但是为什么他会愿意写呢?因为他在学习时找到了兴趣,建立了自信,于是他开始写了,并且认为是对的。对于这样的博客,如果当一位专家级的人物在评论中写道:“你写得什么垃圾,这个模式不是这样理解的,你还是回去好好读读设计模式的语义吧。”你知道这样的评论对于博客主打击有多大吗?也许他再也不会去写设计模式的心得了。反之,另一位读者在下面评论道:“你写得不错,但是有理解错误的地方,比如(1)(2)(3)等。”于是他们讨论了关于技术的细节,最终这博客主又写了一篇关于这个设计模式的文章,此时他写得比以前好了,赢得了普遍的赞誉。后来,他写了很多篇这样的文章,给读者带来了知识上的分享和收获。
有读者一定会说,你这不就是在写自己吗?哈哈,我想所有写博客人的想法都是一样的。这既是我的感受,也是所有写了博客人的感受,大家写作的目的都是分享心得,并希望得到赞誉或者中肯的批评,而不是被打击和辱骂。
我始终都认为,在没有一定积累之前,对设计模式的理解大都可能是片面,甚至是错误的(包括我自己),但这不等于不应该鼓励去把自己的想法写下来。事实证明,大部分很牛的人写出来的技术文章是不好读的。因为所谓牛人,已经在学习过程中跨越了N个技术门槛才达到某个高度,此时他已经无法理解初学者的困惑的原因了。就像我在教我儿子认字时,我开始根本无法理解,他怎么会区分不开“右”、“石”和“万”,“左”和“在”等字,甚至把“车”和“在”字搞混.。但这些就是小朋友的学习难点,你必须得理解他们,耐心教导他们。
一般说我的书是垃圾的读者,通常都是牛人,原因就是他们已经跨越了初学者的障碍,因此没有去认真读我的书,就给出了极端情绪化的否定,说大话纯粹是扯淡。因此对于两本书都持否定态度,这样的批评我一般可以忽略。而前几天有个读者在微博中说“相比《大话设计模式》,《大话数据结构》真是本垃圾书。”我略感惊讶。说一本不错,而另一本是垃圾,这比较少见。我于是和他在微博中讨论了一下。最终原因找到了,因为他看GoF的书没看懂,所以觉得《大话设计模式》不错,而他之前学过严蔚敏的数据结构,至少是已经非初学数据结构的人了,因此再读我的《大话数据结构》会认为差别不大(唉,那也不至于垃圾呀)。明白了吗?这就是关键。造成被读者极端肯定或否定的原因就在于他之前有没有好好学过它,使得阅读体验结果是愉悦还是失望。事实上,两本书都是我写的,在准备写作《大话数据结构》的时候,我就考虑到了之前一些《大话设计模式》的读者觉得大话过多的意见,而改为少一些白话,多一些讲解的方式,但毕竟两个技术差异太大,你不能指望全都是同样的趣味体验。由于在写作前是购买和阅读了市面上绝大多数有名的数据结构图书才开始写作,除了头两次印刷有不少细节错误是不可原谅以外,整本书对数据结构的讲解是不错的。我个人认为《大数》要比《大设》更好一些。
有点跑题了,回过头来说《放过设计模式吧》这篇博文,我觉得值得阅读,里面作者对设计模式的分析很有学习借鉴的意义,可以帮助读者更好的理解设计模式。但是我依然鼓励所有学习设计模式(也包括其他所有技术)的朋友把自己的学习心得体会写下来,哪怕是不够好的,哪怕是有错的。人都是从小长到大的,谁TM没幼稚过。错了,改就行!对于什么才叫好的技术文章,标准可能有很多条,但我觉得是能让读者阅读愉快,更加自信而不是更加自卑就是其中很重要的一条。生来世间,多少总得留下点有价值的东西,写比不写强,多写写自然就好了,不是吗?加油!
吐槽完毕,继续休假式治疗,再见!