[轉載]探尋軟件的永恒之道 
   

探尋軟件的永恒之道
――評介《建筑的永恒之道》

撰文/透明

從模式說起

“模式”這個詞進入中國軟件開發者的視野,是從《設計模式》[2]一書開始的。2000年9月,中國的軟件開發圖書市場還遠不如今天繁榮,相信這本書給絕大多數人的都是一種耳目一新的感覺。突然之間看到如此之多精致優雅的解決方案,足以令長期苦苦探索設計之路的開發者們“漫卷詩書喜欲狂”了。

在那個時候,我也是模式的癡迷者之一。還記得2001年,我和朋友的通信中多次表現出這樣的癡迷。下面是我2001年10月給朋友Windy的一封信:

對“面向模式的設計”的開悟,在十三陵。

站在長陵的綾恩殿,宏大的建筑,給我一種鵜鶘灌頂的感悟。那天John Vlissides說,Christopher Alexander曾經說中國的建筑給了他很多靈感。今天,我想我抓到了一點大師的感觸。

繁復的構造,精巧的設計,卻能天衣無縫的組成如此完美的建筑。無疑這是設計的成功。仔細觀察之下,發現對于各種各樣的建筑,其組成元件――欞椽梁柱――卻都是毫無二致。這是多么高的復用程度!這體現了多么成熟的設計體系!

……

在公路邊,一些建筑工人在建造一組仿古的房屋。朝代更替,光陰流逝,但工人們仍然能夠完美的仿造四百年前的建筑。因為他們一代代流傳著精確而形象的模式語言。

盡管我看Shalloway的Design Patterns Explained已經有一段時間,在今天,我終于知道為什么他如此鐘情于Alexander的建筑模式了。


可惜,由于缺乏一種文化的積淀,《設計模式》的讀者們(包括我在內)都患上了消化不良。我大膽估計,《設計模式》在中國軟件業造成的負面效果絕不少于其正面效果。Alan Shalloway曾經說,“模式”并不僅僅限于“設計”,甚至“設計”二字正是導致最多誤會的根源[3];John Vlissides在他的Pattern Hatching中列舉了對模式的“十大誤解”,其中提到“模式并不僅僅是一種解決方案”[4]。但是,有多少人知道,為什么?

正是因為缺乏必要的背景知識,中國開發者對模式的了解往往是片面的甚至是錯誤的。如果把模式僅僅視為一種解決方案、或者一種反復出現的情況的總結,那么它頂多只對軟件開發有一定的幫助或者指導意義;如果只把模式作為預先(up-front)設計的方案,它甚至會導致過分工程(over-engineering)。總而言之,模式頂多只能算一種“好東西”,至于“永恒之道”這種溢美之詞,即使最鐘情于模式如我,也是不敢出口的。

建筑的永恒之道

在面對一門有數十年思想基礎和十余年發展歷史的學科時,我們必須承認自己的淺薄,我們必須不斷學習。同時,我們必須有自己的思想。蘇格拉底說:“我們無知,所以我們有智慧。”

為了真正理解GoF的思想,為了真正理解模式的思想,我們有必要先深入其思想基礎。于是,我翻開了手上的書。于是,我看到了與我以往的理解完全不同的知識,我看到了一個嶄新的世界。

記得上面的一個問題嗎?“模式并不僅僅是一個解決方案”。這句話是什么意思?請看下面這段話:

……模式系統形成了一種語言。

從數學觀點看,最簡單的語言是一個包括兩個系列的系統:

1. 一系列要素或符號。

2. 組合這些符號的一系列規則。

然而,……模式既是要素,也是規則,所以規則和要素不可分。模式就是要素。每一模式也是一個規則,它描述了本身也是其他模式的要素的可能的排列。[5]

于是豁然開朗。從最初的定義開始,模式就不僅僅是解決方案,而是一種完整的語言。作為解決方案,模式構成了語言的要素;而作為語言規則時,模式的意義同樣重要,甚至更加重要。而這個方面常常被《設計模式》的讀者們忽略了。

僅從書名就可以看出,作者把模式當成“建筑的永恒之道”――這種說法是否有點太不謙虛了?請看作者的解釋:

