“山哥,你是怎么提高设计能力的? ”
这个问题最近被人问及, 我回想了下这10多年学习历程,并没有发现一个确切的东西能帮助提升设计能力,更具体点是“面向对象的设计能力”。
我大学的时候学了几门语言,也勉强做了几个项目,但是都停留在能使用的层面,根本没有考虑到可扩展性,重用性,灵活性,易读,优雅...... 等东西, 也不知道什么是设计模式, 估计大部分码农翻身的读者都比我强得多。
刚工作的时候,一个搞Java的同学给我说,山哥你知道吗,现在模式很流行,我们都在搞模式。
模式? 正在抱微软大腿的我是一脸懵逼。
回去赶紧搜,于是就发现了四人帮那本著名的《设计模式》,赶紧研读,发现是雾里看花,水中望月,看不清楚。
这设计模式就如同一座高山,可望而不可及。 当然用来吹牛还是可以的,吃饭时给组长说:我最近看到一本书,叫设计模式,里边提出了两条原则,实在是太好了。
“什么原则?”
“一条面向接口编程而不是面向实现编程, 另外一条是优先使用组合而不是继承。”
虽然我洋洋得意,但是我心中明白,我也不知道这是啥意思。
后来看到闫宏写的《Java与模式》一书 ,里边举了很多红楼梦的例子,有点意思,大概知道了一些模式的写法。
照葫芦画瓢,写了个Iterator, 激动不已。没成想到JDK中一看,人家早就写好了。
转入Java阵营以后,发现模式在这里确实比较提倡,不仅仅是标准的23种设计模式,还有J2EE开发中用到的各种模式。
那就老老实实地学吧,不仅仅看书,还开始看源码,当时流行的有一个叫做Jive论坛,纯用servlet和JSP写的,现在看来可能是比较幼稚,但是它里边用了很多的设计模式,比如单例,模板方法,代理,迭代器等等。
之前学习设计模式,看到的都是小打小闹的小例子,不知道怎么用到项目中来,现在看到Jive,一下子看到设计模式在实战中的鲜活的应用,实在是大开眼界。
(由于时间太过久远,感兴趣的可以再翻翻Jive,但是不太建议再花太多的时间学习了)
后来发现了一本神书《敏捷软件开发,原则,模式与实践》,第一次讲了面向对象设计的原则,其中还有一个薪水支付的案例,真是让我大开眼界,一下子明白了“优先使用组合而不是继承"的道理。
此后又看了JUnit的源码,再次感慨大牛把设计模式玩得炉火纯青。
看了不少书和源码以后,就想在工作中想找机会实战,无奈工作中增删改查居多,在框架下填代码,浑身的OO内力无处宣泄,真是不爽。 (其实也没多少内力,把自己高估了。)
终于逮到一次机会,我负责的模块业务逻辑非常复杂,我就想办法把这一块逻辑从增删改查的框架中剥离处理,好好设计了一番,应用了一些设计模式,效果还不错,基本达到了OCP的原则:对修改封闭,对扩展开放。
各位同学也可以想一想,自己的工作中有没有一些复杂的业务逻辑?能不能把他们单独拎出来做个设计?
再挑战下有难度的源码吧,大家把Spring“吹嘘”得神乎其神,一定得看看, 于是开始进入Spring源码,这绝对是一次痛苦之旅,多如牛毛的class,深不可测的函数调用层次,把人搞得头晕眼花,反复的调试,加上文档的配合,总算走出了黑暗森林,也体会到了Spring设计的一些妙处,尤其是软件开发最最重要的一点: 抽象。
当我在工作中再次遇到复杂的需求时, 也努力地去做抽象,寻找本质的东西,有一次竟然把业务操作抽象成二维坐标系下点的移动,让我喜不自胜,感受到了抽象的威力。
但是这样“顿悟”时刻还是太少了。面向对象的原则S.O.L.I.D 听起来很简单,23种设计模式理解起来也不难,但是想把这些原则和模式在实践中应用好,那可就不容易了,很多时候我在面对复杂问题的时候也是非常犯愁,无法找到合适的接口和抽象,最后做出的设计不尽如人意。
总结一下,想提升自己的设计能力,我的经验就是: 阅读书籍, 阅读源码,再加上不断地思考和实践。
谨以此和大家共勉。