1. 程式人生 > >黑客教父郭盛華:8種方法能快速重構整體代碼庫

黑客教父郭盛華:8種方法能快速重構整體代碼庫

頻繁 ucs 機會主義 print 閱讀 BE 運行 快速 東方

  中國黑客教父,元老級人物,威名遠播的網絡黑客安全專家,東方聯盟創始人郭盛華提供了8種方法能快速重構整體代碼庫:他表示,雖然許多軟件項目都是以最好的意圖開始的,比如幹凈的架構,明確的目標和明確的目標,但並非所有的目標都是如此。而且,在那些做的人當中,並不是所有人都會一直這樣。

技術分享圖片

  隨著時間,功能要求,財務壓力,競爭優先級以及不斷變化的開發人員,很可能開始作為代碼質量的光輝典範最終變成一個龐然大物。

  整體代碼庫本質上很難維護。這可能是由於許多原因,包括以下功能:

  做太多了。

  知道太多。

  有太多的責任。

  依賴(或太多)全局狀態和不可測試。

  在這些情況下,如果你改變了某些東西,經常是其他的東西-在與應用程序沒有明顯聯系或關聯的應用程序的一部分-中斷。

  出於這些原因和其他許多原因,代碼變得脆弱,人們通常認為最好的行動方式是從頭開始重寫應用程序。但是,重寫通常最終會導致昂貴的失敗。

技術分享圖片

  不知道為什麽?然後問你自己幾個問題,找出原因:

  重新創建現有級別的功能需要多長時間?

  這是否比刪除現有應用程序中的技術債務更少或更多?

  你能應付在這段時間內缺乏可見的前進進展嗎?

  您是否有資源和時間修復舊系統上的重要和安全錯誤,並重寫它?

  新系統會比現有系統更好嗎,還是會重新實現相同的錯誤?

  新系統的功能是否與現有系統完全一樣?

  你能維護兩個代碼庫和兩個開發團隊嗎?

  你會重復從舊系統中吸取的經驗教訓嗎?

  我並不是說重構現有系統總是最好的選擇。然而,雖然不是華而不實或吸引註意力的,它往往是成本更低的選擇和更理智的方式。

  據說,我現在要介紹如何重構單一代碼庫的基本知識。

