【課程簡介】
軟件重構(gòu)面臨的背景都是相似的,程序員們?yōu)榱丝焖偻瓿尚枨蠛蜕暇€而寫出了最基本的代碼。然后在功能的不斷擴(kuò)充過程中,以打補丁的方式對代碼進(jìn)行擴(kuò)充,中間還會面臨著開發(fā)人員的變更和離職。逐漸地,代碼就會變得越來越臃腫,漸漸地變得難以維護(hù)。
很多開發(fā)人員對重構(gòu)有著嚴(yán)重的誤解,錯誤的認(rèn)為重構(gòu)是專門安排一個階段來進(jìn)行的。但是,我們認(rèn)為重構(gòu)是持續(xù)進(jìn)行的,而不是在項目結(jié)束時、發(fā)布版本時、迭代結(jié)束時,甚至不是每天快下班時才進(jìn)行的。重構(gòu)是我們每隔一個小時或者半個小時就要去做的事情。通過重構(gòu),我們可以持續(xù)地保持代碼盡可能干凈、簡單并且具有表達(dá)力。因此,重構(gòu)成為了每個開發(fā)人員必備的基本技能,可是國內(nèi)的開發(fā)人員卻很少去做。
那么,糟糕的軟件代碼會有什么樣的影響呢?首先是開發(fā)效率的降低,在糟糕架構(gòu)下加入新功能,會受之前代碼的影響,可能存在意想不到的改動點和問題點,開發(fā)和調(diào)試時間都會大大增加;其次是故障率的提升,在質(zhì)量低下的代碼中,總是容易隱藏著很多不易發(fā)現(xiàn)的坑,這些都會成為故障的隱患;同時,架構(gòu)也會使得需求的完成大打折扣,使得設(shè)計好的目標(biāo),因為架構(gòu)限制或者性能等原因,只能完成80%甚至更低。
大多數(shù)軟件開發(fā)方面的培訓(xùn)都是關(guān)于新系統(tǒng)的設(shè)計和開發(fā),講師教你如何從無到有創(chuàng)建出一個新的應(yīng)用來。然而,在真實的項目中,許多產(chǎn)品如今往往依然運行在基于復(fù)雜架構(gòu)設(shè)計和傳統(tǒng)技術(shù)實現(xiàn)的遺留系統(tǒng)上,并依賴著它們。如何摸索出有效方法應(yīng)對這些遺留系統(tǒng),已經(jīng)成為我們最需解決的問題之一。
隨著不同產(chǎn)品的推出,不同客戶、不同版本的發(fā)布,需要維護(hù)的遺留代碼越來越多,重構(gòu)也就在所難免。不僅如此,所有的軟件系統(tǒng),經(jīng)過一段時間的維護(hù),都會逐漸變成遺留系統(tǒng),并且都遭遇了緩慢而不可抗拒的腐化。因此,軟件開發(fā)人員不得不面對既有系統(tǒng)的混亂代碼。而本課程正是告訴你如何重構(gòu)既有的遺留系統(tǒng),如何重構(gòu)代碼、重構(gòu)設(shè)計、重構(gòu)架構(gòu)。
本課程教你如何扭轉(zhuǎn)系統(tǒng)腐化,重構(gòu)復(fù)雜遺留系統(tǒng),減低維護(hù)成本。在面對一個錯綜復(fù)雜的、不透明的、令人費解的系統(tǒng)時如何慢慢地、逐步地將其變成一個簡單的、有良好組織和設(shè)計的系統(tǒng)。
【培訓(xùn)特色】
本課程注重實戰(zhàn),采用案例貫穿方式完成實踐,收集了大量的真實案例,針對項目過程中技術(shù)人員常犯的錯誤進(jìn)行了匯總、研討,并形成培訓(xùn)教程。本次培訓(xùn)從程序員的編程思維開始講解,通過大量的真實案例,詳細(xì)地介紹了重構(gòu)需要注意的要點以及難點,這些知識都是講師十幾年經(jīng)驗的總結(jié)。
本次課程1/3時間講解核心思想,1/3時間動手重構(gòu)實踐,1/3點評分析總結(jié)。
【學(xué)員基礎(chǔ)】
學(xué)員學(xué)習(xí)本課程應(yīng)具備下列基礎(chǔ)知識:
l. 目前正在面臨復(fù)雜遺留系統(tǒng),必須需要維護(hù)和重構(gòu)
2. 具有面向?qū)ο蠡靖拍睿煜せ驹O(shè)計模式
【培訓(xùn)對象】
各類軟件研發(fā)中心的軟件設(shè)計師、架構(gòu)師、項目經(jīng)理、技術(shù)總監(jiān)、質(zhì)量部門經(jīng)理。對于重構(gòu)技術(shù)懷有疑問和困惑,需要梳理解答的團(tuán)隊和個人,效果更佳。
|
代碼重構(gòu) |
設(shè)計重構(gòu) |
軟件腐爛監(jiān)控 |
重構(gòu)管理 |
程序員 |
必須精通 |
需要了解 |
需要了解 |
需要了解 |
設(shè)計師 |
必須精通 |
必須精通 |
需要了解 |
需要了解 |
架構(gòu)師 |
必須精通 |
必須精通 |
必須精通 |
必須精通 |
數(shù)據(jù)庫工程師 |
需要了解 |
需要了解 |
/ |
/ |
質(zhì)量管理 |
/ |
/ |
必須精通 |
必須精通 |
管理者 |
/ |
/ |
需要監(jiān)控 |
需要了解 |
【培訓(xùn)時長】
3天
【課程大綱】
以下大綱內(nèi)容較多,實際授課時根據(jù)學(xué)員課前調(diào)查進(jìn)行調(diào)整,并且實際授課不一定按此順序。
|
授課內(nèi)容 |
第一部分 為什么軟件需要及時重構(gòu) |
|
第一單元 剖析軟件質(zhì)量不斷下降的源頭 |
質(zhì)量不斷下降的表現(xiàn): 1. 程序代碼越來越亂 2. 軟件維護(hù)成本越來越高 3. 軟件變更越來越困難 4. 無法進(jìn)行新技術(shù)的改造 以往采取的措施: 1. 頭痛醫(yī)頭,腳痛醫(yī)腳 2. 拋棄掉重新編寫 3. 因擔(dān)心未來變化而做的過度設(shè)計 帶來的問題 1. 團(tuán)隊成員越來越多但效率卻越來越低 2. 測試變得越來越困難而任務(wù)繁重 3. 軟件系統(tǒng)越來越笨重而不適應(yīng)未來變化 分析與反思
案例分析:一個遺留系統(tǒng)的演化過程 1. 起初的設(shè)計 2. 隨后的變更 3. 質(zhì)量不斷下降的過程 軟件質(zhì)量下降的根源: 1. 軟件總是因變更而變得越來越復(fù)雜 2. 軟件結(jié)構(gòu)已經(jīng)不再適應(yīng)復(fù)雜的軟件需求 3. 必須要調(diào)整軟件結(jié)構(gòu)以適應(yīng)新的軟件需求
軟件是因需求變更而質(zhì)量下降嗎? 案例分析:推演軟件變更的設(shè)計過程 應(yīng)對軟件變更的更佳方式:兩頂帽子 1. 重構(gòu)原有代碼以適應(yīng)新的需求 2. 實現(xiàn)新的需求 案例:演示兩頂帽子的設(shè)計過程 案例:財務(wù)憑證生成程序的設(shè)計過程
|
第二單元 高質(zhì)量的軟件設(shè)計過程 |
以往軟件設(shè)計的過程: 1. 演示以往軟件設(shè)計的過程 2. 剖析以往軟件設(shè)計的問題與風(fēng)險
小步快跑模式的開發(fā)過程: 1. 用較快的速度開發(fā)一個最核心的功能 2. 讓第一個版本運行起來并可以驗證 3. 在第一個版本的基礎(chǔ)上不斷添加功能: a. 每次只添加一個很簡單、很單一的功能 b. 每次以兩頂帽子的方式添加新功能 c. 運行、調(diào)試與驗證 d. 重復(fù)這個過程添加下一個功能 4. 復(fù)雜的系統(tǒng)就是由一次次正確開發(fā)的不斷積累而成
案例:演示小步快跑的開發(fā)過程 小步快跑解決的問題: 1. 復(fù)雜功能有效地解耦 2. 代碼編寫總是可測試與驗證 3. 簡化設(shè)計與思考的復(fù)雜度 4. 適時重構(gòu)以避免軟件退化 案例:數(shù)據(jù)推送程序的設(shè)計過程 案例:標(biāo)簽庫的設(shè)計變更過程
測試驅(qū)動設(shè)計 1. TDD vs. 后測試開發(fā) 2. 案例:演示測試驅(qū)動設(shè)計的過程 3. 測試驅(qū)動設(shè)計的優(yōu)勢 4. 實踐測試驅(qū)動設(shè)計的難題 討論:自動化測試腳本應(yīng)當(dāng)由誰來寫?
|
第二部分 重構(gòu)的概念 |
|
第三單元 何為重構(gòu) |
軟件重構(gòu)的概念 1. 重構(gòu)是一系列代碼的等量變換 案例:一個Hello World重構(gòu)過程 2. 重構(gòu)的保險索:自動化測試 案例:Hello World的自動化測試過程 3. 軟件修改的四種動機(jī)——重構(gòu)的價值 4. 一個真實的謊言——重構(gòu)的誤區(qū) 5. 重構(gòu)的主要方法與技巧
案例分析:重構(gòu)一個大型遺留系統(tǒng) 1. 重構(gòu)第一步:分解大函數(shù) 超級大函數(shù)及其危害 案例:演示大函數(shù)產(chǎn)生的過程 案例:演示抽取方法操作步驟 實踐抽取方法會遇到的問題和解決方案 2. 重構(gòu)第二步:拆分大對象 超級大對象及其危害 案例:演示超級大對象的產(chǎn)生過程 案例:演示抽取類的操作步驟 講解單一職責(zé)設(shè)計原則 案例:演示“分久必合,合久必分”的重構(gòu)過程 3. 重構(gòu)第三步:提高復(fù)用率 講解順序編程及其危害 “不要重復(fù)代碼”原則 案例:提高代碼復(fù)用的6個方法 案例:演示新增代碼時的代碼復(fù)用過程 用靜態(tài)檢查工具檢查重復(fù)代碼 4. 重構(gòu)第四步:可擴(kuò)展設(shè)計 過度設(shè)計 vs. 恰如其分的設(shè)計 講解“開放-封閉”的設(shè)計原則 案例:講解可擴(kuò)展設(shè)計的4個方法 案例:講解新增代碼的可擴(kuò)展設(shè)計過程 5. 重構(gòu)第五步:降低耦合度 案例:講解接口、實現(xiàn)與工廠模式 案例:講解外部接口解耦與適配器模式 案例:講解繼承泛濫問題與橋接模式 案例:講解方法解耦與策略模式 案例:講解過程解耦與命令模式 案例:講解透明擴(kuò)展與組合模式、裝飾者模式 6. 重構(gòu)第六步:系統(tǒng)分層 反思軟件架構(gòu)需要怎樣的分層結(jié)構(gòu) 遺留系統(tǒng)如何擁抱需求變化 遺留系統(tǒng)如何應(yīng)對技術(shù)變革 7. 重構(gòu)第七步:領(lǐng)域驅(qū)動設(shè)計 領(lǐng)域驅(qū)動設(shè)計的概念 講解領(lǐng)域模型分析方法 講解原文分析法與領(lǐng)域驅(qū)動設(shè)計
討論:如何制定重構(gòu)項目計劃 練習(xí):重構(gòu)一個小程序并編寫測試腳本
|
第四單元 關(guān)于重構(gòu)的討論 |
什么時候重構(gòu) 1. 重構(gòu)是一種習(xí)慣 2. 重構(gòu)讓程序可讀 3. 重構(gòu),才好復(fù)用 4. 先重構(gòu),再擴(kuò)展 5. 緊急任務(wù)時的重構(gòu)
測試的困境 1. 重構(gòu)初期的困局 2. 解耦與自動化測試 3. 建立自動化測試體系
重構(gòu)的評價 1. 評價軟件質(zhì)量的指標(biāo) 2. 評價軟件質(zhì)量的工具 |
第三部分 系統(tǒng)級的重構(gòu)項目 |
|
第五單元 在敏捷框架中開展重構(gòu) |
現(xiàn)在大家都在探討SAFe規(guī)模化敏捷 1. 以較小的資源投入,創(chuàng)造出更多的價值,及時為用戶提供服務(wù) 2. 更快地交付,更快地反饋,更早地產(chǎn)生價值 3. 增量構(gòu)建系統(tǒng),動態(tài)制訂里程碑
企業(yè)敏捷實踐遇到的較大挑戰(zhàn) 1. 敏捷開發(fā):每個迭代都是在上一個版本的基礎(chǔ)上變更 2. 軟件退化: a) 每變更一次,軟件質(zhì)量就下降一次 b) 變更得越頻繁,軟件質(zhì)量下降的速度就越快 c) 敏捷開發(fā)的軟件變更是頻繁的 結(jié)論:不解決軟件變更的質(zhì)量問題,敏捷開發(fā)就不能真正落地
分析軟件退化的根源 1. 軟件總是從簡單向復(fù)雜轉(zhuǎn)變 2. 簡單軟件有簡單軟件的設(shè)計 3. 復(fù)雜軟件有復(fù)雜軟件的設(shè)計 4. 當(dāng)軟件由簡單軟件向復(fù)雜軟件轉(zhuǎn)變時,重構(gòu)成為必然
保證高質(zhì)量軟件開發(fā)的關(guān)鍵:兩頂帽子 1. 高質(zhì)量軟件開發(fā)的關(guān)鍵在于每次變更的設(shè)計 |