l

2010年5月8日 星期六

從 The Timeless Way of Building 學設計 (1)

05/07 23:07 ~ 05/08 01:05

有一陣子 Teddy 很熱心地不斷跟周遭認識的人『推銷』The Timeless Way of Building 這本書,告訴他們這本書有多好,多棒,看了之後可以深入了解 design patterns 背後的理論基礎 (鄉民甲:知道這個東東要幹嘛?)。有少數幾個意志不堅的朋友誤信 Teddy 之言買了這本書,但是好像都沒有人認真的去讀這本書。Teddy 當年很幸運有好學不倦的指導教授與 Teddy 一起看這本書,一起討論,所以讀起來不孤單。也許這些被 Teddy 拐騙的朋友們沒有那麼幸運能有讀伴,所以可能看了幾頁就看不下去(如果曾經有鼓起勇氣打開這本書的話...)。

也許光是靠一張嘴是沒有用的,必須要舉例子說明讀這本書真的可以幫助提昇軟體分析與設計的能力,這樣才會有誘因下定決心去讀這本書。Teddy 為了『生出』一篇部落格文章(奇怪,明明沒有料還要硬擠),在此就舉個例子說明一下。

請翻到這本書第 19 章 Differentiating Space,接下來 Teddy 節錄本章的若干句子:

Within this process, every individual act of building is a process in which space gets differentiated. It is not a process of addition, in which pre-formed parts are combined to create a whole: but a process of unfolding, like the evolution of an embryo, in which the whole preceds its parts, and actually gives birth to them, by splitting.

看懂了,恭喜老爺,賀喜夫人。看不懂也沒關係,繼續看下去,看到最後再回頭看這一段。

***

Design is often thought of as a process of synthesis, a process of putting together things, a process of combination.

According to this view, a whole is created by putting together parts. The parts come first: and the form of the whole comes second.

But it is impossible to form anything which has the character of nature by adding performed parts.

作者的意思『應該』是說設計不是把『紅茶 + 牛奶 + 糖 = 奶茶』,或是說 『客廳 + 房間 + 廚房 + 廁所 + 陽台 + 玄關 = 房子』 的一種『合成過程』。作者在書中不斷強調『建築物要有生氣 (alive)』,不是買集合式住宅蓋好直接搬進去住就好了,因為集合式住宅的建築師根本不知道誰會搬進來住,因此不可能依據個別家庭的需求來建造與設計房屋。Teddy 『猜想』作者的想法應該比較接近日本電視節目『全民住宅改造王』那樣,要考慮到個別居民(家庭)的需求以及住宅地點特性來設計與建造。但是,要如何達到這樣的目的?請看下去。

***

It is only possible to make a place which is alive by a process in which each part is modified by its position in the whole.

In short, each part is given its specific from by its existence in the context of the larger whole.

This is a differentiating process.

設計應該是一種『差異化』(有人翻譯成『分化』...聽起來好像是要搞破壞...)的過程。什麼意思?上面這幾句應該很清楚了:每一個 part 要依據它所在位置的『地形地物』(context) 來調整,修正。這種調整,修正就是一種『差異化』的過程,使得這個 part 可以適應其所在的特定的『地形地物』。還是太抽象...Teddy 也知道...舉個例子,前一陣子 Teddy 看了另一個日本的節目,內容也是和蓋房子有關。一對夫妻在山坡地上買了一小塊地要蓋房子,建築師考慮到太太在廚房作家事時(站著)也可以和坐在客廳地板上的先生在聊天時有『目光接觸』,而不是只聽到彼此的聲音而已,以便增加夫妻相處時間的感情。夫妻都是上班族,每天一大早就要出門搭很久的電車到公司,平常在家裡相處的時間並不長。因此建築師特別做了兩項設計:
  • 把廚房安排在客廳旁邊
  • 廚房和客廳之間有若干 落差(好像是廚房地面比客廳地面要矮 50 公分之類的)