有人已告訴我們,優秀的建筑與低劣的建筑,優秀的城市與低劣的城市之間沒有客觀的差別。

其實,建筑、城市的好壞之別是一個客觀的問題……不過易于理解,為什么人們如此堅信好劣建筑之別沒有單一堅實的基礎。

這是因為產生這種差別的獨特的中心特質無法命名。

(為什么這種特質無法命名?)

把(這種)無名特質想象為一點,我們試的每個詞作為一個橢圓。每個橢圓包括這點,但每個橢圓也包括許多遠離此點的其他的意義。

因為每個詞總是像這樣的一個橢圓,所以每個詞對于作為點的特質來說,總是太空泛,太不明確,范圍太大。沒有一個詞可以表達無名特質,因為特質太特殊,詞太廣泛了。但是,它是存在于任何人、任何東西之中的最重要的特質。[6]

很明顯,這里所說的“好”的建筑和“差”的建筑,都不包含結構有缺陷的“豆腐渣工程”。在結構工程學能夠保證結構的穩固、健壯之后,建筑師們想到的便是如何讓建筑真正滿足人的需要。在書中,作者多次表示,盡管現代建筑有極其優秀的結構,卻缺乏優秀的設計,導致大量的建筑違背人的本性。

我們已經說到了“人的本性”。那么,建筑中“人的本性”在哪里?它就在數千年流傳的模式語言中。一個特定的模式,在特定的場景下,輔以特定的相關模式,它就是符合人的本性的,因為模式是“允許其自身內力自我疏解”的,而模式語言又是有活力、能夠自我發展的。所以,基于模式設計、設計反向影響模式語言,這樣的過程正是“建筑的永恒之道”。

在此有些個人見解:我們已經太習慣于IT圖書那種填鴨式的教學方法了,我們已經太習慣于“一本入門應用、一本進階原理、一本參考資料”的讀書方式了。再說一次,當我們面對Christopher Alexander這些人文氣息濃厚的技術書籍時,我們必須承認自己的淺薄和無知,我們必須用自己的智慧來思考。中國人最擅長邏輯思維,是以中國人也最容易被一些似乎有意義的詞匯蒙蔽雙眼而陷入邏輯先驗不能自拔。當《建筑的永恒之道》在一開始就告訴你“這種中心特質”無法命名的時候,你是不是很不能習慣?繼續讀下去,讓你快要生銹的大腦運轉起來吧。

回到我們的模式

我這里所說的“我們的模式”,是指“軟件開發中的模式”。介紹了這么多建筑學中的模式,對于軟件開發者有什么意義嗎?或者說得更直白一些,模式會是“軟件的永恒之道”嗎?對此,我沒有答案,只有討論。不過我相信,沒有人能夠知道真理,有討論、有思考,我們就能離真理更近一些。

由于此書成于1979年,作者又是一位建筑學家,書中自然也無法給出關于軟件開發的答案,仍然只能靠讀者自己去思考。讀完兩遍之后,我的心得大約有以下幾點:

----和建筑結構一樣,軟件中亦有諸多的“內力”。和建筑設計一樣,軟件設計也應該努力疏解系統中的內力,使系統趨于穩定、有生氣。一切的軟件設計都應該由此出發。

----任何系統都需要有變化,任何系統都會走向死亡。作為設計者,應該擁抱變化、利用變化,而不是逃避變化。

----好的軟件只能“產生”而不能“創造”,我們所能做的只是用一個相對好的過程,盡量使軟件朝向好的方向發展。從這個角度來說,開發的迭代周期越短越好。

----軟件的工業化使軟件僵死、失去“無名特質”、謬誤百出、脫離現實。通過規程、制度來控制,只會使系統內力無從疏解,最終走向崩潰。

----……

我好象沒有提到模式?因為整本書講的都是模式。至于如何在軟件的領域中看待模式,那需要你自己去思考、去體會了。

模式到底是不是軟件的永恒之道?最終,我還是無法給出一個答案。但是,我相信,充分理解模式語言,充分理解模式語言和設計的關系,會幫助我們提高設計能力,也會幫助我們豐富模式語言。

未完的結尾

