【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

4 評(píng)論 8358 瀏覽 85 收藏 18 分鐘

編輯導(dǎo)語:邏輯思維對(duì)于構(gòu)建產(chǎn)品架構(gòu)十分重要,產(chǎn)品架構(gòu)設(shè)計(jì)是一個(gè)系統(tǒng)化的大工程,對(duì)于個(gè)人能力也有一定的要求,本篇文章作者分享了用“DDD”的思維來構(gòu)建產(chǎn)品架構(gòu),結(jié)合作者的設(shè)計(jì)理念總結(jié)出了一套完整的方法論,一起來學(xué)習(xí)一下吧,希望對(duì)你有幫助。

最近帶的產(chǎn)品經(jīng)理請(qǐng)教我如何思考并繪制產(chǎn)品架構(gòu)圖,他在網(wǎng)上看了一些文章,要么大段概念介紹,無法實(shí)操,要么不好理解,所以想問問我有沒有什么經(jīng)驗(yàn)。

其實(shí)關(guān)于產(chǎn)品架構(gòu)的設(shè)計(jì),我自己基于“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)”理念,創(chuàng)造了一套“一二三四”模型,不知是否具有廣泛性和應(yīng)用性,遂整理成文,并附加案例,供大家討論并驗(yàn)證。

一、前言

作為產(chǎn)品經(jīng)理,只專注于功能設(shè)計(jì)是不夠的,需要清楚地了解產(chǎn)品的定位、要解決的問題、系統(tǒng)的組成、每個(gè)系統(tǒng)承擔(dān)的角色以及未來的發(fā)展,因此對(duì)產(chǎn)品的架構(gòu)能力必不可少。

當(dāng)我剛開始負(fù)責(zé)一個(gè)產(chǎn)品的時(shí)候,對(duì)于產(chǎn)品架構(gòu)的要求不是那么明顯,覺得那只是換了一種漂亮的形式來展現(xiàn)系統(tǒng)中的功能。而且也不注重前期的規(guī)劃,往往是要做相關(guān)的材料,才根據(jù)現(xiàn)有的系統(tǒng)反推架構(gòu)。

但是隨著產(chǎn)品的發(fā)展,出現(xiàn)了一些之前沒有考慮到的需求,此時(shí)再去加新功能,難點(diǎn)不在于要怎么設(shè)計(jì),而是如何兼容已有的設(shè)計(jì),久而久之,產(chǎn)品邏輯會(huì)越來越復(fù)雜,牽一發(fā)而動(dòng)全身,最終只能重構(gòu),不管是對(duì)設(shè)計(jì)還是對(duì)開發(fā)都是如此。

當(dāng)我開始負(fù)責(zé)一條業(yè)務(wù)線的多個(gè)產(chǎn)品的時(shí)候,又發(fā)現(xiàn)不同產(chǎn)品之間會(huì)有相同的功能模塊,但是他們是分別開發(fā)的,可能邏輯不同,也可能技術(shù)方案不同,造成這樣原因有很多,比如溝通問題、制度問題等,但最重要的還是由于對(duì)新需求“打補(bǔ)丁”的方式導(dǎo)致產(chǎn)品越來越臃腫,一些共用的模塊無法抽離出來,所以形成了重復(fù)造輪子的情況。

以上,讓我越來越明白前期設(shè)計(jì)好產(chǎn)品架構(gòu)的重要性,同時(shí)糾正了我的一個(gè)思想:產(chǎn)品架構(gòu)設(shè)計(jì)是一個(gè)系統(tǒng)性的工程,不是隨便羅列功能模塊就能完成的。

我開始研究方法論,看了一些文章,每個(gè)人都有每個(gè)人的看法,但尚沒有一種權(quán)威的理論作為支撐。

于是我嘗試跳出產(chǎn)品范疇,去看看旁邊比我們先發(fā)展好幾十年的開發(fā)領(lǐng)域,試圖從中找到一些靈感。

近年來技術(shù)架構(gòu)都在圍繞“高內(nèi)聚低耦合”的思想不斷完善,從MVC、三層架構(gòu)到微服務(wù)、中臺(tái)、DDD,無一例外。

