序
寫下本書第一個字的具體時間已不可考。從文件創建的時間看,本書的寫作至少可以追溯到2017 年11
月,屈指算來,三載光陰已逝。為了本書,我已算得上嘔心瀝血。回想這三年多時光,無論是在萬公尺高空的飛行途中,還是在蔚藍海邊的旅行路上,抑或工作之餘正襟危坐於書桌之前,我的心弦一刻不敢放鬆,時刻沉思系統的建構,糾結案例的選擇,反覆推敲文字的運用。我力求輸出最好的內容,希望打造領域驅動設計技術書籍的經典!
我在ThoughtWorks 的前同事滕雲開我的玩笑:「老人家,你寫完這本書,也就功德圓滿了!」、「老人家」是我在ThoughtWorks 的諢名。我雖然對此稱呼一直敬謝不敏,不過寫作至今,我已心力交瘁,被稱作「老人家」,也算「名副其實」了。至於是否「功德圓滿」,就要交給讀者諸君來品評了。
本書內容主要來自我在GitChat 發佈的課程「領域驅動設計實踐」。該課程歷經兩年打造,完成於2020 年1 月21 日。當時的我,頗有感慨地寫下如此後記:
課程寫作結束了。戰略篇一共34 章,約15.5 萬字;戰術篇一共71 章,約35.1 萬字。合計105 章,50.6 餘萬字,加上2 篇訪談錄、2 篇開篇詞與這篇可以稱為「寫後感」的後記,共110 章。如此成果也足可慰藉我為之付出的兩年多的艱辛時光!
我對「領域驅動設計實踐」課程的內容還算滿意,然而,隨著我對領域驅動設計的了解的蛻變與昇華,我的「野心」也在不斷膨脹,我不僅希望講清楚應該如何實踐領域驅動設計,還企圖對這套方法區塊系進行深層次的解構。
所謂「解構」,就是解析與重構:解析,就是要做到知其然更知其所以然;重構,則要做到青出於藍而勝於藍。
我欽佩並且尊敬Eric Evans 對領域驅動設計革命性的創造,他對設計的洞見讓我尊敬不已。尤其在徹底吃透界限上下文的本質之後,微服務又蔚然成風,我更加佩服他的遠見卓識。然而,尊敬不是膜拜,佩服並非盲從,在實踐領域驅動設計的過程中,我確實發現了這套方法區塊系天生的不足。於是,我在本書中提出了我的GitChat 課程不曾涵蓋的領域驅動設計統一過程(domain-driven
design unified process,DDDUP),相當於我站在巨人Eric Evans 的肩膀上,建構了自己的一套領域驅動設計知識系統。
領域驅動設計統一過程的提出,從根基上改變了本書的結構。我調整和整理了本書的寫作脈絡,讓本書呈現出與「領域驅動設計實踐」課程迥然有別的全新面貌。本書不再滿足於粗略地將內容劃分為戰略篇和戰術篇,而是在領域驅動設計統一過程的指導下,將該過程的3 個階段—全域分析、架構映射和領域建模作為本書的3 個核心篇,再輔以開篇和融合,共分為5 篇(20 章)和4
個附錄,全面而完整地表達了我對領域驅動設計的全部認知與最佳實踐。在對內容做進一步精簡後,本書仍然接近600 頁,算得上是軟體技術類別的大部頭了。
該如何閱讀這樣一本厚書呢?
若你時間足夠充裕,又渴望徹底探索領域驅動設計的全貌,我建議還是按部就班、循序漸進地進行閱讀。或許在閱讀開篇的3 章時,你會因為太多資訊的一次性湧入而產生迷惑、困擾和不解,這只是因為我期望率先為讀者呈現領域驅動設計的整體面貌。在獲得領域驅動設計的全貌之後,哪怕你只是在腦海中存留了一個朦朧的輪廓,也足以開啟自己對設計細節的了解和認識。
若你追求高效閱讀,又渴望尋求領域驅動設計問題的答案,可以根據目錄精準定位你最為關心的技術講解。或許你會失望,甚至產生質疑,從目錄中你獲得了太多全新的概念,而這些概念從未見於任何一本領域驅動設計的圖書,這是因為這些概念都是我針對領域驅動設計提出的改進與補充,是我解構全新領域驅動設計知識系統的得意之筆—要不然,一本技術圖書怎麼會寫三年之久呢?
我將自鳴得意的創新概念一一羅列於此。
業務服務。
業務服務是全域分析的基本業務單元,在統一語言的指導下完成對業務需求的抽象,既可幫助我們辨識界限上下文,又可幫助開發團隊開展領域分析建模、領域設計建模和領域實現建模。業務服務的粒度也是服務契約的粒度,由此拉近了需求分析與軟體設計的距離,甚至可以說跨越了需求分析與軟體設計的鴻溝。
菱形對稱架構。
雖然菱形對稱架構脫胎於六邊形架構與整潔架構,但它更為簡潔,與界限上下文的搭配可謂珠聯璧合,既保證了界限上下文作為基本架構單元的自治性,又融入了上下文映射的通訊模式,極大地豐富了設計要素的角色構造型。
服務驅動設計。
服務驅動設計採用程序式的設計思維,卻又遵循物件導向的職責分配,能在提高設計品質的同時降低開發團隊的設計門檻,完成從領域分析模型到領域實現模型的無縫轉換,並可作為測試驅動開發的前奏,讓領域邏輯的實現變得更加穩健而高效。
以上概念皆為領域驅動設計統一過程的設計專案,又都能與領域驅動設計的固有模式有機融合。對軟體複雜度成因的剖析,對價值需求和業務需求的劃分,在領域驅動設計統一過程基礎上建立的能力評估模型與參考過程模型,提出的諸多新概念、新方法、新模式、新系統,雖說都出自我的一孔之見,但也確乎來自我的第一線實踐和複習,我自覺其可圈可點。至於內容的優劣,還是交給讀者評判吧。
若讀者在閱讀本書時有任何意見與回饋,可關注我的微信公眾號「逸言」與我取得聯繫,我也會在公眾號上發佈後續我對領域驅動設計系統的更多探索與思考,也歡迎讀者加入我的知識星球"NoDDD",與我共同探討軟體技術的二三事。
在寫這篇前言的前一天,我偶然讀到蘇東坡的一首小詞:
春未老,風細柳斜斜。試上超然台上看,半壕春水一城花。煙雨暗千家。寒食後,酒醒卻諮嗟。休對故人思故國,且將新火試新茶。詩酒趁年華。驀然內心被叩擊,仿佛心弦被優美的辭章輕輕地帶著詩意撥弄。吾身雖不能上超然台,然而書成之後,可否看到半壕春水一城花?未曾飲酒,卻諮嗟,是否多情笑我早生華髮?如今的我,已然焙出新火,恰當新火試新茶,卻不知待到明年春未老時,能否做到何妨吟嘯且徐行的落拓不羈?無論如何,還當詩酒趁年華—仰天大笑出門去,吾輩豈是蓬蒿人!
張逸