DDD的終極大招 By Experience

2021-08-30 10:50:32 字數 3055 閱讀 9475

以ddd思想和微服務架構為代表的新的架構時代正在逐步形成,不同方法和工具的湧現讓人激動不已,同時這個過程也讓人感覺到些許的不安,因為沒有一套方法和一套架構能夠打遍天下,我們能明確告訴所有組織和團隊的,也只是架構設計上應該「響應變化勝過遵循計畫」!具體到採用哪一種架構設計思想和方法,彷彿都需要增加乙個定語「這取決於……」。

以去年的「明星」方法event storming(es)為例,今年已經開始被不少人所批判。內行已經開始調侃這就是「糊牆」(不明就裡的同學可以感受下圖中的es現場)。而實際上es創始人alberto是一位很低調的實踐者,仍然在不停地磨練著他發明的這套方法。一年裡我也接到了無數類似「我們是***領域,有***系統,es感覺好像用不上?」的問題。我的答案往往是:「沒事兒,你們先試試,找到具體困難點,咱們再看為啥不好用。」

(乙個es現場,「糊」滿各色紙貼的建模過程。)

我相信得到這個答案的部分團隊可能真的去嘗試了es,但鮮有人再將他們遇到的具體困難反饋給我 —— 也許es實踐本身就是困難,而不是他們要解決的業務問題。但我的出發點卻並非推廣es,而是讓團隊能夠獲取「經驗」!這點上還是小有成就的,去年我可能還是中國區「糊牆」最多的人,今年很多人都遠勝過我了。

不管是在ddd原著,還是後續不少專家的書籍中,都明示或暗示架構設計最後的終極大招還是by experience ——靠經驗吃飯。從戰略角度的subdomain(子問題域的劃分)到戰術建模層面entity、vo的選擇,最終的決策很可能不是完全「理性」,經驗這個「感性」的東西發揮著很大的作用。

對於乙個顧問和教練來說這是絕望的答案,因為我們每次面對的是希望學習,但沒有經驗的團隊,「靠經驗吃飯」等於告訴團隊這東西沒套路、靠感悟。這就迫使我們轉換視角,從教大家ddd方法,轉換到幫助大家獲取ddd經驗。下面就讓我們來看看怎麼有效解決ddd經驗獲取這個問題。

ddd作為一種架構方法,最大的突破應該說是非常明確地區分出了問題域和解決方案域。而認知問題這件事情絕對不是技術人員擅長的,從我們學習程式設計起,我們就被如設計模式(design pattern)這樣的解決方案所包圍。想當年我自己最得意的事情也是refactor to pattern,也是把解決方案當成了「終極問題」來追求。

這往往是乙個痛苦的蛻變,需要有人在你身邊不停念叨「你說的問題是什麼?」。你必須要做到心平氣和,即使你認為對方是故意挑釁,有時候挑戰更能促進思考上的突破。比如我經歷過下面的一段經典對話:

甲:我認為這個子問題域是客戶賬戶管理的問題。

乙:我覺得你已經在說解決方案了。

甲:客戶賬戶管理是問題,我並沒有提怎麼管理啊!

乙:誰說一定要管理客戶?!我還是覺得你說的是解決方案!

甲:(受不了你了… … )不管理客戶我們做這個系統幹啥?

乙:我就是這個意思啊,為啥要做這個系統?我們解決了什麼業務問題?

甲:這麼說的話那把業務找過來,看他們怎麼說。

乙:行,反正ddd裡說領域專家很重要,業務來了再討論。

某種意義上這兩位技術人員的爭論是卓有成效的,最終的發現是業務問題其實並不清楚,遠沒有達到可以進入解決方案建模討論的時候。

當然上面的對話還有另外乙個有意思的核心觀點,即由於問題和解決方案在整個建模過程中是不停深入和迭代的,所以我們必須鼓勵,甚至要求從業務到技術跨領域的人員參與和協作。

這點是我為什麼仍然認為es是乙個好方法的基礎,當然與我相對的觀點是,如果有了真正的領域專家,搞那麼複雜的協作有必要嗎?es通過對事件(event)的利用,提供了一套業務和技術能夠共同理解的協作機制。在我的輔導過程中,很容易讓兩邊的同學都理解如何上手。