技術分享圖片

  一:你了解應用程序?

  在你做任何事之前,你對這個應用程序有什麽了解?雖然通常很容易潛入並且只是編碼,但這是最糟糕的事情。你可以做的最好的事情就是盡可能多地學習它。

  如果你的龐然大物像許多其他人一樣,那麽很可能沒有單一的,集中組織的知識庫。相反,信息將存儲在各種非常不同的位置。這些可能包括以下內容:

  在以前的開發者,企業主,經理,項目經理和其他利益相關者的頭腦中

  代碼註釋

  代碼提交消息

  待辦事項

  一個或多個README文件

  代碼文檔

  一個或多個維基

  一個錯誤報告工具

  盡可能多地找到這些信息,並將它們放在一起,集中到一個中心位置。正如你所做的那樣,這裏有一系列問題可以幫助你盡可能多地發現:

  為什麽創建應用程序?

  誰想要它建立?

  誰在工作?

  這意味著什麽?

  它的主要特點是什麽?

  它的附加功能是什麽?

  它的最大缺陷是什麽?

  它有什麽補充錯誤?

  希望這份清單能夠激勵你提出一系列後續問題,這些問題可以讓你了解所有需要了解的問題。

  二:是否在版本控制下?

  了解所獲得的應用程序後,詢問其源代碼是否存儲在版本控制下。如果沒有,那就直接通過版本控制吧!你想要做的最後一件事是做任何改變,而不能恢復它們。

  黑客教父郭盛華強烈建議你使用Git,但是如果你對Git感到厭惡的話,Mercurial是另一個不錯的選擇。他也鼓勵您將它存儲在遠程存儲庫中,無論是GitHub,Bitbucket,GitLab還是其他無數代碼托管服務之一。

  三:測試套件的狀態是什麽?

  接下來,代碼覆蓋的程度如何?根據應用程序的年齡,處理它的開發人員數量(以及他們的技能水平),這些開發人員的就業方式等,可能沒有適當的代碼測試套件。

  如果是這種情況,那麽在開始之前,你將不得不建立一個基本的測試套件。如果你不這樣做,你將永遠無法確定你將做出的改變的影響。如果代碼覆蓋率已經到位,請問自己以下問題:

  什麽級別的覆蓋可用?

  測試套件需要多長時間才能完成?

  他們是否完成或耗盡可用內存?

  有多少測試失敗?

  跳過了多少測試?

  有多少測試過期了?

  是否有單元,集成和功能測試的混合?

  代碼段中是否有沒有測試的部分?

  是否有惡意評論會得到解決?

  測試中有什麽意見?

  測試套件是否啟用了完整的錯誤報告?

  如果做得好,你的測試套件應該可以幫助你理解代碼如何工作,比深入每個類文件要快得多。花時間閱讀並徹底理解測試。

  四:什麽是靜態分析?

  現在您已經了解了有關應用程序的更多信息並掌握了測試覆蓋率,是否使用了靜態代碼分析?如果你不熟悉它,靜態代碼分析是:

  對計算機軟件的分析是在沒有實際執行程序的情況下執行的。在大多數情況下,分析是在某個版本的源代碼上執行的,而在其他情況下則是某種形式的目標代碼。

  通過在您的代碼上定期運行靜態代碼分析器(例如Phan),您可以幫助確保代碼質量得到改善,而不是下降。您還可以將錯誤的來源追溯到引入它們的特定提交。

  如果您的代碼尚未使用,則無論您的軟件語言如何,都可以使用許多第三方軟件包和在線服務。

  五:開始重構

  既然您的團隊擁有盡可能多的信息,那麽現在是開始重構應用程序的時候了。為了讓你做得對,我們來討論一下我最近遇到的一些聖人建議:

  沒有完美的設計,只有更好的設計

  知道你的代碼永遠不會是完美的,即使這是完全可能的。雖然重構可以幫助您持續改進,但它比以前更簡單,更具可讀性,更易維護並且可測試性更強,但任務永遠不會結束。

  你可能總是覺得你可以做得更好,但是有一段時間你必須接受這個問題,至少暫時是這樣,盡可能地好。

  在這一點上,你必須訓練自己離開它並轉向別的東西。不要陷入“讓它變得更好”的陷阱。你已經改善了它。它比它好。讓它繼續前進。

  清理復雜代碼庫的關鍵原則是始終重構功能的服務

  如果所做的改變不是微不足道的,就是出於美學的原因,重構可能會產生消極的看法。但是,有時候,這種重構是必需的,並且隨著時間的推移,有助於確保代碼庫的質量更好。

  但是,如果這就是所做的一切,那麽價值就值得懷疑。相反,主要確保所做的更改是為了明確而有效的目的。這些可以包括創建新功能或修復突出的錯誤或缺陷。

  六:制定重構項目計劃

  既然您完全了解應用程序的工作方式,現在就開始重構它。但是,你必須有一個計劃!什麽進入這樣一個計劃?中國知名黑客教父郭盛華的這次演講推薦了五個主要考慮因素:

  分解成一系列可實現的任務。

  提出一個現實的時間表和資源需求。

  獨立或與其他項目並行工作。

  工作人員認真。

  如果並行工作,則說明依賴關系。

  七:實現機會主義重構的習慣

  接下來,鼓勵你的團隊養成機會主義重構的習慣。黑客教父郭盛華在博文中作了以下詳細描述:

  只要有人看到一些不太清楚的代碼,他們應該抓住機會在那裏修正它,然後-或者至少在幾分鐘內修復它。Bob叔叔稱這種機會主義重構是遵循童子軍規則-始終將代碼置於比您找到的狀態更好的狀態。

  雖然不是銀彈,但通過這些常規的小清理,代碼的質量應該始終提高,並且不應該將sprints專用於代碼清理,因為它將處於持續改進狀態。

  八:使用專用的重構工具

  重構的一個優點是你不需要特定的工具來完成它。這是因為,正如馬丁福勒所說,如果你“采取小步驟,頻繁測試”,那麽你應該沒問題。也就是說,手動重構將是一個較慢的過程,需要更多的努力,但仍然可以實現。

  但是,如果您已經有重構經驗,為什麽不省時省力,並利用內置或可用於主要IDE和文本編輯器的工具?不管你的方法如何,請記住慢一點,測試,測試和測試。

  另外,當你做出每一個改變時,請檢查你的測試套件。它需要新的測試嗎?您是否發現系統另一部分中與您正在處理的內容有關的錯誤?然後為其添加一個或多個測試。您現有的一些測試不再相關嗎?然後刪除它們。始終確保您的測試套件保持最新狀態。

技術分享圖片

?  從哪裏來?

  盡管本文沒有深入研究重構的具體內容,但它展示了一系列八項原則,您可以按照這些原則正確地處理任務。從頭開始重寫您的應用程序可能非常誘人,但我會提醒您慢慢推進以得出結論。

黑客教父郭盛華:8種方法能快速重構整體代碼庫