其實(shí)對(duì)于產(chǎn)品架構(gòu)來說也是一樣,在設(shè)計(jì)系統(tǒng)時(shí)不僅要考慮全面,還要考慮未來的可拓展性。

本文介紹了我在研究“DDD”后,借助其通過分解控制復(fù)雜性的思想,并結(jié)合自身經(jīng)驗(yàn)總結(jié)的一套構(gòu)建產(chǎn)品架構(gòu)的方法論,我將其命名為“一二三四”模型。

二、一個(gè)【關(guān)鍵鏈路】

客觀世界中,存在能量守恒定律,一種物質(zhì)通過周圍環(huán)境的影響會(huì)變成另一種/幾種物質(zhì),但總能量不會(huì)變。如果我們把環(huán)境因素想象成一個(gè)黑盒,那么可以抽象出下圖模型:

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

同理,我們將互聯(lián)網(wǎng)產(chǎn)品也想象成一個(gè)黑盒,它并不會(huì)創(chuàng)造新事物,而是通過將事物線上化協(xié)同化,并通過數(shù)據(jù)智能的方式加速“輸入→輸出”這一過程,從而為用戶提升效率、創(chuàng)造價(jià)值。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

任何一個(gè)產(chǎn)品不管它現(xiàn)在發(fā)展得有多龐大,都有且存在著一條關(guān)鍵鏈路,用來連接各實(shí)體。

比如在沒有滴滴前,我們是靠運(yùn)氣打車,乘客和司機(jī)之間不存在其他的聯(lián)系。

而滴滴是將周圍的司機(jī)、周圍的車輛和需要打車的乘客都聯(lián)系在了一起,從而提升了打車體驗(yàn)。

盡管現(xiàn)在的滴滴已經(jīng)不止“打車”業(yè)務(wù),還發(fā)展了貨運(yùn)、順風(fēng)車、代駕、共享自行車、金融等其他業(yè)務(wù),但都是在這條關(guān)鍵鏈路上,對(duì)輸入和輸出進(jìn)行擴(kuò)展。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

所以在繪制產(chǎn)品架構(gòu)圖之前,應(yīng)該先思考:你所負(fù)責(zé)的產(chǎn)品,它的核心鏈路是什么,連接了哪些實(shí)體?

這樣做有兩個(gè)好處:

  1. 避免其他干擾,直擊產(chǎn)品核心價(jià)值,類似于“第一性原理”;
  2. 不需要對(duì)業(yè)務(wù)很熟悉,只要有產(chǎn)品定位,就可以得到。

例如在疫情當(dāng)下,高校無法組織線下考試,因此需要做一個(gè)線上考試平臺(tái),即便你以前沒有接觸過教育信息化行業(yè),你也知道考試的輸入是考生、考官和試卷。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

值得注意的是,產(chǎn)品的核心鏈路不是一成不變的,它會(huì)隨著產(chǎn)品定位的變化而變化,比如下圖是小紅書歷次slogan的變化,每一次定位的變更都意味著輸入和輸出的調(diào)整。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

三、兩個(gè)【思維】

找到了核心鏈路,接下來就是利用“分解思維”對(duì)核心鏈路進(jìn)行梳理,并利用“聚合思維”對(duì)系統(tǒng)進(jìn)行構(gòu)建。

1. 分解思維——6W2H

通過第一步,我們找到了與系統(tǒng)相關(guān)的、最直接的輸入和輸出實(shí)體,接下來就是分析實(shí)體與實(shí)體、實(shí)體與系統(tǒng)之間的聯(lián)系。最全面且有效的方法就是6W2H:

1)分解輸入

回到線上考試系統(tǒng),先按照上圖的方法分析試卷:對(duì)于輸入,我們要尋根溯源,思考它從哪來,如何來、與系統(tǒng)的關(guān)系等。

  • what(屬性):試卷類型、分值;
  • who(誰參與輸入):出題老師;
  • when(什么時(shí)候輸入):考試前;
  • where(從哪來):題目;
  • how(怎樣輸入):創(chuàng)建、導(dǎo)入;
  • how much(數(shù)量受什么影響):考試方式。

