最近在思考DDD的落地情況(筆者剛?cè)チ艘患倚鹿荆倳?huì)比較一下),似乎DDD是一個(gè)很好的東西,但隨著學(xué)習(xí)和實(shí)踐的深入,越來(lái)越發(fā)現(xiàn),在當(dāng)下的很多技術(shù)團(tuán)隊(duì)里,DDD推行起來(lái)還是比較困難的。所以將一些坑和心得記錄如下:
流程為王,建模是什么? 這似乎是目前很多技術(shù)團(tuán)隊(duì)的通病,遇到一個(gè)產(chǎn)品或需求,很多經(jīng)驗(yàn)老道的上來(lái)就是梳理流程(這已經(jīng)算比較不錯(cuò)的,有的是上來(lái)就寫(xiě)代碼),一個(gè)個(gè)流程圖,泳道,時(shí)序 畫(huà)的賊溜。建模?沒(méi)有建模,只有數(shù)據(jù)庫(kù)表,庫(kù)表的設(shè)立也與現(xiàn)實(shí)的實(shí)體一一對(duì)應(yīng),能稍有提煉的也是教課書(shū)里面反復(fù)嚼爛的:角色,權(quán)限等。 模型的抽象完全沒(méi)有任何思考。所以DDD中的領(lǐng)域劃分,限界上下文與領(lǐng)域的關(guān)系,別說(shuō)什么核心域,通用域了,就是一個(gè)簡(jiǎn)單的系統(tǒng)里面域是什么,大部分開(kāi)發(fā)人員并沒(méi)有思考和分析,所以這些對(duì)于很多技術(shù)人員有如一座不可逾越的大山。
思維轉(zhuǎn)換的難度,在目前大部分開(kāi)發(fā)人員里面,很多都是淺度開(kāi)發(fā),即你給我產(chǎn)品原型,我通過(guò)框架實(shí)現(xiàn)增刪改查。不管是所謂的技術(shù)管理者還是架構(gòu)師,開(kāi)發(fā)任務(wù)的分配也是依據(jù)產(chǎn)品的原型圖來(lái)進(jìn)行劃分的(其實(shí)這也間接的導(dǎo)致了產(chǎn)品經(jīng)理低水平化)。 拿到原型就開(kāi)始寫(xiě)代碼,一個(gè)交互對(duì)應(yīng)一個(gè)三層類(lèi),這樣簡(jiǎn)單的機(jī)械化的編碼方式,不是不好,產(chǎn)品如果很簡(jiǎn)單,這樣的項(xiàng)目反而直觀簡(jiǎn)單,但一旦遇到復(fù)雜邏輯的項(xiàng)目,就錯(cuò)綜復(fù)雜,維護(hù)起來(lái)也是叫苦連天,所以又直接導(dǎo)致了另一個(gè)程序員的壞毛病,一個(gè)運(yùn)行正常的系統(tǒng),往往因?yàn)閾Q了技術(shù)支撐團(tuán)隊(duì),而需要進(jìn)行所謂的重構(gòu)。
數(shù)據(jù)庫(kù)依賴癥,可能是老一輩程序員因?yàn)檎Z(yǔ)言和環(huán)境的問(wèn)題,所以從老到新或多或少都會(huì)將數(shù)據(jù)庫(kù)擺在整個(gè)系統(tǒng)的核心位置(注意不是數(shù)據(jù),不過(guò)在很多人的觀點(diǎn)里面,數(shù)據(jù)和數(shù)據(jù)庫(kù)是等同的)。所以一切思考的目標(biāo)都是為了適應(yīng)數(shù)據(jù)庫(kù)的設(shè)計(jì),所以一切編程結(jié)果你也可以看成就是一系列的 事務(wù)操作腳本,所以用面向?qū)ο蟮恼Z(yǔ)言寫(xiě)出面向過(guò)程的代碼,一點(diǎn)也不奇怪。
阻抗的溝壑,關(guān)系型數(shù)據(jù)庫(kù)誕生的目的就是為了方便查詢,但真實(shí)的世界的構(gòu)成和運(yùn)行,其實(shí)都沒(méi)有這個(gè)目標(biāo),至少主要目標(biāo)不是這樣的。這樣就誕生了兩種不同的思維方式,導(dǎo)致很多時(shí)候系統(tǒng)的設(shè)計(jì)和開(kāi)發(fā)往往有相當(dāng)一部分邏輯是來(lái)處理這兩種不同的思維方式的轉(zhuǎn)換(其實(shí)很真正的業(yè)務(wù)一點(diǎn)關(guān)系也沒(méi)有。。。。。)。工程的浪費(fèi),甚至導(dǎo)致效率的浪費(fèi)。當(dāng)然也有思維方式的改變的風(fēng)險(xiǎn)和禁錮。
重視程度不夠,其實(shí)大部分時(shí)候,別說(shuō)老板了,就是技術(shù)團(tuán)隊(duì)自己對(duì)于設(shè)計(jì)和文檔都重視不夠,項(xiàng)目一上線,沒(méi)有問(wèn)題,皆大歡喜,那個(gè)時(shí)候只有喜悅和慶功,你這個(gè)時(shí)候提出來(lái),可能之前的設(shè)計(jì)與代碼對(duì)不上,需求有變動(dòng)的時(shí)候,只改了代碼,而沒(méi)有改正相應(yīng)的設(shè)計(jì),你這不是太不懂得場(chǎng)合了嗎?所以設(shè)計(jì)分析工作在很多很多團(tuán)隊(duì)不是重要的工作(除非是一些合同約定),即便是需要交付,那么 文檔和實(shí)現(xiàn)的不一致,這個(gè)誰(shuí)會(huì)關(guān)心了,誰(shuí)會(huì)去檢查了?所以就這樣吧。