http://blog.sina.com.cn/s/blog_54830f070100cekm.html
我很不願意去J道或其它知名的技術網站看那裡的討論。整體上來說,在這些網站上也形成了不大不小的圈子,其活動者大體也是業界實實在在的實踐者,包括各個層次的程式員以及高層設計人員。所以,理論上這些圈子應該代表中國軟體業技術主流的水準。然而我的確無法恭維;讓我最為沮喪的是一種充斥其間的神秘主義的氛圍。所有人都在討論某種流行的方法論、模式或其它的理論,這些討論徹底浮動在事物的表面,對於技術、方法本身內在的演化邏輯、本質屬性毫無洞見,最後無非是在玩弄新鮮名次。所謂資深者渾渾噩噩,初學者懵懵懂懂,完全是不知所云。這不是一個認識深度的問題,這是一個認識方法問題,軟體行業的技術精英們似乎與人類積累下來的寶貴的洞察事物的一般方法絕緣,極其庸俗地而且滿懷熱情地沉迷於他自己所羅織而成的一種高深莫測之中。是什麼原因導致了這種情況?是軟體技術人員整體上缺乏一般的思想修養和必要的洞察能力以及狹隘的知識界結構所致?應該有這個因素。另外,高科技的光環似乎使這些人並不為這種空洞貧乏而感到羞恥,似乎軟體有理由成為一種超越一般的學科、科技的神秘的東西。顯然這是極其有害而且荒唐的。軟體與軟體職業者一樣都來自於我們所存在於其中的文明大背景,軟體理論與實踐必然遵循有關知識與技術的一般的方法,軟體從業者需要從根本上提高自己的文化、文明素養才有可能獲得出色的洞見與技能。在這個意義上,他們沒有任何特別之處。
本文略舉二三事,旨在說明這種流行的弊病並且給出我的分析。
關於DDD
DDD是什嗎?首先是一種觀點,這種觀點認為軟體系統的關鍵在於處理領域模型的複雜性;以此為出發點,處理領域模型的方法、技巧、最佳實務;最後,在這種思想指導下服務於領域建模的各種工具;DDD就是這三個方面,並且其邏輯上的遞進是有順序的;J道有專欄來討論DDD,但遍觀所有文章無不是瞎子摸象。有許多回答“什麼是DDD”的文章都是在談論一個驢唇不對馬嘴的問題。
DDD的根源仍然是那個老問題:軟體系統的實質的複雜性在於需要從紛紜現實中抽象出一個邏輯上清晰、嚴謹、有序的良好的概念結構出來。對於目前絕大多數應用軟體來說,這個所謂現實都可稱之為某種領域;Brooks稱之為概念結構,另有人稱為概念性模型;這個思想源頭由來已久,但它不會抹殺DDD作為一種系統的、完整的思想系統的獨立價值。
關於依賴注入
對於物件導向系統來說,運行時的系統是一個由相互作用、彼此協同的對象構成的對象關係圖,資訊在圖中流動,圖的有價值的行為,或者說狀態遷移路線,形成所謂功能用例;開發人員開發系統實際上是在敘述兩件事情:@對象本身的結構與行為@它們如何裝配以形成一個複雜的圖狀的結構。一方面,這兩件事情並不能截然分開,另一方面,在相當多的情況下,分開來會使系統的體系、層次趨於分明。
對象組合裝配成對象關係圖這件事情在系統中設定一個責任者來專職完成,這個做法是幾種所謂原廠模式的實質;無非是將對象圖的煩瑣的裝配過程加以隱蔽,並且同時也在一定程度上降低了對象圖的結構依賴程度而只關心其最終的行為。
後來容器環境的出現使這個對象關希圖的裝配任務被交給容器來做,容器實際上在運行時充當工廠的角色,而作為程式只需要描述出對象之間的依賴關係;依賴注入是對象圖裝配的自動化過程,是原廠模式的提升而已。這種顯而易見的傳承關係我沒有聽到被任何人提起過。
關於AOP
任何結構良好的系統的一個最重要的特徵,就是在相對底層打造共用結構單元,或者說橫切單元。它們與上層單元是正交的關係:上層的單元由多個下層單元支援;下層的單元被多個上層單元所共用;共用、通用、橫切、正交是同義字。
橫切成份的出現幾乎是系統是否具有良好品質的試金石,它在系統的所謂微分特性(收斂)、可擴充性等等方面都起決定作用;在面向過程方法中,我們追求重用的過程;物件導向中我們追求重用的對象甚至構建,面向服務系統中我們追求共用服務,甚至在資料庫設計中,資料庫範式也是在追求最大程度的共用成分。橫切在電腦軟體的曆史中由來已久。
AOP也正是被這個力量所推動,它提供的平台、機制和方法是橫切傳統的一種自覺和加強,他的確對於某些問題的處理給出了強有力的手段,尤其是與容器相結合時。但是,另一方面,AOP並沒有也不能夠囊括所有的系統橫切問題,它本身不過是處理橫切問題的技術方法中的一種。另外AOP作為一種橫切方法,他並不具有與面向過程、物件導向等相類似的方法論意義,後兩者在根本上乃是源於兩種觀察世界的哲學角度:直觀地說,我們可以認為世界是過程,或者是對象,但我們很難說世界是由方面構成的;這有些類似於柏拉圖哲學中的概念世界了。因此,AOP並不能夠與OOP相類比,更不存在AOP取代OOP的問題,兩者的前途並不衝突。
打破神秘主義
打破神秘主義的目的是在於我們能夠從本質上理解軟體各種方法、模式的曆史演化、邏輯脈絡而不是認為層出不窮的都是些天上掉下來的全新的沒有先驅的、沒有原因的了不起的創造;對這種內在演化、邏輯脈絡的把握遠比這些新鮮概念本身更加重要,我們籍此能夠洞悉事物的根源;對這種根源的無知是許多程式員只會新名詞而不能夠駕馭、熟用各種方法、模式的根本原因;有太多的人湮沒其中徒豪精力。