碼農是怎么提高設計能力的?
“欣哥,你是怎么提高設計能力的? ”
這個問題最近被人問及, 我回想了下這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種設計模式理解起來也不難,但是想把這些原則和模式在實踐中應用好,那可就不容易了,很多時候我在面對復雜問題的時候也是非常犯愁,無法找到合適的接口和抽象,***做出的設計不盡如人意。
總結一下,想提升OO的設計能力,我的經驗就是: 閱讀書籍, 閱讀源碼,再加上不斷地思考和實踐。
謹以此和大家共勉。
【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】