一枝看上去很美的花——書評《Java與模式》 (轉)

worldblog發表於2007-12-14
一枝看上去很美的花——書評《Java與模式》 (轉)[@more@]

一枝看上去很美的花

——書評《與》

撰文/剃刀

(本文首發於《員》雜誌年第1期):namespace prefix = o ns = "urn:schemas--com::office" />

躺在我面前的,是閻宏博士編著、電子工業出版社出版的厚達1024頁的《Java與模式》。如果按照我的朋友Jacques Lebrun在他的《The Mythical Man-Month:一次豆豆式的書評嘗試》中的說法,這本書是要歸於“體態狼伉”的“龐然巨物”的,而且恰好1K的頁碼數的確也很能“讓人產生心理障礙”了。不過,由於本人研究模式理論有日,也知道在設計模式方面很難寫出一本能“作掌上舞”的小書,所以,還是暫且拋開“豆豆式”的批評套路,回到嚴謹的批評上來。在《Java與模式》的序1中,朱天華博士將此書盛讚為“散發著奇妙香氣的曼妙花朵”,而我對它的評價則是“一枝看上去很美的花”。

直到最近,中文的模式理論類書籍只有《設計模式》一本。《設計模式》的經典地位毋庸置疑,但是其中使用的範例太老舊,很難讓讀者獲得直觀的感性認識,兼之理論闡述太過抽象,導致閱讀體驗極差。《設計模式》的讀者普遍反映“看不懂”,實是情理之中。而《Java與模式》是迄今為止第一本模式理論的中文教材,自然,也是最好的一本,因為並沒有第二本。

對於《Java與模式》這本書,作者閻宏博士的期望並不僅僅是普及模式理論和設計模式技術,而且還希望探索模式理論的哲學根源,將設計模式技術與中國傳統文化結合起來。這種技術的形而上學探索,便是朱博士所讚的“奇妙香氣”,也正是筆者說它“看上去很美”的原因。在本文中,筆者也將對這兩方面分別評論,以期給這本書一個全面而不失之偏頗的評價。

迄今為止最好的模式教材

一本模式教材應該是什麼樣子的?或者說,如何評價一本模式教材的優劣。

首先,這本書應該對C.Alexander的模式理論作必要的介紹。畢竟大多數讀者接觸“模式”這個詞是從“設計模式”開始,他們學習模式的目的是提高開發的能力。模式教材的作者不可能也不應該假設他的讀者都讀過《建築的永恆之道》。由於Alexander的模式理論對軟體模式的形式、理論有著極其深遠的影響,因此模式教材的作者應該幫讀者補上這一課。

其次,這本書應該對面向的一些指導性原則作必要的介紹。像開放-封閉原則(OCP)、Liskov替換原則(LSP)、依賴倒轉原則(ISP)等原則,是物件導向努力的方向。同樣,一個負責的作者也不應該假設他的讀者都讀過Robert Martin的Designing Oriented C++ Applications Using The Booch Method,他也應該幫那些物件導向的初學者補上這一課。

第三,這本書應該對《設計模式》書中提到的大部分模式作足夠詳盡的介紹。由於《設計模式》的經典地位和它的枯燥晦澀,一本模式教材最應該做的就是不厭其詳地介紹《設計模式》中一些重要模式的來龍去脈,說明它們為什麼必要,說明它們的適用範圍以及(更重要的)不適用的範圍,說明它們如何解決問題以及遺留下的問題。如果不能解答《設計模式》給讀者留下的這些疑問,一本模式教材將無法引起讀者的共鳴,也無法給讀者立竿見影的效用。

最後,書中的內容應該“與時俱進”。範例應該來自應用更為廣泛的軟體專案,語言最好是Java或者(由於C++內在的侷限性,並不適合用於描述設計模式),圖例應該用UML……儘管我很推崇Robert Martin那本書,但如果看到一本今天的模式教材還在用Booch方法,我一定先把它扔到一邊去。

在我所見到的模式書籍中,Alan Shalloway的Design Patterns Explained和閻博士這本《Java與模式》都符合上述四點要求,所以都可以被評為“好的模式教材”;而Pattern HatchingThe Pattern Almanac等書則不符合上述要求,因此不是“好的模式教材”(請注意:不是好的模式教材,並不妨礙它們成為好的模式專著。但那不在我的評判範圍之內,因此我不做評判。對適用範疇之外的事物保持恰當的沉默,是嚴謹的科學態度所必須的)。現在Design Patterns Explained尚未出版中譯本,因此不論它是否優於《Java與模式》,後者都是迄今為止最好的中文模式教材。

