一枝看上去很美的花

新用户注册 | 用户登陆 | 回复 | 刷新 论坛嘉宾: 快刀浪子

zhangqq


发表文章数: 80
内力值: 135/135
贡献度: 182
人气: 17

一枝看上去很美的花 [文章类型: 转载]

  一枝看上去很美的花
  ——書評《Java與模式》
  撰文/剃刀
  (本文首發于《程序員》雜志2003年第1期)
  躺在我面前的,是閻宏博士編著、電子工業出版社出版的厚達1024頁的《Java與模式》。如果按照我的朋友Jacques Lebrun在他的《The Mythical Man-Month:一次豆豆式的書評嘗試》中的說法,這本書是要歸于“體態狼伉”的“龐然巨物”的,而且恰好1K的頁碼數的確也很能“讓人産生心理障礙”了。不過,由于本人研究模式理論有日,也知道在設計模式方面很難寫出一本能“作掌上舞”的小書,所以,還是暫且抛開“豆豆式”的批評套路,回到嚴謹的批評上來。在《Java與模式》的序1中,朱天華博士將此書盛贊爲“散發著奇妙香氣的曼妙花朵”,而我對它的評價則是“一枝看上去很美的花”。
  直到最近,中文的模式理論類書籍只有《設計模式》一本。《設計模式》的經典地位毋庸置疑,但是其中使用的範例太老舊,很難讓讀者獲得直觀的感性認識,兼之理論闡述太過抽象,導致閱讀體驗極差。《設計模式》的讀者普遍反映“看不懂”,實是情理之中。而《Java與模式》是迄今爲止第一本模式理論的中文入門教材,自然,也是最好的一本,因爲並沒有第二本。
  對于《Java與模式》這本書,作者閻宏博士的期望並不僅僅是普及模式理論和設計模式技術,而且還希望探索模式理論的哲學根源,將設計模式技術與中國傳統文化結合起來。這種技術的形而上學探索,便是朱博士所贊的“奇妙香氣”,也正是筆者說它“看上去很美”的原因。在本文中,筆者也將對這兩方面分別評論,以期給這本書一個全面而不失之偏頗的評價。
  迄今爲止最好的模式教材
  一本模式教材應該是什麽樣子的?或者說,如何評價一本模式教材的優劣。
  首先,這本書應該對C.Alexander的模式理論作必要的介紹。畢竟大多數讀者接觸“模式”這個詞是從“設計模式”開始,他們學習模式的目的是提高軟件開發的能力。模式教材的作者不可能也不應該假設他的讀者都讀過《建築的永恒之道》。由于Alexander的模式理論對軟件模式的形式、理論有著極其深遠的影響,因此模式教材的作者應該幫讀者補上這一課。
  其次,這本書應該對面向對象的一些指導性原則作必要的介紹。像開放-封閉原則(OCP)、Liskov替換原則(LSP)、依賴倒轉原則(ISP)等原則,是面向對象程序設計努力的方向。同樣,一個負責的作者也不應該假設他的讀者都讀過Robert Martin的Designing Object Oriented C++ Applications Using The Booch Method,他也應該幫那些面向對象的初學者補上這一課。
  第三,這本書應該對《設計模式》書中提到的大部分模式作足夠詳盡的介紹。由于《設計模式》的經典地位和它的枯燥晦澀,一本模式教材最應該做的就是不厭其詳地介紹《設計模式》中一些重要模式的來龍去脈,說明它們爲什麽必要,說明它們的適用範圍以及(更重要的)不適用的範圍,說明它們如何解決問題以及遺留下的問題。如果不能解答《設計模式》給讀者留下的這些疑問,一本模式教材將無法引起讀者的共鳴,也無法給讀者立竿見影的效用。
  最後,書中的內容應該“與時俱進”。範例應該來自應用更爲廣泛的軟件項目,語言最好是Java或者C#(由于C++內在的局限性,並不適合用于描述設計模式),圖例應該用UML……盡管我很推崇Robert Martin那本書,但如果看到一本今天的模式教材還在用Booch方法,我一定先把它扔到一邊去。
  在我所見到的模式書籍中,Alan Shalloway的Design Patterns Explained和閻博士這本《Java與模式》都符合上述四點要求,所以都可以被評爲“好的模式教材”;而Pattern Hatching、The 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與模式》,因此後者也可能繼續成爲最好的中文模式教材。

发表时间: 2015-03-12, 23:18:24 个人资料

zhangqq


发表文章数: 80
内力值: 135/135
贡献度: 182
人气: 17

