软件重构过程中的思维转换: 遗留代码如何变废为宝
“我開始收到各式各樣的郵件,人們都表示‘天吶!我也是這樣!’。”她說,“我開始去傳播這條信息,告訴大家重新建構遺留代碼這件事其實非常有價值,憑此來吸引合適的人。”?????????? ? ? ? ? ? ? ?? ——?Andrea Goulet
編者注:Andrea Goulet是Corgibytes的首席執行官,她的公司專注于處理、改進并精簡企業現有的代碼庫。
??????? Andrea Goulet和她的商業合作伙伴坐在起居室里,隨意地聊著她們的戰略計劃方案。她們一直在試圖尋找一種方式來傳遞自己的價值主張——為其他公司清除遺留代碼和技術債務。
??????? “我們意識到我們所做的事情已經不再僅限于清除舊代碼了,實際上我們是在像整修房子一般重新修改軟件,目的是讓它存活更長時間、使其運營更加流暢并且處理更多的信息。”Goulet這樣說道,“這讓我開始思考公司該如何修正自己的代碼以獲得更高的效率。這就如同你在房頂上添加了新的屋檐,使得房子更具價值。這件事聽上去并不吸引人,但對于公司來說卻至關重要。不過,許多人采取的做法都是錯的。”
??????? 如今,Goulet成為了Corgibytes的首席執行官。這是一家負責重新設計應用并使其符合現代化需求的咨詢公司。她看到過各式各樣有問題的系統、遺留的代碼以及與技術債務相關的問題。Goulet認為初創企業必須轉變自己的思維模式——從償還技術債務轉變為創建技術財富以及從清除舊代碼轉變為逐步對其進行修改。她表示要想完成這件事,你必須要招募到一些出色的工程師來攻克此難題。
??????? 重新思考遺留代碼
??????? 關于遺留代碼最常見的定義來自《Working Effectively with Legacy Code》一書的作者Michael Feathers。遺留代碼指的是那些沒有測試覆蓋率的代碼。這個定義要比大多數人以為的——遺留代碼指的是那些過時系統——要更全面一些。但據Goulet表示,這兩種定義都還沒能完全說明遺留代碼的含義。“遺留代碼與軟件的使用年限無關。一個才使用兩年的應用也可以處于廢棄狀態。”她這樣說道,“這關乎的是改進軟件的難易程度。”
??????? 當你想要去改進一個軟件時,如果你無法分辨當時設計者的思考內容,這就變成了遺留代碼。
??????? 遺留代碼不是一個技術問題,而是一個溝通問題。
??????? “上述這句話意思是說你的代碼庫可以反映出你的整個對話架構。”Goulet這樣說道,“如果你想要去修改你的遺留代碼,那你同樣要去解決代碼運行的問題。兩者缺一不可。這是很多人都會忽略的一點。”
??????? Goulet和她的團隊始處理一個遺存項目的方法跟考古學家的方法有點相似。他們首先要尋找一些遺留下來的工件,這些工件可以讓他們了解到過去開發者的思考方式。所有的這些工件組合在一起后便能提供新的決策。
??????? 那么最重要的工件是什么呢? 是有條理的、能揭露開發者意圖的、整潔的代碼。比方說,如果你用“foo”或是“bar”這些普通的名詞來命名一個變量,那么六個月之后你再回頭看,你將絲毫想不起來這個變量代表的是什么。
??????? 如果這個代碼難以理解,那么一個有用的工件就是源代碼控制系統。這是因為它可以提供該代碼的變化歷史并且為開發者提供編寫代碼的機會。
??????? 自動化測試也可以提供邏輯依據。“其實,那么多人認可Michael Feathers關于遺留代碼的定義是有原因的。”Goulet解釋道,“測試組件在理解開發者意圖時非常有用”
??????? 這里能得到的經驗很簡單:如果你不想被自己的遺留代碼困住,那就多關注一些有助于他人在未來更容易理解該代碼的細節。編寫及執行單元、接受、審批并且進行集成測試。解釋說明你的代碼執行命令。這能在未來讓其他人以及你自己更好地理解你當時的想法。
??????? 不過,不管你采取何種措施,遺留代碼的問題都會不可避免得出現。原因顯而易見。
??????? 在初創公司發展早期,公司必須要推出一些功能。開發者為此也承擔了很大壓力,測試也有可能半途而廢。?????? Corgibytes團隊遇到了很多數年來一直懶得進行測試的公司。
??????? 當然,在你開發一個樣品時,強迫你去進行測試也有些說不通。但當你開發出產品并擁有了客戶的時候,你就需要投資時間和精力在產品的維護和改善上了。“很多人都會說我們根本無需擔心維護相關的事宜,功能才最重要。”Goulet這樣說道,“如果你是這么想的,那你永遠無法具有競爭力。”
??????? 事實上,熱力學第二定律也適用于代碼:在所有過程中,熵的增加是不可逆的。熵是作為度量一個熱力學系統無序狀態的量度單位。這意味著你必須要解決技術債務帶來的混亂狀態。而遺留代碼不過是隨著時間累積而成的債務之一。
??????? 技術債務往往能反映出運營問題。
??????? 很多首席技術官都能意識到這個問題,但他們很難說服同事去相信花錢修復這些已存在的技術債務是值得的。這有些像是原路返回,卻最終得不到任何新的成果。除非技術債務開始嚴重損害公司每天的運行效率,否則很多公司是不會想去解決技術債務的。不過拖到這時候才去解決,所花費的成本就非常高昂了。
??????? 忘記技術債務,專注于構建技術財富
??????? 如果你可以將你的技術債務轉化為累積技術財富的機會,那你讓首席執行官、投資者以及其他股東接受你提案的可能性會大很多。
??????? “我們不能再將技術債務當做是一個不好的名詞。當你處于產品設計和開發早期階段時,技術債務將起到很大幫助作用。當你解決了部分債務時,你能帶給自己動力。舉個例子,當你在家中安裝一些新窗戶時,你確實花了很多錢,但你卻可以每個月節省下一百美元的電費。代碼亦是如此。不過解決技術債務并非是體現在效率上,而是會隨著時間的流逝為你帶來生產率。”Goulet說。
??????? 一旦你的團隊不再富有成效,你必須要確認是什么技術債務在阻止他們的前進。
??????? 如果你可以改變自己的觀點,專注于技術財富的創造,你最終可以獲得剩余的產能。這些產能可以被拿去修補更多的技術債務以及遺留代碼,從而形成一種良性循環。
????????別再將自己的軟件當做是一個產品,將其想做是你未來會長期居住的一間房子。
??????? Goulet表示這是一個非常重要的思維模式轉變。這能讓你擺脫短淺的思維方式,轉而去專注于軟件的維護。
??????? 這就像是房子一樣,關于房子的現代化改造通常以兩種形式發生:外表上的小變化(“我買了一個新地毯!”)以及昂貴但卻能在未來有所回報的大投資(“我們要去更換管道系統”)。這兩種形式的變化你都需要去考慮,目的是讓你的產品和團隊更加順暢得運行和工作。
??????? 這當然也需要提前進行預算的規劃。如果你不這樣做,那么那些大筆的購買費用將會影響你的其他計劃。時常進行維護的費用應該是在預期之內的。令人感到震驚的是,許多公司往往不會提前規劃好一筆資金作為維護費。
??????? 因此,Goulet創建了“軟件改造”這一術語。當你房屋中的某項物品損壞了,你不會去推倒其他部分、選擇重新開始。與此相同,當你擁有一些過時且有問題的代碼時,重寫不一定會是最好的選擇。
??????? 下面是Corgibytes在重新調整代碼庫時會做的一些事情:
-
將一些整體應用分成更小、更易進行維護的微服務。
-
減少彼此功能之間的聯系,從而提高其可擴展性。
-
更新品牌以及前端的界面。
-
建立自動化測試,這樣代碼就可以自行檢測。
-
重構或者編輯代碼庫,使得代碼更好地運行。
??????? 具體來說,每家公司重新調整代碼庫的工作應該有三種類型:
-
自動測試
-
持續交付
-
文化升級
????????
??????? 找到最具天賦的代碼調整者
??????? 業內普遍這么認為:頂尖的工程師都不愿意處理遺留代碼。他們都想要創造一些新的功能。人們還表示繼續糾結遺留代碼的維護是浪費時間的做法。
??????? 這些都是錯誤的觀念。如果你知道從哪里可以找到一些技巧嫻熟的工程師并且為他們提供一個愉快的工作環境,那么他們將幫你解決那些棘手的技術債務問題。
??????? “無論何時,如果我們在會議上詢問參會者有誰喜歡處理遺留代碼?通常只有不到10%的人會舉手。”Goulet說,“但當我與這些人進行交流時,我又發現他們都是一些喜歡解決挑戰性難題的工程師。”
??????? 那么,你如何才能找到這些解決遺留代碼的精英人士呢?Goulet嘗試了很多種辦法,其中一些起作用了。
??????? Goulet在egacycode.rocks上推出了一個社區網站,該網站的聲明如下:“長久以來,那些喜愛重新建構遺留代碼的工程師一直被當做是二流的開發者。如果你為解決遺留代碼這份工作感到自豪,歡迎加入!”
??????? “我開始收到各式各樣的郵件,人們都表示‘天吶!我也是這樣!’。”她說,“我開始去傳播這條信息,告訴大家重新建構遺留代碼這件事其實非常有價值,憑此來吸引合適的人。”
??????? 她還在招募過程中采用了持續交付的做法,她為此類開發者提供了很多細節信息以及明確的指示。一段時間過后,她還進一步改進了申請流程,從而可以更早地發現一些出色的候選人。比方說,她的申請指南是這樣的:“首席執行官將會瀏覽你的簡歷,所以請確保你的求職信是寫給首席執行官的。”但并未注明首席執行官的性別。而那些所有以“尊敬的先生”或是“某先生”開頭的求職信都會被直接刪除。
??????? “我這樣做是因為很多人都假定軟件公司的首席執行官一定是位男性。對此,我感到很煩惱。”Goulet這樣說道,“所以有一天,我想到把這個作為指示放在網站上,然后觀察有多少申請者能夠注意到這一點。令我驚訝的是,這個細節不但剔除掉了一些不太嚴謹的候選人,還突顯出了很多擅長處理遺留代碼的人才。”
??????? 修改者并非是以細節為導向做事,他們不過是必須要去關注細節。
??????? 在我們這一行,人們盛行推崇編寫代碼的人,以至于所有人都希望他們也可以完成維護工作。這是一個錯誤的想法。最好的代碼調整者從來都不是最好的代碼編寫者。
??????? 當Goulet招募到了一些出色的代碼調整者時,她知道該如何讓他們獲得成功。
??????? 下面是一些能讓此類開發者保持愉悅且高效的方法:
-
給予他們足夠的自主權。分配項目給他們時候,你可以解釋問題是什么,但是千萬別去強行規定他們應該怎么解決。
-
如果他們要求對自己的電腦和工具進行升級時,請答應他們的要求。他們知道自己需要什么才能最大程度上提高自己的工作效率。
-
幫助他們減少語境的問題。在完成某個項目之前,他們喜歡專注做好一件事。
??????? 穩定期并不是一個負面的詞匯
??????? 大多數初創企業不會去回顧自己的發展階段,還有一些公司甚至認為公司的發展應當是永無止境的。事實情況卻不一定要如此。穩定期意味著你現在擁有可以去創建技術財富的人力和方法,你可以調動所有資源去處理一些需要優先解決的問題。
??????? 這還意味著你需要分配更多的企業預算到產品的維護以及更新上。“你不能將產品的維護當做是另一個項目。”Goulet這樣說道,“它必須要扎根在你的企業文化中——這一點非常重要,它將在未來幫助公司取得更大的成功。”
??????? 最終,通過上述這些措施構建而成的技術財富將會為你的團隊帶來一批全新的開發者:這是一群有時間和資源來探索新領域、客戶群以及機遇的偵察兵。當你可以去開發新的市場并且基于自己已完成的產品不斷取得成功時,這時你的公司才真正處于一個繁榮發展的狀態。
本文轉載地址:http://www.lieyunwang.com/archives/207507【獵云網】
from:?http://blog.csdn.net/lovelion/article/details/52550784
總結
以上是生活随笔為你收集整理的软件重构过程中的思维转换: 遗留代码如何变废为宝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历年软件设计师下午考试试题汇总统计(更新
- 下一篇: 22种代码味道(Martin Fowle