新聞中心
什么是設(shè)計(jì)?什么是架構(gòu)?從零開始建立一個(gè)新的系統(tǒng),新寫的每行代碼都可能成為明天的歷史包袱?如何能有效的在遺留代碼上工作?今天,阿里資深技術(shù)專家輝子為我們帶來(lái)NBF框架下軟件工程架構(gòu)設(shè)計(jì)通用方法論,值得細(xì)細(xì)品讀。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、武威ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的武威網(wǎng)站制作公司
Note:本文討論的是基于服務(wù)化前提下的通用軟件工程架構(gòu)方法論,并未涉及到微觀設(shè)計(jì)或架構(gòu)的具體細(xì)節(jié)。
前言
即使代碼多年的人都會(huì)對(duì)這兩個(gè)問(wèn)題有點(diǎn)蒙圈:什么是設(shè)計(jì)?什么是架構(gòu)?
從單詞上看:設(shè)計(jì)是Software Design,架構(gòu)是Software Architecture;分別對(duì)應(yīng)的作者是:Designer和Architect:
- Architect都是Designer,但Designer未必是Architect。正如所有的架構(gòu)設(shè)計(jì)都是設(shè)計(jì),但設(shè)計(jì)未必是架構(gòu)設(shè)計(jì);
- Design關(guān)注微觀代碼(inside component),Architecture關(guān)注宏觀軟件結(jié)構(gòu)(between components);
- Architect應(yīng)該都是從Designer成長(zhǎng)起來(lái)的。畢業(yè)了用code編寫軟件;成長(zhǎng)了用ppt設(shè)計(jì)軟件;
- 只會(huì)用ppt設(shè)計(jì),但代碼寫得不好的Architect都是假的Architect;
- Architecture里聽到比較多的詞語(yǔ):Serverless、FAAS、Microservice、multi-layer、Event driven、OSGI、NBF......
- Design里聽到比較多的詞語(yǔ):SOLID、 DDD、正交設(shè)計(jì)、Design Pattern;
- 搞不清SOLID,也不可能把軟件的層次分好,也無(wú)法理解什么是OSGI的價(jià)值;
- 好的Designer是通往好的Architect的必經(jīng)之路。
服務(wù)化架構(gòu)的基本原則
New System
從零開始建立一個(gè)新的系統(tǒng),有幾個(gè)特征:
- 歷史包袱小
- 上下文簡(jiǎn)單
- 設(shè)計(jì)的約束小
- 新寫的每行代碼都可能成為明天的歷史包袱
由于調(diào)用方還沒(méi)有,新系統(tǒng)可以比較完美的執(zhí)行我們預(yù)想的架構(gòu)設(shè)計(jì),但是切記,最后那行才是最重要的那行:不要讓今天的代碼成為明天的歷史包袱,新的每行代碼都在書寫歷史。
上圖的1,2,3,4代表新建系統(tǒng)的順序:
- 由“相”抽象出“心”:先思考,那么多的業(yè)務(wù)場(chǎng)景下“相”,共同的特征“心”是什么。并反向用更多的相去驗(yàn)證心。
- 將“心”具象成領(lǐng)域模型:關(guān)注領(lǐng)域模型(Domain Model),解耦數(shù)據(jù)模型(Persistence Model):將TUNNEL SPI化。
- 將領(lǐng)域模型中的依賴SPI化:解耦對(duì)外部系統(tǒng)的依賴,反轉(zhuǎn)依賴控制權(quán)。
- Mock所有spi實(shí)現(xiàn),確?!靶摹鳖I(lǐng)域模型包裹的單元測(cè)試完全通過(guò)
- 實(shí)現(xiàn)TUNNEL BUNDLE:設(shè)計(jì)數(shù)據(jù)模型(Persistence Model),關(guān)注“存”,“取”不關(guān)注領(lǐng)域模型。
- 實(shí)現(xiàn)依賴SPI適配BUNDLE:連接真實(shí)依賴服務(wù)。
- 包裝domain service:模型相關(guān),業(yè)務(wù)無(wú)關(guān)。
- 根據(jù)業(yè)務(wù)需求組合/編排domain service成為scenario bundle或者業(yè)務(wù)SOP。
Working on legacy
對(duì)于一個(gè)軟件工程師來(lái)講,寫代碼最痛苦的事情莫過(guò)于coding on legacy,但同時(shí)又給了我們各種說(shuō)辭:
- 這些代碼太爛了,改起來(lái)太費(fèi)勁【需要更多人】
- 這事做不到,因?yàn)橐郧跋到y(tǒng)架構(gòu)問(wèn)題導(dǎo)致的【責(zé)任不在我】
- 經(jīng)過(guò)我的修改,現(xiàn)在已經(jīng)好很多了,工單數(shù)量大批下降【我功勞顯著】
- 知不知道:接手你代碼的人其實(shí)也在重復(fù)說(shuō)上述3件事情
如何能有效的在遺留代碼上工作,業(yè)內(nèi)有本非常不錯(cuò)的書,叫"Working Effectively with Legacy Code",值得精讀:
圖片來(lái)源:書籍《Working Effectively with Legacy Code》
所以我這里的標(biāo)題可能不準(zhǔn)確,我要討論的更多是"遺留代碼的重構(gòu)",什么時(shí)候我們開始討論需要把現(xiàn)有系統(tǒng)重構(gòu):
- 代碼確實(shí)腐化到無(wú)法正常維護(hù),或者新加一個(gè)需求代價(jià)很大;
- 目前代碼的技術(shù)架構(gòu)滿足不了下一步業(yè)務(wù)的發(fā)展;
- 很多特性已經(jīng)下線作廢,卻跟有用的代碼藕斷絲連;
- 業(yè)務(wù)邏輯隨著發(fā)展分散到不同的應(yīng)用里,界限不清;
- 專家級(jí)的未雨綢繆,著眼未來(lái)的規(guī)劃和新技術(shù)的應(yīng)用;
- 換老大了,需要立新的flag。
架構(gòu)的基本原則依然是上面那幅圖。但上下文的不同,我們的發(fā)力點(diǎn)和優(yōu)先級(jí)有明顯的區(qū)別。阿里整個(gè)體系里的依賴關(guān)系錯(cuò)綜復(fù)雜,要對(duì)阿里環(huán)境下的系統(tǒng)做重構(gòu)是件絕對(duì)謹(jǐn)小慎微的事情。為了完成在這么復(fù)雜體系下的架構(gòu)及代碼重構(gòu),我們必須有條不紊的分離關(guān)注點(diǎn)以及一如既往的堅(jiān)持軟件卓越。
聚焦與收斂上游調(diào)用
解耦下游依賴
以服務(wù)為單位切換
老系統(tǒng)下線
經(jīng)過(guò)一步一步的分解,legacy系統(tǒng)已經(jīng)完全被重構(gòu),并且具備隨時(shí)切換的準(zhǔn)備。這里我給幾個(gè)建議:
- 先把老實(shí)現(xiàn)作為API的默認(rèn)實(shí)現(xiàn),新的實(shí)現(xiàn)作為老的實(shí)現(xiàn)的降級(jí)實(shí)現(xiàn),并使用策略分流一部分流量(具體比例跟團(tuán)隊(duì)信心相關(guān));
- 對(duì)于有業(yè)務(wù)需求變更的部分應(yīng)盡快實(shí)現(xiàn)在新的實(shí)現(xiàn)里,并將新實(shí)現(xiàn)作為API的默認(rèn)實(shí)現(xiàn),老實(shí)現(xiàn)作為新實(shí)現(xiàn)的降級(jí)實(shí)現(xiàn),策略應(yīng)該是即時(shí)降級(jí),也就是新實(shí)現(xiàn)出現(xiàn)問(wèn)題立刻降級(jí)到老實(shí)現(xiàn);
- 運(yùn)行一段時(shí)間沒(méi)有問(wèn)題后,講所有默認(rèn)實(shí)現(xiàn)切換為新實(shí)現(xiàn),并將老實(shí)現(xiàn)作為新實(shí)現(xiàn)的降級(jí)實(shí)現(xiàn);
- 其實(shí)這時(shí)就算所有切換完畢:老實(shí)現(xiàn)可以永遠(yuǎn)作為新實(shí)現(xiàn)的降級(jí)實(shí)現(xiàn),也就是只要我升級(jí)一次服務(wù),上一次成功版本就可以作為這次的降級(jí)實(shí)現(xiàn),這樣,線上問(wèn)題回滾就是秒級(jí)的。
總結(jié)
本文基于借助NBF提供的遠(yuǎn)程多態(tài),服務(wù)編排等能力下基礎(chǔ)資料,商品,組網(wǎng)等系統(tǒng)新建,重構(gòu)的經(jīng)驗(yàn)及方法論總結(jié)。僅供遇到架構(gòu)重構(gòu),解耦等問(wèn)題困擾的技術(shù)團(tuán)隊(duì)參考。
本文作者:輝子
分享名稱:如何避免新代碼變包袱?阿里通用方法來(lái)了
分享URL:http://www.dlmjj.cn/article/ccohgep.html


咨詢
建站咨詢