Re: 一枝看上去很美的花 [文章类型: 转载]

  前面已經提到,作者閻宏博士非常注重模式理論與中國傳統思想的結合,全書也處處穿插著源自中國經典的哲學小品,並試圖向讀者傳達一種中國道家思想的哲學意味。下面,我將對這種哲學意味進行評價。作爲一個軟件開發者,面對一本闡述軟件開發技術的書籍,我將盡力把評論收斂在科學的範疇之內,並對科學所不能及的範疇保持恰當的沈默。如前所述,這是嚴謹的科學態度所必須的。艱難地、謹慎地、堅定地,我將開始了。
  重要而非必要的哲學意味
  綜觀全書,閻宏博士的論點大致可以總結爲:
  軟件模式理論起源于C.Alexander的建築模式理論,後者又起源于中國的道家思想。並且,模式理論與包括孫子、墨子等在內的中國傳統思想多有暗合之處。因此,朝著中國傳統思想的方向爲模式理論做形而上學的探索,有助于發展“軟件工程哲學”。
  對于閻博士賦予這本書的哲學意味(以及它占據的篇幅),我的評價是:重要,但非必要。說它“重要”,是因爲它對于讀者理解模式理論可能不無裨益——這是心理學範疇的價值,而非科學範疇的;說它“非必要”,是因爲它在科學範疇沒有任何價值,對模式的實際應用也並沒有更多的助益。下面,我將詳細闡述我的觀點。
  軟件模式起源于C.Alexander的建築模式理論,這是毫無疑問的。不論是GoF的《設計模式》、Alan Shalloway的Design Patterns Explained,還是Linda Rising的The Pattern Almanac,都強調Alexander的著作《建築的永恒之道》和《建築模式語言》對軟件模式思想的影響。但是,Alexander的建築模式理論(以及從它衍生而來的軟件模式理論)是否起源于中國的道家思想,就有可商榷之處了。
  中國的道家思想似乎是適用範圍最爲廣泛的一種思想。天地運轉、人情世故,似乎無不蘊涵在一句“道可道非常道”之中。這種極其廣泛的適用性就給我們一個暗示:它很可能是一個並無意義的理論。從邏輯學的角度來說,一個矛盾式有無限大的信息量,可以從中推出任何命題。因此,只要用足夠含混的語言把矛盾隱藏到一個命題中而不被發現,那麽任何其他命題都可以從這個命題起源出來,因爲後者已經是一個矛盾式了。以道家思想爲例,對于《道德經》的第一句,大多數人的句讀是“道可道,非常道”,意思是“道一旦被言說出來,就不成其爲恒常的道”,這聽起來很像維特根斯坦所說的“語言遊戲”;而我的一位朋友ozzzzzz的句讀卻是“道可、道非,常道”,意思是“既容納正面觀點,也容納反面觀點,這就是恒常的道”,這聽起來又更像是黑格爾的辨證法了。爲什麽出現這種情況?原因就在于:這句話足夠含混,可以容許有不同的、甚至是矛盾的理解,因此可以從中推出任何理論——只要有足夠的邏輯能力。說“模式理論起源于中國道家思想”,也是對這種邏輯能力的一次運用。
  爲了演示如何從矛盾式推出自己想要的理論,我的朋友Snowfalcon做了一個更有趣的實驗。下面是Snowfalcon即興寫下的一段文字:
  
  軟件的永恒之禅
  模式的哲學可以追溯到佛教的起源。可以將佛教的理論“投射”到軟件設計中。
  ……
  首先,“無名特質”(QWAN)意味著一個軟件的內在屬性不僅僅存在于這個軟件之中,而且存在于這個軟件與其它軟件的相互作用之中,存在于這個軟件與計算機外部的世界,特別是用戶的相互作用之中。
  “無名特質”其實在佛教中早已有詳細的闡述。佛教中講“空”就是這個概念。佛教中的“空”分爲“人空”和“法空”。其中法空說的是“法空,則謂一切事物之存在皆由因緣而産生,故亦無實體存在”。也就是說,所有的事物都由內在的本質“因緣”所定,當它反映到人腦中則形成了“色法”。所謂“色法”,泛指有質礙之物,即占有一定之空間、具有自他互相障礙及會變壞之性質者。無名特質對應了空,它是一切事物的産生和內在的本質。但是由于人的觀察,形成了色法。色法阻礙了人對事物即空的本質覺悟,從而說它是自他互相障礙。
  因此軟件中這個最重要的屬性之所以是“無名”的,是因爲它是映射到人腦之前的屬性。在這個屬性被映射到人腦中之後,就已經經曆了用各種方式局限到各種不同範圍之內的過程;這種過程導致這個無名的質變成一大堆“有名”的“色法”。在本書後面讀者會讀到,這些“有名”的“色法”就包括軟件性能要求的可變性、軟件的可用性;以及系統的可擴展性、靈活性和可插入性等等。這些質就是色法,如果我們用色法去觀察世界,那麽就不能理解無名特質的本身的空。
  聽起來是不是也很有道理?爲什麽“模式的哲學”既可以起源于道家思想,也可以起源于佛教?甚而至于,你可以感覺到:只要有足夠的邏輯能力和語言能力,你還可以讓“模式的哲學”起源于其他的很多思想。原因就在于:和道家思想一樣,佛教的理論也用足夠含混的語言包容了矛盾,因此能夠從中推導出任何其他理論。
  
  正如我所暗示的,還可以把這樣的邏輯遊戲繼續玩下去。你甚至可以聲稱模式的哲學起源于柏拉圖的思想:模式是“理型的解決方案”,是某一類具體解決方案的“靈魂”;具體解決方案是模式在真實世界的“投影”;當人們看到這些“投影”時,他們靈魂中的理性受到震蕩,並因此而探尋完美的“理型”——也就是模式。當然,也可以聲稱模式的哲學起源于赫拉克利特的思想,只要你願意。