除掉“Alexander的模式理論”和“物件導向設計原則”這兩項要素之外,《Java與模式》這本書有兩個值得注意的特點:第一,它採用了大量從金融業務中抽取出來的Java程式碼示例;第二,書中穿插著大量源自中國古典名著的哲學小品。關於第二個特點,我將在後面評論。至少,閻博士紮實的基礎和長期在華爾街開發軟體專案的使得這些範例不至於像《設計模式》中的範例那樣生澀,也不至於像The Joy of Patterns中的範例那樣流於簡單。

但是,這並不意味著閻博士對模式的闡述並無缺陷。對於模式來說,除了“解決方案(solution)”之外,最重要的元素還包括“問題(problem)”、“(force)”和“效果(consequence)”。讀者每學習一個模式,除了學到模式所代表的解決方案之外,還必須相應地學到該模式所適用的範圍(由“問題”給出)、不適用的範圍(由“約束”給出)和該模式造成的正反兩面的效果。否則,讀者僅學到一個解決方案,卻不知道應該在何時使用(以及,在何時不使用),則只能靠自己在不斷的試錯過程中摸索該模式的約束條件。摸索模式的約束條件,與摸索問題的解決方案,兩者的工作量往往相差無幾——也就是說,模式將沒有任何幫助。閻博士對此顯然是很清楚的,在《Java與模式》的1.6節中,閻博士明確無誤地列舉出了模式的“十大要素”(包含了一些並非最重要的要素,如“範例[example]”、“已知應用[known uses]”等)。

可是,在講解具體模式的時候,閻博士卻忽略了“約束”這個重要的約束——至少是沒有明確地在每個模式中指出。這種行文安排,或許是由於閻博士的哲學態度(關於這一點,我將在後面討論)。但是,這種疏漏的後果可能是很嚴重的:缺乏(至少是不明確標明)約束條件的模式介紹,加上似是而非、放之四海皆準的哲學小品,可能很容易讓讀者對模式抱一種過分的樂觀態度,並將對模式的誤用歸咎於沒有獲得那種無影無形的“道”,從而失去加深對模式認識的機會。甚至於,對於一個不太負責的讀者,對約束條件的疏漏可能讓全書的努力付諸東流。對於一本1K頁的技術書籍來說,讓讀者冒著放棄科學意味的風險而追求哲學意味,成本恐怕太高了一點。努力地(也可能是一廂情願地)為這種疏漏做一些補救,也是我寫這篇書評的目的之一。

上面就是我對《Java與模式》這本書技術層面的評價,一言以蔽之曰:白璧微瑕。在Design Patterns Explained的中譯本出版之前,這本書毫無疑問是最好的中文模式教材;即使Design Patterns Explained出版,由於中西文化上的差異和翻譯水平的限制,它與讀者的親合度也未必強於《Java與模式》,因此後者也可能繼續成為最好的中文模式教材。

前面已經提到,作者閻宏博士非常注重模式理論與中國傳統思想的結合,全書也處處穿插著源自中國經典的哲學小品,並試圖向讀者傳達一種中國道家思想的哲學意味。下面,我將對這種哲學意味進行評價。作為一個軟體開發者,面對一本闡述軟體開發技術的書籍,我將盡力把評論收斂在科學的範疇之內,並對科學所不能及的範疇保持恰當的沉默。如前所述,這是嚴謹的科學態度所必須的。艱難地、謹慎地、堅定地,我將開始了。

重要而非必要的哲學意味

綜觀全書,閻宏博士的論點大致可以總結為:

軟體模式理論起源於C.Alexander的建築模式理論,後者又起源於中國的道家思想。並且,模式理論與包括孫子、墨子等在內的中國傳統思想多有暗合之處。因此,朝著中國傳統思想的方向為模式理論做形而上學的探索,有助於發展“軟體工程哲學”。

對於閻博士賦予這本書的哲學意味(以及它佔據的篇幅),我的評價是:重要,但非必要。說它“重要”,是因為它對於讀者理解模式理論可能不無裨益——這是心理學範疇的價值,而非科學範疇的;說它“非必要”,是因為它在科學範疇沒有任何價值,對模式的實際應用也並沒有更多的助益。下面,我將詳細闡述我的觀點。

軟體模式起源於C.Alexander的建築模式理論,這是毫無疑問的。不論是GoF的《設計模式》、Alan Shalloway的Design Patterns Explained,還是Linda Rising的The Pattern Almanac,都強調Alexander的著作《建築的永恆之道》和《建築模式語言》對軟體模式思想的影響。但是,Alexander的建築模式理論(以及從它衍生而來的軟體模式理論)是否起源於中國的道家思想,就有可商榷之處了。

