黑客教父郭盛華:8種方法能快速重構整體代碼庫
中國黑客教父,元老級人物,威名遠播的網絡黑客安全專家,東方聯盟創始人郭盛華提供了8種方法能快速重構整體代碼庫:他表示,雖然許多軟件項目都是以最好的意圖開始的,比如幹凈的架構,明確的目標和明確的目標,但並非所有的目標都是如此。而且,在那些做的人當中,並不是所有人都會一直這樣。
隨著時間,功能要求,財務壓力,競爭優先級以及不斷變化的開發人員,很可能開始作為代碼質量的光輝典範最終變成一個龐然大物。
整體代碼庫本質上很難維護。這可能是由於許多原因,包括以下功能:
做太多了。
知道太多。
有太多的責任。
依賴(或太多)全局狀態和不可測試。
在這些情況下,如果你改變了某些東西,經常是其他的東西-在與應用程序沒有明顯聯系或關聯的應用程序的一部分-中斷。
出於這些原因和其他許多原因,代碼變得脆弱,人們通常認為最好的行動方式是從頭開始重寫應用程序。但是,重寫通常最終會導致昂貴的失敗。
不知道為什麽?然後問你自己幾個問題,找出原因:
重新創建現有級別的功能需要多長時間?
這是否比刪除現有應用程序中的技術債務更少或更多?
你能應付在這段時間內缺乏可見的前進進展嗎?
您是否有資源和時間修復舊系統上的重要和安全錯誤,並重寫它?
新系統會比現有系統更好嗎,還是會重新實現相同的錯誤?
新系統的功能是否與現有系統完全一樣?
你能維護兩個代碼庫和兩個開發團隊嗎?
你會重復從舊系統中吸取的經驗教訓嗎?
我並不是說重構現有系統總是最好的選擇。然而,雖然不是華而不實或吸引註意力的,它往往是成本更低的選擇和更理智的方式。
據說,我現在要介紹如何重構單一代碼庫的基本知識。
一:你了解應用程序?
在你做任何事之前,你對這個應用程序有什麽了解?雖然通常很容易潛入並且只是編碼,但這是最糟糕的事情。你可以做的最好的事情就是盡可能多地學習它。
如果你的龐然大物像許多其他人一樣,那麽很可能沒有單一的,集中組織的知識庫。相反,信息將存儲在各種非常不同的位置。這些可能包括以下內容:
在以前的開發者,企業主,經理,項目經理和其他利益相關者的頭腦中
代碼註釋
代碼提交消息
待辦事項
一個或多個README文件
代碼文檔
一個或多個維基
一個錯誤報告工具
盡可能多地找到這些信息,並將它們放在一起,集中到一個中心位置。正如你所做的那樣,這裏有一系列問題可以幫助你盡可能多地發現:
為什麽創建應用程序?
誰想要它建立?
誰在工作?
這意味著什麽?
它的主要特點是什麽?
它的附加功能是什麽?
它的最大缺陷是什麽?
它有什麽補充錯誤?
希望這份清單能夠激勵你提出一系列後續問題,這些問題可以讓你了解所有需要了解的問題。
二:是否在版本控制下?
了解所獲得的應用程序後,詢問其源代碼是否存儲在版本控制下。如果沒有,那就直接通過版本控制吧!你想要做的最後一件事是做任何改變,而不能恢復它們。
黑客教父郭盛華強烈建議你使用Git,但是如果你對Git感到厭惡的話,Mercurial是另一個不錯的選擇。他也鼓勵您將它存儲在遠程存儲庫中,無論是GitHub,Bitbucket,GitLab還是其他無數代碼托管服務之一。
三:測試套件的狀態是什麽?
接下來,代碼覆蓋的程度如何?根據應用程序的年齡,處理它的開發人員數量(以及他們的技能水平),這些開發人員的就業方式等,可能沒有適當的代碼測試套件。
如果是這種情況,那麽在開始之前,你將不得不建立一個基本的測試套件。如果你不這樣做,你將永遠無法確定你將做出的改變的影響。如果代碼覆蓋率已經到位,請問自己以下問題:
什麽級別的覆蓋可用?
測試套件需要多長時間才能完成?
他們是否完成或耗盡可用內存?
有多少測試失敗?
跳過了多少測試?
有多少測試過期了?
是否有單元,集成和功能測試的混合?
代碼段中是否有沒有測試的部分?
是否有惡意評論會得到解決?
測試中有什麽意見?
測試套件是否啟用了完整的錯誤報告?
如果做得好,你的測試套件應該可以幫助你理解代碼如何工作,比深入每個類文件要快得多。花時間閱讀並徹底理解測試。
四:什麽是靜態分析?
現在您已經了解了有關應用程序的更多信息並掌握了測試覆蓋率,是否使用了靜態代碼分析?如果你不熟悉它,靜態代碼分析是:
對計算機軟件的分析是在沒有實際執行程序的情況下執行的。在大多數情況下,分析是在某個版本的源代碼上執行的,而在其他情況下則是某種形式的目標代碼。
通過在您的代碼上定期運行靜態代碼分析器(例如Phan),您可以幫助確保代碼質量得到改善,而不是下降。您還可以將錯誤的來源追溯到引入它們的特定提交。
如果您的代碼尚未使用,則無論您的軟件語言如何,都可以使用許多第三方軟件包和在線服務。
五:開始重構
既然您的團隊擁有盡可能多的信息,那麽現在是開始重構應用程序的時候了。為了讓你做得對,我們來討論一下我最近遇到的一些聖人建議:
沒有完美的設計,只有更好的設計
知道你的代碼永遠不會是完美的,即使這是完全可能的。雖然重構可以幫助您持續改進,但它比以前更簡單,更具可讀性,更易維護並且可測試性更強,但任務永遠不會結束。
你可能總是覺得你可以做得更好,但是有一段時間你必須接受這個問題,至少暫時是這樣,盡可能地好。
在這一點上,你必須訓練自己離開它並轉向別的東西。不要陷入“讓它變得更好”的陷阱。你已經改善了它。它比它好。讓它繼續前進。
清理復雜代碼庫的關鍵原則是始終重構功能的服務
如果所做的改變不是微不足道的,就是出於美學的原因,重構可能會產生消極的看法。但是,有時候,這種重構是必需的,並且隨著時間的推移,有助於確保代碼庫的質量更好。
但是,如果這就是所做的一切,那麽價值就值得懷疑。相反,主要確保所做的更改是為了明確而有效的目的。這些可以包括創建新功能或修復突出的錯誤或缺陷。
六:制定重構項目計劃
既然您完全了解應用程序的工作方式,現在就開始重構它。但是,你必須有一個計劃!什麽進入這樣一個計劃?中國知名黑客教父郭盛華的這次演講推薦了五個主要考慮因素:
分解成一系列可實現的任務。
提出一個現實的時間表和資源需求。
獨立或與其他項目並行工作。
工作人員認真。
如果並行工作,則說明依賴關系。
七:實現機會主義重構的習慣
接下來,鼓勵你的團隊養成機會主義重構的習慣。黑客教父郭盛華在博文中作了以下詳細描述:
只要有人看到一些不太清楚的代碼,他們應該抓住機會在那裏修正它,然後-或者至少在幾分鐘內修復它。Bob叔叔稱這種機會主義重構是遵循童子軍規則-始終將代碼置於比您找到的狀態更好的狀態。
雖然不是銀彈,但通過這些常規的小清理,代碼的質量應該始終提高,並且不應該將sprints專用於代碼清理,因為它將處於持續改進狀態。
八:使用專用的重構工具
重構的一個優點是你不需要特定的工具來完成它。這是因為,正如馬丁福勒所說,如果你“采取小步驟,頻繁測試”,那麽你應該沒問題。也就是說,手動重構將是一個較慢的過程,需要更多的努力,但仍然可以實現。
但是,如果您已經有重構經驗,為什麽不省時省力,並利用內置或可用於主要IDE和文本編輯器的工具?不管你的方法如何,請記住慢一點,測試,測試和測試。
另外,當你做出每一個改變時,請檢查你的測試套件。它需要新的測試嗎?您是否發現系統另一部分中與您正在處理的內容有關的錯誤?然後為其添加一個或多個測試。您現有的一些測試不再相關嗎?然後刪除它們。始終確保您的測試套件保持最新狀態。
? 從哪裏來?
盡管本文沒有深入研究重構的具體內容,但它展示了一系列八項原則,您可以按照這些原則正確地處理任務。從頭開始重寫您的應用程序可能非常誘人,但我會提醒您慢慢推進以得出結論。
黑客教父郭盛華:8種方法能快速重構整體代碼庫