题记:上学的时候就看过这本书,确实经典,可惜当时没有 Java 版的,是 C# 版的,感觉有点遗憾,没想到 N 年之后,竟然推出了 Java 版的,那必须给小伙伴们安排几本。
回归编程本质,恶补设计模式
很多时候,80后甚至70后老程序员会思考一个问题:为什么这届员工这么难带?有趣的是,不少老咖归罪到Python头上——这玩意太好使了,90%的场景我都能找到现成的库和框架,以至于让程序员越来越懒,逐渐脱离面向对象,或者说逐渐偏离了编程本质。
这样的程序员,成不了架构师。
架构师的基本功是设计,他们在设计程序而不是编写代码,两者有本质区别。
决定程序员天花板高度的是:设计、数学以及对计算机系统的理解程度。
985出身的程序员普遍上升通道明确,主要原因是他们的基本功扎实。
数学和计算机原理都需要一点天赋而更多是努力,但是设计,只要深刻理解透彻了,对整个职业生涯的提升程度要高于前两者。
设计模式是几十年前的四位绝世高手锤炼出来的23套编程套路,是不可多得的软件设计思想,遗憾的是,很多Python程序员对其思想并无深刻理解,如前所述,绝大多数场景下确实也用不上。设计模式,除了是高校软件工程专业课程和考研课程之外,似乎社会编程培训已经放弃了——学习成本高,见效慢。
掌握设计模式相当于华山派的“气宗”,是程序员的内功修为,虽然在同样的学习时间下,类似Python这种“剑宗”的开发模式见效更快,但是长远来看,“气宗”才是走向软件架构师以上级别的必由之路。
如果:
- 你渴望了解OO(Object Oriented,面向对象)世界的初学者
- 你是困惑于僵硬、脆弱、无法复用的程序员
- 你是拿着OO编程的简历,做着PO(Procedure Oriented,面向过程)开发或者基于函数式编程的程序员
- 你是习惯了用Python框架、库、自动化开发而忽视了软件开发本质的程序员
- 你是决心脱离“码农”圈的程序员
你需要仔细阅读一下这篇文章。
关于学习设计模式的一点感悟
之前有一次做培训的经历,学员大多是计算机专业学生或有过一定经验的在职开发者。他们都知道类、方法、构造方法、甚至抽象类、接口等概念,并写过桌面、Web或移动程序,可是当我提问为什么要面向对象,它的好处在哪里时,却没有人能完整地讲出来,多数人的反应是,概念是知道的,就是表达不清楚。
针对于此,我举了中国古代的四大发明中活字印刷的例子,通过一个虚构的曹操做诗的情景,把面向对象的几大好处讲解了一下,学生普遍感觉这样的教学比直接告诉面向对象有什么好处要更加容易理解和记忆。
这就使得我不断地思考这样一个问题,学一门技术是否需要趣味性以及通俗性的引导。
我在思考中发现,看小说时,一般情况下我都可以完整地读完它,而阅读技术方面的图书,却很少按部就班、每章每页的仔细阅读。尽管这两者有很大区别,技术书中可能有不少知识是已经学会或暂时用不上的内容,但也不得不承认,小说之所以可以坚持读完是因为我对它感兴趣,作者的精妙文笔布局在吸引我。而有些技术书的枯燥乏味使得读者阅读很难坚持,很多时候读个几章就进入书架了。
技术的教学同样如此,除非学生是抱着极大的学习动机来参与其中,否则照本宣科的教学、枯燥乏味的讲解,学生一定会被庞杂的概念和复杂的逻辑搅晕了头脑,致使效果大打折扣。也正因如此,造成部分学生学了四年的计算机编程,却可能连面向对象有什么好处都还说不清。
为什么不可以让技术书带点趣味性呢,哪怕这些趣味性与所讲的技术并不十分贴切,只要不是影响技术核心的本质,不产生重大的错误,让读者能轻松阅读它,并且有了一定的了解和感悟,这要比一本写得高深无比却被长期束之高阁的书要好得多。
设计模式学习路线
显然,学习设计模式,需要编程基础,找一门编程语言(建议从纯正的OO语言开始,比如JAVA),从头开始学习。为什么不推荐Python,这玩意太容易入门了,容易失去对编程的敬畏之心,同时最可怕的是,他能完成的事情太多,会让人忽略编程的本质,从而不自觉的失去上升的动力——当然了,很多基础工作可以用Python完成。
设计模式源于GoF四人组的名著《设计模式》,这是所有人绕不开的经典。
我时常拿程序员的成长与足球运动员的成长做对比。
GoF的《设计模式》好比是世界顶级足球射门集锦,《重构》、《敏捷软件开发》、《设计模式解析》好比是一场场精彩的足球比赛。虽然我为之疯狂,为之着迷,可是我并不只是想做一个球迷(软件使用者),而是更希望自己能成为一个球员(软件设计师),能够亲自上场比赛,并且最终成为球星(软件架构师)。我仔细地阅读这些被誉为经典的著作,认真实践其中的代码,但是我总是半途而废、坚持不下去,我痛恨自己意志力的薄弱、憎恶自己轻易地放弃,难道我真的就是那么的笨?
痛定思痛,我终于发现,贝利、马拉多纳不管老、胖都是用来敬仰的,贝克汉姆、罗纳尔迪尼奥不管美、丑都是用来欣赏的,但他们的球技……嗨,客气地说,是不容易学会的,客观地说,是不可能学得会的。为什么会这样?原来,我学习中缺了一个很重要的环节,我们在看到了精彩的球赛、欣赏球星高超球技的同时,却忽略了球星的成长过程。他们尽管有一定天分,但却也是从最底层通过努力一点一点慢慢显露出来的,我们需要的不仅仅是世界杯上的那定乾坤的一脚,更需要了解这一脚之前是如何练出那种神奇脚法的方法,对于程序员来讲,精彩的代码的实现思路,要比看到精彩的代码更加令人期待。
入门设计模式,你首先需要的学习资料显然不是培养球星(软件架构师)的豪门俱乐部,而是训练足球基本功的体校,培训的是初学足球的小球员(面向对象的程序员),先打好面向对象的基础,从而更加容易并深入理解和感受GoF《设计模式》以及其他大师作品的魅力。
直接看上面提到的四大名著,大概率从入门到放弃,所以这里推荐《大话设计模式》作为你架构师之路的第一站。
这本书并没有创造或发现什么模式,因此谈不上站在巨人肩膀上而看得更远。这本书能成为一些准备攀登面向对象编程高峰的朋友的登山引路人、提携者,在登山途中迷路时给予指引一条可以坚实踩踏的路线,在峭壁攀岩不慎跌落时给予保护和鼓励。
这本书有两个特色
第一个特色是重视过程。我看了太多的计算机编程类的图书,大多数书籍都是在集中讲授优秀的解决方案或者完美的程序样例,但对这些解决方案和程序的演变过程却重视不够,好书之所以好,就是因为作者可以站在学习者的角度去讲解问题所在,让学习门槛降低。《重构与模式》中有一句经典之语:“如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。”本人就希望能通过小菜与大鸟的对话,在不断地提问与回答过程中,在程序的不断重构演变中,把设计模式的学习门槛降低,让初学者可以更加容易地理解,为什么这样设计才好,你是如何想到这样设计的。
第二个特色就是贴近生活。尽管编程是严谨的,不容大话和戏说。但生活却是多姿多彩的,而设计模式也不是完全孤立于现实世界而凭空想出来的理论。事实上所有的模式都可以在生活中找到对应。因此,通过主人公小菜和大鸟的对话,将求职、面试、工作、交友、投资、兼职、办公室文化、生活百味等等非常接近程序员生活原貌的场景写到了书中,用一个个小故事来引出模式,会让读者相对轻松地进入学习设计模式的状态。当然,此举的最大目的还是为了深入浅出,而非纯粹噱头。
关于学习设计模式的疑问
需要什么基础?
主要是Java或其他编程语言的基础知识,如变量、分支判断、循环、函数等编程基础。
设计模式是否有必要全部学一遍?
答案是,Yes!别被那些说什么设计模式大多用不上,根本不用全学的声音所左右。尽管现在设计模式远远不止23种,对所有都研究透彻是不太容易的,但就像作者本人一样,在学习GoF总结的23个设计模式过程中,你会被那些编程大师们进行伟大的技术思想洗礼,不断增加自己对面向对象的深入理解,从而更好的把这种思想发扬光大。这就如同高中时学立体几何感觉没用,但当你装修好房子购买家俱时才知道,有空间感,懂得空间计算是如何的重要,你完全可能遇到买了一个大号的冰箱却放不进厨房,或买了开关门的衣橱(移门不占空间)却因床在旁边堵住了门而打不开的尴尬。
重要的不是你将来会不会用到这些模式,而是通过这些模式让你找到“封装变化”、“对象间松散耦合”、“针对接口编程”的感觉,从而设计出易维护、易扩展、易复用、灵活性好的程序。成为诗人后可能不需要刻意地按照某种模式去创作,但成为诗人前他们一定是认真地研究过成百上千的唐诗宋词、古今名句。
如果说,数学是思维的体操,那设计模式,就是面向对象编程思维的体操。
我学了设计模式后时常会过度设计,如何办?暂时现象,继续努力。
设计模式有四个境界
- 没学前是一点不懂,根本想不到用设计模式,设计的代码很糟糕;
- 学了几个模式后,很开心,于是到处想着要用自己学过的模式,于是时常造成误用模式而不自知;
- 学完全部模式时,感觉诸多模式极其相似,无法分清模式之间的差异,有困惑,但深知误用之害,应用之时有所犹豫;
- 灵活应用模式,甚至不应用具体的某种模式也能设计出非常优秀的代码,以达到无剑胜有剑的境界。
不会用设计模式的人要远远超过过度使用设计模式的人,从这个角度讲,因为怕过度设计而不用设计模式显然是因噎废食。当你认识到自己有过度使用模式的时候,那就证明你已意识到问题的存在,只有通过不断的钻研和努力,你才能突破“不识庐山真面目,只缘身在此山中”的瓶颈,达到“会当凌绝顶,一览众山小”的境界。
祝大家学习愉快~