領域驅動設計(Domain-Driven Design, DDD)比較像是一個「概念」,而不是「技術」。講的是如何透過正確的建模,來建立擁有足夠可擴充性的複雜軟體。
這本書從 18 世紀的中國地圖開始舉例,這份中國地圖以現代來說當然不是很正確,但這就是以當時官方的理解所描繪出來的。在這個例子,當時的中國對世界的知識就是領域(domain),而地圖就是模型(model)。模型是對現實的一種簡化。它對現實做了一些解釋,把與解決問題密切相關的方面抽象出來,並忽略無關的細節。
軟體程式是為了滿足使用者的某種需求而建立,而為了建立真正能為使用者創造價值的軟體,我們必須去了解使用者所在的知識體系,也就是領域。但領域的深度和廣度可能遠遠超越了軟體所要交付的需求,所以我們藉由建立模型,對領域進行了「選擇性的簡化」和「有意識的結構化」,使我們能夠理解資訊的意義,並關注正確的問題。
我們並不是藉由建模來盡可能復刻一個「現實」,而更像是製作電影。就算是紀錄片也不會完全呈現真實生活的每一個時刻。導演會選擇素材與呈現方式,軟體工程師也會選擇模型與關聯。
首先,為了讓軟體具備客戶所需的可擴充性,我們需要正確的建模;而要正確建模,就需要充分了解領域,了解客戶的真正需求。透過消化知識、持續學習與重構,把這些理解轉化成團隊與客戶共用的語言,而這個共同語言反過來又會成為模型的要素。這個就是 DDD 的核心之一:UBIQUITOUS LANGUAGE(通用語言)。
然後,程式碼必須要依照模型來實作。因為模型是基於對領域的認知建構出來,而我們都知道程式碼本身要有可讀性。所以依此推理,程式碼必須能夠表述模型。這個就是 DDD 的核心之二:MODEL-DRIVEN DESIGN(模型驅動設計)。
結語
核心就是這些,500 多頁的內容把軟體建構的方式充分理論化。包括建構區塊、重構、戰略設計等概念。因為物件導向已經是現代主流,以現在來說,我覺得有點把平常在做的事情,做了太過的理論化,所以不喜歡看書的應該看不太下去。但這本書是個不錯的驗證器,經驗不夠應該看不太懂(我第一次讀的狀況),理解的程度大概也代表了經驗的高低。