日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
DDD的哲學:模型的關(guān)聯(lián)、演進和認知

作者 | 鐘敬

接上篇《??當我們談?wù)揇DD時我們在談?wù)撌裁??》

“關(guān)聯(lián)”、《矛盾論》、畢達哥拉斯學派

DDD的哲學意味(上)說到了“模型驅(qū)動的設(shè)計”以及其中兩個重要的模式“實體”和“值對象”,兩者統(tǒng)稱“領(lǐng)域?qū)ο蟆?。在領(lǐng)域建模的過程中,建立領(lǐng)域?qū)ο箝g的“關(guān)聯(lián)(Association)”也是非常重要的?!禗DD》第5.1節(jié)對此進行了專門的討論。不過與實體不同,艾老師并沒有把關(guān)聯(lián)當做一種正式的“模式”。這一點實屬可惜,因為關(guān)聯(lián)至少與實體有同樣的重要性。為什么這么說呢?下面還是先扯幾句哲學。

前面提到毛老師的《實踐論》,這里再說說怹老人家的另一篇杰作《矛盾論》。這篇論文的第一部分“兩種宇宙觀”中提到了兩種認識論體系:“形而上學”和“唯物辯證法”。前者是錯誤的、后者是正確的。

形而上學認為事物的發(fā)展是靜態(tài)的、外因驅(qū)動的、孤立的;唯物辯證法則認為事物的發(fā)展是動態(tài)的、內(nèi)因驅(qū)動的、聯(lián)系的(還記得中學政治課背過嗎?)。前兩點我們后面再聊,這里先討論“聯(lián)系”。

《矛盾論》中引用列寧的話:“要真正地認識事物,就必須把握住、研究清楚它的一切方面、一切聯(lián)系和‘中介’。我們永遠也不會完全做到這一點,但是,全面性這一要求可以使我們防止犯錯誤和防止僵化?!边@強調(diào)了,只有充分了解事物之間的聯(lián)系,才能充分認識事物。

DDD中,領(lǐng)域(事物)的概念以實體、值對象、聚合、模塊等方式表達出來。有些伙伴把領(lǐng)域中的主要聚合或?qū)嶓w識別出來后,卻沒有識別它們之間的關(guān)聯(lián),就認為已經(jīng)完成了領(lǐng)域建模。這樣的模型其實是不完整的。那么,如果我們認識到了這一點,并且識別出了關(guān)聯(lián)之后,還要進一步識別關(guān)聯(lián)上的哪些信息呢?讓我們先看一下古老的畢達哥拉斯學派。

這個學派在古希臘最早對數(shù)學進行了系統(tǒng)的研究。他們發(fā)現(xiàn)了無理數(shù),然后把泄露無理數(shù)秘密的團隊成員扔進了大海。畢達哥拉斯認為世界的本原是“數(shù)”。宇宙的和諧來源于數(shù)的和諧。而數(shù)的和諧體現(xiàn)在十組對立的關(guān)系中:一與多、奇與偶、左與右、陰與陽、動與靜、曲與直、明與暗、善與惡、方與長、有限與無限。在這十組關(guān)系中,最根本的是“一與多”。也就是說,只有把握了“一與多”,才能把握“數(shù)”,進而把握世界。

從畢達哥拉斯的學說中,我們或許可以得到這樣的啟發(fā)(嗯 ~ ~ 我承認有點牽強):在領(lǐng)域模型中,對關(guān)聯(lián)進行建模時首先要考慮的是數(shù)量關(guān)系。也就是常說的“一對一”“一對多”“多對多”等等。如果做得精細些的話,還可以考慮存在性(必選的還是可選的)。不少建模人員在建模時都忽視了理清數(shù)量關(guān)系,從而限制了對領(lǐng)域知識的深刻理解。

對數(shù)量關(guān)系的識別看似簡單,但我們發(fā)現(xiàn)百分之六七十的初學者在實踐中都會搞錯。只有經(jīng)過一段時間的練習,才能充分掌握。

