5/13 23:29 ~ 5/14 00:20
有些人在念研究所的時候研究 design patterns 相關的題目,指導教授可能叫你寫幾個 patterns 出來再舉一些例子就可以畢業了。不知道鄉民們有沒有想過這個問題:
『要如何生出一個新個 pattern』?今天 Teddy 來談一下這個問題(醜話說在前面,Teddy 部落格上的內容純粹為 Teddy 個人狂想曲,產品成分可能包含重金屬與不明配方,鄉民們自行服用之後若有任何副作用 Teddy 恕不負責)。
***
Teddy 第一份工作做的是 e-learning,因此當 Teddy 辭掉工作去念博速班的時候,指導教授建議 Teddy 可以研究『E-learning patterns』。這個主意還不錯,因為 Teddy 對於 e-learning domain knowledge 與 design patterns 都滿熟的,又有 e-learning 實務經驗,於是 Teddy 便開始了三年 (還是四年,這麼快就忘了!) 的 e-learning pattern languages 研究生涯。
俗話說:『事情不是笨蛋想得那麼簡單』,真正要自己『生』出一套 patterns 出來,才發現箇中的難處。雖然 design patterns 還算熟,但是
『用 patterns』和
『生出 patterns』是兩回事,此時想到 GoF 的書裡面提到他們的研究是得到 The Timeless Way of Building 的啟發,指導教授與 Teddy 就想這本書裡面會不會有教導『如何生出 patterns』的方法,所以萌生看這本書的想法。
翻開課本第 14 章:Patterns which can be shared
To work our way toward a shared and living language once again, we must first learn how to
discover patterns which are deep, and capable of generating life.
第一個重點來了,
patterns 不是被『創造』出來的,而是老早就存在,等著被『發現』。就好像生物不是被『創造』出來的,而是被『發現』。(當然以現在的技術也許真的可以無中生有創造出一個全新的物種,但這畢竟是人工的,不是天然的...記得嗎...電視廣告有交代:『天然A尚好』)這也是為什麼有些 patterns 用起來會覺得很好,很自然,有些卻覺得很生硬。後者可能就是『基因改造』的 patterns...
Each pattern is a three-part rule, which expresses a relation between a certain
context, a
problem, and a
solution.
As an element in the world, each pattern is a relationship between a certain context, a certain system of forces which occurs repeatedly in that context, and a certain spatial configuration which allows these forces to resolve themselces.
上面這一段有學過 design patterns 的鄉民們應該就比較熟悉了,從結構上來說,patterns 的三大要素:context, a problem, and a solution。在 GoF 第三頁則說一個 pattern 有四個基本元素:pattern name, problem, solution, consequences,耶怎麼不一樣...基本上還是一樣的,pattern name 就不用提了,一定要有,至於 Alexander (The Timeless Way of Building 的作者) 所說的 context 和 GoF 所說的 consequences 從字面上來解釋只是套用 pattern『之前』和『之後』的差別(美容前,美容後),因此 consequences 也叫做 resulting context (美容後)。如果不要把 context 特別侷限在套用 pattern 之前,那麼 context 應該包含了 consequences。簡單的公式
context --> applying a pattern --> resulting context (consequences)
看不懂請跳過...
As an element of language, a pattern is an instruction, which shows how this spatial configuration can be used, over and over again, to resolve the given system of forces, wherever the context makes it relevant.
The pattern is, in short, at the same time a
thing, which happens in the world, and the
rule which tells us how to create that thing, and when we must create it.
It is both a process and a thing; both a description of a thing which is alive, and a description of the process which will generate that thing.
這邊有一個重點,pattern 是一個『東西』同時也是一個描述如何產生這個東西的『流程』。所以,如果鄉民們發現了一個新的 pattern 打算將它寫下來,而其他人在看過你所寫的 pattern 之後了解到這個 pattern 的確有意義,但卻無法如法泡製,那麼這可能表示你所描述的 pattern 只是一個『thing』,而還不具備『process』的特質。
***
講了這麼多,那到底要如何發現一個 pattern?如果是要寫 pattern,可能會以 context -> problem -> solution 的順序出現,但是發現 pattern 的順序剛好相反。
We must first define some physical feature of the place, which seems worth abstracting.
因為 Alexander 尋找的是建築領域的 patterns,所以他提到『define some physical feature (i.e., spatial relationships, 空間上的關係)of the place』。例如,你到了總統府旁邊的『台北賓館』,覺的這裡面怎麼那麼漂亮啊,雖然是老建築物,但是裡面的一些設計用在當代還是很有用。因此,你想要找出這些你覺的好的設計,這就是『尋找 pattern』的第一步,從好的建築物(或是軟體,或是其他領域裡面被認為是好的東西)中定義出 physical feature (如果是軟體的話,就可能包含靜態結構關係與動態互動關係)。
Next, we must define the problem, or the field of forces which this pattern brings into balance.
Finally, we must define the range of contexts where this system of forces exists and where this pattern of physical relationships will indeed actually bring it into balance.
***
最後 Teddy 要補充說明,找出 patterns 的研究是一種『
empirical study』,就是說要從實務經驗中來尋找 patterns。就好像新物種幾乎都是在野外原產地被發現是一樣的道理,不太可能坐在冷氣房裡面理論推導一番就可以『發現』新物種。Alexander 和他的同事也是花了 10 幾年以上的時間來發現與實際驗證建築領域的 patterns,而 GoF 裡面的 patterns 也都有 Known Use 這的段落(說明那些知名的軟體也用了這個 design pattern)。而 Erich Gamma (GoF 的第一個人) 自己也是開發了很多軟體來驗證這些 design pattern,包含比較沒人知道的 HotDraw 以及很有名的 JUnit 還有 Eclipse。
結論就是,除非鄉民們對於某個領域很熟,也有多年的實務經驗,不然隨便亂找 patterns 可是會變成『誤入叢林的小白兔』,害人害己啊。
PS:Teddy 當年也很想研究 A Pattern Language for Computer Game...但是 Teddy 只會玩『青蛙過馬路』這一種等級的遊戲,所以只好放棄啦。當時真恨自己沒有從小卯起來玩 game...
***
友藏內心獨白:言語無法形容,只能用心體會。