從簡(jiǎn)單的功能優(yōu)化到復(fù)雜的架構(gòu)升級(jí),系統(tǒng)重構(gòu)往往伴隨著高昂的時(shí)間成本和技術(shù)挑戰(zhàn)。本文通過一個(gè)生動(dòng)的做菜場(chǎng)景,深入淺出地解釋了系統(tǒng)重構(gòu)的重要性和必要性。

———— / BEGIN / ————

相信在產(chǎn)品經(jīng)理的職業(yè)生涯中,大家不止一次聽過系統(tǒng)重構(gòu)這個(gè)詞。

而且所有產(chǎn)品經(jīng)理都經(jīng)歷過這樣的魔幻時(shí)刻:明明只是加個(gè)篩選條件,技術(shù)評(píng)估卻要3個(gè)月;想優(yōu)化某個(gè)功能按鈕,卻被告知整個(gè)頁面都要重寫。

一問原因:因?yàn)橐到y(tǒng)重構(gòu)!

那到底什么是重構(gòu)呢?

如果用一個(gè)我親身經(jīng)歷過的例子來解釋重構(gòu)的重要意義就是:

我當(dāng)年所在某電商平臺(tái)在一次促銷活動(dòng)時(shí),導(dǎo)致每秒峰值訂單突破5000萬時(shí),訂單系統(tǒng)響應(yīng)速度從200ms驟升至2秒,注意是每單哦!

最后一番排查發(fā)現(xiàn):優(yōu)惠計(jì)算模塊與庫存模塊存在循環(huán)調(diào)用,核心業(yè)務(wù)邏輯與日志模塊深度耦合。

想象這樣的場(chǎng)景:炒鍋師傅(優(yōu)惠模塊)每做一份宮保雞丁,都要跑到倉庫(庫存系統(tǒng))確認(rèn)花生庫存,再折返調(diào)料臺(tái)(日志系統(tǒng))記錄操作日志。高峰期這樣的折返跑,不出餐慢才是奇跡。

同過這個(gè)做菜的例子大家很容易理解,這并不是因?yàn)檐浖O(shè)計(jì)失誤,而是廚房(系統(tǒng))擴(kuò)張后的必然代價(jià),單多了你就要優(yōu)化的工序,要么加人要么提前做準(zhǔn)備,相信沒有人會(huì)去說廚師你怎么怎么樣對(duì)吧?

不過很多時(shí)候,在我做咨詢走訪很多公司時(shí),第一時(shí)間這個(gè)團(tuán)隊(duì)的信息化負(fù)責(zé)人的結(jié)論都是會(huì)把這個(gè)問題甩到“初代”產(chǎn)品經(jīng)理身上,聲稱是“初代”系統(tǒng)的產(chǎn)品經(jīng)理的設(shè)計(jì)不合理所導(dǎo)致了今天的一切。

但是我想說:重構(gòu)系統(tǒng)是不可避免的!初期就沒有幾個(gè)客人的時(shí)候你要做一個(gè)航母出來也沒有用???

那今天我就給大家盤點(diǎn)一下重構(gòu)的觸發(fā)條件(避免在規(guī)劃會(huì)上被甩鍋):

【產(chǎn)品驅(qū)動(dòng)】功能疊加困境:新需求開發(fā)周期超過3個(gè)月

【大白話解讀】你是一家賣燒烤的店,當(dāng)某天老板讓你推出酸菜魚的時(shí)候,你要做的就是需要重建灶臺(tái),先把一部分烤爐改成煤氣灶。

【產(chǎn)品驅(qū)動(dòng)】協(xié)作效率低下:跨團(tuán)隊(duì)需求需修改5個(gè)以上模塊,這背后往往是領(lǐng)域劃分不到位。

【大白話解讀】三個(gè)廚師擠在一個(gè)灶臺(tái)炒菜,你覺得會(huì)不會(huì)打架?

【技術(shù)驅(qū)動(dòng)】系統(tǒng)性能瓶頸:核心接口成功率低于99%

【大白話解讀】相當(dāng)于廚房出餐錯(cuò)誤率超過10%

