胡琪

为今天工作,为明天投资,为未来孵化一些东西!

设计模式与架构

个人觉得设计模式的掌握重在对其应用场景和优缺点的理解,重在“形”而不在“义”。设计模式的定义和UML图只是辅助手段而已,因此本专栏的《设计模式》会花比较大的篇幅讲解各个设计应用场景以及各场景下的优缺点,同时对每个设计模式都会举1-2个知名的开源项目的示例,让大家更容易体会到这种设计模式往往用在哪些场合下。而不是像网上绝大部分讲设计模式的文章举几个自己按照UML图实现的代码示例,这种做法充其量只是在告诉你如何去实现这个设计模式而已,而不是告诉你为何要去用设计模式实现这段功能(本质上就是应用场景),意义不是很大。

【设计模式之】OOP六大基本原则与单例模式

【设计模式之】建造者模式

【设计模式之】工厂方法模式

【设计模式之】策略模式

【设计模式之】观察者模式

【设计模式之】代理模式与动态代理技术(JDK自带与CGLIB)

【设计模式之】适配器模式

我对设计模式的一点看法

很多人觉得设计模式很简单,很容易看懂,但是我想说的是设计模式一点都不简单。你只是看懂了设计模式的UML图,看懂了讲解设计模式的一些示例代码,这不是设计模式的真正意义所在,设计模式是一种思想,重在”形”而不在”义”,能够看懂那些示例代码不代表你学会了设计模式,个人觉得有且仅有一种方式表明你学会了设计模式,那就是在你写的代码中能够看到设计模式的影子,或者在一些明显应该使用设计模式的地方你使用了设计模式,亦或是你觉得自己根本没用啥设计模式但实际上达到了设计模式的效果。这也是设计模式真正的难点所在,该在哪些应用场合下使用哪种设计模式。

这也是设计模式区别于一些你认为很难的东西的地方,比如llvm,比如插件化技术,设计模式它是一种思想,无任何固定实操,就像一句名言:懂无数的道理却依然过不好这一生,因为道理无法实操,因此你很难知道该怎么应用它,该在什么时候去应用它。只能靠自己去悟,靠不断的反思,尝试与反馈来升级你对它的认知。

而llvm也好,插件化也好本质上只是一个新的技能很多时候你觉得一个技能难是因为你缺少和这些技能相关的基础知识以及这些技能相关的子技能。对于任何技能而言个人觉得只要你肯花时间学习,学会它基本上是一件概率为100%的事情,唯一的差别只不过是你学会它要花费多长时间的问题。
这是我在工作中学习llvm后的最大感受。刚开始接触llvm时觉得有点难,一方面因为llvm是一个新的知识点,而自己在这个领域的基础知识基本为0,另一方面LLVM开发时做的很多操作本质上是类似用指令去完成函数的功能,类似汇编开发,而我们平时的开发逻辑都是编程语言的语句层面,因此它的思考模式和我们平常写代码是不大协调的,但是后面慢慢的摸索一段时间后发现刚开始觉得难的地方实际上没那么难。这就类似小时候学骑自行车一样,刚开始也会觉得很难,但是当你学会后会发现骑自行车也没那么难。这也是很多技能的一个特点:只要你肯花时间钻研,学会它基本上是一件概率为100%的事情,唯一的差别只不过是你学会它要花费多长时间的问题,因为技能能够通过大量的实操训练,刻意练习来获得。这也是为何技术类岗位jd往往每一年要求的技能都会比上一年多很多的原因,因为技能本质上绝大部分人学会它的概率是100%的,唯一的差距就是时间的长短,一年的时间足以让绝大部分人学会很多技能了,因此只能用一些更新的技能要求来拉开候选人的差距。

而思想则不然,无法通过大量练习获得,因为它很难实操。对于设计模式而言你觉得简单的只是别人为了让你看懂而举的一些简单的示例而已。如果是一个超大型项目呢?你还能灵活的使用设计模式吗?思想和技能还有另外一个很大的区别就是技能很容易过时而思想不容易过时。比如安卓开发,llvm开发本质上都是一个技能,如果某天安卓像诺基亚那样被市场淘汰掉了,如果某一天出现了一个更加强大的编译器架构取代了llvm,那么你会的这些技能都将失去竞争力甚至派不上用场。但是设计模式不会,只要代码存在,不管是哪种语言,设计模式都可以指导你写出更好的代码。

那么是不是说技能就不重要呢?技能就不难呢?如果是为何公司招聘jd大部分要求的都是技能呢?这是因为虽然对于技能而言只要你肯花时间,学会它基本上是一件概率为100%的事情。但是做任何事情都包含了一个最基本的成本:时间成本。而对于公司而言产出一个东西都是有时间要求的,假设你目前不会安卓开发,虽然从理论上来说只要花时间你肯定能学会基本的安卓开发,比如3个月,但是公司很可能是需要在这个月就上线一个App。那么这个时候已经会这个技能就很重要了。如果完成一个任务,领导允许你一拖再拖那只能说你太幸运了。另一个方面很多高级技能不是孤立的,是依赖其他很多细节的,因为这项技能可能涉及非常庞大的相关知识和子技能,而要想掌握所有的这些相关知识是需要付出大量时间才能习得的。比如插件化技术。如果你对安卓的framework层不够熟悉是很难开发一个插件化框架的。而安卓的framework层牵涉的东西实在是太多了,代码量太庞大了。没有至少1-2年的开发积累是很难抓住和插件化相关的核心理论且将其系统化体系化的,这种技能就属于高阶技能了,但本质上还是技能,花1-2年绝大部分人都是可以学会的。

最后我想说的是设计模式一点都不简单,它是一种思想,只能靠你去悟,不用拘泥于设计模式书上讲的那些示例。到目前为止我的设计模式系列就讲解完了,在这期间我也看过设计模式的一些比较经典的书籍,也查阅了大量的开源项目代码,去寻找设计模式的应用场景。但是我依然不敢说我学会了设计模式,只敢说我熟悉设计模式,如果你对设计模式有更好的学习方法,欢迎和我讨论交流。