中國的道家思想似乎是適用範圍最為廣泛的一種思想。天地運轉、人情世故,似乎無不蘊涵在一句“道可道非常道”之中。這種極其廣泛的適用性就給我們一個暗示:它很可能是一個並無意義的理論。從邏輯學的角度來說,一個矛盾式有無限大的資訊量,可以從中推出任何命題。因此,只要用足夠含混的語言把矛盾隱藏到一個命題中而不被發現,那麼任何其他命題都可以從這個命題起源出來,因為後者已經是一個矛盾式了。以道家思想為例,對於《道德經》的第一句,大多數人的句讀是“道可道,非常道”,意思是“道一旦被言說出來,就不成其為恆常的道”,這聽起來很像維特根斯坦所說的“語言遊戲”;而我的一位朋友ozzzzzz的句讀卻是“道可、道非,常道”,意思是“既容納正面觀點,也容納反面觀點,這就是恆常的道”,這聽起來又更像是黑格爾的辨證法了。為什麼出現這種情況?原因就在於:這句話足夠含混,可以容許有不同的、甚至是矛盾的理解,因此可以從中推出任何理論——只要有足夠的邏輯能力。說“模式理論起源於中國道家思想”,也是對這種邏輯能力的一次運用。

為了演示如何從矛盾式推出自己想要的理論,我的朋友Snowfalcon做了一個更有趣的實驗。下面是Snowfalcon即興寫下的一段文字:

軟體的永恆之禪

模式的哲學可以追溯到佛教的起源。可以將佛教的理論“投射”到軟體設計中。

……

首先,“無名特質”(QWAN)意味著一個軟體的內在屬性不僅僅存在於這個軟體之中,而且存在於這個軟體與其它軟體的相互作用之中,存在於這個軟體與外部的世界,特別是的相互作用之中。

“無名特質”其實在佛教中早已有詳細的闡述。佛教中講“空”就是這個概念。佛教中的“空”分為“人空”和“法空”。其中法空說的是“法空,則謂一切事物之存在皆由因緣而產生,故亦無實體存在”。也就是說,所有的事物都由內在的本質“因緣”所定,當它反映到人腦中則形成了“色法”。所謂“色法”,泛指有質礙之物,即佔有一定之空間、具有自他互相障礙及會變壞之性質者。無名特質對應了空,它是一切事物的產生和內在的本質。但是由於人的觀察,形成了色法。色法阻礙了人對事物即空的本質覺悟,從而說它是自他互相障礙。

因此軟體中這個最重要的屬性之所以是“無名”的,是因為它是對映到人腦之前的屬性。在這個屬性被對映到人腦中之後,就已經經歷了用各種方式侷限到各種不同範圍之內的過程;這種過程導致這個無名的質變成一大堆“有名”的“色法”。在本書後面讀者會讀到,這些“有名”的“色法”就包括軟體要求的可變性、軟體的可用性;以及系統的可擴充套件性、靈活性和可插入性等等。這些質就是色法,如果我們用色法去觀察世界,那麼就不能理解無名特質的本身的空。

聽起來是不是也很有道理?為什麼“模式的哲學”既可以起源於道家思想,也可以起源於佛教?甚而至於,你可以感覺到:只要有足夠的邏輯能力和語言能力,你還可以讓“模式的哲學”起源於其他的很多思想。原因就在於:和道家思想一樣,佛教的理論也用足夠含混的語言包容了矛盾,因此能夠從中推匯出任何其他理論。

正如我所暗示的,還可以把這樣的邏輯遊戲繼續玩下去。你甚至可以聲稱模式的哲學起源於柏拉圖的思想:模式是“理型的解決方案”,是某一類具體解決方案的“靈魂”;具體解決方案是模式在真實世界的“投影”;當人們看到這些“投影”時,他們靈魂中的理性受到震盪,並因此而探尋完美的“理型”——也就是模式。當然,也可以聲稱模式的哲學起源於赫拉克利特的思想,只要你願意。

那麼,這種理論的追根溯源有什麼意義?答案是:在科學的範疇內,沒有任何意義。正如上面所說,從矛盾式可以推出任何命題。整個推導過程僅僅是一個邏輯遊戲,只是給同一個命題以不同的表達,而不能給出更多的資訊。對於閻博士的這本書,情況正是這樣:不論把模式理論歸結於道家思想或者佛教思想或者別的什麼思想,都不能給模式理論以更多的內涵。

除了提綱挈領的哲學思想之外,閻博士在書中處處採用的“文化小品”也有著同樣的問題:它們對於理解單個的模式並無更多的幫助。這類來自中國古典名著的小故事,在點綴著讀者的閱讀體驗的同時,也混淆著讀者的頭腦。讀者在瞭解模式的方面節約了多少時間,就會在理解模式的方面浪費多少時間。