此外,前文提過,除了這里說的實例之間的關(guān)聯(lián)以外,還要考慮類型之間的關(guān)聯(lián)(也就是泛化)。對泛化關(guān)系的掌握,是領(lǐng)域建模技術(shù)從初級階段邁向中級階段的門檻,也是向高級建模技術(shù)進階的關(guān)鍵。要熟練掌握這項技術(shù),除了在項目中實踐,還可參考《分析模式》。在《DDD》的后半部分有一些高階的例子運用了泛化,但在前面講模型驅(qū)動設(shè)計的章節(jié)卻沒有提及泛化,這就忽略了一種建模的重要手段,也算是該書的一個瑕疵吧。

模型的演進、辯證法、進化論

前文說到,唯物辯證法認為事物的發(fā)展是動態(tài)的、內(nèi)因驅(qū)動的、聯(lián)系的;并且已經(jīng)討論了“聯(lián)系”。這一節(jié)首先討論“動態(tài)”。

事物的發(fā)展變化是永恒的。因此,我們會不斷強調(diào),與其期望一次性把領(lǐng)域模型和架構(gòu)建好,不如建立團隊的架構(gòu)演進能力。在《DDD》第8章至第13章,集中討論了模型重構(gòu)的方法。

模型要不斷演進,這個說法多數(shù)人聽了都會點頭稱是。又有誰不知道“唯一不變的就是變化”呢?然而在這一點上,說到和做到是有距離的。

真想做到模型的演進,不僅需要上述《DDD》中的建模技能,還要扎實地掌握重構(gòu)、TDD(或者至少是自動化測試)和持續(xù)集成,我將之稱為敏捷工程實踐的“老三樣”。此外,還要掌握架構(gòu)演進和數(shù)據(jù)庫演進的若干種模式,以及建立多維度的指標體系,利用工具進行量化的架構(gòu)守護等。

然而我們很多人,哪怕接受了DDD,也是急于學習建模技能(這本身沒有錯),而對模型演進絲毫不感興趣。這樣的DDD往往半途而廢。這是因為,如果不能演進模型(進而演進整個軟件系統(tǒng)),那么軟件和模型就會逐漸不一致,最后模型變成廢紙一張,一切打回原形。這背后可以回歸到團隊甚至企業(yè)文化的問題。衡量一個企業(yè)的文化,關(guān)鍵不是看怎么說,而是看怎么做。

談完“動態(tài)”,再談“內(nèi)因驅(qū)動”。

《矛盾論》中強調(diào)“唯物辯證法認為外因是變化的條件,內(nèi)因是變化的根據(jù),外因通過內(nèi)因而起作用”。內(nèi)因是第一位的,外因是第二位的。而形而上學只看到外因,外因也能使事物發(fā)生變化,但只是量的變化。而內(nèi)因才能導致質(zhì)的變化。換句話說,事物本身必然包含內(nèi)在的矛盾,這一矛盾的發(fā)展變化,在一定外因的條件下,會導致事物發(fā)生質(zhì)的變化。

聯(lián)系到模型的演進,我們從《DDD》中的相關(guān)例子看到,隨著對領(lǐng)域知識理解的深入,模型的重構(gòu)往往不是多了幾個實體、少了幾個關(guān)聯(lián),而是多出了若干抽象層次,甚至將模型的核心部分打碎重組。所以我們既要對這一點有充分的心里準備,知道這是復雜系統(tǒng)的模型演進中必然發(fā)生的;也要未雨綢繆,掌握相關(guān)的建模和架構(gòu)演進技術(shù)。不過也不用怕,當掌握相關(guān)技能后,再復雜的重構(gòu),總可以小步快跑,穩(wěn)健推進。

