l

2012年10月2日 星期二

設計模式的逆襲:種子篇

Oct. 01 15:48~17:20

image

 

今年八月底Teddy開了為期三天的「Design Patterns這樣學就會了:入門實作班」。課程的講義內容與範例是Teddy自己準備的,但是這個課程有贈送每位學員一本《大話設計模式》讓學員們在課程結束之後可以回家 窒息 自習。其實Teddy的內心裡,是希望學員們能夠讀GoF的《Design Patterns》這本書,但是基於以下幾個理由改送《大話設計模式》。。

  • GoF這本書,不管是英文版,或是翻譯的中文版,其實都不是很容易理解(有看沒有懂)。
  • 《大話設計模式》這本書前一陣子Teddy有快速讀過一遍,裡面的例子相較之下很容易理解,算是一本寫的還不錯的書。
  • 《Design Patterns》英文版比《大話設計模式》貴很多 XD。

由於《大話設計模式》繁體中文版是由「悅知」出版,Teddy的《笑談軟體工程:敏捷開發法的逆襲》也是由「悅知」出版,因此Teddy就請認識的出版社編輯小姐幫忙訂購書籍。結果編輯小姐就建議「Teddy自己寫一本,自己賺版稅 XD」。當時Teddy看了編輯小姐的建議心裡就在想:「嘿嘿,想害我。寫一本書版稅真的賺不到多少錢,但花費的時間卻非常的多,完全不成比例」。

後來因為Teddy又開了「模式入門第一堂課:30 分鐘寫出一個模式」,投資了更多的時間在pattern上面,慢慢發現市面上的書籍存在著一些問題。

  • 太難理解:如果要深入學好Design Patterns,首選的書籍當然是GoF的《Design Patterns》。但是現代人通常沒什麼時間也沒什麼耐性(這是一個很強的force啊),要慢慢地把GoF的《Design Patterns》看懂並吸收裡面的日月精華,是一件費時又費力的事情。有誰願意至少花個3-5年來「精通」《Design Patterns》?
  • 太過範例導向《大話設計模式》、《設計模式之禪》、《王者歸來:品味Java的21種設計模式》(剛好這三本都是大陸同胞所寫的書 XD)這三本常見的中文書,都是以「範例」為出發點,用簡單易懂的範例來說明每一個pattern。這種以範例解釋設計模式的方法,算是對每個設計模式提供一種操作型定義」,這其實是一種很不錯的教學切入點。但是讀完之後又覺得有些在GoF的《Design Patterns》針對每個模式所想要表達的「抽象定義」觀點好像不見了。
  • 長得太像:最後一點不知道算不算是一個問題,就是上面提到的這三本中文書,怎麼內容與結構都如此的「雷同」啊!除了用範例導向的方式來解釋個別的pattern以外,都剛剛好「順便」介紹了Open-Closed Principle、Single Responsibility Principle等幾個物件導向設計原則。難道這就是傳說中的「山寨 英雄所見略同」?

***

少了什麼?

如果Teddy真的去寫了一本有關設計模式的書,而這本書的內容表現方式只是台灣搞笑版的《大話設計模式》,或《設計模式之禪》,或《王者歸來:品味Java的21種設計模式》,那就不值得一寫。畢竟寫一本中文的專業電腦書,「經濟上」的代價實在是太少,必須要有「其他的意義」,才值得一寫。

這個「其他的意義」是什麼,Teddy一直遍尋不著,所以也就沒有寫書的念頭。一直到這幾個禮拜,Teddy在思考force的問題,似乎慢慢發現「其他的意義」:

從Pattern的原點思考,回到pattern的六個基本格式,發現從GoF的《Design Patterns》的撰寫格式,其實Teddy沒有辦法立即很清楚的回答幾個簡單的問題。例如,每一個pattern要解決的問題是什麼?這些問題中存在那些force?鄉民們如果願意花點時間去讀一下GoF的《Design Patterns》,會發現其實GoF的書中,很多篇幅都在談solution。包含Intent與Motivation,仔細閱讀很容易發現solution的影子,但是卻不容易找出problem是什麼。Problem經常是需要讀了一大段文字之後,讀者必須要自己去推敲。無法用一或兩句話寫出problem是什麼,這其實是一個很嚴重的問題,代表說讀者腦袋中無法用簡單且抽象的概念,來記憶、說明、比較這每一個pattern要解決的問題是什麼。做軟體的人應該都知道,要先了解問題,再探討解法才有意義。所以,無法直接指出每一個pattern的problem,這就是一個很嚴重的problem XD。

***

從Teddy上面所講的這一堆有個沒的事情,對於「如何寫出一本好的設計模式書籍」這個問題,可以找到幾個force:

  • 原本GoF的《Design Patterns》書中所要表達的「抽象定義」觀點,不能因為採用「操作型定義」的寫作方式而消失。
  • 只強調「抽象定義」而沒有容易理解的範例,讀者透過實作來理解pattern的過程將會遇到困難。
  • 每一個pattern的問題如果無法被清楚的被描述,讀者將不容易比較相似pattern之間的差異,也容易發生誤用的情況。

要解決上面這幾個force,Teddy提出的solution是:

  1. 以容易理解的範例說明pattern六個基本元素(Name、Context、Problem、Force、Solution、Resulting Context)的概念,
  2. 將GoF的《Design Patterns》重新整理之後,用新的格式來表達,
  3. 提供完整且容易瞭解的範例程式,使得讀者有能力夠過實作來加強理解每一個pattern。

第1點和第3點Teddy都有初步的資料,所以接下來的工作就是把每一個pattern重新整理,用新的格式來表達,這樣就新書的雛型就出來了。講是這樣講,23個pattern要一個、一個整理,也是頗花時間與心力的工作。但無論如何,這樣的一本Design Patterns新書,才不會流於「又是另外一本設計模式的書」,花時間去寫也才有意義(希望有朝一日完成後可以反攻大陸 XD)。

***

友藏內心獨白:Force好像少寫了「搞笑」這一點啊 ?!

5 則留言:

  1. 《大話設計模式》透過範例說明解說設計模式,內容有趣容易上手,但缺少context與force的分析過程,很難將學到的知識實際應用。期待Teddy快點把《設計模式的逆襲》生出來,我要買一本作者簽名珍藏版的 XD

    回覆刪除
  2. 請問有打算什麼時候出嗎?最近在專研設計模式也一直苦無找不到一本好的書!!

    回覆刪除
  3. 看了大話設計模式覺得以初學(程式白癡)的視角還蠻好懂的
    但是看完之後又覺得不足夠(缺乏練習,講簡單就是不懂)
    又去買了GoF的
    感覺有大話設計模式的範例當入門再去看GoF就好懂
    就像是真的在現實生活中programming遇到問題再去找解法才會更能吸收
    期待設計模式逆襲~

    回覆刪除
  4. 《設計模式的逆襲》+1 ( 敲碗~~~ )

    回覆刪除