系统重构的10点经验总结
導(dǎo)讀:我們?nèi)粘9ぷ髦?#xff0c;系統(tǒng)重構(gòu)應(yīng)該是最讓人頭疼的了,無(wú)論是錯(cuò)綜復(fù)雜還是簡(jiǎn)單的系統(tǒng),在發(fā)展的過(guò)程中都會(huì)經(jīng)歷重構(gòu),系統(tǒng)重構(gòu)也是任何技術(shù)團(tuán)隊(duì)無(wú)法回避的問(wèn)題,在我服務(wù)的多家公司,幾乎每家公司都經(jīng)歷了一次甚至多次系統(tǒng)的重構(gòu),本文就我在多年的重構(gòu)工作中總結(jié)出來(lái)的幾點(diǎn)建議分享給各位朋友,希望能夠給朋友們帶來(lái)幫助。
高成,現(xiàn)就職于唯品會(huì),曾服務(wù)于微博、愛(ài)奇藝等公司,主要從事后端系統(tǒng)的開(kāi)發(fā)和設(shè)計(jì)工作,參與了多個(gè)互聯(lián)網(wǎng)應(yīng)用的開(kāi)發(fā)、設(shè)計(jì)以及重構(gòu)工作,擁有電商系統(tǒng)、社交平臺(tái)等系統(tǒng)的研發(fā)和架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),現(xiàn)作為唯品會(huì)供應(yīng)鏈核心系統(tǒng)重構(gòu)項(xiàng)目負(fù)責(zé)人主持供應(yīng)鏈核心系統(tǒng)檔期業(yè)務(wù)的重構(gòu)工作。
1、重構(gòu)確定并且聚焦目標(biāo)
首先我相信我們大家都確信,系統(tǒng)重構(gòu)會(huì)有巨大的成本投入,業(yè)務(wù)可能需要暫緩、新系統(tǒng)引入的問(wèn)題( BUG)會(huì)帶來(lái)業(yè)務(wù)的不穩(wěn)定,存在研發(fā)人員投入開(kāi)銷還有各種隱性成本等等。我們服務(wù)的商業(yè)公司,獲取利潤(rùn)是最終目的,投入成本做一個(gè)項(xiàng)目肯定要獲得收益。重構(gòu)的目標(biāo)一定要能夠獲得更大的提升,無(wú)論是業(yè)務(wù)流程、系統(tǒng)性能或是其他方面,如果僅僅一個(gè)很小的改善,完全沒(méi)必要大費(fèi)周章。
因此重構(gòu)之前權(quán)衡好成本,重構(gòu)是否能夠獲得良好的收益?
無(wú)論如何進(jìn)行系統(tǒng)重構(gòu)都是一次傷筋動(dòng)骨的過(guò)程,是涅槃重生還是飛蛾撲火,完全取決我們項(xiàng)目執(zhí)行的過(guò)程中是否明確了目標(biāo),且一直聚焦于目標(biāo)的實(shí)現(xiàn)。保持目標(biāo)的聚集是能否取得良好結(jié)果的必要條件。
如果我們僅僅確立了目標(biāo),但沒(méi)有聚集于目標(biāo),反而在多個(gè)非重要的節(jié)點(diǎn)投入較大資源,必然會(huì)導(dǎo)致我們對(duì)目標(biāo)的投入降低。工作中的原始資本投入都是 8 個(gè)小時(shí),這就需要我們明確目標(biāo)聚焦目標(biāo),把有限的資源投入到最重要的事情中,才能獲得既定目標(biāo)的良好結(jié)果。
2、重構(gòu)要有可量化的指標(biāo)
團(tuán)隊(duì)確認(rèn)了重構(gòu)的目標(biāo)之后,下一步要將目標(biāo)量化,確定好目標(biāo)之后就能夠確認(rèn)邊界,圍繞在邊界內(nèi)將需要實(shí)現(xiàn)的事項(xiàng)一一羅列出來(lái),盡可能對(duì)每個(gè)實(shí)現(xiàn)制定可以用數(shù)據(jù)清晰表現(xiàn)出來(lái)的指標(biāo),比如用戶操作的響應(yīng)時(shí)間縮短到 100 毫秒、單元測(cè)試的覆蓋率達(dá)到 80%、發(fā)現(xiàn)問(wèn)題時(shí)長(zhǎng)降低到 30 分鐘以內(nèi)等等。
有了明確的數(shù)據(jù)指標(biāo)我們才能評(píng)估最終是否獲得了良好收益,這些目標(biāo)必須要在重構(gòu)團(tuán)隊(duì),包括產(chǎn)品、研發(fā)、測(cè)試甚至包括業(yè)務(wù)方在內(nèi)達(dá)成一致,團(tuán)隊(duì)的目標(biāo)需要清晰明了,防止出現(xiàn)過(guò)度或是不達(dá)標(biāo)是最終不能獲得良好收益。
3、重構(gòu)要有更好的質(zhì)量
既然決定了要對(duì)系統(tǒng)進(jìn)行一次重構(gòu),那么我們肯定要做到的就是要比之前做的更好,如果之前接口響應(yīng)時(shí)間在 100 毫秒,而經(jīng)過(guò)重構(gòu)之后反而到了 200 毫秒以上,那么大家辛苦付出的努力是不是也更加不值得。而進(jìn)行重構(gòu)往往是一件十分引人注目的事情,一個(gè)微小的問(wèn)題反而容易在眾人注目下變得非常嚴(yán)重的問(wèn)題。為了減少引起不必要的麻煩,重構(gòu)團(tuán)隊(duì)就更加要注重各個(gè)方面的問(wèn)題,無(wú)論是系統(tǒng)性能、用戶體驗(yàn)還是 BUG 數(shù)量等。
?
4、重構(gòu)之前要和業(yè)務(wù)方溝通
技術(shù)團(tuán)隊(duì)進(jìn)行系統(tǒng)重構(gòu)的工作的時(shí)候往往忽略掉了業(yè)務(wù)方,認(rèn)為這是技術(shù)團(tuán)隊(duì)內(nèi)部的事情,不需要知會(huì)業(yè)務(wù)方,這個(gè)想法是非常錯(cuò)誤的,進(jìn)行重構(gòu)的目標(biāo)就是為了改善改進(jìn)業(yè)務(wù)流程,而不去和業(yè)務(wù)方提前溝通進(jìn)行閉門(mén)造車,最后的結(jié)果很可能和進(jìn)行重構(gòu)的初衷背道而馳。進(jìn)行系統(tǒng)重構(gòu)首先我們必須了解現(xiàn)有系統(tǒng)的業(yè)務(wù)需求,是否有待改進(jìn)的業(yè)務(wù)需求點(diǎn),是否有新的業(yè)務(wù)訴求等,這些需求往往會(huì)影響到我們重構(gòu)的進(jìn)度和目標(biāo),甚至出現(xiàn)南轅北撤的事情。
技術(shù)團(tuán)隊(duì)和業(yè)務(wù)方往往對(duì)待問(wèn)題的出發(fā)角度不同,思考問(wèn)題的方式也不同,在進(jìn)行重構(gòu)之前和業(yè)務(wù)方溝通獲得業(yè)務(wù)方的支持,往往能夠事半功倍。
例如,我的團(tuán)隊(duì)在進(jìn)行一塊業(yè)務(wù)系統(tǒng)重構(gòu)的時(shí)候進(jìn)入到了系統(tǒng)切換的試運(yùn)行的階段,由于拿出的方案給到業(yè)務(wù)方無(wú)法被業(yè)務(wù)方接受,業(yè)務(wù)方提出的解決方案我們還需要進(jìn)行再次開(kāi)發(fā),對(duì)整個(gè)項(xiàng)目進(jìn)度影響了足足一個(gè)月時(shí)間之多。吸取教訓(xùn)的我們?cè)谶M(jìn)行下一個(gè)項(xiàng)目的時(shí)候提前和業(yè)務(wù)方進(jìn)行了溝通,業(yè)務(wù)方從他們的角度給予了很多的意見(jiàn)和建議以及業(yè)務(wù)未來(lái)的發(fā)展方向的指引,我們發(fā)現(xiàn)這些建議和意見(jiàn)幫助我們更好理解業(yè)務(wù)的同時(shí)也大大的降低了我們工作量,減少了我們很多冗余的設(shè)計(jì)。
?
5、重構(gòu)應(yīng)該用迭代的方式
參與過(guò)重構(gòu)項(xiàng)目的朋友都知道,重構(gòu)項(xiàng)目往往是個(gè)時(shí)間跨度很長(zhǎng)的工作,少則一兩個(gè)月多則一年半載都有,如果不將整個(gè)重構(gòu)進(jìn)行合理拆分,而是采用全部開(kāi)發(fā)完成,再進(jìn)行系統(tǒng)切換的方式會(huì)對(duì)整個(gè)重構(gòu)引入很大的風(fēng)險(xiǎn)。首先長(zhǎng)時(shí)間的時(shí)間跨度內(nèi)業(yè)務(wù)會(huì)進(jìn)行持續(xù)變更,其次團(tuán)隊(duì)面臨長(zhǎng)時(shí)間沒(méi)有結(jié)果輸出面臨來(lái)自各個(gè)方面的壓力,還有系統(tǒng)問(wèn)題持續(xù)累積,這種蒙頭狂奔的方式往往造成了項(xiàng)目失敗或是目標(biāo)便宜。
而采用迭代方式進(jìn)行重構(gòu),可以以更小的顆粒度持續(xù)交付工作成果,交付 - 試用 - 反饋 - 調(diào)整,持續(xù)有交付,持續(xù)有反饋,持續(xù)調(diào)整能夠保證團(tuán)隊(duì)的目標(biāo)不會(huì)偏移,形成一個(gè)正向循環(huán),保證最后的重構(gòu)目標(biāo)。
6、重構(gòu)要清晰了解舊系統(tǒng)
知己知彼,百戰(zhàn)不殆,系統(tǒng)重構(gòu)是一個(gè)與舊系統(tǒng)對(duì)抗的過(guò)程,不對(duì)舊系統(tǒng)的弄的清清楚楚怎么能夠比舊系統(tǒng)做的更好呢?其實(shí)了解現(xiàn)有系統(tǒng)是一個(gè)學(xué)習(xí)的過(guò)程,如果有舊系統(tǒng)的開(kāi)發(fā)人員還在公司,那么就事半功倍了,舊系統(tǒng)的開(kāi)發(fā)同學(xué)幫忙給做次分享,省去了我們重構(gòu)團(tuán)隊(duì)很多的工作,比直接去讀代碼更能清晰明了的了解到舊系統(tǒng)的相關(guān)知識(shí),以及有哪些需求點(diǎn)和應(yīng)該注意的問(wèn)題等等,通過(guò)學(xué)習(xí)和了解舊系統(tǒng)設(shè)定目標(biāo)基準(zhǔn)值避免引入老舊問(wèn)題,也是避免重蹈覆轍的一個(gè)好辦法。
?
7、重構(gòu)要提前規(guī)劃系統(tǒng)切換方案
不知道朋友有沒(méi)有遇到過(guò),重構(gòu)完系統(tǒng)發(fā)現(xiàn),如果進(jìn)行新舊系統(tǒng)的切換是個(gè)難題。我們以前遇到過(guò)由于沒(méi)有提前做好規(guī)劃和切換步驟,導(dǎo)致最后臨時(shí)抱佛腳,開(kāi)始使用各種奇葩辦法做系統(tǒng)切換,有的還需要增加額外工作量,甚至各種辦法的刷臉求人,總之這不是一個(gè)很好的體驗(yàn)。
系統(tǒng)切換往往是在重構(gòu)中被我們忽略的一個(gè)步驟,但是這是非常重要的一個(gè)環(huán)節(jié),在做最初的計(jì)劃就應(yīng)該考慮到如何進(jìn)行系統(tǒng)切換,一個(gè)設(shè)計(jì)好的切換方案也應(yīng)該貫穿重構(gòu)始終,避免因?yàn)榍袚Q方案引起服務(wù)不可用或是引入系統(tǒng) BUG。尤其是前期整個(gè)團(tuán)隊(duì)付出巨大努力取得了一定成果的時(shí)候,在最后一步切換的時(shí)候出現(xiàn)問(wèn)題,對(duì)團(tuán)隊(duì)是個(gè)非常大的打擊,也使得業(yè)務(wù)方對(duì)團(tuán)隊(duì)失去信心,帶來(lái)很不必要的麻煩。
?
8、重構(gòu)高度重視系統(tǒng)數(shù)據(jù)
一次系統(tǒng)重構(gòu)大多數(shù)情況下會(huì)涉及到數(shù)據(jù)結(jié)構(gòu)的修改,對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行修改必然引入很大的風(fēng)險(xiǎn),尤其在一些老舊的業(yè)務(wù)系統(tǒng)重構(gòu)精簡(jiǎn),業(yè)務(wù)去掉冗余數(shù)據(jù)的時(shí)候,往往需要將老數(shù)據(jù)的業(yè)務(wù)數(shù)據(jù)重新寫(xiě)入到新系統(tǒng)的數(shù)據(jù)庫(kù)。重構(gòu)的目標(biāo)是為了比舊系統(tǒng)更好,無(wú)論是性能還是業(yè)務(wù)方面,如果我們對(duì)數(shù)據(jù)的操作導(dǎo)致外部依賴舊系統(tǒng)的業(yè)務(wù)無(wú)法正常運(yùn)行,那將是影響 SLA 指標(biāo)的問(wèn)題。說(shuō)到系統(tǒng)數(shù)據(jù)有些同學(xué)可能僅僅關(guān)注的是業(yè)務(wù)數(shù)據(jù),其實(shí)數(shù)據(jù)也包含了系統(tǒng)運(yùn)行所產(chǎn)生的日志數(shù)據(jù),無(wú)論新舊系統(tǒng)的日志數(shù)據(jù),都是很重要的,如果因?yàn)橹貥?gòu)影響到數(shù)據(jù)的讀取、處理、分析,則是得不償失的事情。
?
9、重構(gòu)要采用成熟的技術(shù)選型
技術(shù)選型是重構(gòu)工作的基石,選擇一套成熟穩(wěn)定的技術(shù)方案是重構(gòu)項(xiàng)目完成的必要條件。有些時(shí)候我們引入最新版的數(shù)據(jù)庫(kù)雖說(shuō)會(huì)有性能提升但是也會(huì)引入一定的不穩(wěn)定因素,之前我們團(tuán)隊(duì)在使用 MongoDB 的一個(gè)新版本的時(shí)候,發(fā)現(xiàn)主從庫(kù)的數(shù)據(jù)并不能很好的同步,出現(xiàn)過(guò)丟失數(shù)據(jù)的情況,進(jìn)入社區(qū)發(fā)現(xiàn)這個(gè)版本使用的用戶很多都反饋了這個(gè)問(wèn)題,這時(shí)候我們不得不選擇了大多數(shù)人共同的一個(gè)選擇,降低了一個(gè)版本來(lái)解決問(wèn)題,相信此類情況比比皆是。在不是很成熟的方案帶來(lái)并不顯著的性能提升,反而還會(huì)引入不確定的風(fēng)險(xiǎn)的時(shí)候,我們需要權(quán)衡利弊得失,重構(gòu)更是要保證系統(tǒng)的穩(wěn)定性。
技術(shù)方案能否有足夠強(qiáng)大的支撐也是我們需要考慮的一個(gè)方面,現(xiàn)在我們團(tuán)隊(duì)面對(duì)的重構(gòu)是從單體式架構(gòu)往微服務(wù)轉(zhuǎn)變,舊系統(tǒng)的版本構(gòu)建在是 PHP 語(yǔ)言上,新的系統(tǒng)我們由兩個(gè)選擇繼續(xù)選擇用 PHP 進(jìn)行重構(gòu)或是采用公司統(tǒng)一的微服務(wù)框架,我們毫不猶豫的選擇了使用公司統(tǒng)一的微服務(wù),這樣做有幾個(gè)顯而易見(jiàn)的好處。
和公司內(nèi)部進(jìn)行交互更加方便快捷;
可以直接獲取成熟的經(jīng)驗(yàn);
基礎(chǔ)服務(wù)有公司級(jí)的支持;
以上的好處,顯然對(duì)我們能否成功重構(gòu)系統(tǒng)并且獲得足夠的幫助起到了顯著的幫助,反而采用 PHP 進(jìn)行微服務(wù),公司內(nèi)部并無(wú)成功經(jīng)驗(yàn)可以借鑒,業(yè)內(nèi)也并無(wú)太多可靠的方案可以進(jìn)行選擇。一個(gè)成熟可靠的的技術(shù)方案是我們能否更進(jìn)一步的保障和基石。
?
10、重構(gòu)更加關(guān)注重視團(tuán)隊(duì)成員
參與過(guò)重構(gòu)的同學(xué)都知道重構(gòu)工作是一項(xiàng)枯燥乏味的工作,往往周期長(zhǎng)、復(fù)雜度、難度大、牽扯廣、優(yōu)先級(jí)低,而且很有可能是一件費(fèi)力不討好的工作。開(kāi)發(fā)一個(gè)業(yè)務(wù)方期待的新功能、新模塊往往比一場(chǎng)翻天覆地的重構(gòu)更能引起業(yè)務(wù)方的重視,也更容易獲取良好結(jié)果與反饋,反而不需要承擔(dān)大多的壓力。
但是越是面對(duì)這樣的情況越是需要加大對(duì)團(tuán)隊(duì)的鼓勵(lì)增強(qiáng)團(tuán)隊(duì)的信心,消除團(tuán)隊(duì)的疑慮困惑,給予團(tuán)隊(duì)持續(xù)的鼓勵(lì),給整個(gè)團(tuán)隊(duì)注入正能量,讓團(tuán)隊(duì)保持積極向上的團(tuán)隊(duì)氛圍,即使面對(duì)各種困難、問(wèn)題,也始終對(duì)團(tuán)隊(duì)保持信心保持樂(lè)觀,讓大家輕松愉快的投入到重構(gòu)工作中,盡量不擔(dān)負(fù)額外的壓力。
?
以上內(nèi)容均為工作中的總結(jié)反思,分享給大家,希望以上的這些總結(jié),能夠?qū)Υ蠹矣兴鶐椭?#xff0c;文章所講述的內(nèi)容,如有不足之處還望留言批評(píng)指出。
總結(jié)
以上是生活随笔為你收集整理的系统重构的10点经验总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 提升用户体验的必杀器——A/B实验统计方
- 下一篇: 定位服务器数据丢弃包问题