圖窮匕見-所有反DDD模式都是垃圾

老肖想当外语大佬發表於2024-09-04

本文書接上回《主觀與客觀,破除DDD憑經驗魔咒》,關注公眾號(老肖想當外語大佬)獲取資訊:

  1. 最新文章更新;

  2. DDD框架原始碼(.NET、Java雙平臺);

  3. 加群暢聊,建模分析、技術實現交流;

  4. 影片和直播在B站。

開個玩笑

“我不是針對這一個問題,我是說所有的反DDD模式都是垃圾”,作為教練,在團隊中我時常用這樣的玩笑來調侃不符合DDD價值觀的判斷邏輯和決策結果,並指出具體不符合的點在哪裡,由於大家已經相互非常瞭解,能夠很快反應過來並建立共識,從而不斷修正決策邏輯和決策結果,使問題的範圍和解決方案收斂在一個確定的範圍內,持續地保持對系統複雜度的掌控。

===

前提條件

首先需要對齊我們討論的場景,主要在下面的條件範圍內:

  1. 軟體系統是長期迭代的

  2. 軟體系統是業務向的系統

在這個條件範圍下,我們可以解讀為:

  1. 我們認為迭代成本是軟體成本的重要組成部分

  2. 我們認為自己打造的軟體系統的業務複雜度高於技術複雜度

成本與複雜度

為了儘可能降低系統迭代的綜合成本,本質上就是掌控系統複雜度,而系統複雜度由業務複雜度和技術複雜度共同構成。

為了實現“掌控系統複雜度”的目標,基於複雜度守恆定律,我們有以下觀點:

  1. 複雜度不可被消除,只可被轉移

  2. 尊重業務固有複雜度

  3. 避免引入額外技術複雜度

而我們在《關於領域驅動設計,大家都理解錯了》一文推導過關於複雜度的結論:

  1. 系統複雜度與元素的數量和元素的關係有關;

  2. 元素的關係對系統複雜度的影響遠遠大於元素的數量所產生的影響;

===

核心觀點

如果你已經跟隨《老肖的領域驅動設計之路》系列一路讀過來,那麼我們接下來的推導過程就需要在之前構建的認知基礎上進行,這裡列出核心觀點以供複習:

  1. 領域驅動設計是一種價值觀

  2. DDD價值觀:邊界明確是最重要的事

  3. 軟體長期主義:可維護性是最重要的事

  4. DDD是軟體工程的第一性原理

基於上面這些觀點,DDD的核心,就是掌控系統元素之間的關係,明確邊界,將複雜度控制在一個個有限的範圍內,完全匹配軟體工程的成本控制的邏輯,那麼是不是就可以得出下面的結論:

  1. 符合DDD價值觀,意味著符合軟體工程的成本利益

  2. 反DDD的模式,意味著不符合軟體工程的成本利益

那麼回到本文的標題,“所有反DDD模式都是垃圾”,更準確的描述應該是“所有反DDD模式都是不符合軟體工程成本利益的”,我認為,這個邏輯是成立的。

如果你認同《DDD是軟體工程的第一性原理?》一文的觀點,那麼同樣也能得出這樣的結論,違反軟體工程第一性原理,當然會適得其反,走向系統快速失控的深淵。

所以,很抱歉,如果你的軟體設計思維,沒有圍繞著“明確和維護邊界”來開展,那麼大機率是錯誤的價值判斷思路,系統的複雜度大機率也很難被掌控,而具象化出來的現象,就是我們常說的“迭代不動了”。

那麼,快來和我一起實踐DDD吧!

相關文章