那我們要如何處理系統(tǒng)重構(gòu)呢?

實(shí)時(shí)上按照現(xiàn)在企業(yè)的要求:重構(gòu)就像在一家正常營(yíng)業(yè)的餐廳去升級(jí)后廚——客人們照常吃著火鍋,后廚卻在悄然更換排風(fēng)系統(tǒng)。

所以要求我們決不能停機(jī)!為此具體的執(zhí)行步驟可以定義為下面的三大部分:

Step1:先搭臨時(shí)灶臺(tái)(顧舊立新)

在后廚角落搭建一個(gè)新的煤氣灶,保持老系統(tǒng)不再迭代,在旁邊根據(jù)新的產(chǎn)品規(guī)劃重新設(shè)計(jì)整個(gè)功能并實(shí)現(xiàn)。

Step2:食材統(tǒng)一分裝(接口翻譯層)

老顧客依然要吃到熟悉的”麻辣香鍋”,即便后廚已經(jīng)改用智能炒菜機(jī)。

我們知道很多時(shí)候在重構(gòu)的時(shí)候由于新的方案的應(yīng)用,比如用戶希望取消早已經(jīng)不用的某個(gè)字段,很多老系統(tǒng)的交互還是用生成一個(gè)文件的形式定時(shí)去查詢(很多銀行系統(tǒng)現(xiàn)在還是這樣)。

注意這個(gè)時(shí)候我們要做的是必須保證提供的數(shù)據(jù)消費(fèi)方式和命名方式都是之前的(比如之前叫userID),我們要做的是必須額外建設(shè)一個(gè)新的翻譯模塊,把所有新的數(shù)據(jù)格式與接口翻譯成之前的模式,這么做的最重要一點(diǎn)是,避免當(dāng)某天下游報(bào)錯(cuò)的時(shí)候,別人可以直接把一本糊涂賬扔到你頭上,都是因?yàn)槟阒貥?gòu)系統(tǒng)導(dǎo)致的,我數(shù)據(jù)都亂了(別問我怎么知道的,血和淚換來的)。

Step3:動(dòng)線魔法改造(數(shù)據(jù)雙寫+灰度發(fā)布)

就像在傳菜通道加裝自動(dòng)分揀機(jī),先讓新模塊處理5%的流量,同時(shí)保持老系統(tǒng)運(yùn)轉(zhuǎn)。當(dāng)新模塊的到達(dá)率穩(wěn)定在99.97%后,才逐步關(guān)閉老舊代碼。

所以總結(jié)一下就是:

  • 蓋新屋子:保持老房子對(duì)外輸出不變,在旁邊另起爐灶;

  • 保持對(duì)外輸出不變:翻譯成現(xiàn)有接口的輸出格式:字段叫法/字段類型/消費(fèi)方式;

  • 灰度切換流量:逐步將老系統(tǒng)的流量切換至新系統(tǒng),最后關(guān)停老系統(tǒng);

當(dāng)然在文章的最后結(jié)尾,必須給大家補(bǔ)充一個(gè)我的經(jīng)驗(yàn)教訓(xùn):

重構(gòu)這件事在任何一家公司都是出力不討好的事,活又多,風(fēng)險(xiǎn)又高,如果你不幸接手了,那你要做的必須要讓你的業(yè)務(wù)可感知,也就是通過重構(gòu)給業(yè)務(wù)側(cè)帶來新的業(yè)務(wù)價(jià)值提升(速讀/解決舊歷史問題/解決之前業(yè)務(wù)不能實(shí)現(xiàn)的需求),否則重構(gòu)的過程就將無比艱難!

下次再聽到”需要重構(gòu)”時(shí),請(qǐng)記住:這不是在否定你的設(shè)計(jì),而是邀請(qǐng)你參與指揮一場(chǎng)廚房革命。畢竟,在數(shù)字化生存時(shí)代,不會(huì)用架構(gòu)思維武裝自己的產(chǎn)品經(jīng)理,終將成為被重構(gòu)的對(duì)象。

本文來自微信公眾號(hào):三爺茶館,作者:三爺茶館