在項目維護(hù)的過程中羽圃,由于工程師水平的參差不齊乾胶,很多需求時間緊、任務(wù)重,或又因前幾任工程師離職沒做好交接识窿,導(dǎo)致了大量的可讀性差斩郎、效率低下的代碼,這時候喻频,在職的工程師最想做的恐怕就是重構(gòu)代碼缩宜,將那些垃圾代碼舍棄,按照自己良好的設(shè)計重新實(shí)現(xiàn)一遍半抱。
在工程師看來脓恕,重構(gòu)之后有非常多的好處:
- 代碼更簡潔,可讀性窿侈、可維護(hù)性更強(qiáng)
- 實(shí)現(xiàn)新的需求效率更高
- 新人的學(xué)習(xí)成本更低
重構(gòu)之后丟棄了過往的累贅,往往也會丟棄了過往的經(jīng)驗(yàn)秋茫。盡管過去的代碼十分丑陋史简,但它們確確實(shí)實(shí)可以正常地運(yùn)轉(zhuǎn)。如果要重構(gòu)肛著,能保證新的代碼不會像過去團(tuán)隊的代碼一樣圆兵,慢慢變丑陋嗎?依然會面臨同樣的風(fēng)險枢贿,而且殉农,過去團(tuán)隊已經(jīng)付出的時間成本,還要再次付出一遍局荚。
我所負(fù)責(zé)的項目就經(jīng)歷過這樣一次重構(gòu)超凳,帶來好處的同時也帶來了很多傷害,主要有以下幾點(diǎn):
1. 用戶很長時間看不到產(chǎn)品的變化耀态,容易對產(chǎn)品失去信心
按照原本的開發(fā)計劃轮傍,團(tuán)隊每周會響應(yīng)客戶反饋的 2 個改進(jìn)意見,修正 4+ 個 bug首装,約兩個月推出一個重點(diǎn)功能...用戶每周都能感受到產(chǎn)品在改進(jìn)创夜,這會讓用戶更加喜愛你的產(chǎn)品,重構(gòu)意味著舍棄了正常進(jìn)度的產(chǎn)品更新仙逻,而需要花大量的時間來重新組織代碼驰吓,而這所有改進(jìn),用戶完全感知不到系奉,一旦在某些功能上落后于競爭對手檬贰,可能就直接導(dǎo)致用戶流失。
2. 以前遇到的坑基本會再踩一遍
工程師往往會低估重構(gòu)的難度和所要消耗的時間喜最,以前遇到的坑基本會再踩一遍偎蘸。比如,在過去的版本中,導(dǎo)出的數(shù)據(jù)是帶有公司 logo 和精美樣式的 EXCEL 文件迷雪,重構(gòu)時就沒有考慮到這一點(diǎn)限书,結(jié)果又花了大量的時間去調(diào)整導(dǎo)出文件的樣式。
為實(shí)現(xiàn)某個特殊需求章咧,舊版寫了很多丑陋的代碼倦西,在重構(gòu)的時候,依然沒有想到優(yōu)雅的辦法赁严,但是用戶已經(jīng)嚴(yán)重依賴這個功能扰柠,又必須實(shí)現(xiàn),后來重構(gòu)的版本依然通過非常別扭的方案實(shí)現(xiàn)這個需求疼约。
3. 技術(shù)上沒有包袱了卤档,但產(chǎn)品上的包袱更重
如果重構(gòu)涉及到前端用戶看到的部分,則面臨的壓力會更大程剥。在過去的版本中劝枣,用戶體驗(yàn)被打磨的非常細(xì)致,甚至很多你想不到的地方都被用戶熟練掌握织鲸,一旦交互上有稍微大的改動舔腾,就會影響到他們的正常使用。
重構(gòu)的版本還很難使用敏捷的方式快速迭代搂擦,一旦推出了新版的最小可行化版本稳诚,用戶會吐槽比舊版差遠(yuǎn)了,為啥要用這個瀑踢,如果要測試成熟再推出扳还,用戶等待的時間則會更加漫長。
4. 競爭對手利用這段時間可能已經(jīng)走很遠(yuǎn)了
在重構(gòu)的這段時間丘损,你的競爭對手在馬不停蹄的開發(fā)新的功能普办,拓展新的客戶,而自己的產(chǎn)品對于客戶來說卻停滯不前徘钥。在重構(gòu)之前衔蹲,一定不能只從工程角度考慮問題,還要想想公司的生意呈础。
如果必須要重構(gòu)舆驶,如何做?
首先而钞,在日常的項目管理中比原,為開發(fā)團(tuán)隊預(yù)留20%的自主時間诬像,讓他們自由支配。開發(fā)團(tuán)隊可以利用這些時間重寫代碼、完善架構(gòu)囚痴、重構(gòu)代碼庫中有缺陷的部分,避免“需要停下來重寫代碼”的情形發(fā)生。如果現(xiàn)有代碼已難以維護(hù),這里給出一點(diǎn)建議供參考:
- 針對重構(gòu)和日常需求制訂切實(shí)可行的計劃和時間表蟋定。通常,有經(jīng)驗(yàn)的開發(fā)團(tuán)隊估計的開發(fā)時間八九不離十草添,但是多數(shù)團(tuán)隊沒有重構(gòu)的實(shí)際經(jīng)驗(yàn)驶兜,估計往往會過于樂觀。這時必須仔細(xì)檢查每處細(xì)節(jié)远寸,確保計劃切實(shí)可行抄淑。
- 把重構(gòu)目標(biāo)拆解,實(shí)現(xiàn)遞增修改驰后,同時要花精力保持產(chǎn)品迭代肆资,讓用戶感受到產(chǎn)品的改進(jìn),哪怕會因此把3個月的工作時間延長至半年灶芝。重寫代碼時迅耘,保證讓用戶看到功能的改進(jìn)——即使會占用少則25%,多則50%的開發(fā)資源——對保持產(chǎn)品的市場占有率至關(guān)重要监署。
- 由于開發(fā)用戶可見功能的資源有限,必須謹(jǐn)慎選擇正確的產(chǎn)品特性纽哥,確保產(chǎn)品定義的正確性钠乏。