通過以上分析,我們新發(fā)現(xiàn)了兩個(gè)實(shí)體:出題老師和題目,需要繼續(xù)對(duì)其分解至最細(xì)(見下圖),過程中可省略一些維度(考生、考官也按照相同的辦法進(jìn)行分解,此處略)。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

2)分解輸出

對(duì)于輸出的分解思路會(huì)有少許不一樣:我們要發(fā)散思維,思考它到哪去,如何去、如何擴(kuò)大輸出等。

  • what(屬性):考試模式、考試時(shí)間、考試公告;
  • who(誰參與輸入):學(xué)校負(fù)責(zé)人;
  • when(什么時(shí)候輸入):考試前;
  • where(到哪去):考場(chǎng)。

同樣對(duì)找出的實(shí)體用相同方法進(jìn)行再分解:

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

至此,我們已經(jīng)有了一個(gè)非常龐大的包含各角色、各事物及信息流轉(zhuǎn)方向的對(duì)象關(guān)聯(lián)畫布。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

2. 聚合思維——?jiǎng)澐肿佑?/h3>

如果把我們面對(duì)的問題叫做“領(lǐng)域”,接下來,就要利用聚合的思想將一個(gè)或多個(gè)分散的實(shí)體封裝為一個(gè)整體,使“領(lǐng)域”劃分為幾個(gè)“子域”(子系統(tǒng))。

在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)思想中,關(guān)于如何聚合可遵循以下四個(gè)原則:

  1. 生命周期一致性原則
  2. 問題域一致性原則
  3. 場(chǎng)景頻率一致性原則
  4. 聚合應(yīng)盡可能的小原則

翻譯成產(chǎn)品經(jīng)理能聽懂的話就是:

  • 實(shí)體A脫離另外一個(gè)實(shí)體B是否有存在的意義。例如如果沒有考試,那么也就不存在考場(chǎng)
  • 不屬于一個(gè)問題域的實(shí)體不能放在一起。比如在線監(jiān)考和在線考場(chǎng),根據(jù)生命周期原則可能會(huì)把這兩個(gè)實(shí)體放在一個(gè)子域,因?yàn)橛姓谶M(jìn)行的考場(chǎng)才需要監(jiān)考,但實(shí)際上他們解決的是兩個(gè)不同領(lǐng)域的問題
  • 實(shí)體A和實(shí)體B能否被同時(shí)操作。以“試卷”、“考場(chǎng)”和“題目”為例,試卷包含了很多題目,這些題目會(huì)通過線上考場(chǎng)展示給每個(gè)考生。但是,站在操作層面,如果你要查看試卷列表,其實(shí)并不需要關(guān)心里面的題目,也不需要了解試卷所在的考場(chǎng)。盡管考務(wù)人員在編排考場(chǎng)的時(shí)候會(huì)查看題目以驗(yàn)證是否添加正確,但是大多數(shù)時(shí)候并不會(huì)去查看題目的分?jǐn)?shù),更不可能在創(chuàng)建考場(chǎng)的時(shí)候修改題目
  • 剩余的實(shí)體均劃分成單獨(dú)的子域。
  • 好的劃分可以讓整個(gè)系統(tǒng)更靈活,拓展性更高。但是也不能一味追求分化,需要根據(jù)自己業(yè)務(wù)的實(shí)際場(chǎng)景去衡量。還是拿題目和試卷舉例,如果你的業(yè)務(wù)比較簡(jiǎn)單,只需要對(duì)試卷進(jìn)行操作,那么可以把題目和試卷劃分為一個(gè)“試卷子域”;如果你的業(yè)務(wù)復(fù)雜,試卷既可以直接創(chuàng)建,也可以通過題目組卷,那么就需要?jiǎng)澐譃閮蓚€(gè)子域“題庫子域”和“試卷子域”。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

因此對(duì)于線上考試平臺(tái)可以做如下劃分:

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

3. 分解思維——界限上下文

在DDD中,對(duì)界限上下文的定義是:動(dòng)態(tài)的業(yè)務(wù)流程被邊界靜態(tài)切分的產(chǎn)物??梢院?jiǎn)單理解為再次利用分解思維把每個(gè)子域內(nèi)涉及到的模塊分解出來(此處不一一舉例)。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