前面反復提到了架構(gòu)演進。其實《DDD》和《演進式架構(gòu)》是兩本書。兩者的側(cè)重點不同,一本側(cè)重領(lǐng)域建模,一本側(cè)重系統(tǒng)架構(gòu)演進。不過在實踐中我們常常將兩者結(jié)合起來運用。下面聊兩句演進式架構(gòu)的原理,這超出了《DDD》原書的范圍。

“演進式架構(gòu)”強調(diào)增量地、多維度地、導向性地架構(gòu)變化過程。我們主要解釋這三個關(guān)鍵詞。

《演進式架構(gòu)》(Building Evolutionary Architectures)和“進化論”(Theory of Evolution)中的“演進”和“進化”其實是同一個英文詞根。有人將“Theroy of Evolution”翻譯成“進化論”,有人翻譯成“演化論”。《演進式架構(gòu)》的譯者討了個巧,各取一個字,就成了“演進”,其實都是一個意思。所以,演進式架構(gòu)實際上引用了進化論的隱喻。

達爾文的《物種起源》將進化論總結(jié)為遺傳、變異和適者生存。該書第一部分首先講的是“人工選擇”,例如對狗和金魚的馴化;后面才推廣到自然選擇。將演進式架構(gòu)和進化論進行比較,可以看到一些有趣的共同點。

將軟件系統(tǒng)類比為生命體。不影響系統(tǒng)架構(gòu)的漸進式修改相當于生物的“遺傳”。對架構(gòu)的本質(zhì)性修改相當于生物的“變異”。變異的系統(tǒng)需要經(jīng)過各種驗證,看看是否符合人的需求,這實際上是一種“人工選擇”的過程。適應需求的架構(gòu)得以延續(xù),不適應的則會被淘汰或進一步變異,這就是演進式架構(gòu)中說的“導向性”,也這就是“適者生存”。達爾文指出物種的進化總是漸進式的,而不會短時間內(nèi)發(fā)生劇烈變化。這就是演進式架構(gòu)中的“增量式”變化。生物適應環(huán)境時,要適應多方面的因素:捕食能力、逃避天敵的能力、適應氣候的能力、抵御病蟲害的能力、繁殖能力等等。各種因素都適應,才能生存。同樣,系統(tǒng)也要適應多方面的因素:功能的正確性、可擴展性、可維護性、性能、安全等等。這就是演進式架構(gòu)中說的“多維度”。

上述類比可以促使我們對演進式架構(gòu)進行更深入的思考。至于具體技術(shù),可以參閱原書。

限界上下文與人類認識能力的有限性

雖然哲學家可能是人類有史以來最喜歡爭辯的群體,但有一個觀點,多數(shù)哲學家卻是有共識的:人的認識能力是有限的。從孟子的“吾生也有涯,而知也無涯”,到康德的“物自體不可知”,再到辯證唯物主義的“人只能認識相對真理”,都說明了這一點。那么,這和限界上下文有什么關(guān)系呢?

如果問一位同事限界上下文是什么,常常聽到這樣的回答:“業(yè)務(wù)功能的邊界”“業(yè)務(wù)領(lǐng)域的邊界”諸如此類。這種說法雖然沒錯,但說的是結(jié)果,不是原因;是表象,不是本質(zhì)。因為聚合、模塊等也可以說是一種“業(yè)務(wù)功能的邊界”。所以上述回答沒有答到點子上。

限界上下文是在《DDD》第14章“保持模型的完整性”中介紹的。眼尖的同學可能就會問了:為什么這一章的名字不叫做“劃分功能邊界”?這里的“完整性”到底指什么?

讓我們繼續(xù)看原文。這一章的開頭幾段所舉的例子,是說有兩個團隊共用了一個Charge(收費)對象。但兩個團隊所說的Charge背后的業(yè)務(wù)概念其實是有差別的。開始時兩個團隊都沒有意識到這個問題。他們都去改這個類,后來程序崩潰了。然后作者說“模型最基本的要求是它應該保持內(nèi)部一致,術(shù)語總具有相同的意義,并且不包含互相矛盾的規(guī)則……”。所以,作者在本章要解決的實際上是系統(tǒng)的一致性問題。

