l

2014年3月21日 星期五

如何學習GoF Design Patterns?

Mar. 17 17:05~18:58

螢幕快照 2014-03-11 下午6.45.15

 

前幾天收到一封信,有位「學員候選人」寫信問Teddy:

我是C#程式設計師,曾經自修看過大話設計模式。目前的程度大概就是勉強看得懂一些基本的設計模式。不知道我適合上Design Patterns入門或進階方面的課程嗎?

***

答案當然是:「非常適合啊」熱戀。但是光說適合沒用,要告訴對方為什麼適合,否則就只是為了推銷而推銷。要回答這個問題,必須要問一個更基本的問題:「要如何學習Design Patterns?」

傳統學習Design Patterns的方法有:

  • 看書:Teddy「大膽假設一下」,大部分的人都是從看書開始學習Design Patterns。早些年只有GoF的書可以看,雖然這是設計模式「聖經版」,但是書中的很多說明過於簡潔,讀起來不是那麼好懂。就好像是剛念碩士班的學生被老師要求讀論文一樣,假設每個英文字都看得懂,但是整個句子連起來就是不知道背後想要表達什麼意義。

GoF的書還有一個缺點,就是例子舉的不是很容易讓初學者可以看懂。所以後來市面上出了很多設計模式的書,像是非常有名的《深入淺出設計模式 (Head First Design Patterns)》,以及《大話設計模式 》。前者以解釋物件導向精神著稱,例子也算是舉的不錯。後者以淺顯易懂又通俗的例子,以及鄉民對話為賣點。

Gamma在一篇訪問中曾經說過,他也鼓勵大家多讀其他設計模式的書。

  • 寫程式:光看書其實沒辦法學會設計模式,就好像光看食譜不會變成「阿基師」,一定要搭配實作練習。就算是把書上的例子照著打,有打過一遍跟沒有打過一遍的差別還是很大(最好可以多練習幾次)。所以,當書上的解釋看不懂的時候,不要停下來,直接去實作吧。
  • 看別人的程式:除了自己寫程式以外,還有另外一招就是看別人寫的程式。當然這些「別人的程式」一定要是好的程式,而不是那種「像豬一樣的隊友」所寫出來的程式。找些有名的開源軟體,像是Eclipse,看看人家的程式是如何設計,如何套用模式,可以增長不少功力。
  • 作專案:書上的例子畢竟大部分都只是「玩具等級」的程式,有些甚至「人造性質」非常重,作多了對於實際應用幫助有限。對設計模式有了基本了解之後,應用在實際專案中,解決真實世界的問題,就可以慢慢地把設計模式內化為自己的一部分。
  • 網路資料:現在網路發達,從各種技術網站、部落格、網路課程、甚至是Youtube,都可以找到很多不錯且免費的資源。
  • 找前輩討論:初學者自己套用設計模式經常會發生誤用的情況,可能發生「殺雞用牛刀」,甚至是「殺雞用原子彈」(過度設計)。也有可能根本誤用,隨便把幾個看起來相關的模式湊再一起,看看能得到什麼設計。這就好像人類把老虎和獅子抓來配種,生下來的寶寶是沒有生殖能力的動物,也很容易夭折。這時候,如果有經驗豐富的人可以討論,就可以少走一些冤枉路。
  • Pair Programming:雙人編程(搭檔編程)也是一種學習設計模式(廣義的說,學習各種技能)的好方法。10幾年前Teddy曾經用VB 6.0開發一個「多媒體教材製作工具(authoring tool),因為支援基本的繪圖功能,所以有很多設計模式剛好合適用來解決設計的問題。後來公司請了一個新人要來接手這個系統,新人看了程式碼之後傻眼,因為在那個年代沒看過有人用VB把程式寫成這樣子的。
    後來Teddy藉由修改程式或是新增功能的機會,一邊改一邊解釋給新人聽,順便告訴他用到的那些設計模式是作什麼用的,為什麼要用。後來新人了解了設計架構之後,很快的就有能力可以接手改程式。

    ***

Teddy學習設計模式的方法大概也就是上面這幾種。很多人用了pattern一陣子之後,會遇到一個問題:每一個設計模式看起來可能不難,但是在專案上實際遇到問題,還真不曉得要如何用模式來解決。這個問題的答案,Teddy也是經過好幾年,後來回學校念書,接觸的Alexander的書,慢慢才體會到GoF的書,以及仿間大部分的書,都少了Alexander原本所提「模式」的一些精神:

  • 什麼是設計:既然是要學「設計模式」,那麼請問各位鄉民,什麼是「設計」?
  • 什麼是模式:同上面的問題,既然是要學「設計模式」,那麼請問各位鄉民,什麼是「模式」?如果鄉民們能說出「模式是在某個特定情境下,對於一再重複出現的問題,所提出經過驗證的解法」,那就已經很不錯了。但是,還不夠,要知道模式的內涵:name、context、problem、force、solution、resulting context,最好能夠自己動手寫幾個(整理幾個)別人還沒發現的模式出來。
  • 什麼是好的設計:知道設計與模式的定義,接下來就要問,什麼是好的設計?這個問題的答案,會決定大家套用模式的合適程度。
  • 如何用模式解決大問題:單一模式可以解決小問題,如何套用多個模式來解決較大的問題,又不會導致「套錯」或是「過度設計」。

以上這四點,其實Teddy已經在部落格中談過好幾次。這些觀念,和使用哪一種程式語言完全沒有關係,和懂不懂物件導向設計也沒有關係。只和你願不願意動腦、願不願意思考有關。這也是學模式最難的地方,因為要去讀Alexander的書才能體會,很可惜在台灣絕大部分的軟體工程師都沒讀過他的書。

***

再回到原本的問題,一個C#程式設計師(或是使用其他物件導向語言的開發人員),不管他有沒有讀過任何一本設計模式的書,對於物件導向的觀念是否深入,只要願意動腦(會寫信給Teddy問問題,就先假設一下他是願意動腦的很棒),都可以來上Teddy的設計模式課程,也都有能力聽得懂。

    ***

友藏內心獨白:這篇不是廣告文啊。

沒有留言:

張貼留言