黃崟釗
1.領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)概述
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design,DDD)由著名建模專家Eric Evans 于2003年提出,是一個(gè)針對(duì)大型復(fù)雜業(yè)務(wù)系統(tǒng)的領(lǐng)域建模方法體系。近幾年,多個(gè)大型互聯(lián)網(wǎng)企業(yè)均已在相關(guān)產(chǎn)品線上開展了相關(guān)實(shí)踐并取得了不錯(cuò)的成效,也讓這個(gè)只在國(guó)外流行的方法論逐漸被國(guó)內(nèi)所熟知。
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)改變了傳統(tǒng)軟件開發(fā)工程師針對(duì)數(shù)據(jù)庫建模的方式,通過面向領(lǐng)域的思維方式,將要解決的業(yè)務(wù)概念和業(yè)務(wù)規(guī)則等內(nèi)容提煉為領(lǐng)域知識(shí),然后借由不同的建模范式將這些領(lǐng)域知識(shí)抽象為能夠反映真實(shí)世界的領(lǐng)域模型。
2.國(guó)有企業(yè)的創(chuàng)新性被激發(fā)
一直以來,國(guó)有企業(yè)的“金字塔”型管理架構(gòu)深受詬病。權(quán)利不斷向上集中、決策周期長(zhǎng)、員工放不開手腳,導(dǎo)致國(guó)有企業(yè)普遍保守、缺乏創(chuàng)新性,繼而在市場(chǎng)上缺乏競(jìng)爭(zhēng)力。
然而,近幾年國(guó)家大力推進(jìn)的國(guó)企混合所有制改革以及國(guó)有企業(yè)數(shù)字化轉(zhuǎn)型,為國(guó)有企業(yè)注入了新的活力。一方面,國(guó)有資本和民間資本融合,雙方優(yōu)勢(shì)互補(bǔ)。另一方面,互聯(lián)網(wǎng)、大數(shù)據(jù)、云計(jì)算、人工智能、區(qū)塊鏈等技術(shù)加速創(chuàng)新,大大加快了國(guó)有企業(yè)數(shù)字化轉(zhuǎn)型的進(jìn)程。
在此背景下,國(guó)有企業(yè)的創(chuàng)新性紛紛被激發(fā),部分國(guó)有企業(yè)領(lǐng)導(dǎo)層也更愿意接受新鮮事物。為本文中提到的某國(guó)有企業(yè)通過領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法論來自建經(jīng)營(yíng)管理系統(tǒng)奠定了基礎(chǔ)。
1.搭建項(xiàng)目團(tuán)隊(duì)
采取“領(lǐng)導(dǎo)牽頭、技術(shù)主導(dǎo)、全員參與”的方式搭建項(xiàng)目團(tuán)隊(duì)。
首先,由公司領(lǐng)導(dǎo)牽頭,成立領(lǐng)導(dǎo)小組。領(lǐng)導(dǎo)小組由公司核心領(lǐng)導(dǎo)和聯(lián)合工作組組成。公司核心領(lǐng)導(dǎo)在項(xiàng)目組織建立、重大業(yè)務(wù)需求決策、關(guān)鍵方案審議、資源保障等方面有絕對(duì)話語權(quán)。聯(lián)合工作組由各部門中高層組成,負(fù)責(zé)日常事務(wù)過程中一般業(yè)務(wù)需求的決策。
其次,由研發(fā)部門選聘項(xiàng)目經(jīng)理,協(xié)調(diào)各方開展領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)實(shí)踐以及企業(yè)經(jīng)營(yíng)管理系統(tǒng)的搭建。
最后,由聯(lián)合工作組確認(rèn)實(shí)施小組人員名單。實(shí)施小組分為業(yè)務(wù)組和技術(shù)組。各部門應(yīng)該至少安排一名業(yè)務(wù)代表,作為業(yè)務(wù)組成員,全程參與到項(xiàng)目建設(shè)過程中,業(yè)務(wù)代表也就是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法論中的“領(lǐng)域?qū)<摇?。技術(shù)組根據(jù)不同的專業(yè)分工,分設(shè)需求組、設(shè)計(jì)組、開發(fā)組、測(cè)試組、實(shí)施組等,組長(zhǎng)即項(xiàng)目經(jīng)理。
2.著手戰(zhàn)略設(shè)計(jì)
項(xiàng)目團(tuán)隊(duì)搭建完成,即可開始戰(zhàn)略設(shè)計(jì)。戰(zhàn)略設(shè)計(jì)是為了降低系統(tǒng)復(fù)雜度,分而治之。直接面對(duì)企業(yè)經(jīng)營(yíng)管理這樣的大業(yè)務(wù)我們可能無從下手,必須將企業(yè)經(jīng)營(yíng)這個(gè)大的業(yè)務(wù)拆成市場(chǎng)、項(xiàng)目、合同、開票、回款、采購、人力資源、綜合事務(wù)等相對(duì)較小的業(yè)務(wù),然后繼續(xù)拆解,直至我們完全可以在一個(gè)業(yè)務(wù)范圍內(nèi)開展討論與建模?!皠澐诸I(lǐng)域,分而治之”,是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的核心思想。
領(lǐng)域指的是范圍與邊界。將業(yè)務(wù)細(xì)分到一定程度后就能形成邊界,在邊界之內(nèi)我們能建立起解決對(duì)應(yīng)業(yè)務(wù)問題的領(lǐng)域模型。將領(lǐng)域進(jìn)一步細(xì)分,我們就能得出“子域”。子域就是在領(lǐng)域內(nèi)更細(xì)的業(yè)務(wù)邊界與范圍。
核心域、通用域和支撐域都屬于子域,但他們的重要性與功能屬性不同。包含企業(yè)核心業(yè)務(wù)和競(jìng)爭(zhēng)力的子域可以劃為核心域;可以同時(shí)被多個(gè)子域調(diào)用、具有通用功能的子域可以劃為通用域,例如組織、員工等。除核心域和通用域之外的子域可以算是支撐域,如數(shù)據(jù)字典、消息通知等。
如何區(qū)分核心域、通用域與支撐域沒有統(tǒng)一標(biāo)準(zhǔn),根據(jù)企業(yè)自身特征劃分即可。某國(guó)有企業(yè)經(jīng)營(yíng)業(yè)績(jī)壓力大,需要在營(yíng)銷、財(cái)務(wù)等方面發(fā)力,所以將市場(chǎng)、項(xiàng)目、財(cái)務(wù)等領(lǐng)域劃為核心域,將人資、綜合、采購等領(lǐng)域劃為通用域。
3.開展事件風(fēng)暴
戰(zhàn)略設(shè)計(jì)完成后,需要編制事件風(fēng)暴計(jì)劃,按照“核心域-通用域-支撐域”的順序,依次開展事件風(fēng)暴。
事件風(fēng)暴(Event Storming)類似頭腦風(fēng)暴,開發(fā)者與領(lǐng)域?qū)<以谝粋€(gè)足夠大的白板上,使用藍(lán)色的便簽紙羅列出領(lǐng)域中所有的領(lǐng)域事件,然后使用黃色的便簽紙標(biāo)注出導(dǎo)致該事件的命令,再用綠色的便簽紙為每一個(gè)事件標(biāo)注出命令發(fā)起方的角色。顏色的使用可以根據(jù)使用者的習(xí)慣調(diào)整,只需要確保事件、命令、角色使用的顏色不同即可。最后對(duì)事件進(jìn)行分類,整理出實(shí)體、聚合、聚合根以及限界上下文。
在開展事件風(fēng)暴時(shí),需確保本次事件風(fēng)暴討論的子域的相關(guān)部門均有領(lǐng)域?qū)<业綀?chǎng)。例如,在討論“銷售合同”時(shí),可能涉及銷售合同的簽訂、開票、回款、閉合等業(yè)務(wù),那么這次事件風(fēng)暴就需要業(yè)務(wù)人員、合同歸口部門、財(cái)務(wù)人員至少3 名領(lǐng)域?qū)<以趫?chǎng),以保證各方對(duì)本次事件風(fēng)暴的結(jié)果達(dá)成共識(shí)。另外,實(shí)踐證明,除了開發(fā)者和領(lǐng)域?qū)<?,系統(tǒng)未來的測(cè)試人員、實(shí)施人員和運(yùn)維人員也需要參與事件風(fēng)暴,以便于讓所有人對(duì)業(yè)務(wù)的認(rèn)知在同一水平線上。
4.建立統(tǒng)一語言
統(tǒng)一語言是整個(gè)項(xiàng)目團(tuán)隊(duì)在溝通交流時(shí)使用的語言。統(tǒng)一語言應(yīng)該“確保統(tǒng)一,隨時(shí)記錄”。
“確保統(tǒng)一”就是說,無論你在項(xiàng)目團(tuán)隊(duì)中扮演什么樣的角色,你使用的語言就必須是統(tǒng)一語言。很多時(shí)候,即使是“老同志”或者“部門骨干”,也會(huì)在業(yè)務(wù)流程和概念上產(chǎn)生分歧。當(dāng)各個(gè)部門領(lǐng)域?qū)<遗c開發(fā)者共同創(chuàng)建領(lǐng)域模型的時(shí)候,往往會(huì)引起激烈的討論,每個(gè)人都會(huì)與其他人達(dá)成一致或者妥協(xié),但最終都是為了創(chuàng)造最適合項(xiàng)目團(tuán)隊(duì)的統(tǒng)一語言。以該國(guó)有企業(yè)為例,在一次事件風(fēng)暴過程中,業(yè)務(wù)人員、營(yíng)銷人員和財(cái)務(wù)人員對(duì)“項(xiàng)目”的定義不一致,為保證語言的統(tǒng)一,演化出了“銷售項(xiàng)目”“采購項(xiàng)目”和“非收支類項(xiàng)目”等概念,并對(duì)這些概念進(jìn)行了嚴(yán)格的釋義,三方對(duì)新演化出的概念達(dá)成了一致,后續(xù)交流時(shí)大家都采用新的統(tǒng)一語言進(jìn)行交流。
“隨時(shí)記錄”是指,統(tǒng)一語言的產(chǎn)生是隨時(shí)可能發(fā)生的。統(tǒng)一語言既來源于國(guó)家標(biāo)準(zhǔn)、行業(yè)標(biāo)準(zhǔn)、公司制度,也來源于需求調(diào)研、事件風(fēng)暴、日常交流。開發(fā)者需要安排專人隨時(shí)記錄統(tǒng)一語言,避免遺忘。隨著時(shí)間的推移,統(tǒng)一語言將會(huì)不斷壯大成長(zhǎng),成為團(tuán)隊(duì)的知識(shí)庫。
5.完成領(lǐng)域建模
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)通過領(lǐng)域模型同時(shí)滿足分析建模、設(shè)計(jì)建模和實(shí)現(xiàn)建模的需要,從而將分析、設(shè)計(jì)和編碼實(shí)現(xiàn)糅合在一個(gè)整體階段中,避免彼此的分離造成知識(shí)傳遞帶來的知識(shí)流失和偏差。領(lǐng)域模型的邊界稱為限界上下文(bounded context)。一個(gè)限界上下文內(nèi),所有的概念必須是清晰的,即統(tǒng)一語言。
開發(fā)團(tuán)隊(duì)在針對(duì)領(lǐng)域邏輯進(jìn)行分析、設(shè)計(jì)和編碼實(shí)現(xiàn)時(shí),都在進(jìn)行領(lǐng)域建模,產(chǎn)生的輸出無論是文檔、設(shè)計(jì)圖還是代碼,都是組成領(lǐng)域模型的一部分。
6.持續(xù)迭代優(yōu)化
系統(tǒng)采用前后的分離架構(gòu)。前端使用Vue 和ElementUI 作為開發(fā)框架,進(jìn)行組件化、模塊化開發(fā);后端使用JAVA 語言,框架采用Springboo+Mybatis+Myb atisplus+RabbitMq;移動(dòng)端使用uni-app 框架,組件采用uView,uni-app 可以將一套代碼同時(shí)編譯打包成安卓和蘋果的apk/app;同時(shí)代碼管理使用Git,版本依賴使用Maven 進(jìn)行管理。
開發(fā)模式采用迭代開發(fā)模式。迭代式開發(fā)適合那些需求信息不明確的項(xiàng)目,每次只設(shè)計(jì)和實(shí)現(xiàn)這個(gè)產(chǎn)品的一部分。相對(duì)于傳統(tǒng)的瀑布流式開發(fā),每次設(shè)計(jì)和實(shí)現(xiàn)的一個(gè)階段叫做一個(gè)迭代,每一次迭代都包括了需求分析、產(chǎn)品設(shè)計(jì)、開發(fā)與測(cè)試,因此每一個(gè)迭代都是一個(gè)完整的瀑布模型。在實(shí)踐中,建議核心模塊搭建時(shí)期、系統(tǒng)上線之前的迭代可根據(jù)團(tuán)隊(duì)默契程度定為2~4 周,系統(tǒng)上線后的試運(yùn)行期可縮短迭代周期至1~2 周。
國(guó)有企業(yè)通過領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)作為方法論,自建企業(yè)經(jīng)營(yíng)管理系統(tǒng),預(yù)計(jì)可取得以下成效。
1.為各部門提供經(jīng)營(yíng)活動(dòng)管理工具、日常事務(wù)處理工具,提高工作效率并通過信息系統(tǒng)建設(shè),規(guī)范經(jīng)營(yíng)管理過程,建立經(jīng)營(yíng)管理過程中各環(huán)節(jié)之間數(shù)據(jù)的有效連接,實(shí)現(xiàn)公司經(jīng)營(yíng)活動(dòng)的精細(xì)化管理,提升管理水平。
2.通過對(duì)數(shù)據(jù)的挖掘和分析,實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)型管理,為企業(yè)管理者提供科學(xué)的統(tǒng)計(jì)報(bào)表以及有效的數(shù)據(jù)可視化界面。并為企業(yè)管理者建立數(shù)據(jù)使用后評(píng)價(jià)機(jī)制,科學(xué)評(píng)估各個(gè)決策帶來的影響,降低決策風(fēng)險(xiǎn)。
3.借助事件風(fēng)暴、統(tǒng)一語言等工具,將開發(fā)人員、設(shè)計(jì)人員、領(lǐng)域?qū)<覍?duì)業(yè)務(wù)的認(rèn)知拉到同一水平線,降低需求分析與系統(tǒng)設(shè)計(jì)的風(fēng)險(xiǎn),避免系統(tǒng)的反復(fù)修改。通過前期的充分準(zhǔn)備將系統(tǒng)建設(shè)風(fēng)險(xiǎn)前置,達(dá)到“先慢后快”的效果,提升系統(tǒng)開發(fā)效率。
1.管理層重視是關(guān)鍵
企業(yè)經(jīng)營(yíng)管理系統(tǒng)是企業(yè)的主要生產(chǎn)經(jīng)營(yíng)協(xié)作工具,系統(tǒng)的建設(shè)是“一把手工程”。在重大事項(xiàng)決策以及各類事務(wù)優(yōu)先級(jí)等方面,公司核心領(lǐng)導(dǎo)必須給予明確答復(fù)。另外,國(guó)有企業(yè)轉(zhuǎn)型時(shí),業(yè)務(wù)部門有很大的業(yè)績(jī)壓力,希望有更多的自由度去開拓市場(chǎng),而國(guó)有企業(yè)的職能部門則經(jīng)常面臨網(wǎng)絡(luò)攻防演練、上級(jí)單位巡查、審計(jì)檢查等事務(wù),更注重網(wǎng)絡(luò)安全、合規(guī)管理以及風(fēng)險(xiǎn)控制。兩者的特性決定了他們之間的矛盾是不可避免的、常態(tài)化的。在雙方對(duì)業(yè)務(wù)認(rèn)知沖突、爭(zhēng)執(zhí)不下時(shí),就需要公司核心領(lǐng)導(dǎo)牽頭,在二者之間尋找平衡。
2.全員參與是基礎(chǔ)
企業(yè)的經(jīng)營(yíng)管理是一個(gè)多方協(xié)作的過程,系統(tǒng)建設(shè)過程中的需求收集、分析、評(píng)審等需要各部門全程參與,以便保障業(yè)務(wù)需求和系統(tǒng)需求的一致。領(lǐng)域?qū)<液图夹g(shù)人員在一起工作,能保證開發(fā)出來的軟件是能夠準(zhǔn)確傳遞業(yè)務(wù)規(guī)則的。無論是實(shí)踐領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),還是做好企業(yè)經(jīng)營(yíng)管理系統(tǒng)的搭建,每個(gè)部門均需要有至少1 名管理者和1~2名領(lǐng)域?qū)<胰虆⑴c系統(tǒng)建設(shè),不得缺失。
3.業(yè)務(wù)上的共識(shí)是核心
信息系統(tǒng)只是工具,在實(shí)踐領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)時(shí),更重要的是各方在業(yè)務(wù)上的共識(shí)。各部門的立場(chǎng)站位各不相同,推動(dòng)工作要先拿共融,企業(yè)經(jīng)營(yíng)管理系統(tǒng)的搭建尤其如此。領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的核心就是“業(yè)務(wù)驅(qū)動(dòng),而非技術(shù)驅(qū)動(dòng);業(yè)務(wù)建模,而非技術(shù)建模”,技術(shù)人員在與領(lǐng)域?qū)<覅f(xié)作時(shí)應(yīng)有意識(shí)地主導(dǎo)各方就每項(xiàng)業(yè)務(wù)達(dá)成共識(shí)。首先,各方應(yīng)該就業(yè)務(wù)目標(biāo)、意義、預(yù)期結(jié)果充分討論,明確需求目的;其次,求同存異,對(duì)于達(dá)成共識(shí)的概念及時(shí)記錄統(tǒng)一語言,對(duì)于暫時(shí)無法達(dá)成共識(shí)的地方重復(fù)以上步驟或者邀請(qǐng)管理層介入,逐步與各方達(dá)成共識(shí)。