DDD的哲學(xué):核心域、統(tǒng)一語言
作者 | 鐘敬
閱讀本系列文章:《??DDD的哲學(xué):模型的關(guān)聯(lián)、演進(jìn)和認(rèn)知??》
核心域與主要矛盾
大約公元前800年至前200年間,中國、希臘、印度和以色列的文明幾乎在同一時(shí)期興起,這被稱為人類文明的軸心時(shí)代。不同文明展現(xiàn)出了不同的風(fēng)貌。中國古代文化強(qiáng)調(diào)辯證邏輯,重視變化、聯(lián)系和綜合的思維方式,同時(shí)又有“子不語怪力亂神,六合之外存而不論”的唯物主義傾向。古希臘則重視嚴(yán)格的推理和分析,孕育了形式邏輯和公理化的數(shù)學(xué)體系。印度在婆羅門和佛教哲學(xué)中,從另一個(gè)方向?qū)⑥q證法、邏輯和語言學(xué)推向極致。以色列的先知?jiǎng)t創(chuàng)立了一神論的猶太教和政教合一的社會(huì)體制。
直到近代,西方才產(chǎn)生了系統(tǒng)的辯證法體系,集大成者是黑格爾。馬克思和恩格斯吸收了黑格爾的辯證法,揚(yáng)棄了其中的唯心主義成分,形成了辯證唯物主義,成為了風(fēng)起云涌的無產(chǎn)階級(jí)革命的理論基礎(chǔ)。后來唯物辯證法傳入中國,與中國傳統(tǒng)文化中的辯證法和唯物主義思想一拍即合。為了將馬克思主義中國化,毛老師寫出了《實(shí)踐論》和《矛盾論》。前文提到了《矛盾論》第一部分“兩種宇宙觀”,這一節(jié)看一下第四部分“主要的矛盾和主要的矛盾方面”。
事物中包含著多種矛盾,其發(fā)展變化成為事物發(fā)展的內(nèi)在動(dòng)力。在多種矛盾中,一般會(huì)有一種占主導(dǎo)地位,稱為“主要矛盾”。要有效地處理問題,就要抓住主要矛盾。
例如某籌備開業(yè)的保險(xiǎn)公司要開發(fā)一個(gè)保險(xiǎn)核心系統(tǒng)。在開始時(shí),“快速開展新單業(yè)務(wù)的需要與落后的新單處理能力”的矛盾就是主要矛盾,而“快速理賠的要求與落后的理賠能力”之間的矛盾則是次要矛盾。這是因?yàn)椋麻_業(yè)的保險(xiǎn)公司首先面臨的是新單業(yè)務(wù)的壓力而不是理賠的壓力。
在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,領(lǐng)域模型中包含主要矛盾的部分,稱為“核心域”(Core Domain)。在復(fù)雜的領(lǐng)域模型中,將核心域識(shí)別并有效處理的過程稱為“精煉”(Distillation, 《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》第15章)。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中還提供了“領(lǐng)域愿景說明”(Domain Vision Statement),“強(qiáng)調(diào)核心” (Highlighted Core), “分離核心”(Segregated Core)等模式用于精煉過程的具體實(shí)踐。
隨著內(nèi)因和外因的變化,主要矛盾和次要矛盾會(huì)發(fā)生轉(zhuǎn)化。例如,當(dāng)處理新單業(yè)務(wù)的系統(tǒng)成熟后,就成為了次要矛盾,而理賠則成為主要矛盾。當(dāng)理賠也成熟后,靈活的產(chǎn)品和算法的定義可能變?yōu)橹饕堋?/p>
總之,以矛盾的觀點(diǎn)看問題,就可以知道識(shí)別和處理“核心域”的必要性,同時(shí)以發(fā)展的眼光看待核心域的轉(zhuǎn)化。
這里還有一個(gè)微妙的問題:目前業(yè)界不同人所說的“核心域”的含義是有區(qū)別的。假如我們把業(yè)務(wù)需求作為“問題空間”,將軟件系統(tǒng)的分析和設(shè)計(jì)作為“解空間”,那么《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書中所說的核心域?qū)嶋H上處于解空間,而另一本《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中的核心域說的是問題空間。
《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中,核心域在“精煉”一章中。其邏輯在于,先有領(lǐng)域模型,然后在領(lǐng)域模型發(fā)展到一定的復(fù)雜程度時(shí),就需要從中“精煉”出核心域了。由于領(lǐng)域模型處于解空間,因此《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中的“核心域”談的是解空間的問題。
而《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中的核心域則來自于對(duì)業(yè)務(wù)問題的分解,因此屬于問題空間,先于領(lǐng)域模型的建立。
存在兩個(gè)層面的“核心域”的現(xiàn)象具有一定的合理性。因?yàn)槊苁瞧毡榇嬖诘模却嬖谟趩栴}空間,也存在于解空間,兩者都有“主要矛盾”,所以可以說兩個(gè)層面都存在核心域。
目前多數(shù)人理解的核心域是《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》中的說法,而《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》原書中的模式和實(shí)踐卻沒有得到重視。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)本來要求“統(tǒng)一語言”,但“核心域”這一概念自身已經(jīng)不統(tǒng)一了。這是業(yè)界需要解決的一個(gè)問題。
下一節(jié)就來看看與統(tǒng)一語言相關(guān)的問題吧。
統(tǒng)一語言與哲學(xué)的“語言轉(zhuǎn)向”
前面介紹了哲學(xué)從本體論向方法論的轉(zhuǎn)變。在方法論方面,洛克、休謨、帕斯卡等等大家宛如哲學(xué)天空中的星斗,而黑格爾和康德是其中最璀璨的兩顆。
然而新的問題來了。這些哲學(xué)家的著作中往往充斥著晦澀的詞匯,其中很多是自造的,在此基礎(chǔ)上又進(jìn)行了復(fù)雜的推演,然后產(chǎn)生了更加晦澀的語言。這些莫衷一是的概念又被后人按照自己的意思做了不同的解釋。后果是,不僅普通人難以窺其門徑,即便專業(yè)的哲學(xué)工作者,也會(huì)爭論不休。盡管由此產(chǎn)生了大量論文和“學(xué)術(shù)成果”,但人們也逐漸意識(shí)到,很多爭論僅僅是由于對(duì)同一名詞的理解不同,而沒有解決任何實(shí)際問題。這樣的哲學(xué)除了在象牙塔中孤芳自賞,又有多少實(shí)際意義?
到了十九世紀(jì)末,人們逐漸意識(shí)到問題很可能出在“語言”上,很多哲學(xué)問題來源于對(duì)語言的誤用。解決了語言問題,就解決了哲學(xué)問題。由此產(chǎn)生了“語言哲學(xué)”,并成為了二十世紀(jì)上半葉英美哲學(xué)的主流。如果說認(rèn)識(shí)論是“對(duì)思考的思考”,那么語言哲學(xué)就是“對(duì)言說的言說”。盡管歷史上有很多哲學(xué)家也很重視語言,但那時(shí)語言只是研究哲學(xué)的工具;而現(xiàn)在,語言成了哲學(xué)本身。這種哲學(xué)關(guān)注點(diǎn)的轉(zhuǎn)移,稱為“哲學(xué)的語言轉(zhuǎn)向”(the linguistic turn in philosophy)。
信息技術(shù)和語言有著不解之緣。當(dāng)您初次學(xué)習(xí)編程,知道了一條條指揮計(jì)算機(jī)工作的指令被稱為計(jì)算機(jī)“語言”時(shí),是否曾像我當(dāng)初那樣,有過一絲的驚訝?
在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中和語言直接相關(guān)的模式是“統(tǒng)一語言”(Ubiquitous Language)。該模式出現(xiàn)在《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》的第二章,屬于該書第一部分“運(yùn)用領(lǐng)域模型”,與“消化知識(shí)”和“模型驅(qū)動(dòng)設(shè)計(jì)”共同作為全書的總綱。
“統(tǒng)一語言”要求業(yè)務(wù)和開發(fā)人員要用一致的語言來溝通。例如,同一個(gè)概念應(yīng)該用同一個(gè)詞匯,同一詞匯也僅表達(dá)唯一的概念。這一道理是如此“直白”,為什么領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)還要專門強(qiáng)調(diào)呢?因?yàn)檫@一實(shí)踐看似不難理解,但要在實(shí)踐中真正做好則不太容易。下面我們從語言哲學(xué)的角度看一看軟件開發(fā)中有關(guān)語言的問題。
首先,語言哲學(xué)認(rèn)為,語言的意義是在使用的過程中體現(xiàn)出來的。
前面提到的早期哲學(xué)家,他們的語言是為了表達(dá)自己的觀念自造的,并沒有真正被用來解決實(shí)際問題,因而沒有“恰當(dāng)”地使用語言,從而造成了新的哲學(xué)問題。
回到軟件開發(fā),如果對(duì)軟件的理解只是寫在文檔中,而這些文檔很少有機(jī)會(huì)被閱讀,沒有真正起到交流的作用,那么也可以看作對(duì)語言的誤用。這也正是敏捷軟件開發(fā)所反對(duì)的。而統(tǒng)一語言強(qiáng)調(diào)不同干系人,尤其是業(yè)務(wù)人員和開發(fā)人員間的溝通。只有在協(xié)作中,統(tǒng)一語言才有意義。
近年流行的“事件風(fēng)暴”方法,也可看作是統(tǒng)一語言的應(yīng)用。事件風(fēng)暴和經(jīng)典的用例分析方法所解決的問題其實(shí)是類似的,都是為了捕獲行為需求,為進(jìn)一步的領(lǐng)域建模奠定基礎(chǔ)。事件風(fēng)暴中的“風(fēng)暴”來源于頭腦風(fēng)暴,是常用的溝通協(xié)作方法。因此,溝通協(xié)作是事件風(fēng)暴的內(nèi)在組成部分,這一點(diǎn)是事件風(fēng)暴優(yōu)于傳統(tǒng)的用例分析的地方。
其次,語言哲學(xué)強(qiáng)調(diào)語言的表達(dá)能力是有的限度的。
如維特根斯坦所說,“凡可說的,皆可說清;凡不可說的,應(yīng)保持緘默”。前面提到的早期哲學(xué)家的另一個(gè)問題,就是強(qiáng)行用語言表達(dá)無法表達(dá)的東西。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)認(rèn)為,軟件開發(fā)的過程可以看作知識(shí)的學(xué)習(xí)、構(gòu)建和運(yùn)用的過程。而有些知識(shí)是語言難以表達(dá)的。不過,難以表達(dá)不代表不可知。比如說,我們難以向沒有吃過梨子的人描述梨子的味道,但這并不代表梨子的味道是不可知的,只要嘗一下就可以了。軟件開發(fā)中的不可言說知識(shí)同樣不是玄學(xué),而完全可以通過持續(xù)的交流和實(shí)踐來掌握。因此,不要期望通過文檔可以表達(dá)所有知識(shí),而要回歸到干系人之間的溝通和協(xié)作。
再次,語言哲學(xué)認(rèn)為,語言只有在特定的語境(Context)中才有意義。
前文已經(jīng)提到,領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中利用限界上下文(Bounded Context)來保證概念的一致性。而統(tǒng)一語言是針對(duì)限界上下文而言的,只有在其所處的上下文中才有意義。英文Context在中文中有兩種譯法:“語境”和“上下文”。目前《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書中采用了“上下文”的譯法。其實(shí)譯作“語境”可能更恰當(dāng),在“語境”中運(yùn)用“語言”,意思會(huì)更協(xié)調(diào)一些。
最后,語言哲學(xué)又可分成兩大流派:較早的“理想語言學(xué)派”和晚一些的“日常語言學(xué)派”。
理想語言學(xué)派認(rèn)為自然語言是模糊的,哲學(xué)的出路在于利用數(shù)理邏輯創(chuàng)造一種形式化的語言。這種語言不僅表意明確,而且可以跨越各種自然語言。這在后來導(dǎo)致了計(jì)算機(jī)科學(xué)的基礎(chǔ)理論“形式語言與自動(dòng)機(jī)”的產(chǎn)生。
這一過程可以追溯到十七至十八世紀(jì),萊布尼茨發(fā)明的二進(jìn)制以及提出的“通用文字”(characteristica universalis)的構(gòu)想。到了十九世紀(jì),布爾利用二進(jìn)制使邏輯成為了數(shù)學(xué)演算。布爾代數(shù)至今仍然是計(jì)算機(jī)科學(xué)的基礎(chǔ)。稍后,現(xiàn)代邏輯學(xué)之父弗雷格提出了一階謂詞演算。這一理論也導(dǎo)致了像Prolog這樣的邏輯編程語言的誕生。二十世紀(jì),羅素、哥德爾等人進(jìn)一步將數(shù)理邏輯發(fā)揚(yáng)光大。后來,圖靈提出的“圖靈機(jī)”,丘奇提出的lambda演算,成為了算法和編程語言的數(shù)學(xué)基礎(chǔ)。我們程序員所使用的各種編程語言,也可以算作形式語言。
較晚出現(xiàn)的一派則認(rèn)為自然語言本身就是精確的,之所以會(huì)讓人覺得模糊,是因?yàn)闆]有進(jìn)入特定的語境。因此,應(yīng)通過對(duì)自然語言本身的研究處理哲學(xué)問題,而無需借助形式語言。這就是“日常語言學(xué)派”。
對(duì)于軟件開發(fā)者來說,沒有必要陷入哲學(xué)家的爭論。我們反而可以看到兩者各自的合理性,以及互相銜接的可能。
一方面,計(jì)算機(jī)中運(yùn)行的是二進(jìn)制的字節(jié)流,而這又是由編程語言編譯得來的。機(jī)器語言和編程語言都是形式語言。另一方面,計(jì)算機(jī)所要解決的業(yè)務(wù)問題,卻開始于日常語言或者說自然語言的描述。因此我們必須有一種自然語言和形式語言的轉(zhuǎn)換機(jī)制。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中的領(lǐng)域建模正是這一機(jī)制的重要環(huán)節(jié)。領(lǐng)域模型在自然語言和編程語言之間建立起了橋梁,幫助跨越兩者之間的巨大鴻溝,成為開發(fā)復(fù)雜軟件的重要手段。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中,常用UML(統(tǒng)一建模語言)進(jìn)行領(lǐng)域建模。嚴(yán)格地說,UML也是一種形式語言。不過比起編程語言,UML更貼近業(yè)務(wù)概念,更容易與自然語言轉(zhuǎn)換。同時(shí),用UML建立的領(lǐng)域模型,又可以方便地映射到編程語言和數(shù)據(jù)庫設(shè)計(jì)。UML常用于軟件系統(tǒng)的分析和設(shè)計(jì),而編程語言用于編碼。在分析、設(shè)計(jì)、編碼過程中保持語言的統(tǒng)一,是統(tǒng)一語言的另一層意思。
小結(jié)
我們用若干章節(jié)探討了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的哲學(xué)內(nèi)涵。兩者之間的這種契合關(guān)系并非偶然。
哲學(xué)的主要目的是解決對(duì)世界進(jìn)行認(rèn)識(shí)(認(rèn)識(shí)論)和詮釋(語言哲學(xué))問題。前面說的本體論,從現(xiàn)在的觀點(diǎn)來看也可以理解為一種對(duì)世界的詮釋。
計(jì)算機(jī)系統(tǒng)本質(zhì)上是用軟硬件對(duì)現(xiàn)實(shí)中的事物以及邏輯進(jìn)行模擬,進(jìn)而解決現(xiàn)實(shí)中的問題。計(jì)算機(jī)軟件可以看作現(xiàn)實(shí)世界的模型。在計(jì)算機(jī)中最終運(yùn)行的模型是二進(jìn)制流,這在形式上與現(xiàn)實(shí)世界有巨大的差距,這是軟件開發(fā)的本質(zhì)復(fù)雜性之一。
為了跨越現(xiàn)實(shí)世界和二進(jìn)制模型之間的鴻溝,軟件開發(fā)方法學(xué)采取了漸進(jìn)的方式。首先將現(xiàn)實(shí)世界映射為分析模型,然后由分析模型映射為設(shè)計(jì)模型,再映射為編程語言模型,最后編譯成二進(jìn)制模型。通過這種逐層遞進(jìn)的方式,來化解軟件開發(fā)的困難。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)中所說的領(lǐng)域模型,主要指上面說的分析模型,目的是為了反應(yīng)業(yè)務(wù)概念,也兼顧了一定的開發(fā)視角。建立領(lǐng)域模型的過程,就是認(rèn)識(shí)現(xiàn)實(shí)世界中的概念及其發(fā)展變化邏輯的過程,而這正是認(rèn)識(shí)論和語言哲學(xué)的應(yīng)用場景。這就是哲學(xué)對(duì)領(lǐng)域建模以及整個(gè)軟件開發(fā)過程具有指導(dǎo)作用的原因。
對(duì)領(lǐng)域建模的強(qiáng)調(diào),并非始自領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),而是從軟件開發(fā)方法學(xué)出現(xiàn)的時(shí)候就已經(jīng)開始了。早期的結(jié)構(gòu)化方法學(xué),采用數(shù)據(jù)流圖和ER圖等方式進(jìn)行建模。后來發(fā)展為面向?qū)ο蠓椒▽W(xué),采用對(duì)象建模的方式。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)則是對(duì)面向?qū)ο蠓椒▽W(xué)的歸納和發(fā)展,為面向?qū)ο蠓椒▽W(xué)建立了一套模式語言,使之更容易學(xué)習(xí)和運(yùn)用。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)主要面向的還是傳統(tǒng)意義上的軟件開發(fā),尤其是企業(yè)應(yīng)用的開發(fā)。經(jīng)過幾十年的發(fā)展,至少在理論上已經(jīng)研究得比較透徹了,難點(diǎn)在于工程上的推廣和應(yīng)用。而近年來,人工智能、大數(shù)據(jù)以及下一代互聯(lián)網(wǎng)的發(fā)展,帶來了一系列新的問題:隱私如何保護(hù)?誰擁有個(gè)人行為數(shù)據(jù)的所有權(quán)?人工智能是否會(huì)剝奪人的自由意志?怎樣判定人工智能作惡的法律責(zé)任?機(jī)器人可以用于戰(zhàn)場嗎?個(gè)人怎樣面對(duì)高科技所帶來的焦慮?等等。這些則是倫理學(xué)、心靈哲學(xué)所要討論的問題。這些話題超出了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的范圍,我們的討論,也可告一段落了。