這一章標題中的“完整性”是對單詞Integrity的翻譯。Integrity固然有“完整性”的意思,但也包含“統(tǒng)一”、“健全”等含義。因此,本章的標題如果翻譯成“保持模型的統(tǒng)一”會更準確。翻譯成“完整性”則容易造成誤導。

保持系統(tǒng)的一致性,早已被IT界的前輩們所重視。例如,Brooks老師在七十年代寫的《人月神話》中已經(jīng)做了強調(diào)。不過,之前的專家們在潛意識里總是認為,對于一個復雜的系統(tǒng),總有辦法做到團隊理解的全局一致性?!度嗽律裨挕分芯土信e了若干種方法。

然而《DDD》中指出“在理想世界中,我們可以得到涵蓋整個企業(yè)領(lǐng)域的單一模型。這個模型將是統(tǒng)一的,沒有任何相互矛盾或相互重疊的術(shù)語定義”然而“大型系統(tǒng)領(lǐng)域模型的完全統(tǒng)一既不可行,也不劃算”。

為什么“不可行”呢?答案就是人類認識能力的有限性。由于大型軟件是團隊協(xié)作開發(fā)的,因此這里的認識能力還要擴展到群體的認識能力。也就是包含了個人的認識能力、群體的協(xié)作能力、以及兩者的相互作用。越是復雜的系統(tǒng),認知起來越困難。當系統(tǒng)復雜性達到一定程度時,就超過了一個團隊的認知能力,無法保證系統(tǒng)的一致性了。

解決的辦法就是分而治之,將一個“理想中”的大模型劃分成幾個小模型,每個小模型不超過團隊的認知能力。因此每個小模型內(nèi)部就可以保證嚴格的一致性,而與另一個模型內(nèi)部不需要一致,只需要約定好模型之間的接口就可以了。也就是說,我們在了解了人類認識能力的有限性之后,不再追求全局一致性,而是退而求其次,代之以局部的一致性,從而使系統(tǒng)的正確性在總體上得到管理,實現(xiàn)業(yè)務(wù)目標,這樣就足夠了。

概念的一致性是通過語義上的一致性來表達的,所以作者引用了語言學上“上下文”的術(shù)語。在日常語言中,人們常常會隨時切換上下文,在特定場景下未必會影響溝通。但在計算機軟件中,一個元素要么屬于一個上下文,要么不屬于,這個界限必須清清楚楚。為了強調(diào)這一邊界的重要性,因此稱為“限界上下文”。

上下文的具體劃分方法,仍然要圍繞領(lǐng)域概念的內(nèi)聚和耦合關(guān)系。因此劃分的結(jié)果,當然表現(xiàn)了一個“領(lǐng)域的邊界”或者說“功能的邊界”。如上文所述,這是結(jié)果而不是原因。

根據(jù)敏捷組織的理論,一個開發(fā)組的規(guī)模最好在5~9人之間(這是有心理學研究作為依據(jù)的)。那么,一個限界上下文的規(guī)模,一般就是這樣一個開發(fā)組所能把握的規(guī)模。

知道了人類認識能力的局限,就使我們對這個世界秉持謙卑和敬畏的態(tài)度。這也有助于我們理解限界上下文所要解決的問題、劃分的方法、及其與團隊的關(guān)系。最終使我們能夠正確劃分上下文,管控好復雜系統(tǒng)的一致性。

在這個系列文章的最后一篇,我們將繼續(xù)討論“核心域”、“統(tǒng)一語言”,并對全文做一個總結(jié)。


網(wǎng)頁標題:DDD的哲學:模型的關(guān)聯(lián)、演進和認知
URL分享:http://m.5511xx.com/article/cdjcooj.html