DDD峰會歸來話DDD

来源:http://www.cnblogs.com/wayfarer/archive/2017/12/17/2017-ddd-submit-china.html
-Advertisement-
Play Games

一場大戲落幕,首屆DDD中國峰會如大會主題色一般的紅。或許在12月9日這一天,全中國的DDD粉絲大約有一半都匯聚在了國家會議中心。聽起來是幸,其實是不幸,因為DDD在中國的人群基數實在是太少了。 因為要負責大會的其中一個Track,期間又要接受採訪,另外還有朋友到訪,所以除了前面的兩個keynote ...


一場大戲落幕,首屆DDD中國峰會如大會主題色一般的紅。或許在12月9日這一天,全中國的DDD粉絲大約有一半都匯聚在了國家會議中心。聽起來是幸,其實是不幸,因為DDD在中國的人群基數實在是太少了。

因為要負責大會的其中一個Track,期間又要接受採訪,另外還有朋友到訪,所以除了前面的兩個keynote以及我自己的session(這是當然的),我沒有完整聽完一個session。然而單單是和DDD大咖、專家與愛好者們交談,已經受益匪淺了。參會歸來,關於DDD的idea產生了許多,我覺得有必要和DDD談談我的想法。

DDD是什麼

正如Alberto在keynote中提到,DDD不是架構。我贊同這一觀點,並一直認為DDD是一種方法論(Methodology)。根據維基百科:Methodology is the systematic, theoretical analysis of the methods applied to a field of study,DDD正是針對軟體領域提供的系統與理論分析方法。Eric在創造性地提出DDD時,實則是針對當時項目中聚焦在Data(主要是DB Schema)為核心的系統建模方法的批判。這種面向數據的建模方式無法應對日漸複雜的業務邏輯,也無法更好地應用當時正沸沸揚揚的OO設計思想。這是設計觀念的轉變,蘊含了全新的設計思想、設計原則與設計過程

坦白說,Eric Evans的DDD奠基之作《Domain-Driven Design》並沒有非常清晰的系統脈絡,戰略設計與戰術設計也未成體系。Eric創造了一堆新奇的概念,隱隱中確乎有一條圍繞“領域”進行設計的思想主線,但對整個設計過程的描述卻是不清晰的。結構上,我更認同Vaughn Vernon一書《Implementing Domain-Driven Design》,該書清晰地給出了從戰略設計到戰術設計的設計過程。

我在和ThoughtWorks的餘丹妮聊到DDD時,我吐槽說Eric的DDD其實沒有解決三個問題:

  • 如何進行領域建模
  • 如何識別Bounded Context
  • 如何在戰術層面尋找對象

餘丹妮則認為DDD不是架構(設計)方法,因此不能把每個設計細節具象化。DDD是一套體系,這就決定了它必須具有開放性,在這個體系中你可以用任何一種方法來解決這些問題。我深表贊成,卻也認為這些關鍵問題如果沒有具體落地的方法,可能會讓團隊無可適從。這其實也是DDD在許多項目中難以推行的部分原因。

EDD

Alberto是EventStorming的創始人,他在keynot中強調建模應該專註於event。EventStorming方法貫穿了DDD整個設計過程,包括Ubiquitous Language、Bounded Context等戰略設計的元素,也能沉入戰術設計中,以Event作為主要的設計驅動力。

在聆聽Alberto的演講時,我突然想到這種以領域事件作為設計驅動力的思想會否走出另一條不同的路(分支)。我之前在《或許是領域建模的真相》中模糊提到這樣的思想,例如針對事件建模,實則是對業務流程以“狀態機”形式進行建模。狀態的遷移,就是command或者decision對event的觸發。

如果我們再將event視為一種不可變、可追溯的消息,那麼DDD社區提出的許多知識都可以圍繞著event進行設計,包括:

  • EventStorming
  • Event Sourcing
  • CQRS

考慮event的不變性與消息的本質,我們還可以將如下內容引入:

  • Functional Programming
  • Reactive Programming

那麼我們是否可以提出Event Driven Design的設計概念呢?與EDA(Event Driven Architecture)不同,EDD算是DDD的一種分支,是一種設計方法學,涵蓋了戰略設計與戰術設計等多個層次。而它與傳統DDD的區別在於建模思想與編程泛型的不同。

微服務拯救DDD

我說“微服務拯救了DDD”,其實是對肖然說的一句戲言,並不准確。在諸多社區力量的貢獻中,DDD一直都在生長,在DDD提出來的十五個年頭,不僅沒有走入老年期的落寞,反而在每年都生長出不同的嫩綠新葉。既然DDD沒有衰亡,何談拯救?然而,不可否認的是因為微服務的火熱,讓DDD這種緩慢生長的態勢突然煥發了勃勃的生機,就好像給這棵大樹註入了生長劑一般,一下子開枝散葉。凡微服務所及之處,皆可見DDD的身影。這就造成了微服務拯救DDD的錯覺。

我在演講《Bounded Context的實踐意義》中提及了六邊形、限界上下文與微服務之間的關係,這裡不再贅述。但肖然的《為不確定性架構》演講提及了微服務保證了系統的simplicity,卻讓我浮想聯翩。

對於架構,我一直強調對系統複雜性的應對。我曾經在十月份的一個會議上分享過《如何應對架構的高複雜度》,內容其實來源於我對複雜系統思考所撰寫的一篇文章。我從理解力與預測能力兩個角度剖析軟體系統的複雜度。這個思考角度實際來自Jurgen Appelo對複雜系統理論的闡釋。Jurgen Appelo將Complicated與Complex分別放在理解力與預測能力兩個迥然不同的維度。Complicated與Simple(簡單)相對,意指非常難以理解,而Complex則介於Ordered(有序的)與Chaotic(混沌的)之間,認為在某種程度上可以預測,但會有很多出乎意料的事情發生。如下圖所示:

系統的規模與結構會幹擾我們對系統的理解,而需求的變化則是我們無法預測的。那麼,微服務是怎麼應對系統複雜度的呢?核心思想是“分而治之”,它從系統規模著手,將一個大的系統拆分為一個個細粒度的服務。即使不考慮拆分的合理性,我們也可以看到它雖然控制了規模帶來的複雜度,卻加強了結構的複雜性。

個人認為,微服務對simplicity的保證,實則是將業務複雜度轉移到了技術複雜度。顯而易見,每個微服務的業務是非常簡單的,代碼易於理解和維護,也可以非常容易地進化乃至於替換。當我們需要開發和維護多個微服務時,如何管理和監控服務,如何梳理服務之間的通信,如何保證數據的一致性(最終一致性),都來自技術層面的挑戰。

這種複雜度的轉移為何能得到多數人的認同?針對IT人員,它其實基於兩個前提:

  • 業務是不可控的,技術卻相對可控:相對於技術,業務對變化更加敏感,我們也無法正確地預測業務的變化
  • 技術的複雜性可以通過分工來解決:多數應用開發公司可以重用微服務的平臺、框架或工具,然後集中精力來對付業務;降低了業務複雜度,就等同於降低了整個系統的複雜度

DDD的未來

在接受會議主辦方的採訪時,希望我能給DDD打call。那麼DDD重要嗎?非常重要,但它確實不是“銀彈”。正如前面所述,DDD其實一直在生長。由於沒有任何一家商業化公司推動DDD,它反而沒有受到利益關係的干擾,雖然生長緩慢,但卻健康。DDD以“領域”為核心,只要軟體系統仍然還在處理“領域”,理論上DDD就有其生存的空間。如果我們不把DDD具象化(正如前面所說),它就可以成為一個不錯的“框”,凡是和“領域”相關的理論、方法、實踐與模式,都可以往這個框里塞。

倘若能一直保持DDD的開放性,保持DDD的獨立性,我覺得在未來的五年乃至十年,DDD仍將煥發生命力,只是它的面貌會更加多姿多彩,甚至超過Eric Evans對DDD的原初定義。畢竟,軟體系統的核心只有兩個:領域和演算法。也許,只有到了AI演算法能把領域開發的職責都能攬過去,DDD才不會存在了,因為那時候已經沒有了領域,只剩下了演算法。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面的話 適配器模式的作用是解決兩個軟體實體間的介面不相容的問題。使用適配器模式之後,原本由於介面不相容而不能工作的兩個軟體實體可以一起工作。適配器的別名是包裝器(wrapper),這是一個相對簡單的模式。在程式開發中有許多這樣的場景:當試圖調用模塊或者對象的某個介面時,卻發現這個介面的格式並不符合 ...
  • 最近要分析web頁面,在安卓和ios上的性能差異,除了操作系統本身不同之外,應該還多地方要探究的,第一步就是要在真機上分析。所以總結一下幾個方法。 1.Mac+iPhone+ Lightning+Safari 瀏覽器 步驟: 1)用:Lighting線將mac與iphone相連 2)iphone打開 ...
  • 在寫這篇博客時這本書我已經是看過一遍了,為了加深印象和深入學習於是打算做這系列的前端經典書籍導讀博文,大家如果覺得這本書講的好可以自己買來看看,我是比較喜歡看紙質版書的,因為這樣才有讀書的那種感覺。 本期我給大家講述的是 前端經典js書籍 <<你不知道的javaScript(上捲)>> 第一章內容的 ...
  • 文檔聲明 不是註釋也不是元素,總是在HTML的第一行 書寫格式:<!DOCTYPE HTML> 是用於通知瀏覽器目前文檔正使用哪一個HTML版本(相關屬性 lang) 若不寫文檔聲明,瀏覽器渲染頁面時會進入怪異模式 HTML元素又叫根元素或根標記,是所有元素的祖先元素 例:<html lang="e ...
  • 連我自己把float和絕對定位,都稱為脫離文檔流,想想概念又不那麼清晰,於是尋找了W3C資料來理解,才發覺不應該叫文檔流。 資料 英文:https://www.w3.org/TR/CSS22/visuren.html#normal-flow 中文:http://w3help.org/zh-cn/kb ...
  • 先說下選擇Markdown編輯器的原因,我們進行平臺開發,需要很多的操作手冊和API文檔,要在網站中展示出來就需要是HTML格式的文件,但是由於內容很多,不可能全部由技術人員進行文檔的編寫,如果是只有文檔操作經驗的人來做就會出現很麻煩的情況。 最初,我們先用試著用word來寫,再轉換成HTML文件保 ...
  • 目錄: 前言 基礎學習資料與網站介紹 定製我的博文 3.1 我想要的效果 3.2 基礎知識如何實現 3.2.1 一級標題 3.2.2 二級標題 3.2.3 三級標題 3.2.4 目錄 3.2.5 添加小鏈接 3.3 博客園中具體分塊 3.3.1 整體部分 3.3.2 body部分 3.3.3 博文部 ...
  • 今天主管給了我個需求,說要用混合開發,用H5調用本地攝像頭進行掃描二維碼,我之前有做過原生安卓的二維碼掃一掃,主要是通過調用zxing插件進行操作的,其中還弄了個閃光燈.但是純H5的沒接觸過,心裡沒底,於是晚上回家開始網上各處找方案.以下是我對於H5掃描二維碼以及調用本地攝像頭的理解以及代碼.科普網 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...