4. 關(guān)于該步驟的答疑

個(gè)人認(rèn)為,本部分是本篇最重要也是最難理解的內(nèi)容,因此有必要做一些解釋。

我做過幾個(gè)從0-1的產(chǎn)品,在進(jìn)行用戶調(diào)研前,首先會(huì)提前構(gòu)思好可能的業(yè)務(wù)流程,再通過調(diào)研去驗(yàn)證和補(bǔ)充。因?yàn)闆]有相關(guān)業(yè)務(wù)經(jīng)驗(yàn),提前想的流程就會(huì)不全面,在這種情況下我開始尋找一種能夠快速熟悉業(yè)務(wù)的方法。

經(jīng)過不斷總結(jié)經(jīng)驗(yàn),我發(fā)現(xiàn)任何一個(gè)產(chǎn)品都只會(huì)關(guān)注于一個(gè)基本問題,所以我直接從這個(gè)基本問題入手,找出相關(guān)的輸入輸出,再通過各個(gè)維度的不斷分解,不僅能找到所涉及的所有實(shí)體和過程,同時(shí)還找到了他們之間的聯(lián)系(業(yè)務(wù)流程)。各位看官不妨一試。

四、三個(gè)【完善】

一個(gè)系統(tǒng)要想好用,有完善可拓展的功能只是第一步,還必須保證系統(tǒng)的穩(wěn)定性和安全性。

這些不只是技術(shù)人員需要考慮的問題,產(chǎn)品經(jīng)理也需要設(shè)計(jì)相應(yīng)的產(chǎn)品架構(gòu)、業(yè)務(wù)流程和功能邏輯來規(guī)避這些問題,有時(shí)甚至要犧牲用戶體驗(yàn)。

在穩(wěn)定性上,我們已經(jīng)從業(yè)務(wù)的角度把一個(gè)大系統(tǒng)劃分成了一個(gè)個(gè)高內(nèi)聚、低耦合的小模塊,接下來就要從運(yùn)行維護(hù)的角度考慮如何檢測(cè)預(yù)警以及出問題時(shí)的上報(bào)和解決。

此外還要找出所依賴的第三方服務(wù),做好及時(shí)監(jiān)控和應(yīng)急方案,下圖是我在網(wǎng)上找的通過設(shè)計(jì)維護(hù)穩(wěn)定性的兩個(gè)例子。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

同樣在安全性上,除了要保證基本的數(shù)據(jù)安全、網(wǎng)絡(luò)安全,產(chǎn)品經(jīng)理還要做一些提升安全性的設(shè)計(jì),如二次認(rèn)證、CA加密、二級(jí)密碼等。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

五、四個(gè)【層次】

至此,我們已經(jīng)將整個(gè)業(yè)務(wù)劃分出了多個(gè)領(lǐng)域(系統(tǒng)/模塊),接下來就是縱向地對(duì)層次進(jìn)行劃分。

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

這里先介紹一下產(chǎn)品層面的三層架構(gòu)(雖不是但源于技術(shù)層面):

  • 表示層:與用戶直接接觸的軟件和硬件形態(tài)
  • 業(yè)務(wù)邏輯層:通過上述步驟劃分出來的各領(lǐng)域模塊
  • 數(shù)據(jù)層:使用到的數(shù)據(jù)庫和數(shù)據(jù)服務(wù)

這種架構(gòu)本身沒有什么問題,但是如果站在更高的視角看整個(gè)產(chǎn)品矩陣,你會(huì)發(fā)現(xiàn)隨著業(yè)務(wù)場(chǎng)景越來越復(fù)雜,每條業(yè)務(wù)線都會(huì)變得非常臃腫,并且業(yè)務(wù)線與業(yè)務(wù)線之間會(huì)存在重復(fù)造輪子的情況。

比如公司要做一個(gè)企業(yè)培訓(xùn)的新業(yè)務(wù),其中題庫、試卷模塊可以完全復(fù)用考試系統(tǒng)(類似于技術(shù)開發(fā)中的“組件”“中臺(tái)”概念),但在現(xiàn)有三層架構(gòu)下不好進(jìn)行抽離。