其實這種介紹模式的手法並不新鮮。就在CSDN網站上,我也不止一次地看到有人用比喻的手法來介紹設計模式(以及其他比較難理解的東西,例如物件導向),並美其名曰“深入淺出”之類。對於這種降低難度的辦法,我一向不感冒。對於模式,最重要的元素莫過於“約束”——“問題”和“解決方案”都是一目瞭然的,但真正重要的是要知道“何時不使用模式”,也就是“約束”所討論的東西。什麼樣的比喻能夠描述出軟體問題的複雜度?即使有這樣的比喻,它又怎能不像軟體問題一樣難以理解?所以,我反對在討論模式的時候濫用比喻——畢竟我們討論的是軟體問題的解決方案,而不是那些看似輕鬆的比喻。

即使是閻博士精心挑選的比喻,也同樣無法令人滿意。我隨手撿一個例子:

孫悟空在與黃風怪的戰鬥中,“使一個身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一噴,叫聲‘變!’變有百十個行者,都是一樣打扮,各執一根鐵棒,把那怪圍在空中。” 換言之,孫悟空可以根據自己的形像,複製出很多“身外之身”來。

老孫的這種身外身的手段在物件導向的設計領域裡,叫做原始模型()模式。

這就是典型的過分簡化的比喻:既然可以說這種“身外身”的手段是Prototype模式,那麼我可不可以說它是Factory Method模式呢?又可不可以說它是Singleton模式呢?又可不可以說它是Flyweight模式呢?這樣一個“案例”,既不能說明模式的“問題”,也不能說明模式的“約束”——如果討論設計模式而不說明“問題”和“約束”,那討論就沒有任何意義。這樣的比喻,簡單則簡單矣,恐怕讀者看完了例子還是如墜雲中,不知道自己的軟體中是不是適合用這種“身外身的手段”。

到此,讀者可以看到我的觀點:閻博士給這本《Java與模式》賦予的哲學意味、文化意味,不論是提綱挈領的哲學淵源,還是貫穿全書的文化小品,對於模式的知識都並無助益。因此,我認為它並非必要。這對於那些想要透過這本書“得道”而掌握模式精髓的讀者,無疑是一個打擊,不過也應了最近又開始流行的一句老話:No silver bullet。

儘管並非必要,但這些內容的確有其價值——不是科學範疇的,而是心理學範疇的。書中的哲學意味儘管不能給讀者更多的模式理論,但的確能夠吸引中國讀者的眼球,讓他們有興趣捧起這本書來;書中的文化小品儘管不能讓讀者更好地理解模式,但的確能夠調節讀者的閱讀體驗,讓他們不至於疲憊地把書扔到一邊。同樣,這些比喻也可以讓讀者更快地對模式有一個大致的瞭解,雖然他們會在需要使用模式的時候花掉更多的時間去摸索模式的適用範圍。

這就是我對《Java與模式》中哲學意味的綜合評價:重要,但非必要。你可以把它們當作很好的調節劑(當然也可能被看成使用不當的稀釋劑,這取決於個人愛好),但不要希望能從中學到更多的什麼東西。老子的“道”說了上千年,終於還是沒有人“得道”。

寫在最後

如果可以的話,我寧可不要對《Java與模式》的哲學意味做任何評價,因為這種糾纏了哲學、邏輯和科學的文字寫來實在費勁。只是,作者閻宏博士對他書中的哲學意味如此看重,我如果評價他的書而不評價這一部分,對他是大不恭,故此勉力為之。現在,我終於又可以回到輕鬆的書評路線上來了。

借用Jacques Lebrun的那句“法國人的俏皮話”來評價閻宏博士:他沒有時間往短裡寫。這本《Java與模式》會有1K頁這麼厚,閻博士的“貪心”是肇因——想在一本書裡放下模式理論起源、模式基礎和模式例項,而且還不願厚此薄彼,最後的成果變成“狼伉巨物”也就是情理之中了。不過,這種“貪心”的風格把這本書置於一個略顯尷尬的境地:它太大,無法成為公共汽車上的閱讀物;如果要當參考手冊來看,又顯得太稀——在查閱一個急需的模式時,恐怕是不會有太多人有心情順便欣賞“孫大聖大戰黃風怪”的。所以,儘管這是一本很好的書,我卻不知道該在什麼時間讀它。至少,我不會願意在公車上捧著一本1K頁的書,所以,它還是尷尬地躺在我辦公室的抽屜裡。

所以,這本《Java與模式》的確是一本好書,如果你有足夠的耐性來讀它的話——我已經沒有這樣的耐性了。實際上,我現在看到超過500頁的書就會退避三舍。不過,除掉其中那些有助於消化的、帶有淡淡甜味的輔料之外,它能給讀者的養分與它1K的頁碼並不相稱。對此,我也只能希望閻博士能夠有時間把這本書“往短裡寫”了。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993292/,如需轉載,請註明出處,否則將追究法律責任。

相關文章