內容簡介這是一本從業(yè)務和架構視角講解DDD的基本原則、底層邏輯、落地難點、落地方法和進階技巧的實戰(zhàn)性著作。DDD的理論體系復雜,學習和實踐門檻較高,已有的關于DDD的著作或多或少存在理論描述難理解、案例示范難落地等問題,阻礙了DDD在實踐中的應用。本書作者有20余年的軟件研發(fā)經(jīng)驗,對DDD有深刻的理解,深諳DDD實踐過程中的痛點,他在這本書中高屋建瓴、化繁為簡,讓讀者有撥云見霧之感。理論部分(第1~3章)從軟件工程的基本思想出發(fā),首先分析了DDD產(chǎn)生的原因,并由此推論出DDD的基本原則,這些內容是學習本書的基礎;緊接著分析了DDD落地的難點,幫助讀者掃清障礙;然后提煉出了DDD的成熟度模型,包括DDD的戰(zhàn)略、戰(zhàn)術和衡量指標。這些內容極具針對性和獨創(chuàng)性,是研發(fā)團隊必須掌握的,也是目前同類書中很少講的。實戰(zhàn)部分(第4~10章)從業(yè)務建模和架構的角度切入,首先用搭積木的方式講解和演示了DDD項目由簡易到復雜的落地過程,包含大量的業(yè)務建模場景和案例,涉及如何應用通用語言、如何建模領域邏輯、如何應用上下文和子域切分系統(tǒng)以及如何保持語言、模型、代碼的一致性等重要內容;然后講解了如何將各種設計模式應用到DDD中,以及如何設計出能讓DDD更好落地的系統(tǒng)架構。這些內容兼具實操性和思想性,充滿經(jīng)驗和智慧,在同類書中同樣也不多見。
(1)作者背景:作者是亞信云研發(fā)總監(jiān),有超過20年的軟件研發(fā)經(jīng)驗,曾就職于微軟等企業(yè)。(2)作者經(jīng)驗豐富:作者對DDD有深刻理解,成功主導多個互聯(lián)網(wǎng)商業(yè)項目。(3)克服同類弊病:作者用豐富的經(jīng)驗和深入的思考,將DDD化繁為簡,克服了同類書難理解和不落地的問題,讓讀者撥云見霧。(4)針對性、獨創(chuàng)性:DDD原則、DDD底層邏輯、DDD成熟度模型、DDD落地難點等多個知識點都是讀者獨創(chuàng),極具針對性,同類書不具備。(5)實操性、思想性:用搭積木方式演示DDD項目搭建過程,將DDD與設計模式和系統(tǒng)架構深度融合,在同類書中同樣也不多見。(6)企業(yè)界、學術界力薦:來自騰訊、華為、北交大等知名企業(yè)和學府的近10位專家高度評價并鼎力推薦。
Preface 前 言
為什么要寫這本書
本書創(chuàng)作的初心有兩個。
第一,服務于廣大開發(fā)人員的職業(yè)進階和轉型。
本書講授的是領域驅動設計(Domain-Driven Design,DDD)的相關知識。DDD是一種業(yè)務建模和架構設計方法,而業(yè)務建模和架構設計是開發(fā)人員職業(yè)進階和轉型的技能。
在當今AI技術大流行的背景下,快速掌握這兩項技能對開發(fā)人員來說很重要,因為寫程式化“膠水代碼”的工作很快就會被AI所取代。AI加速了開發(fā)這個崗位的進化和發(fā)展,這并不是件壞事。試想一下未來開發(fā)團隊的工作場景:建模師們和行業(yè)的領域專家共同完成模型的搭建,AI就幫助我們生成了相應的代碼,包括測試和必要的界面,之后只要把這些代碼和工作成果稍加優(yōu)化,整個開發(fā)就結束了。功能實現(xiàn)以后,架構師登場,根據(jù)業(yè)務需要設定除功能之外的其他質量屬性的要求,如安全、性能、可用性、可維護性和兼容性,并在AI的輔助下給出各個質量屬性的解決方案,配合云原生或PaaS平臺的部署環(huán)境,系統(tǒng)很快搭建完畢,上線運行。
在這個場景中,你所要做的就是把職業(yè)技能樹上的建模或架構這兩部分點亮。所以,如果未來本書注定會出現(xiàn)在你的辦公桌上,不如現(xiàn)在就把它買回家—可以先人一步,及早開始。
有人會說,憑什么未來和你描述一樣呢?是不是有蹭AI熱度之嫌?好吧,撇開AI不談(其實它并不是一個體現(xiàn)本書價值的關鍵因素),想象一下五年后的自己,任何技術人員的職業(yè)發(fā)展都是從低級到高級、技術到業(yè)務、具體到抽象的過程。即便沒有AI,我們是要立志成為精通多個領域知識的建模師、架構師,還是一個只會寫代碼,知曉許多類庫用法的技術人員?答案在你心中。更何況,上面描述的工作場景已經(jīng)不是未來時態(tài)了,在很多團隊中已經(jīng)真真切切地開始發(fā)生。
幾年之內,開發(fā)人員都會逐步轉到新的工作中,開發(fā)崗位的工作內容會發(fā)生巨大變化。如前所言,這絕不是壞事,它讓我們的職業(yè)邁上了新的臺階,而我們唯一要做的就是開始學習,點亮建模和架構的技能樹。
本書可以成為一個不錯的起點,不管你是否曾經(jīng)了解過DDD、參與過模型構建,它都可以讓你輕松地開始。隨著閱讀的深入,你會發(fā)現(xiàn)自己已經(jīng)完全被代入了建模師和架構師的角色。
第二,推動DDD方法落地的同時促進國內軟件工程思想的發(fā)展。
從20年前上學時閱讀的《人月神話》《人件》,到如今敏捷、DevOps、TDD、DDD等各種方法滿天飛,所有主流的軟件工程思想都來源于國外。當然,由于技術發(fā)展的歷史原因,這并不奇怪。我們也早已不缺少世界級的互聯(lián)網(wǎng)公司和有實力的科技企業(yè),但在“如何開發(fā)好軟件”這個問題上,還很難看到國人的創(chuàng)新思維和貢獻,更關鍵的是,我們甚至都沒意識到這是個問題。
更嚴重的影響還在于,由于缺乏對這個問題的主動探索和深入思考,我們對外來方法論的應用大多停留在“術”的層面,缺乏對“道”的探究。有術無道止于術,有太多生搬硬套、南轅北轍的例子了,團隊和企業(yè)管理者根本感受不到這些方法論帶來的價值,甚至對它們產(chǎn)生了誤解和反感。
本書與其他講授DDD的書籍的主要區(qū)別在于,它絕不僅僅講授方法和技巧(當然,本書在這方面也有非常豐富且創(chuàng)新的內容),還深入發(fā)掘了其背后的思想和原理。使用的軟件工程和架構原則的分析方法也不局限于應用在DDD上,而是可以用來衡量任何方法的效能和技術決策的優(yōu)劣。
本書的目的之一是在指導團隊成功落地DDD的同時,激發(fā)讀者對書中思維角度和分析方法的思考。因此這些思想和方法都不是完美無瑕的,而恰恰相反,筆者希望讀者能在思考后給出批判性的意見。激發(fā)讀者思考,終究會點燃有才華的讀者的靈感之火。
讀者對象
AI時代需要職業(yè)轉型的開發(fā)人員、架構師及其他IT從業(yè)者。
工業(yè)制造、新興互聯(lián)網(wǎng)等復雜領域的軟件開發(fā)團隊。
計劃或已經(jīng)落地DDD、TDD、微服務和DevOps的軟件開發(fā)團隊。
技術管理者、研發(fā)效能專家和咨詢顧問。
即將步入社會的計算機系大學生。
本書主要內容
第1~3章為理論部分,主要講授DDD的底層邏輯、基本原則、價值、落地難點和成熟度模型。其中,第1章是全書的基石,特別是DDD的兩個基本原則,是我們討論后面內容的基礎,讀者務必仔細閱讀、領悟和掌握。第2章分析了DDD落地的難點,幫助團隊掃清障礙。第3章首次提出DDD成熟度模型,不僅列出了整個DDD戰(zhàn)略和戰(zhàn)術模式,還提出了企業(yè)收益這個對企業(yè)意義重大的衡量指標,3個成熟度階段的劃分對團隊也具有重要的指導意義。
第4~10章為實操部分,主要講授DDD的戰(zhàn)略和戰(zhàn)術,分別對應于業(yè)務建模和架構技術。其中,第4~6章側重于業(yè)務建模,主要介紹如何構建領域模型和打造通用語言。第7章側重于架構技術,主要講授如何分割系統(tǒng)、構建模塊。第8章主要解決DDD在編碼環(huán)節(jié)可能遇到的問題。第9章則是設計模式的運用,這些模式將幫助我們得到更加智慧、更加優(yōu)雅健壯的領域模型。第10章闡述DDD和系統(tǒng)架構之間的關系。
勘誤和支持
作者在博客園(Cnblogs.com)開設了專欄講解書中的內容并回答讀者提問,讀者在該網(wǎng)站搜索書名即可找到相關專欄并參與討論。
目 錄 Contents
前言
第1章 DDD的基本原則與價值分析1
1.1 DDD的初心1
1.1.1 軟件項目成敗的關鍵1
1.1.2 兩個亟須驗證的事實3
1.2 DDD的基本原則6
1.2.1 DDD的兩個基本原則7
1.2.2 原則的底層邏輯10
1.3 DDD的價值分析12
1.3.1 復雜度控制12
1.3.2 架構原則16
1.3.3 團隊協(xié)作20
1.4 關于DDD原則的案例23
第2章 DDD落地難點分析35
2.1 DDD的適用范圍35
2.1.1 領域特性36
2.1.2 團隊成熟度38
2.1.3 適用性評分表39
2.2 5個常見誤區(qū)39
2.3 文化的變革44
2.3.1 領域專家的邊界44
2.3.2 設計師的錘子46
2.3.3 開發(fā)人員的輪子47
2.4 團隊的挑戰(zhàn)48
2.4.1 管理者的責任48
2.4.2 開發(fā)團隊的意識和技能50
2.4.3 角色重新定位51
2.5 測試、過程和架構的佳搭檔52
2.5.1 測試的佳搭檔:TDD和
單元測試52
2.5.2 過程的佳搭檔:敏捷過程
和DevOps54
2.5.3 架構的佳搭檔:六邊形、
洋蔥和分層架構56
第3章 DDD成熟度模型59
3.1 成熟度模型的目的及特殊性59
3.2 5個度量維度60
3.3 3級成熟度模型63
第4章 模型的要素—用例、
視圖和構造塊68
4.1 模型的構建步驟68
4.2 模型的場景:用例69
4.2.1 用例的定義69
4.2.2 用例的目的70
4.2.3 發(fā)現(xiàn)用例72
4.2.4 用例的編寫73
4.3 模型的數(shù)據(jù):類圖76
4.3.1 屬性77
4.3.2 方法78
4.3.3 注釋、約束和關鍵字79
4.3.4 依賴和限定關聯(lián)80
4.3.5 聚合與組合82
4.4 模型的行為:交互圖83
4.4.1 時序圖84
4.4.2 協(xié)作圖89
4.4.3 交互圖與類圖的關系91
4.5 模型的變化:操作契約92
4.5.1 作用93
4.5.2 后置條件94
4.5.3 準則94
4.6 模型的構造塊:實體、值對象、
領域服務95
4.6.1 實體95
4.6.2 值對象99
4.6.3 實體與值對象的比較103
4.6.4 領域服務105
第5章 從語言到模型—基礎
模型構建108
5.1 設計目標108
5.2 設計之前的準備工作110
5.2.1 語言110
5.2.2 角色111
5.2.3 溝通111
5.2.4 方法113
5.2.5 工具113
5.2.6 時間115
5.3 領域模型的構建115
5.3.1 發(fā)掘領域概念116
5.3.2 創(chuàng)建關聯(lián)118
5.3.3 定義屬性123
5.3.4 分配職責125
5.3.5 觸發(fā)事件128
5.3.6 處理異常134
5.4 典型的領域邏輯建模137
5.4.1 規(guī)則與約束137
5.4.2 流程與分支140
5.4.3 驗證與篩選142
5.4.4 算法與計算144
5.4.5 時間與空間146
5.4.6 有狀態(tài)與無狀態(tài)149
5.4.7 同步與異步150
5.5 典型案例151
5.5.1 案例1:在線購物網(wǎng)站152
5.5.2 案例2:汽車租賃系統(tǒng)153
5.5.3 案例3:銀行系統(tǒng)154
第6章 精煉模型—深入模型設計156
6.1 模型引力場:聚合156
6.1.1 聚合的定義及作用157
6.1.2 聚合規(guī)則158
6.1.3 聚合設計法則158
6.1.4 實現(xiàn)方法161
6.2 模型裝配線:工廠163
6.2.1 為什么需要工廠163
6.2.2 廠址選擇169
6.3 模型貨架:存儲庫171
6.3.1 為什么需要存儲庫171
6.3.2 存儲庫接口175
6.3.3 存儲庫與工廠的區(qū)別176
6.3.4 存儲庫與數(shù)據(jù)訪問對象的區(qū)別177
6.3.5 存儲庫實現(xiàn)的注意事項177
6.4 富二代的煩惱:基類與繼承178
6.4.1 抽象、泛化與DDD178
6.4.2 通用語言與基類179
6.4.3 為多態(tài)去繼承181
6.4.4 合格的子類、自然的繼承關系:
Liskov原則182
6.4.5 抽象類與接口的選擇183
6.5 模型質量:優(yōu)秀的開發(fā)組件 184
6.5.1 精心設計領域模型的特征184
6.5.2 模型設計的基本原則186
6.5.3 為擴展性而設計188
第7章 分而治之—上下文、
模塊和子域191
7.1 分離用例、模型和團隊:上下文191
7.1.1 什么是上下文191
7.1.2 為什么需要上下文193
7.1.3 上下文的識別方法195
7.1.4 識別上下文的步驟199
7.1.5 同一上下文工作法200
7.1.6 跨上下文團隊工作法202
7.2 重用性和穩(wěn)定性:模塊207
7.2.1 包的內聚性原則207
7.2.2 包的耦合性原則209
7.3 區(qū)別特殊性與一般性:子域211
7.3.1 核心競爭力:核心域211
7.3.2 周邊業(yè)務:支撐域215
7.3.3 通用能力:通用域215
7.4 上下文、模塊和子域之間的關系216
7.4.1 上下文和子域的關系216
7.4.2 上下文和模塊的關系216
7.4.3 子域和模塊的關系217
第8章 關鍵細節(jié)—從模型到代碼218
8.1 DDD 中的代碼要求