因此在設(shè)計(jì)產(chǎn)品架構(gòu)時(shí),還要根據(jù)產(chǎn)品經(jīng)理的經(jīng)驗(yàn),對(duì)業(yè)務(wù)依賴性不高,通用性、復(fù)用性較強(qiáng)的子域單獨(dú)抽離出來,組成新的一層——通用業(yè)務(wù)層。

  • 表示層;
  • 業(yè)務(wù)邏輯層;
  • 通用業(yè)務(wù)層;
  • 數(shù)據(jù)層。

至此,我們將上述步驟得出的結(jié)果進(jìn)行整理,再找設(shè)計(jì)同事幫忙美化一下,即可得到下圖:

【多圖預(yù)警】手把手教你用“DDD”的思維構(gòu)建產(chǎn)品架構(gòu) | 附詳細(xì)案例

六、總結(jié)

  • 一個(gè)關(guān)鍵路徑:找出核心的輸入輸出;
  • 兩個(gè)思維:分解出各實(shí)體,聚合出各子域;
  • 三個(gè)完善:考慮穩(wěn)定性、安全性、第三方服務(wù);
  • 四個(gè)層次:按表示層、業(yè)務(wù)邏輯層、通用業(yè)務(wù)層、數(shù)據(jù)層劃分。

 

本文由 @產(chǎn)品亂彈 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于CC0協(xié)議。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 結(jié)合自己的經(jīng)驗(yàn),談下理解:
    1. 劃分“領(lǐng)域”:其實(shí)領(lǐng)域就是一個(gè)一個(gè)的業(yè)務(wù)模塊,或者說一條一條的業(yè)務(wù)流。這些業(yè)務(wù)流來自業(yè)務(wù)問題,表示從問題到解決的過程。
    2. 高內(nèi)聚&低耦合:
    i) 一個(gè)問題由實(shí)體+數(shù)據(jù)組成。
    ii) 實(shí)體:由一些靜態(tài)的屬性組成,這些屬性基本不變或很少發(fā)生變化,例如一個(gè)用戶、一個(gè)組織、一個(gè)商品、一個(gè)項(xiàng)目都可以是一個(gè)實(shí)體,實(shí)體內(nèi)部是高內(nèi)聚,外部一定是低耦合的。
    iii) 數(shù)據(jù):即實(shí)體在一個(gè)業(yè)務(wù)過程的產(chǎn)出。例如客戶這個(gè)實(shí)體,在訂單業(yè)務(wù)流中,產(chǎn)生了訂單的數(shù)據(jù)。一條數(shù)據(jù)會(huì)引用多個(gè)實(shí)體的屬性,例如訂單數(shù)據(jù)會(huì)引用商品、客戶、業(yè)務(wù)員等等各種實(shí)體的一個(gè)或多個(gè)屬性。數(shù)據(jù)是動(dòng)態(tài)產(chǎn)生的,所以一定是對(duì)應(yīng)一個(gè)時(shí)間點(diǎn)的。由于數(shù)據(jù)的通用性,所以一定是統(tǒng)一使用數(shù)據(jù)庫來操作&存儲(chǔ)。
    iiii) 業(yè)務(wù)流:其實(shí)業(yè)務(wù)流就是各個(gè)“領(lǐng)域”(可大可小,小到一條業(yè)務(wù)流,大到整個(gè)公司的管理&商業(yè)模式),業(yè)務(wù)流就是產(chǎn)品/解決方案黑盒,輸入&輸出都是實(shí)體+數(shù)據(jù)。
    3. “中臺(tái)”:不管是業(yè)務(wù)中臺(tái),數(shù)據(jù)中臺(tái),都是為了解決“通用性”的問題,避免重復(fù)工作。
    其實(shí)永遠(yuǎn)沒有標(biāo)準(zhǔn)的答案,第一性原理只有一個(gè):產(chǎn)品用來解決一個(gè)核心問題。

    來自浙江 回復(fù)
  2. 還沒看完,就直呼牛比了

    來自河南 回復(fù)
  3. 這種思維在我們國家是比較先進(jìn)的,期望有機(jī)會(huì)一同交流

    來自廣東 回復(fù)
  4. 6

    來自江西 回復(fù)