重構(gòu)這件小事

服務(wù)端的技術(shù)重構(gòu),對(duì)于很多開發(fā)人員來說并不陌生。這里,我們稱大的技改叫做重構(gòu)。自加入我站以來,也是主導(dǎo)或經(jīng)歷過比較大的技術(shù)重構(gòu),簡(jiǎn)單說有兩類:

  1. 從php到golang的重構(gòu)
  2. 兩年累積的golang代碼的重構(gòu)

其實(shí)重構(gòu)的動(dòng)機(jī)無非就這么兩類

  • 語言棧的遷移或統(tǒng)一 算是重寫了
  • 因業(yè)務(wù)發(fā)展,老的架構(gòu)不滿足了,包括穩(wěn)定性、性能上的、擴(kuò)展性上的等等

那么,到底我們的項(xiàng)目,是否需要重構(gòu)了呢?
重構(gòu)本身屬于技改,一般情況下產(chǎn)品和老板不一定是非常關(guān)心的,甚至有時(shí)候是“反對(duì)”的。短期來看,重構(gòu)對(duì)業(yè)務(wù)迭代速度的影響、重構(gòu)中或者重構(gòu)后系統(tǒng)的穩(wěn)定性也未知。那么,我們要不要重構(gòu)呢?

我們要會(huì)算賬!重構(gòu)的收益是什么?成本是什么?風(fēng)險(xiǎn)是什么?想清楚這3個(gè)問題再?zèng)Q定!
* 收益能否量化!比如性能數(shù)據(jù)提升多少?耗時(shí)的減少是直接改善用戶體驗(yàn)的。帶寬是否減少百分多少?帶寬的成本往往是技術(shù)成本大頭。還有如CPU的優(yōu)化,對(duì)于大的業(yè)務(wù)集群也是可觀的收益。
* 成本和風(fēng)險(xiǎn) 成本和風(fēng)險(xiǎn)往往是相關(guān)的。這里主要指技改的額外開發(fā)成本對(duì)業(yè)務(wù)迭代的風(fēng)險(xiǎn)影響,以及過程中的對(duì)系統(tǒng)穩(wěn)定性的風(fēng)險(xiǎn)影響。

其實(shí),還有很多隱形收益是特別需要開發(fā)人員關(guān)注的,如代碼規(guī)范和質(zhì)量的優(yōu)化對(duì)后期開發(fā)效率和易維護(hù)性的影響,平臺(tái)化改造使得整個(gè)系統(tǒng)的擴(kuò)展性、業(yè)務(wù)解耦的改善,等等。那么我簡(jiǎn)單舉例下近期推進(jìn)的go業(yè)務(wù)系統(tǒng)改造。

兩個(gè)月前我開始制定評(píng)論等社區(qū)系統(tǒng)的重構(gòu)roadmap。這些系統(tǒng)在兩年前是從我站的大雜燴系統(tǒng)拆分出來的,經(jīng)歷了非常多的功能堆積、多業(yè)務(wù)方接入,存在非常多的系統(tǒng)性問題。方案包括核心幾點(diǎn):

  • 服務(wù)拆分 比如單體拆成網(wǎng)關(guān)和service服務(wù)。網(wǎng)關(guān)邏輯包括對(duì)外接口、埋點(diǎn)上報(bào)、防刷限流、數(shù)據(jù)聚合、業(yè)務(wù)配置等,無狀態(tài)。service服務(wù)側(cè)重基礎(chǔ)功能邏輯、DB和緩存操作,基本上做到和功能迭代、業(yè)務(wù)方解耦。這樣網(wǎng)關(guān)的頻繁發(fā)版帶來的心智負(fù)擔(dān)就很少了。
  • 配置化改造 比如系統(tǒng)不斷接入了很多業(yè)務(wù)方,那么我們要支持平臺(tái)功能的配置化。同時(shí),要盡量和業(yè)務(wù)方邏輯解耦。
  • 性能優(yōu)化 這點(diǎn)不細(xì)說了,基本上做核心接口性能分析就好了,見golang下的并發(fā)、并行優(yōu)化
  • 穩(wěn)定性 穩(wěn)定性的影響因素很多,架構(gòu)的合理、容災(zāi)容錯(cuò)方案、依賴方系統(tǒng)的穩(wěn)定性等等。
  • 通用邏輯規(guī)范寫法 基礎(chǔ)庫(kù)越強(qiáng)大,業(yè)務(wù)代碼越簡(jiǎn)單。還有比如job常用的內(nèi)存merge、并行調(diào)用框架等等......
  • 編碼質(zhì)量和UT覆蓋 高內(nèi)聚、低耦合,比如api協(xié)議和interface的設(shè)計(jì)啊、類的設(shè)計(jì)啊、函數(shù)的設(shè)計(jì)啊、命名啊、狀態(tài)屬性的寫收斂、太多地方了

重構(gòu)也許很累,但是本身是思考的過程和提升的過程,重構(gòu)的方案也特別重要。敢于重構(gòu),勇于突破。
最后提一個(gè)我們重構(gòu)過程中的小技巧,新老系統(tǒng)怎么切換?我們會(huì)同時(shí)并行請(qǐng)求新老接口,并做結(jié)果diff。當(dāng)結(jié)果完全一致才考慮返回新接口數(shù)據(jù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容