发表时间: 2015-03-12, 23:19:51 个人资料

zhangqq


发表文章数: 80
内力值: 135/135
贡献度: 182
人气: 17

Re: 一枝看上去很美的花 [文章类型: 转载]

  那麽,這種理論的追根溯源有什麽意義?答案是:在科學的範疇內,沒有任何意義。正如上面所說,從矛盾式可以推出任何命題。整個推導過程僅僅是一個邏輯遊戲,只是給同一個命題以不同的表達,而不能給出更多的信息。對于閻博士的這本書,情況正是這樣:不論把模式理論歸結于道家思想或者佛教思想或者別的什麽思想,都不能給模式理論以更多的內涵。
  除了提綱挈領的哲學思想之外,閻博士在書中處處采用的“文化小品”也有著同樣的問題:它們對于理解單個的模式並無更多的幫助。這類來自中國古典名著的小故事,在點綴著讀者的閱讀體驗的同時,也混淆著讀者的頭腦。讀者在了解模式的方面節約了多少時間,就會在理解模式的方面浪費多少時間。
  其實這種介紹模式的手法並不新鮮。就在CSDN網站上,我也不止一次地看到有人用比喻的手法來介紹設計模式(以及其他比較難理解的東西,例如面向對象),並美其名曰“深入淺出”之類。對于這種降低難度的辦法,我一向不感冒。對于模式,最重要的元素莫過于“約束”——“問題”和“解決方案”都是一目了然的,但真正重要的是要知道“何時不使用模式”,也就是“約束”所討論的東西。什麽樣的比喻能夠描述出軟件問題的複雜度?即使有這樣的比喻,它又怎能不像軟件問題一樣難以理解?所以,我反對在討論模式的時候濫用比喻——畢竟我們討論的是軟件問題的解決方案,而不是那些看似輕松的比喻。
  即使是閻博士精心挑選的比喻,也同樣無法令人滿意。我隨手撿一個例子:
  
  孫悟空在與黃風怪的戰鬥中,“使一個身外身的手段:把毫毛揪下一把,用口嚼得粉碎,望上一噴,叫聲‘變!’變有百十個行者,都是一樣打扮,各執一根鐵棒,把那怪圍在空中。” 換言之,孫悟空可以根據自己的形像,複制出很多“身外之身”來。
  老孫的這種身外身的手段在面向對象的設計領域裏,叫做原始模型(Prototype)模式。
  這就是典型的過分簡化的比喻:既然可以說這種“身外身”的手段是Prototype模式,那麽我可不可以說它是Factory Method模式呢?又可不可以說它是Singleton模式呢?又可不可以說它是Flyweight模式呢?這樣一個“案例”,既不能說明模式的“問題”,也不能說明模式的“約束”——如果討論設計模式而不說明“問題”和“約束”,那討論就沒有任何意義。這樣的比喻,簡單則簡單矣,恐怕讀者看完了例子還是如墜雲中,不知道自己的軟件中是不是適合用這種“身外身的手段”。
  到此,讀者可以看到我的觀點:閻博士給這本《Java與模式》賦予的哲學意味、文化意味,不論是提綱挈領的哲學淵源,還是貫穿全書的文化小品,對于模式的知識都並無助益。因此,我認爲它並非必要。這對于那些想要通過這本書“得道”而掌握模式精髓的讀者,無疑是一個打擊,不過也應了最近又開始流行的一句老話:No silver bullet。
  盡管並非必要,但這些內容的確有其價值——不是科學範疇的,而是心理學範疇的。書中的哲學意味盡管不能給讀者更多的模式理論,但的確能夠吸引中國讀者的眼球,讓他們有興趣捧起這本書來;書中的文化小品盡管不能讓讀者更好地理解模式,但的確能夠調節讀者的閱讀體驗,讓他們不至于疲憊地把書扔到一邊。同樣,這些比喻也可以讓讀者更快地對模式有一個大致的了解,雖然他們會在需要使用模式的時候花掉更多的時間去摸索模式的適用範圍。
  這就是我對《Java與模式》中哲學意味的綜合評價:重要,但非必要。你可以把它們當作很好的調節劑(當然也可能被看成使用不當的稀釋劑,這取決于個人愛好),但不要希望能從中學到更多的什麽東西。老子的“道”說了上千年,終于還是沒有人“得道”。
  寫在最後
  如果可以的話,我甯可不要對《Java與模式》的哲學意味做任何評價,因爲這種糾纏了哲學、邏輯和科學的文字寫來實在費勁。只是,作者閻宏博士對他書中的哲學意味如此看重,我如果評價他的書而不評價這一部分,對他是大不恭,故此勉力爲之。現在,我終于又可以回到輕松的書評路線上來了。
  借用Jacques Lebrun的那句“法國人的俏皮話”來評價閻宏博士:他沒有時間往短裏寫。這本《Java與模式》會有1K頁這麽厚,閻博士的“貪心”是肇因——想在一本書裏放下模式理論起源、模式基礎和模式實例,而且還不願厚此薄彼,最後的成果變成“狼伉巨物”也就是情理之中了。不過,這種“貪心”的風格把這本書置于一個略顯尴尬的境地:它太大,無法成爲公共汽車上的閱讀物;如果要當參考手冊來看,又顯得太稀——在查閱一個急需的模式時,恐怕是不會有太多人有心情順便欣賞“孫大聖大戰黃風怪”的。所以,盡管這是一本很好的書,我卻不知道該在什麽時間讀它。至少,我不會願意在公車上捧著一本1K頁的書,所以,它還是尴尬地躺在我辦公室的抽屜裏。
  所以,這本《Java與模式》的確是一本好書,如果你有足夠的耐性來讀它的話——我已經沒有這樣的耐性了。實際上,我現在看到超過500頁的書就會退避三舍。不過,除掉其中那些有助于消化的、帶有淡淡甜味的輔料之外,它能給讀者的養分與它1K的頁碼並不相稱。對此,我也只能希望閻博士能夠有時間把這本書“往短裏寫”了。

