課程簡(jiǎn)介
重構(gòu)是持續(xù)進(jìn)行的,而不是在項(xiàng)目結(jié)束時(shí)、發(fā)布版本時(shí)、迭代結(jié)束時(shí),甚至不是每天快下班時(shí)才進(jìn)行的。重構(gòu)是我們每隔一個(gè)小時(shí)或者半個(gè)小時(shí)就要去做的事情。通過(guò)重構(gòu),我們可以持續(xù)地保持代碼盡可能干凈、簡(jiǎn)單并且具有表達(dá)力。
目標(biāo)收益
隨著不同產(chǎn)品的推出,不同客戶、不同版本的發(fā)布,需要維護(hù)的遺留代碼越來(lái)越多,重構(gòu)也就在所難免。不僅如此,所有的軟件系統(tǒng),經(jīng)過(guò)一段時(shí)間的維護(hù),都會(huì)逐漸變成遺留系統(tǒng),并且都遭遇了緩慢而不可抗拒的腐化。因此,軟件開(kāi)發(fā)人員不得不面對(duì)既有系統(tǒng)的混亂代碼。而本課程正是告訴你如何重構(gòu)既有的遺留系統(tǒng),如何重構(gòu)代碼、重構(gòu)設(shè)計(jì)、重構(gòu)架構(gòu)。
培訓(xùn)對(duì)象
各類(lèi)軟件研發(fā)中心的軟件設(shè)計(jì)師、架構(gòu)師、項(xiàng)目經(jīng)理、技術(shù)總監(jiān)、質(zhì)量部門(mén)經(jīng)理。對(duì)于重構(gòu)技術(shù)懷有疑問(wèn)和困惑,需要梳理解答的團(tuán)隊(duì)和個(gè)人,效果最佳。
課程大綱
第一部分 為什么軟件需要及時(shí)重構(gòu) 第一單元 剖析軟件質(zhì)量不斷下降的根源 |
質(zhì)量不斷下降的表現(xiàn): 1. 程序代碼越來(lái)越亂 2. 軟件維護(hù)成本越來(lái)越高 3. 軟件變更越來(lái)越困難 4. 無(wú)法進(jìn)行新技術(shù)的改造 以往采取的措施: 1. 頭痛醫(yī)頭,腳痛醫(yī)腳 2. 拋棄掉重新編寫(xiě) 3. 因擔(dān)心未來(lái)變化而做的過(guò)度設(shè)計(jì) 帶來(lái)的問(wèn)題 1. 團(tuán)隊(duì)成員越來(lái)越多但效率卻越來(lái)越低 2. 測(cè)試變得越來(lái)越困難而任務(wù)繁重 3. 軟件系統(tǒng)越來(lái)越笨重而不適應(yīng)未來(lái)變化 分析與反思 案例分析:一個(gè)遺留系統(tǒng)的演化過(guò)程 1. 起初的設(shè)計(jì) 2. 隨后的變更 3. 質(zhì)量不斷下降的過(guò)程 軟件質(zhì)量下降的根源: 1. 軟件總是因變更而變得越來(lái)越復(fù)雜 2. 軟件結(jié)構(gòu)已經(jīng)不再適應(yīng)復(fù)雜的軟件需求 3. 必須要調(diào)整軟件結(jié)構(gòu)以適應(yīng)新的軟件需求 軟件是因需求變更而質(zhì)量下降嗎? 案例分析:推演軟件變更的設(shè)計(jì)過(guò)程 應(yīng)對(duì)軟件變更的最佳方式:兩頂帽子 1. 重構(gòu)原有代碼以適應(yīng)新的需求 2. 實(shí)現(xiàn)新的需求 案例:演示兩頂帽子的設(shè)計(jì)過(guò)程 |
第二單元 高質(zhì)量的軟件設(shè)計(jì)過(guò)程 |
以往軟件設(shè)計(jì)的過(guò)程: 1. 演示以往軟件設(shè)計(jì)的過(guò)程 2. 剖析以往軟件設(shè)計(jì)的問(wèn)題與風(fēng)險(xiǎn) 小步快跑模式的開(kāi)發(fā)過(guò)程: 1. 用最快的速度開(kāi)發(fā)一個(gè)最核心的功能 2. 讓第一個(gè)版本運(yùn)行起來(lái)并可以驗(yàn)證 3. 在第一個(gè)版本的基礎(chǔ)上不斷添加功能: a. 每次只添加一個(gè)很簡(jiǎn)單、很單一的功能 b. 每次以兩頂帽子的方式添加新功能 c. 運(yùn)行、調(diào)試與驗(yàn)證 d. 重復(fù)這個(gè)過(guò)程添加下一個(gè)功能 4. 復(fù)雜的系統(tǒng)就是由一次次正確開(kāi)發(fā)的不斷積累而成 案例:演示小步快跑的開(kāi)發(fā)過(guò)程 小步快跑解決的問(wèn)題: 1. 復(fù)雜功能有效地解耦 2. 代碼編寫(xiě)總是可測(cè)試與驗(yàn)證 3. 簡(jiǎn)化設(shè)計(jì)與思考的復(fù)雜度 4. 適時(shí)重構(gòu)以避免軟件退化 測(cè)試驅(qū)動(dòng)設(shè)計(jì) 1. TDD vs. 后測(cè)試開(kāi)發(fā) 2. 案例:演示測(cè)試驅(qū)動(dòng)設(shè)計(jì)的過(guò)程 3. 測(cè)試驅(qū)動(dòng)設(shè)計(jì)的優(yōu)勢(shì) 4. 實(shí)踐測(cè)試驅(qū)動(dòng)設(shè)計(jì)的難題 討論:自動(dòng)化測(cè)試腳本應(yīng)當(dāng)由誰(shuí)來(lái)寫(xiě)? 練習(xí):運(yùn)用小步快跑的方式設(shè)計(jì)一個(gè)軟件 |
第二部分 重構(gòu)的概念 第三單元 何為重構(gòu) |
軟件重構(gòu)的概念 1. 重構(gòu)是一系列代碼的等量變換 案例:一個(gè)Hello World重構(gòu)過(guò)程 2. 重構(gòu)的保險(xiǎn)索:自動(dòng)化測(cè)試 案例:Hello World的自動(dòng)化測(cè)試過(guò)程 3. 軟件修改的四種動(dòng)機(jī)——重構(gòu)的價(jià)值 4. 一個(gè)真實(shí)的謊言——重構(gòu)的誤區(qū) 5. 重構(gòu)的主要方法與技巧 案例分析:重構(gòu)一個(gè)大型遺留系統(tǒng) 1. 重構(gòu)第一步:分解大函數(shù) 超級(jí)大函數(shù)及其危害 案例:演示大函數(shù)產(chǎn)生的過(guò)程 案例:演示抽取方法操作步驟 實(shí)踐抽取方法會(huì)遇到的問(wèn)題和解決方案 2. 重構(gòu)第二步:拆分大對(duì)象 超級(jí)大對(duì)象及其危害 案例:演示超級(jí)大對(duì)象的產(chǎn)生過(guò)程 案例:演示抽取類(lèi)的操作步驟 講解單一職責(zé)設(shè)計(jì)原則 案例:演示“分久必合,合久必分”的重構(gòu)過(guò)程 3. 重構(gòu)第三步:提高復(fù)用率 講解順序編程及其危害 “不要重復(fù)代碼”原則 案例:提高代碼復(fù)用的6個(gè)方法 案例:演示新增代碼時(shí)的代碼復(fù)用過(guò)程 用靜態(tài)檢查工具檢查重復(fù)代碼 4. 重構(gòu)第四步:可擴(kuò)展設(shè)計(jì) 過(guò)度設(shè)計(jì) vs. 恰如其分的設(shè)計(jì) 講解“開(kāi)放-封閉”的設(shè)計(jì)原則 案例:講解可擴(kuò)展設(shè)計(jì)的4個(gè)方法 案例:講解新增代碼的可擴(kuò)展設(shè)計(jì)過(guò)程 5. 重構(gòu)第五步:降低耦合度 案例:講解接口、實(shí)現(xiàn)與工廠模式 案例:講解外部接口解耦與適配器模式 案例:講解繼承泛濫問(wèn)題與橋接模式 案例:講解方法解耦與策略模式 案例:講解過(guò)程解耦與命令模式 案例:講解透明擴(kuò)展與組合模式、裝飾者模式 6. 重構(gòu)第六步:系統(tǒng)分層 反思軟件架構(gòu)需要怎樣的分層結(jié)構(gòu) 遺留系統(tǒng)如何擁抱需求變化 遺留系統(tǒng)如何應(yīng)對(duì)技術(shù)變革 7. 重構(gòu)第七步:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的概念 講解領(lǐng)域模型分析方法 講解原文分析法與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) 討論:如何制定重構(gòu)項(xiàng)目計(jì)劃 練習(xí):重構(gòu)一個(gè)小程序并編寫(xiě)測(cè)試腳本 |
第四單元 關(guān)于重構(gòu)的討論 |
什么時(shí)候重構(gòu) 1. 重構(gòu)是一種習(xí)慣 2. 重構(gòu)讓程序可讀 3. 重構(gòu),才好復(fù)用 4. 先重構(gòu),再擴(kuò)展 5. 緊急任務(wù)時(shí)的重構(gòu) 測(cè)試的困境 1. 重構(gòu)初期的困局 2. 解耦與自動(dòng)化測(cè)試 3. 建立自動(dòng)化測(cè)試體系 重構(gòu)的評(píng)價(jià) 1. 評(píng)價(jià)軟件質(zhì)量的指標(biāo) 2. 評(píng)價(jià)軟件質(zhì)量的工具 |
第三部分 系統(tǒng)級(jí)的重構(gòu)項(xiàng)目 第五單元 遺留系統(tǒng)的技術(shù)改造難題 |
技術(shù)改造的難題 一些大型遺留系統(tǒng)已經(jīng)運(yùn)行維護(hù)十年以上,現(xiàn)在面臨著技術(shù)改造的難題: 1. 程序越來(lái)越亂:代碼在退化,軟件質(zhì)量持續(xù)下降,維護(hù)成本越來(lái)越高; 2. 面臨技術(shù)改造:一直在猶豫改還是不改,但現(xiàn)在到了不得不改的時(shí)候了。 以往的解決方案: 1. 修修補(bǔ)補(bǔ),遇到什么問(wèn)題就解決什么問(wèn)題: 存在的問(wèn)題: a.始終治標(biāo)不治本,不能從根本上解決許多問(wèn)題; b.有過(guò)一些改造,但不敢嘗試真正的技術(shù)改造,越老的系統(tǒng)技術(shù)越落后 存在的問(wèn)題:面臨著被市場(chǎng)淘汰的絕大風(fēng)險(xiǎn) 2. 徹底丟棄原有系統(tǒng)重新開(kāi)發(fā),從而快速擺脫以往的技術(shù)債務(wù) 存在的問(wèn)題: 原系統(tǒng)運(yùn)行維護(hù)十年以上,積累大量繁復(fù)而細(xì)微的業(yè)務(wù)需求與程序邏輯,但在重做過(guò)程中都遭到遺失,給項(xiàng)目帶來(lái)巨大的風(fēng)險(xiǎn) 問(wèn)題的實(shí)質(zhì): 1. 面臨巨大市場(chǎng)的壓力,改造是想做不想做都得做的事情了; 2. 原系統(tǒng)中積累大量繁復(fù)而細(xì)微的業(yè)務(wù)需求與程序邏輯,既不在設(shè)計(jì)文檔中,也不為現(xiàn)有的維護(hù)人員所掌握,但一旦遺失卻嚴(yán)重后果; 3. 一邊在技術(shù)改造,一邊還有新的需求需要維護(hù),意味著改造中的新系統(tǒng),在還未替代老系統(tǒng)前,還要不斷與老系統(tǒng)同步 正是有了如此多的難題與風(fēng)險(xiǎn),使得舊系統(tǒng)改造面臨進(jìn)退兩難的困境。 演化式重構(gòu)解決方案: 1. 演化式地對(duì)原系統(tǒng)進(jìn)行重構(gòu),漸進(jìn)式地進(jìn)行優(yōu)化改進(jìn) 不是丟棄原系統(tǒng),而是從原系統(tǒng)開(kāi)始,運(yùn)用重構(gòu)方法進(jìn)行一小步一小步的優(yōu)化與調(diào)整,使技術(shù)改造過(guò)程變得平滑 2. 培訓(xùn)、指導(dǎo)與審查并舉,切實(shí)提高代碼編寫(xiě)質(zhì)量 首先對(duì)人員進(jìn)行代碼質(zhì)量與重構(gòu)的培訓(xùn),制訂代碼規(guī)范與靜態(tài)代碼檢查。在開(kāi)發(fā)初期加強(qiáng)對(duì)每項(xiàng)設(shè)計(jì)的指導(dǎo),之后組長(zhǎng)責(zé)任制進(jìn)行代碼審查。 3. 組件開(kāi)發(fā)-測(cè)試為一體的團(tuán)隊(duì) 一邊改造,一邊編寫(xiě)自動(dòng)化測(cè)試腳本,讓改造過(guò)程隨時(shí)處于質(zhì)量監(jiān)控之下 4. 優(yōu)化與維護(hù)并行開(kāi)展,讓改造工作快速起效 制訂迭代式計(jì)劃,每完成一次改造就發(fā)布一個(gè)可運(yùn)行版本。之后的運(yùn)行維護(hù)在該版本的基礎(chǔ)上開(kāi)展 5. 平臺(tái)建設(shè)與系統(tǒng)重構(gòu)并行開(kāi)展,加快改造速度 分成平臺(tái)組與重構(gòu)組并行開(kāi)展工作,一邊在搭建新的技術(shù)開(kāi)發(fā)平臺(tái),一邊運(yùn)用重構(gòu)在優(yōu)化原有系統(tǒng),最終實(shí)現(xiàn)原有系統(tǒng)向新開(kāi)發(fā)平臺(tái)的代碼遷移 |
第六單元 系統(tǒng)級(jí)軟件重構(gòu)過(guò)程 |
案例分析:演化式重構(gòu)的改造過(guò)程: 1. 概念及解決的問(wèn)題 演化式重構(gòu)的概念 建立領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的過(guò)程 2. 模塊的選擇與迭代項(xiàng)目計(jì)劃 先選擇易上手、快速起效的模塊開(kāi)始改造 再選擇最核心、最關(guān)鍵的模塊進(jìn)行改造 制訂迭代式技術(shù)改造項(xiàng)目計(jì)劃 3. 組建一個(gè)開(kāi)發(fā)-測(cè)試為一體的團(tuán)隊(duì) 測(cè)試人員與開(kāi)發(fā)人員同時(shí)開(kāi)始工作 改造初期的自動(dòng)化測(cè)試過(guò)程 逐漸編寫(xiě)自動(dòng)化測(cè)試程序的過(guò)程 4. 平臺(tái)建設(shè)與系統(tǒng)重構(gòu)并舉 重構(gòu)組: 一邊在重構(gòu),一邊在升級(jí)維護(hù)上線,既使改造工作快速起效,又使重構(gòu)的成功以最快的速度得到驗(yàn)證,降低改造風(fēng)險(xiǎn) 平臺(tái)組: 構(gòu)建基于領(lǐng)域的輕量級(jí)系統(tǒng)架構(gòu),既為舊系統(tǒng)代碼移植創(chuàng)造條件,又為技術(shù)的更迭降低成本 5. 平滑地代碼移植 代碼移植的條件: 1)舊系統(tǒng)完成了代碼重構(gòu),實(shí)現(xiàn)業(yè)務(wù)代碼與技術(shù)代碼的有效解耦; 2)新平臺(tái)構(gòu)建了一個(gè)基于領(lǐng)域的系統(tǒng)架構(gòu)。 代碼移植過(guò)程: 1)將舊系統(tǒng)中的業(yè)務(wù)領(lǐng)域?qū)佑行崛〕鰜?lái); 2)將業(yè)務(wù)領(lǐng)域代碼放入新平臺(tái)中 3)完成其它的配置、接口、前端界面等工作 4)運(yùn)行、調(diào)試、測(cè)試 改造的效果: 1. 實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),擁抱未來(lái)需求的變化 2. 建立自動(dòng)化測(cè)試體系保障軟件質(zhì)量 3. 更加靈活而快速地應(yīng)對(duì)未來(lái)技術(shù)的更新 討論:系統(tǒng)級(jí)重構(gòu)的經(jīng)驗(yàn)與分享 |
第一部分 為什么軟件需要及時(shí)重構(gòu) 第一單元 剖析軟件質(zhì)量不斷下降的根源 質(zhì)量不斷下降的表現(xiàn): 1. 程序代碼越來(lái)越亂 2. 軟件維護(hù)成本越來(lái)越高 3. 軟件變更越來(lái)越困難 4. 無(wú)法進(jìn)行新技術(shù)的改造 以往采取的措施: 1. 頭痛醫(yī)頭,腳痛醫(yī)腳 2. 拋棄掉重新編寫(xiě) 3. 因擔(dān)心未來(lái)變化而做的過(guò)度設(shè)計(jì) 帶來(lái)的問(wèn)題 1. 團(tuán)隊(duì)成員越來(lái)越多但效率卻越來(lái)越低 2. 測(cè)試變得越來(lái)越困難而任務(wù)繁重 3. 軟件系統(tǒng)越來(lái)越笨重而不適應(yīng)未來(lái)變化 分析與反思 案例分析:一個(gè)遺留系統(tǒng)的演化過(guò)程 1. 起初的設(shè)計(jì) 2. 隨后的變更 3. 質(zhì)量不斷下降的過(guò)程 軟件質(zhì)量下降的根源: 1. 軟件總是因變更而變得越來(lái)越復(fù)雜 2. 軟件結(jié)構(gòu)已經(jīng)不再適應(yīng)復(fù)雜的軟件需求 3. 必須要調(diào)整軟件結(jié)構(gòu)以適應(yīng)新的軟件需求 軟件是因需求變更而質(zhì)量下降嗎? 案例分析:推演軟件變更的設(shè)計(jì)過(guò)程 應(yīng)對(duì)軟件變更的最佳方式:兩頂帽子 1. 重構(gòu)原有代碼以適應(yīng)新的需求 2. 實(shí)現(xiàn)新的需求 案例:演示兩頂帽子的設(shè)計(jì)過(guò)程 |
第二單元 高質(zhì)量的軟件設(shè)計(jì)過(guò)程 以往軟件設(shè)計(jì)的過(guò)程: 1. 演示以往軟件設(shè)計(jì)的過(guò)程 2. 剖析以往軟件設(shè)計(jì)的問(wèn)題與風(fēng)險(xiǎn) 小步快跑模式的開(kāi)發(fā)過(guò)程: 1. 用最快的速度開(kāi)發(fā)一個(gè)最核心的功能 2. 讓第一個(gè)版本運(yùn)行起來(lái)并可以驗(yàn)證 3. 在第一個(gè)版本的基礎(chǔ)上不斷添加功能: a. 每次只添加一個(gè)很簡(jiǎn)單、很單一的功能 b. 每次以兩頂帽子的方式添加新功能 c. 運(yùn)行、調(diào)試與驗(yàn)證 d. 重復(fù)這個(gè)過(guò)程添加下一個(gè)功能 4. 復(fù)雜的系統(tǒng)就是由一次次正確開(kāi)發(fā)的不斷積累而成 案例:演示小步快跑的開(kāi)發(fā)過(guò)程 小步快跑解決的問(wèn)題: 1. 復(fù)雜功能有效地解耦 2. 代碼編寫(xiě)總是可測(cè)試與驗(yàn)證 3. 簡(jiǎn)化設(shè)計(jì)與思考的復(fù)雜度 4. 適時(shí)重構(gòu)以避免軟件退化 測(cè)試驅(qū)動(dòng)設(shè)計(jì) 1. TDD vs. 后測(cè)試開(kāi)發(fā) 2. 案例:演示測(cè)試驅(qū)動(dòng)設(shè)計(jì)的過(guò)程 3. 測(cè)試驅(qū)動(dòng)設(shè)計(jì)的優(yōu)勢(shì) 4. 實(shí)踐測(cè)試驅(qū)動(dòng)設(shè)計(jì)的難題 討論:自動(dòng)化測(cè)試腳本應(yīng)當(dāng)由誰(shuí)來(lái)寫(xiě)? 練習(xí):運(yùn)用小步快跑的方式設(shè)計(jì)一個(gè)軟件 |
第二部分 重構(gòu)的概念 第三單元 何為重構(gòu) 軟件重構(gòu)的概念 1. 重構(gòu)是一系列代碼的等量變換 案例:一個(gè)Hello World重構(gòu)過(guò)程 2. 重構(gòu)的保險(xiǎn)索:自動(dòng)化測(cè)試 案例:Hello World的自動(dòng)化測(cè)試過(guò)程 3. 軟件修改的四種動(dòng)機(jī)——重構(gòu)的價(jià)值 4. 一個(gè)真實(shí)的謊言——重構(gòu)的誤區(qū) 5. 重構(gòu)的主要方法與技巧 案例分析:重構(gòu)一個(gè)大型遺留系統(tǒng) 1. 重構(gòu)第一步:分解大函數(shù) 超級(jí)大函數(shù)及其危害 案例:演示大函數(shù)產(chǎn)生的過(guò)程 案例:演示抽取方法操作步驟 實(shí)踐抽取方法會(huì)遇到的問(wèn)題和解決方案 2. 重構(gòu)第二步:拆分大對(duì)象 超級(jí)大對(duì)象及其危害 案例:演示超級(jí)大對(duì)象的產(chǎn)生過(guò)程 案例:演示抽取類(lèi)的操作步驟 講解單一職責(zé)設(shè)計(jì)原則 案例:演示“分久必合,合久必分”的重構(gòu)過(guò)程 3. 重構(gòu)第三步:提高復(fù)用率 講解順序編程及其危害 “不要重復(fù)代碼”原則 案例:提高代碼復(fù)用的6個(gè)方法 案例:演示新增代碼時(shí)的代碼復(fù)用過(guò)程 用靜態(tài)檢查工具檢查重復(fù)代碼 4. 重構(gòu)第四步:可擴(kuò)展設(shè)計(jì) 過(guò)度設(shè)計(jì) vs. 恰如其分的設(shè)計(jì) 講解“開(kāi)放-封閉”的設(shè)計(jì)原則 案例:講解可擴(kuò)展設(shè)計(jì)的4個(gè)方法 案例:講解新增代碼的可擴(kuò)展設(shè)計(jì)過(guò)程 5. 重構(gòu)第五步:降低耦合度 案例:講解接口、實(shí)現(xiàn)與工廠模式 案例:講解外部接口解耦與適配器模式 案例:講解繼承泛濫問(wèn)題與橋接模式 案例:講解方法解耦與策略模式 案例:講解過(guò)程解耦與命令模式 案例:講解透明擴(kuò)展與組合模式、裝飾者模式 6. 重構(gòu)第六步:系統(tǒng)分層 反思軟件架構(gòu)需要怎樣的分層結(jié)構(gòu) 遺留系統(tǒng)如何擁抱需求變化 遺留系統(tǒng)如何應(yīng)對(duì)技術(shù)變革 7. 重構(gòu)第七步:領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的概念 講解領(lǐng)域模型分析方法 講解原文分析法與領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) 討論:如何制定重構(gòu)項(xiàng)目計(jì)劃 練習(xí):重構(gòu)一個(gè)小程序并編寫(xiě)測(cè)試腳本 |
第四單元 關(guān)于重構(gòu)的討論 什么時(shí)候重構(gòu) 1. 重構(gòu)是一種習(xí)慣 2. 重構(gòu)讓程序可讀 3. 重構(gòu),才好復(fù)用 4. 先重構(gòu),再擴(kuò)展 5. 緊急任務(wù)時(shí)的重構(gòu) 測(cè)試的困境 1. 重構(gòu)初期的困局 2. 解耦與自動(dòng)化測(cè)試 3. 建立自動(dòng)化測(cè)試體系 重構(gòu)的評(píng)價(jià) 1. 評(píng)價(jià)軟件質(zhì)量的指標(biāo) 2. 評(píng)價(jià)軟件質(zhì)量的工具 |
第三部分 系統(tǒng)級(jí)的重構(gòu)項(xiàng)目 第五單元 遺留系統(tǒng)的技術(shù)改造難題 技術(shù)改造的難題 一些大型遺留系統(tǒng)已經(jīng)運(yùn)行維護(hù)十年以上,現(xiàn)在面臨著技術(shù)改造的難題: 1. 程序越來(lái)越亂:代碼在退化,軟件質(zhì)量持續(xù)下降,維護(hù)成本越來(lái)越高; 2. 面臨技術(shù)改造:一直在猶豫改還是不改,但現(xiàn)在到了不得不改的時(shí)候了。 以往的解決方案: 1. 修修補(bǔ)補(bǔ),遇到什么問(wèn)題就解決什么問(wèn)題: 存在的問(wèn)題: a.始終治標(biāo)不治本,不能從根本上解決許多問(wèn)題; b.有過(guò)一些改造,但不敢嘗試真正的技術(shù)改造,越老的系統(tǒng)技術(shù)越落后 存在的問(wèn)題:面臨著被市場(chǎng)淘汰的絕大風(fēng)險(xiǎn) 2. 徹底丟棄原有系統(tǒng)重新開(kāi)發(fā),從而快速擺脫以往的技術(shù)債務(wù) 存在的問(wèn)題: 原系統(tǒng)運(yùn)行維護(hù)十年以上,積累大量繁復(fù)而細(xì)微的業(yè)務(wù)需求與程序邏輯,但在重做過(guò)程中都遭到遺失,給項(xiàng)目帶來(lái)巨大的風(fēng)險(xiǎn) 問(wèn)題的實(shí)質(zhì): 1. 面臨巨大市場(chǎng)的壓力,改造是想做不想做都得做的事情了; 2. 原系統(tǒng)中積累大量繁復(fù)而細(xì)微的業(yè)務(wù)需求與程序邏輯,既不在設(shè)計(jì)文檔中,也不為現(xiàn)有的維護(hù)人員所掌握,但一旦遺失卻嚴(yán)重后果; 3. 一邊在技術(shù)改造,一邊還有新的需求需要維護(hù),意味著改造中的新系統(tǒng),在還未替代老系統(tǒng)前,還要不斷與老系統(tǒng)同步 正是有了如此多的難題與風(fēng)險(xiǎn),使得舊系統(tǒng)改造面臨進(jìn)退兩難的困境。 演化式重構(gòu)解決方案: 1. 演化式地對(duì)原系統(tǒng)進(jìn)行重構(gòu),漸進(jìn)式地進(jìn)行優(yōu)化改進(jìn) 不是丟棄原系統(tǒng),而是從原系統(tǒng)開(kāi)始,運(yùn)用重構(gòu)方法進(jìn)行一小步一小步的優(yōu)化與調(diào)整,使技術(shù)改造過(guò)程變得平滑 2. 培訓(xùn)、指導(dǎo)與審查并舉,切實(shí)提高代碼編寫(xiě)質(zhì)量 首先對(duì)人員進(jìn)行代碼質(zhì)量與重構(gòu)的培訓(xùn),制訂代碼規(guī)范與靜態(tài)代碼檢查。在開(kāi)發(fā)初期加強(qiáng)對(duì)每項(xiàng)設(shè)計(jì)的指導(dǎo),之后組長(zhǎng)責(zé)任制進(jìn)行代碼審查。 3. 組件開(kāi)發(fā)-測(cè)試為一體的團(tuán)隊(duì) 一邊改造,一邊編寫(xiě)自動(dòng)化測(cè)試腳本,讓改造過(guò)程隨時(shí)處于質(zhì)量監(jiān)控之下 4. 優(yōu)化與維護(hù)并行開(kāi)展,讓改造工作快速起效 制訂迭代式計(jì)劃,每完成一次改造就發(fā)布一個(gè)可運(yùn)行版本。之后的運(yùn)行維護(hù)在該版本的基礎(chǔ)上開(kāi)展 5. 平臺(tái)建設(shè)與系統(tǒng)重構(gòu)并行開(kāi)展,加快改造速度 分成平臺(tái)組與重構(gòu)組并行開(kāi)展工作,一邊在搭建新的技術(shù)開(kāi)發(fā)平臺(tái),一邊運(yùn)用重構(gòu)在優(yōu)化原有系統(tǒng),最終實(shí)現(xiàn)原有系統(tǒng)向新開(kāi)發(fā)平臺(tái)的代碼遷移 |
第六單元 系統(tǒng)級(jí)軟件重構(gòu)過(guò)程 案例分析:演化式重構(gòu)的改造過(guò)程: 1. 概念及解決的問(wèn)題 演化式重構(gòu)的概念 建立領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的過(guò)程 2. 模塊的選擇與迭代項(xiàng)目計(jì)劃 先選擇易上手、快速起效的模塊開(kāi)始改造 再選擇最核心、最關(guān)鍵的模塊進(jìn)行改造 制訂迭代式技術(shù)改造項(xiàng)目計(jì)劃 3. 組建一個(gè)開(kāi)發(fā)-測(cè)試為一體的團(tuán)隊(duì) 測(cè)試人員與開(kāi)發(fā)人員同時(shí)開(kāi)始工作 改造初期的自動(dòng)化測(cè)試過(guò)程 逐漸編寫(xiě)自動(dòng)化測(cè)試程序的過(guò)程 4. 平臺(tái)建設(shè)與系統(tǒng)重構(gòu)并舉 重構(gòu)組: 一邊在重構(gòu),一邊在升級(jí)維護(hù)上線,既使改造工作快速起效,又使重構(gòu)的成功以最快的速度得到驗(yàn)證,降低改造風(fēng)險(xiǎn) 平臺(tái)組: 構(gòu)建基于領(lǐng)域的輕量級(jí)系統(tǒng)架構(gòu),既為舊系統(tǒng)代碼移植創(chuàng)造條件,又為技術(shù)的更迭降低成本 5. 平滑地代碼移植 代碼移植的條件: 1)舊系統(tǒng)完成了代碼重構(gòu),實(shí)現(xiàn)業(yè)務(wù)代碼與技術(shù)代碼的有效解耦; 2)新平臺(tái)構(gòu)建了一個(gè)基于領(lǐng)域的系統(tǒng)架構(gòu)。 代碼移植過(guò)程: 1)將舊系統(tǒng)中的業(yè)務(wù)領(lǐng)域?qū)佑行崛〕鰜?lái); 2)將業(yè)務(wù)領(lǐng)域代碼放入新平臺(tái)中 3)完成其它的配置、接口、前端界面等工作 4)運(yùn)行、調(diào)試、測(cè)試 改造的效果: 1. 實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),擁抱未來(lái)需求的變化 2. 建立自動(dòng)化測(cè)試體系保障軟件質(zhì)量 3. 更加靈活而快速地應(yīng)對(duì)未來(lái)技術(shù)的更新 討論:系統(tǒng)級(jí)重構(gòu)的經(jīng)驗(yàn)與分享 |