需求發(fā)生的『良性』『顯性』的變化就是軟件不斷迭代的驅(qū)動(dòng)力,因此我們積累的領(lǐng)域知識(shí)和模型也要適應(yīng)這種變化。關(guān)于提煉知識(shí)和建模,Eric Evans 也總結(jié)了一套名為*模型探討漩渦(https://www.domainlanguage.com/ddd/whirlpool/)的方法。

聚焦于問題域的難點(diǎn),領(lǐng)域?qū)<矣脤?shí)例(一系列步驟或者狀態(tài)變化)對(duì)場(chǎng)景進(jìn)行解釋,與此同時(shí),團(tuán)隊(duì)開始提煉模型或是審視當(dāng)前模型是否可以解決這些問題;不斷用領(lǐng)域?qū)<颐枋龅母鄨?chǎng)景來檢驗(yàn)?zāi)P偷挠行?;隨時(shí)將有助于揭示場(chǎng)景的模型場(chǎng)景和模型一并記錄成文檔,不斷進(jìn)行修正;當(dāng)團(tuán)隊(duì)獲得了對(duì)問題域的理解,并設(shè)計(jì)了足夠的模型后,應(yīng)該用原型或是實(shí)驗(yàn)代碼來對(duì)模型進(jìn)行驗(yàn)證。
搞清楚業(yè)務(wù)變化的具體的探索模型(建模)的方式有許多,例如事件風(fēng)暴工作坊(Event Storming)、用戶故事地圖(Story Mapping)、實(shí)例化需求(Specification By Example)。關(guān)于這些方法的綜合運(yùn)用,可以參考《DDD 15 年》中的一片總結(jié)《模型探索漩渦》(https://zhuanlan.zhihu.com/p/141804228)。這里不再贅述。
Eric Evans 強(qiáng)調(diào)建模漩渦并不是一種開發(fā)流程,卻能夠適用于各種迭代開發(fā)流程。無論是在軟件開發(fā)生命周期的那個(gè)階段,任何時(shí)候只要是模型出現(xiàn)問題,就應(yīng)該跳轉(zhuǎn)到建模的漩渦方法提煉領(lǐng)域知識(shí)。
無獨(dú)有偶,在Eric Evans 提出 DDD 的同時(shí)期,另一種流行的軟件開發(fā)方法論 RUP (https://en.wikipedia.org/wiki/Rational_Unified_Process)也特別強(qiáng)調(diào)迭代建模。RUP 將軟件生命周期分為四個(gè)階段:

構(gòu)思階段 :包括用戶溝通和計(jì)劃活動(dòng)兩個(gè)方面,強(qiáng)調(diào)定義和細(xì)化用例,并將其作為主要模型。
細(xì)化階段:包括用戶溝通和建?;顒?dòng),重點(diǎn)是創(chuàng)建分析和設(shè)計(jì)模型,強(qiáng)調(diào)類的定義和體系結(jié)構(gòu)的表示。
構(gòu)建階段:將設(shè)計(jì)轉(zhuǎn)化為實(shí)現(xiàn),并進(jìn)行集成和測(cè)試。
移交階段:將產(chǎn)品發(fā)布給用戶進(jìn)行測(cè)試評(píng)價(jià),并收集用戶的意見,之后再次進(jìn)行迭代修改產(chǎn)品使之完善。
聽起來有些像傳統(tǒng)的瀑布式軟件開發(fā)方法,但是 RUP 的每個(gè)階段也劃分成了更小的迭代。而且我們可以看到,業(yè)務(wù)建模始終貫穿了其生命周期的四個(gè)階段。
作為一種厚重的軟件開發(fā)方法論,RUP 如今已不再流行,但是迭代建模的思想依然值得我們借鑒。我們應(yīng)當(dāng)抓住軟件開發(fā)生命周期中任何和領(lǐng)域?qū)<医涣鞯臋C(jī)會(huì),通過挑戰(zhàn)和澄清,不斷地完善領(lǐng)域知識(shí)和模型。
到現(xiàn)在為止,似乎探索模型的實(shí)踐大部分和梳理需求的實(shí)踐雷同(除了實(shí)踐風(fēng)暴工作坊),好像我們?cè)谑崂硇枨蟮耐瑫r(shí)就完善了領(lǐng)域模型(當(dāng)然更新模型的可視化需要花費(fèi)額外的時(shí)間)。但我們可能忽視了一個(gè)問題,如何保證代碼實(shí)現(xiàn)也隨著領(lǐng)域模型的完善而演進(jìn)。在 Eric 的模型探索階段中有提到用實(shí)驗(yàn)代碼來驗(yàn)證模型,當(dāng)代碼能夠和模型匹配上,自然應(yīng)該進(jìn)入代碼倉(cāng)庫。除此之外還有其他的實(shí)踐嗎?
迭代建模是對(duì)現(xiàn)有模型的刷新,而模型最為關(guān)鍵的兩個(gè)要素是領(lǐng)域?qū)ο蠛瓦吔?。領(lǐng)域?qū)ο蠖汲袚?dān)著業(yè)務(wù)上的職責(zé),必須有明確的描述;而邊界體現(xiàn)著高內(nèi)聚低耦合(不同粒度的邊界,內(nèi)聚的原則不同),邊界內(nèi)外的依賴有著不一樣的約束。描述職責(zé)和約束依賴應(yīng)該是代碼對(duì)領(lǐng)域模型的最佳體現(xiàn)。