发表时间: 2015-03-12, 23:20:24 个人资料

zhangqq


发表文章数: 80
内力值: 135/135
贡献度: 182
人气: 17

Re: 一枝看上去很美的花 [文章类型: 原创]

向大家推薦這篇考古文章,非常精彩,揭穿了所有“物理學的道家源頭”、“物理學的佛家源頭”這類的語言魔術。

发表时间: 2015-03-12, 23:25:31 个人资料

zhangqq


发表文章数: 80
内力值: 135/135
贡献度: 182
人气: 17

Re: 一枝看上去很美的花 [文章类型: 原创]

忘了說,我有書評裡說的這本書,並仔細看過,所以才覺得這書評格外精彩。

另外,也是對朱清時之流論調的很銳利的回擊。

发表时间: 2015-03-12, 23:30:33 个人资料

zhangqq


发表文章数: 80
内力值: 135/135
贡献度: 182
人气: 17

Re: 一枝看上去很美的花 [文章类型: 原创]

想起來了二十幾年快三十年前,大名鼎鼎的方勵之先生和他太太李淑嫻女士竟然也有把宇宙起源和道家學說聯繫起來的文章,我看到以後目瞪口呆,方先生怎麼也玩這種語言魔術?

後來看到朱清時,有點懷疑這些不是個案能解釋的,是不是有一幫子搞物理的人,愛這麼幹。包括上面書的作者也是科大物理係畢業的。

发表时间: 2015-03-13, 00:12:31 个人资料
您尚未登陆 | 用户登陆