Tips to Developers Starting on Large Applications
原文引用:http://www.infoq.com/articles/tips-to-developers-starting-on-large-apps
假設你是正在開發和維護一個包含2000個類并使用了很多框架的Java開發者。你要如何理解這些代碼?在一個典型的Java企業項目小組中,大部分能夠幫你的高級工程師看起來都很忙。文檔也很少。你需要盡快交付成果,并向項目組證明自己的能力。你會如何處理這種狀況?這篇文字為開始一個新項目的Java開發者提供了一些建議。
1 不要試圖一下子搞懂整個項目
好好考慮一下,為什么理解項目代碼是第一位的?大部分情況是你被要求修復一個bug或者加強系統已有功能。你要做的第一件事情不是理解整個項目的架構。當對項目進行維護時,這樣(理解整個項目架構)可能會對你造成巨大的壓力。
即便是有著10年可靠編程經驗的Java開發者可能也沒有理解項目的核心工作機制,盡管他們可能已經在這個項目工作超過一年(假設他們并非原始開發人員)。比如,對于認證機制或事務管理機制。
他們是怎么做的?他們對于自己負責的部分非常了解,并且能夠交付價值給小組。每天的交付價值遠比了解一些以后還不確定有沒有的東西重要的多。
2 關注于盡快交付價值
那我是否定了你對于項目架構理解的熱情了么?完全不。我只是要求你盡早的交付價值,一旦你開始一個項目,搭建了開發環境,你就不應該花一兩周時間才交付什么,無論他的規模大小。假如你是一個有經驗的程序員卻兩周都沒有任何交付,你的經理怎么會知道你是真的在工作還是在看新聞。
所以交付可以使大家都輕松起來。不要認為你能夠做有價值的交付前必須理解整個項目。這是完全錯誤的。加一段javascript的驗證代碼對業務就很有價值,經理能夠通過你的交付達到對你的信任。這樣能夠向上級領導證明你的貢獻以及員工價值。
日復一日,在你不斷修復bug及增強功能之后,就能夠慢慢開始理解項目架構。不要低估對系統方方面面理解時需要花費的時間。花3-4天理解認證機制,2-3天理解事物管理。這些都是依靠之前的相似項目的經歷,但關鍵還是要花時間才能透徹的理解。要在日常工作中擠出時間,不要向經理要求特定的時間來做這些。
找找項目是否有一些不斷維護的單元測試用例。有效的單元測試用例是理解大型項目代碼的很好途徑。單元測試能夠幫助理解代碼片段,包括一個單元的外部接口(單元如何被調用以及返回內容)及其內部實現(調試單元測試比調試整個實際用例簡單許多)。
你如果能夠很好的理解一些內容,寫一些筆記,或者畫一些類圖、時序圖、數據模型圖,以便你或日后其他的開發者維護。
3 維護大型項目所必須的技能
你能從事當前的工作,必然已經具有良好的java技術。我們來談談能夠讓你在新項目中良好表現的其他技能。大部分時間,你在項目中的任務是修復bug和增強功能。
有兩項很重要的技能能夠協助你維護大型項目代碼。
3.1 能夠迅速發現需要的類
在任何維護活動中,無論是修復bug或增強功能,第一個動作就是識別出當前修復或增強的用例中調用的類。當你定位到需要修復或增強的類/方法,就已經完工了一半。
3.2 能夠分析變更的影響
當你在完成必要的修改或增強工作后,最重要的就是要確認你的修改沒有破壞代碼的其他部分。你要用你的java技術及對其他框架的理解找出變更可能影響的部分。下面有兩個簡單的例子詳細描述了最后提及的情況:
a)當類A的equals()方法變更后,調用一個保護A實例的List的contains()方法時就會被影響到。若Java知識不夠,很難考慮到這樣的影響。
b)在一個web項目中,我們假設“user id”保存在session中。一個新入程序員可能在“user id”中加入一些信息作為bug修復的方法,但是卻不知道會影響到那些關聯“user id”的用例。
當你提高了如上兩個技能,盡管你對項目不是非常了解,但大部分的維護任務會變得簡單很多。若你修復一個bug,你會定位并修復這個bug,并且保證變更不會破壞項目的其他部分。若你增強或加入一個特性,基本上你只需要模仿現有的特性使用相似的設計。
在一個在線銀行項目中,為什么“查看賬戶摘要”和“查看交易歷史”的設計需要巨大的差別呢?如果你理解了“查看賬戶摘要”的設計,完全可以模仿開發出“查看交易歷史”的功能。
就修復bug和增強來說,你不必完全理解所有2000個類的工作內容和代碼如何運行來推動系統。你若有上面的技能,就能很快定位需要修改的代碼的部分,使用良好的java和框架技能修復,保證變更不會破壞項目的其他部分并交付,盡管你可能只知道一小部分項目的設計。
4 使用工具找到需要的變更內容以及變更產生的影響
繼續我們盡快交付的主題,你應當尋找那些能夠通過盡量少的了解項目但能幫助你盡快實施交付的工具作為輔助。
4.1 迅速發現需要變更內容的工具
無論是修復bug還是系統增強,首先都要找到該用例調用的你需要修改的類及方法。基本有兩種方式理解一個用例的工作方式,靜態代碼分析和運行時分析。
源碼分析統計掃描所有代碼并且展示類之間的關系。市場上有很多設備與工具。比如:Architexa, AgileJ, UModel, Poseidon等。
所有的靜態代碼分析工具缺點在于無法確切展示用例中類或方法的運行時調用情況。因此Java新加入了特性,如回調機制(callback patterns)。如靜態分析工具無法推斷出當頁面提交按鈕被點擊時哪個Servlet被調用了。
運行時分析工具能夠展示類和方法在用例運行時的狀態。工具包括:MaintainJ, Diver,jSonde,Java Call Tracer等。這些工具可以捕獲運行時的堆棧狀態,并以此為一個用例生成序列圖和類圖。
序列圖展示了該用例在運行時所有調用的方法。若你在修復一個bug,那這個bug很可能就是這些被調用的方法之一。
若你在增強已有功能,利用序列圖理解調用流程然后再修改。可能是新增一個驗證,修改DAO等。
若你在新增功能,找到一些相似的特性,利用序列圖理解調用流程然后模仿開發新功能。
要小心挑選運行時分析工具。信息過多是這類工具的主要問題。選擇一些提供簡單過濾無效信息并能夠方便的查看各種視圖的工具。
4.2 迅速發現需要變更內容的工具
若單元測試有效,可以通過運行單元測試發現變更有沒有破壞其他測試用例。有效維護并且覆蓋大型企業應用的單元測試還是比較少的。下面有一些針對該情況的工具。
仍然是有兩種技術靜態代碼分析和運行時分析可以使用。市場中有很多靜態代碼分析工具可用。如:Lattix, Structure101, Coverity, nWire and IntelliJ's DSM。
給定一個變更后的類,上述工具均可識別對該類存在依賴的類的集合。開發者需要根據這些信息“猜測”可能產生影響的用例,因為這些工具無法展示運行時類之間的調用關系。
市場上的可以用于運行時影響分析的工具并不多,除了MaintainJ。MaintainJ先捕獲在一個用例中調用的所有類和方法。當所有用例的上述信息都被捕獲之后,就很容易發現類的變更對用例的影響。MaintainJ能夠有效工作的前置條件就是項目的所有用例都應當先運行一遍,以便能夠獲得運行時的依賴關系。
總之,目前你在迅速準確分析變更影響方面,還是可以從工具中獲得有限的幫助。首先根據需要實施一些影響分析,然后根據自己或小組其他高級成員評審來判斷變更的影響。你可能需要上面提到的工具對你的判斷進行反復確認。
5 對上述內容的兩個忠告
5.1 不要降低代碼質量
為了快速交付,所以沒有全盤理解架構,但絕不能以降低代碼質量為條件。下面是一些你可能因為只考慮快速交付而引發的代碼質量問題。
因為修改代碼涉及到很多的依賴,所以新增代碼相對而言風險較小。例如,有5個用例都調用了某個方法。為了改進某個用例,你需要修改這個方法的實現。最簡單的做法就是復制這個方法,重命名,然后在改進的用例中調用新方法。千萬不要這么做。代碼冗余絕對是非常有害的。嘗試對方法進行包裝或者重寫,甚至是直接修改,然后重新測試所有用例,通常停下來想一想,然后親手去實施,是一個比較好的方式。
另一個例子是將“private”方法改為“public”,使得別的類也可以調用。盡量不要將非必須的部分暴露出來。假如為了更好的設計需要重構,就應當著手去做。
大部分應用都有確定的結構和模式來實施。修復或增強程序時,確認你沒有偏離這樣的模式。若對約定不確定,請其他的高級開發者來審核你的變更。若你必須做一些違背約定的實施,盡量放置于一個規模較小的類中(一個200行代碼的類中的私有函數應當不會影響應用的整體設計)
5.2 不要停止深入理解項目架構
按照文章列出的方式,假設你能夠在對項目了解較少的情況下進行交付并以此持續下去,可能你會停止對項目架構的深入了解。這樣從長遠角度來說對你的職業生涯沒有幫助。當你的經驗增加時,你應當承擔比較大的模塊任務。如構建一個完整的新特性或者修改項目的一些基礎設計等較大的改進。當你能夠做這些改進時,你對項目的整體架構應該相當了解。文中列舉的方法是讓你在最短的時間內提升自己,而不是阻止你完整理解整個項目。
6 結論
整篇文章集中在對項目進行必要了解的前提下進行快速交付。你可以在不降低代碼質量的前提下這么做。
若修復一個bug,迅速定位并修復。有必要可以使用運行時分析工具。若新增一個特寫,可以尋找相似特寫,理解流程(有必要使用工具)并編寫。
或許這些聽起來很簡單,但是實用嗎?當然。但前提是你有良好的java技術以及對框架足夠了解才能先修改代碼,然后對變更影響進行分析。對變更影響的分析比實施變更需要更多的技巧。你可能需要高級開發人員協助你分析變更影響。
大約有50%的IT可操作預算用于簡單的bug修復和功能增強。根據文中的建議,對于維護活動中的經費的節省應當還是很有幫助的。
作者Choudary Kothapalli 也是MaintainJ項目的建立者。
About the Author
Choudary Kothapalli is the founder of MaintainJ Inc., the company that builds tools to reduce the costs of maintaining large Java applications. He has over 15 years of experience in developing and maintaining enterprise Java applications. He is a Sun Certified Enterprise Architect and Java Programmer. He lives with his wife and two sons in Toronto, Canada.