本文即將結束。作為對一本書的介紹,我并沒有介紹它的著、譯質量。不是疏忽,實在是不必說。作者Christopher Alexander用了14年的時間來撰寫此書,譯者趙冰用了數年的時間來翻譯此書――我們所看的IT圖書,翻譯周期極少有達到一年的。還需要懷疑這本書的質量嗎?

在讀完第一遍以后,我寫過一篇名為《“軟件藍領”批判》[7]的讀書心得,引起了許多爭論。可惜,參與爭論的網友,絕大多數并沒有理解我寫那篇文章的背景知識,所以大半的討論都沒有意義。在此,我挑選最有意義的一個回復來回答,權當為此文作結,也希望張巖先生能看到這篇文章。

張巖對我說:

Alexander是個建筑師,建筑師關心的是建筑如何能符合人的需要,也就是建筑的“軟”質量。至于建筑的“硬”質量,是由結構工程師來確保的,建筑師既沒有能力,也沒有責任對建筑的“硬”質量負責。因此建筑師的地位類似于軟件工程中的總體設計師或曰架構設計師(現在不是也叫Architect了么?),在這一族群里當然沒有所謂藍領的容身之地。但軟件就沒有“硬”質量的要求了么?當然是有的,所謂編碼強度是也。不死機、不溢出、不誤操作等等。這些是由程序員來保證的,Architect同樣也管不到這一段。因此通常意義上的Software Enginner或者Programmer相當于建筑中的結構工程師的角色。這些人的思維方式應該是內聚的,不能具有發散性,否則“硬”質量無從保證。而模塊也是在這一層次上才開始引入的。

要知道,在建筑開發過程中,建筑師是最不受工程化方法約束的人。因此如果討論工程化方法,是不應該用建筑師的思維方式去類比的。建筑史上有段“佳話”:悉尼歌劇院,建筑師的發散性思維害苦了結構師,結果整個建筑超預算超了一個數量級!但建筑落成之后的收益卻比原先預計的高了一個數量級。因此創造性是“建筑師的武器、結構師的噩夢”。建筑與結構是貫穿建筑界始終的一對矛盾,在軟件設計中同樣存在類似的問題。因此僅僅以建筑學的視角看問題,我個人以為是有點偏頗的。


我在此回答:

你的回復告訴了我很多以前不知道的知識。帶著這些知識,我又讀了一遍《建筑的永恒之道》。并且,我想我找到了答案。

建筑師不受工程化方法約束,但任何人都受自己的模式語言約束,而模式語言本身是受工程化方法約束的。悉尼歌劇院的例子,是在擴充模式語言,這是非常罕見的。當模式語言擴充之后,再利用這些模式語言來建筑,就能得到“質量提升了一個數量級”的建筑,成本卻不會再“超一個數量級”。不知道你最近去過大運村那邊沒有?Philip Cox在那邊設計了一個名叫“錦秋知春”的小區,采用了很多悉尼歌劇院中曾經采用過的元素(或者叫模式),相信它的成本是不會超過預算一個數量級的,對吧?之所以在悉尼歌劇院的例子中出現這樣的窘境,我相信是因為結構工程的滯后――人的思想總是超前的,我們應該讓滯后、僵硬的物理去適應超前的、有生氣的思想,而不是相反,對嗎?
--------------------------------------------------------------------------------

[1] 現在讀者可以在中國互動出版網(http://www.china-pub.com/)購買《建筑的永恒之道》一書及其姐妹篇《建筑模式語言》(A Pattern Language)和《俄勒岡實驗》(The Oregon Experiment)

[2] Eric Gamma等著,李英軍等譯,《設計模式》(Design Patterns),機械工業出版社2000年9月。

[3] 2002年4月30日UMLChina主辦的Alan Shalloway網上交流記錄,http://gigix.cool2u.net/download/Shalloway.pdf

[4] John Vlissides,《模式的十大誤解》,http://gigix.cool2u.net/download/topten.pdf

[5] Christopher Alexander著,趙冰譯,《建筑的永恒之道》(The Timeless Way of Building),知識產權出版社2002年2月,第144頁到第145頁。

[6] Christopher Alexander著,趙冰譯,《建筑的永恒之道》(The Timeless Way of Building),知識產權出版社2002年2月,第21頁到第30頁。

[7] http://expert.csdn.net/develop/Article/13/13656.shtm