一般正常情況下我們都不希望室內有任何落差,尤其是家裡有老人家或是行動不便的人。因為就算是幾公分的落差都可能造成不便或是不小心跌倒。在這個 case 中,建築師設計了 50 公分這麼高的落差,乍看之下覺的很『瞎』(有多瞎...大概和『熊貓人』差不多瞎),但是這樣的設計,卻是可以讓太太在廚房作家事的時候,眼睛就可以直接看到坐在客廳地板上的先生的眼睛 (目光接觸),看到電視畫面之後覺的真的很完美。

因為屋主的錢大部分都花在買地上面了,剩下蓋房子的預算變得很少,因此設計師只能減少蓋房子的建地面積(就是蓋小一點的房子,例如本來可以蓋 50 坪現在只能蓋 30 坪之類的 )。加上屋主夫妻的特別需求,因此出現了有『落差』的室內空間。這就是『差異化』的過程,這種差異化使得這棟房子和全世界其他地方的房子都不相同,住在屋內的人也因為這樣的設計生活的很愉快。

***

書的內容就先講到這邊(因為 Teddy 已經超過就寢時間),那麼上面屁了這一大段,到底和『軟體設計』有何關聯?長話短說,用兩點說明:
 
  • 許多 design patterns 的初學者經常犯的一個應用 patterns 錯誤就是以為只要直接把 pattern A + pattern B + pattern C = System X。這種設計思考模式通常做出來的 System X 會變成四不像,雖然『設計圖上』看起來很熱鬧,這邊一個 pattern,那邊又一個 pattern,但是仔細一看又覺的這個設計怪怪的,但是卻又說不出為什麼怪怪的。這就是看這本書的用途啦,現在鄉民有幸讀到 Teddy 這一篇,就可以大聲說出:光是用『合成』的方式是無法得到好設計滴
  • 既然用合成方式不行,那麼到底要怎樣用『差異化』來設計軟體?簡單舉例,講錯不負責(周公在趕 Teddy 了,無法仔細思考):首先,要有 whole 與 part 的概念,然後當逐一將 part 擺到 whole 裡面的時候,依據 part 所在的位置調整 part 使其可以完美的融合到地形地物之中,最後變成其中不可分割的一部分。還是有聽沒有懂... 假設把 software architecture patterns 當成是 whole,design patterns 當成是 parts。今天有某個設計,預計採用 layered architecture (whole),其中 UI layer 要用 MVC (part),而 MVC 裡面用了 observer pattern (此時 MVC 變成 whole, observer 變成 part...),但是由於這個 AP 是一個網路分散式系統,因此 View 可能在網路的不同端,因此這個 observer pattern 就和 GoF 中標準的 observer 有點不同 (差異化)。仔細讀一下 design patterns 這本書,書中有很多 patterns 其實也都有提到差異化的作法,例如 proxy pattern 就可以依據應用環境再區分為 remote proxy, virtual proxy, 與 protection proxy。
***  

要做好差異化其實不是一件容易的事情,很多設計成功與失敗的地方,就在於差異化的好壞。大家平平都是套用差不多種類的 patterns,為什麼有的人開發的系統就比較容易了解,開發與維護,有的人的系統就好像麵線一樣,一坨一坨黏在一起。


讀懂 GoF 的 Design Patterns: Elements of Reusable Object-Oriented Software 可以從物件導向的角度來解釋設計,讀了 The Timeless Way of Building 讓鄉民們可以用更一般性,更抽象的觀點來解釋設計,這也是讓自己與一般平民百姓有所區別的『差異化』過程喔。

*** 

友藏內心獨白:奇怪了,Teddy 又不認識作者也不是出版社的人幹麼一直推銷這本書?

2 則留言:

  1. 最近認真看了這一本,我覺得如果沒有對生活有一定程度的體悟,是看不下去的XD

    回覆刪除
  2. 好書 !感謝Teddy力推,我買到中文版的也不貴,很有靈魂的一冊。(至於怎麼樣用到專案上就aonther story....)

    回覆刪除