老李一直懷疑自己是不是年紀(jì)大了,腦子跟不上了。 作為十幾年經(jīng)驗(yàn)的資深 Java 工程師,維護(hù)這公司產(chǎn)品的核心代碼的他,現(xiàn)在迭代產(chǎn)品的時(shí)候,經(jīng)常出 Bug 。 有時(shí)修復(fù)一個(gè) Bug 時(shí)間,比開發(fā)一個(gè)需求的時(shí)間要長很多,這是常有的事兒,更可怕的是,改完一個(gè) Bug ,又多出來幾個(gè) Bug,讓人吐血不止。 這樣的情況不在少數(shù),近幾次的更新都沒有按原計(jì)劃的時(shí)間完成,不但讓 Leader 對老李的能力產(chǎn)生懷疑,也讓他自己開始懷疑自己。 這是產(chǎn)品迭代到一定時(shí)期,必然出現(xiàn)的問題;還是自己年紀(jì)大了,在開發(fā)時(shí)各種問題沒有考慮周全,多年的開發(fā)經(jīng)驗(yàn)都不能支撐新的需求。 中年危機(jī)加上職業(yè)瓶頸,老王覺得自己應(yīng)該回家修整一下狀態(tài)了...... 廢話,改 Bug 的痛苦,每個(gè)人都經(jīng)歷過…...改不完的 Bug,是「思想錯(cuò)誤」當(dāng)你遇到,你應(yīng)該怎樣解決? 面對這一系列讓軟件陷入無底泥潭的問題,基于面向?qū)ο笏枷氲念I(lǐng)域驅(qū)動(dòng)設(shè)計(jì)方法是一個(gè)很好的解決方法。 從事過系統(tǒng)設(shè)計(jì)的富有經(jīng)驗(yàn)的設(shè)計(jì)師們,對職責(zé)單一原則、信息專家、充血/貧血模型、模型驅(qū)動(dòng)設(shè)計(jì)這些名詞或概念應(yīng)該不會(huì)感到陌生。 我們可以發(fā)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的一大優(yōu)點(diǎn):系統(tǒng)高度模塊化,代碼重用度高,不會(huì)出現(xiàn)太多的重復(fù)邏輯。 從戰(zhàn)略到戰(zhàn)術(shù),領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain Driven Design,DDD)給出了諸多關(guān)于軟件架構(gòu)、設(shè)計(jì)、建模與編碼的方法和模式,以用于應(yīng)對業(yè)務(wù)復(fù)雜度。 對于學(xué)習(xí) DDD 的開發(fā)人員而言,第一重要的不是掌握 DDD 的模式,而是要改變分析思維與設(shè)計(jì)思維的方式。將這種思維方式運(yùn)用到軟件項(xiàng)目開發(fā)過程中,就是我所提到的「領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)」,它的核心內(nèi)容可以通過層層推進(jìn)的形式匯集為如下三句話:
如何理解這三句話? 當(dāng)你開始領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)時(shí),必須在分析建模階段拋開實(shí)現(xiàn)技術(shù)對你的影響,與需求分析人員、測試人員一起單純針對「領(lǐng)域」進(jìn)行分析建模,即提煉與抽象領(lǐng)域概念,并以統(tǒng)一語言和模型的形式來表達(dá)。 在設(shè)計(jì)建模階段,圍繞著一個(gè)完整的「場景」開展設(shè)計(jì)工作。需求分析人員為「場景」編寫用戶故事;測試人員為「場景」編寫驗(yàn)收標(biāo)準(zhǔn);開發(fā)人員則開始解剖「場景」,將其分解為組合任務(wù)與原子任務(wù),然后各自分配給不同的角色構(gòu)造型。 到了實(shí)現(xiàn)建模階段,就針對這些任務(wù)定義測試用例,開始測試驅(qū)動(dòng)開發(fā),由內(nèi)至外到達(dá)應(yīng)用服務(wù)時(shí),再將它們集成起來。顯然,領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)就是針對領(lǐng)域開展的「合而分分而合」的解構(gòu)過程。 同時(shí),必須謹(jǐn)記:領(lǐng)域模型驅(qū)動(dòng)設(shè)計(jì)的基礎(chǔ)是限界上下文。在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的戰(zhàn)略階段,同樣是一個(gè)「合而分分而合」的解構(gòu)過程:將領(lǐng)域分解為限界上下文,再通過上下文映射聯(lián)合限界上下文共同實(shí)現(xiàn)多個(gè)領(lǐng)域場景。 以上內(nèi)容正是我言猶未盡想要表達(dá)的精髓。學(xué)習(xí)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),就需要抓住 DDD 的根本和精髓。你需要理解什么是限界上下文,它帶來的價(jià)值是什么;你需要理解如何進(jìn)行領(lǐng)域建模,統(tǒng)一語言在其中扮演了什么樣的角色;你需要理解為何領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)提倡以領(lǐng)域?yàn)轵?qū)動(dòng)力,為何需要領(lǐng)域?qū)<覅⑴c到項(xiàng)目開發(fā)中來。 提升了對這些內(nèi)容的認(rèn)識后,再去學(xué)習(xí) DDD 給出的設(shè)計(jì)模式,學(xué)習(xí)我給出的固化設(shè)計(jì)過程,如場景驅(qū)動(dòng)設(shè)計(jì)。然后找三兩個(gè)不曾實(shí)施 DDD 的項(xiàng)目,尋兩三個(gè)實(shí)施了 DDD 的項(xiàng)目,相互對比其模型與代碼,你絕對會(huì)有一種醍醐灌頂?shù)母杏X。當(dāng)然,這些都需要你沉下心來細(xì)心體會(huì),認(rèn)真思考,還需要你廣泛涉獵更多軟件設(shè)計(jì)與開發(fā)的知識,如此方能打通 DDD 的任督二脈。 DDD 不是一門容易衰亡的軟件方法學(xué),反而越來越被行業(yè)所認(rèn)可,薪資待遇也是水漲船高超過了大部分平均值。我從 2017 年 11 月寫下本專欄的第一個(gè)字到現(xiàn)在完成整個(gè)專欄,已有兩年多的時(shí)間了,好在 DDD 在這兩年后依然算是一門顯學(xué),在微服務(wù)與中臺(tái)光芒的映襯下,DDD 也變得越來越耀眼。 如今,專欄終于完成了!《戰(zhàn)略篇》一共 34 章,15 萬 5 千字;《戰(zhàn)術(shù)篇》一共 71 章,35 萬 1 千字;合計(jì) 105 章,共 50 萬 6 千余字,加上兩篇開篇詞與這篇可以稱為寫后感的后記,共 108 章,算是湊齊了一百單八將。如此成果也足可慰藉我為之付出的兩年多艱辛?xí)r光! 如果你想從此寫代碼再也碰不到 Bug |
|