本文集說的都是些平凡的小事救崔,但往往是這些小事區(qū)分了產(chǎn)品的偉大與平庸。
1.雜談業(yè)務(wù)組件標(biāo)準(zhǔn)化
(1)感覺自己萌萌噠
前面章節(jié)提到的“開發(fā)環(huán)境標(biāo)準(zhǔn)化”六孵、“工程標(biāo)準(zhǔn)化”、“三方件標(biāo)準(zhǔn)化”都有明確的本今、可量化的標(biāo)準(zhǔn),有標(biāo)準(zhǔn)就可以看護(hù)冠息。
但“與業(yè)務(wù)強(qiáng)相關(guān)”的業(yè)務(wù)組件孕索,就很難找到“標(biāo)準(zhǔn)”——您可能會(huì)說業(yè)界那些架構(gòu)模式、設(shè)計(jì)模式不就是給我們的明燈嗎?舉個(gè)例子唐断,“微服務(wù)”的方法論只說您的產(chǎn)品只要?jiǎng)澐殖闪宋⒎?wù),就可以享受到很多好處恳啥,但是丹诀,您的產(chǎn)品已經(jīng)有了千萬行的存量代碼,怎么劃分呢硝桩?這些架構(gòu)模式就不怎么回答了枚荣。
于是,實(shí)戰(zhàn)中衙伶,業(yè)務(wù)組件因?yàn)闆]有標(biāo)準(zhǔn)害碾,所以就“跟著感覺走”,通常還是跟著“領(lǐng)導(dǎo)的感覺走”芬沉。如果領(lǐng)導(dǎo)沒有編碼經(jīng)驗(yàn)、沒有深入客戶需求笋籽,這種感覺簡直就是災(zāi)難椭员。
感覺,有兩個(gè)特征:一是主觀性侍芝,二是以自我為中心埋同。所以,跟著感覺走的人和產(chǎn)品咧栗,是不是總覺得自己萌(不)萌(靠)噠(譜)虱肄?
(2)標(biāo)準(zhǔn)化與場景化的矛盾
再來說說矛盾:標(biāo)準(zhǔn)化強(qiáng)調(diào)軍事化管理,要整齊劃一斟或。場景化強(qiáng)調(diào)具體問題具體分析萝挤,要因材施教。這兩種針鋒相對的流派怜珍,在實(shí)戰(zhàn)中如何取舍與平衡呢凤粗?
想說清這個(gè)問題绘面,筆者先引用《神雕俠侶》中獨(dú)孤求敗的墓志銘:
第一把青鋒長劍——“青鋒長劍揭璃,凌厲剛猛亭罪,無堅(jiān)不摧,弱冠前以之與河朔群雄爭鋒”
第二把紫薇軟劍——“紫薇軟劍情组,三十歲所用,誤傷義士不詳院崇,乃棄之深谷”
第三把玄鐵重劍——“重劍無鋒底瓣,大巧不工,四十年前恃之橫行天下”
第四把腐朽木劍——“四十歲之后拨扶,不滯于物茁肠,草木竹石皆可為劍。自此精修垦梆,漸進(jìn)于無劍勝有劍之境”
標(biāo)準(zhǔn)化就是定式,是程序猿的“青鋒長劍和紫薇軟劍”托猩。老前輩們總結(jié)出一種的“套路”,這種套路在合適的場景下使用最安全、最穩(wěn)妥鼻百、最大概率的提高新手的勝算。所以因悲,定式一定要學(xué)勺爱,而且要虛心的學(xué)、深入的學(xué)卫旱。
標(biāo)準(zhǔn)化的誤區(qū)是“生搬硬套”围段。初學(xué)者僅僅理解了定式的招式,卻沒有理解定式的心法适贸,“合適的場景”就是定式的心法——只有在這個(gè)特定的場景下使用這個(gè)定式才最合適——筆者工作初期很迷信設(shè)計(jì)模式,把市面上能買到的設(shè)計(jì)模式的書都讀了一遍拜姿,在產(chǎn)品代碼中大量使用設(shè)計(jì)模式,結(jié)果弄巧成拙到后來自己都看不懂自己的代碼谒获。這就是風(fēng)騷的代價(jià)晴埂。。精耐。
“場景化”就是具體問題具體分析卦停,是程序猿的“玄鐵重劍和腐朽木劍”。這個(gè)階段就是將“定式”爛熟于胸的程序猿惊完,不斷通過一個(gè)個(gè)實(shí)戰(zhàn)案例小槐,對“定式”理解的更加透徹,運(yùn)用的更加靈活自如凿跳。
“場景化”的能力提升似乎沒有更好的辦法控嗜,只有通過實(shí)戰(zhàn)訓(xùn)練和經(jīng)驗(yàn)總結(jié)骡显。
寫到這里,筆者已經(jīng)放棄了從方法論層面進(jìn)行證明與探索了惫谤。Why?
標(biāo)哥的口頭禪:“量變引起質(zhì)變”博助,即當(dāng)代碼規(guī)模數(shù)量級(jí)增長時(shí)痹愚,架構(gòu)面臨的挑戰(zhàn)就會(huì)指數(shù)級(jí)增長蛔糯。只經(jīng)歷過10萬行代碼規(guī)模的程序猿絕無可能看看書就能具備千萬級(jí)代碼規(guī)模的架設(shè)能力蚁飒。因?yàn)樵谝淮未蔚膶?shí)戰(zhàn)訓(xùn)練中萝喘,程序猿的大腦會(huì)經(jīng)歷無數(shù)次主動(dòng)+被動(dòng)的“抽象、總結(jié)”的思維訓(xùn)練
也就是說爬早,有一種痛就叫做你不經(jīng)歷就不會(huì)懂的痛启妹。
2.一種標(biāo)準(zhǔn)化的實(shí)現(xiàn)
下面筆者以一個(gè)VUE+SpringBoot的系統(tǒng)為例饶米,列舉出筆者認(rèn)為比較實(shí)用的標(biāo)準(zhǔn)化實(shí)現(xiàn)
(1)MVC、MVP照瘾、MVVM=>WCSR
MVC丧慈、MVP、MVVM是業(yè)界常規(guī)的架構(gòu)模式鹃愤,我們簡單回顧一下它們的含義:
MVC:Model View Controller笑旺,是模型(model)-視圖(view)-控制器(controller)的縮寫筒主,一種軟件設(shè)計(jì)典范鸟蟹,用一種業(yè)務(wù)邏輯、數(shù)據(jù)藤韵、界面顯示分離的方法組織代碼熊经,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面欲险,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí)匹涮,不需要重新編寫業(yè)務(wù)邏輯。MVC被獨(dú)特的發(fā)展起來用于映射傳統(tǒng)的輸入喜每、處理和輸出功能在一個(gè)邏輯的圖形化用戶界面的結(jié)構(gòu)中雳攘。
MVP:Model-View-Presenter 带兜;MVP 是從經(jīng)典的模式MVC演變而來刚照,它們的基本思想有相通的地方:Controller/Presenter負(fù)責(zé)邏輯的處理沃于,Model提供數(shù)據(jù),View負(fù)責(zé)顯示檩互。MVP與MVC有著一個(gè)重大的區(qū)別:在MVP中View并不直接使用Model咨演,它們之間的通信是通過Presenter (MVC中的Controller)來進(jìn)行的,所有的交互都發(fā)生在Presenter內(nèi)部饵较,而在MVC中View會(huì)直接從Model中讀取數(shù)據(jù)而不是通過 Controller遭赂。
MVVM:Model-View-ViewModel的簡寫。它本質(zhì)上就是MVC 的改進(jìn)版茄猫。MVVM 就是將其中的View 的狀態(tài)和行為抽象化困肩,讓我們將視圖 UI 和業(yè)務(wù)邏輯分開。ViewModel實(shí)現(xiàn)了數(shù)據(jù)綁定勇劣。
WCSR本質(zhì)就是MVC潭枣,為業(yè)務(wù)組件橫向切分的一種標(biāo)準(zhǔn)(圖6)
Website:用于承載頁面相關(guān)的容器幻捏,與JS端進(jìn)行對接
Composite:組合調(diào)度各類原子能力粘咖。
Single:原子能力
Repository:MO侈百、VO、持久化相關(guān)讽坏。
(2)DDD=>對業(yè)務(wù)進(jìn)行合理劃分的一種方法論
只是摘抄DDD繁多術(shù)語中的部分路呜,看到DDD體系的大致思路:
Domain(領(lǐng)域):一個(gè)領(lǐng)域具有類似的核心業(yè)務(wù)织咧,解決類似的問題域
Bounded Context(界限上下文):將Domain劃分成N個(gè)子域,Bounded Context用來描述子域間的關(guān)系笙蒙。Bounded Context實(shí)戰(zhàn)中通常會(huì)變成一個(gè)子系統(tǒng)or模塊。
Domain Model(領(lǐng)域模型):表達(dá)實(shí)體概念(例如:老師轧葛、學(xué)生)艇搀、過程概念(對老師出題考學(xué)生)
Entity(實(shí)體):class Person,有唯一標(biāo)識(shí)
ValueObject(值對象):int a=3;
Domain Service(領(lǐng)域服務(wù)):調(diào)度多個(gè)DomainModel衷笋,純粹的動(dòng)作矩屁,不適合建模為對象
Aggregate(聚合):描述Entity、ValueObject的關(guān)系
Factory(工廠):創(chuàng)建Entity慢蜓、ValueObject郭膛、Aggregate
Repostitory(倉庫):持久化到DB
個(gè)人認(rèn)為氛悬,DDD設(shè)計(jì)了很多嚴(yán)謹(jǐn)規(guī)范的術(shù)語以及分析業(yè)務(wù)需求的流程(仔細(xì)閱讀圖7就能理解DDD是個(gè)什么藥方)耘柱。在復(fù)雜的業(yè)務(wù)需求中调煎,能夠相對條理化己肮、規(guī)范化的縱向劃分業(yè)務(wù)子系統(tǒng)、業(yè)務(wù)組件等娄柳。
筆者不是DDD的鐵粉艘绍,但DDD至少是一個(gè)相對系統(tǒng)的方法論,實(shí)戰(zhàn)中至少可以讓項(xiàng)目組的關(guān)鍵角色相對快速達(dá)成一致的設(shè)計(jì)思路挎挖。
3.總結(jié)
本文的主題很難表述清楚蕉朵,筆者只能列舉所處項(xiàng)目常用的一種實(shí)現(xiàn)方式進(jìn)行闡述敷存,權(quán)當(dāng)拋磚引玉,有一種痛不經(jīng)歷真的無法感同身受锚烦。
PS:筆者程序猿生涯深受標(biāo)哥的指點(diǎn)和影響,文中常常引用他老人家經(jīng)典的觀點(diǎn)蛉拙,因此和小伙伴們制作了標(biāo)哥表情包,以表敬意彻亲。