當然如果真有經驗豐富的領域專家,確實事情就簡單了很多。業務問題的分解首先就變得非常流暢,es的功效也就不那麼明顯了。然而我個人始終認為「團隊共同的學習 勝於 建模本身的正確性」,即使專家也不能完全預見未來,所以團隊能夠有機會通過某種手段學習專家的知識,也是很有價值的一件事情。

ddd最初吸引我的地方是能夠從問題分析一直拉通到**實現,這有別於很多其它的架構方法,總是在某個鏈條上產生脫節。所以ddd的經驗獲取也需要嘗試讓團隊端到端的拉通體驗。

然而事實上很多團隊仍然在踐行著脫節的實踐,比如建模後產生的entity仍然用傳統的資料和行為分離的實現方式。這樣的實踐方式顯然是有悖於ddd的初衷,如果不能讓業務和系統模型實現繫結關係,很快就會走上各說各話的老路上去。

和前兩點相比,這真是乙個需要全隊刻意練習的過程,堅持信念是團隊走過開始陣痛期的必要條件。

之前在輔導團隊的時候,乙個常見問題就是團隊糾結於乙個業務概念建模採用entity,還是vo。經常會聽到團隊說:「從現在的需求來看,vo應該是完全夠用了,但很顯然接下來我們馬上就需要有業務狀態的變化,很可能vo就沒法玩了。」

針對這樣的問題,我往往會刻意引導團隊從簡單的vo建模入手,先不要考慮「未來」的需求,即使有時候這些需求已經相當明確。這樣的刻意行為顯然會造成團隊在接下來的時間裡改變模型,vo可能會被重新建模成entity。短時間有可能是痛苦的,很多技術人員也會跳起來說,你這是「站著說話不腰疼」。

但ddd的核心就在於持續的演進,演進就意味著模型和實現的改變。這樣的改變和上面我們刻意安排的「失敗」其實是一致的。當我們通過這樣的刻意練習獲取了演進的經驗後,業務和架構未來的變化對我們來說就真的可以by experience了。

開篇我就提到了乙個新的架構時代正在浮現,不同於之前的架構方法,沒有乙個組織和企業會在這個時代告訴你這就是做架構的正確方式。數位化時代的系統和應用在不停進化著,速度越來越快,想要找到進化過程中正確的元方法是非常困難的。

ddd的終極大招by experience某種意義上是在持續探索,並要求大家接受在這個探索過程中的不確定性 —— 你的設計有可能在未來被證明是錯誤的。這可能是未來架構設計最大的挑戰,我們必須能夠讓架構持續演進。

《演進式架構》已於今年問世,帶給我們很多這些方面的思考,模擬人類社會的演進,數位化世界的構建和發展應該有很多地方可以借鑑和學習。當然就這個問題而言,不管是ddd,還是microservices,都只是我們探索架構演進的開始,我們還有很多的experience需要獲取!

文/thoughtworks顧宇

IDEA快捷鍵終極大全,速收藏

常用的有fori sout psvm tab即可生成迴圈 system.out main方法等boilerplate樣板 例如要輸入for user user users 只需輸入user.for tab 再比如,要輸入date birthday user.getbirthday 只需輸入user....

DDD 概念中的DDD

領域驅動設計,它是對物件導向的的分析和設計 object orient analysis design 的乙個補充,對技術框架進行了分層規劃,同時對每個類進行了策略和型別劃分。領域模型是領域驅動的核心 採用 的設計思想,業務邏輯不再集中在幾個大型的類上,而是在大量相對小的領域物件上,這些類具有自己的...

化繁為簡的終極指南化繁為簡的終極指南

你是否已經接受了化繁為簡的趨勢,並準備好踏上這波浪潮了?很好,遵循這些指南,你馬上就會創造出優秀的應用。去除彩色。當然,你可以保留一種顏色,但要極度克制地使用它。其他一切最好是黑白的。讓內容來為應用填充顏色。加大 加粗 加黑的標題。看到標題了嗎?把它加到20至30畫素,並且加重。簡潔 纖細 易辨識的...