趙春城
軟件維護之重要性及方法
趙春城

Point
軟件維護階段是軟件生存周期中的最后一個階段,是一個重要的階段,有很大的挑戰性,迎接這些挑戰需要技巧和方法。文章分析了軟件維護的幾種類型,不同類型的維護工作針對不同的工作內容,所占工作比重也不同,并分析總結出維護工作的特征,為管理軟件維護工作打下基礎;分析論證了軟件維護的重要性,維護人員實際做的是幕后英雄的工作,也有很大的挑戰性和成就感;最后,結合作者在軟件維護管理和工作中的實踐,總結出做好軟件維護的幾點實用的實踐經驗,改變對維護工作的認識是做好維護工作的前提。
軟件維護是軟件生存期中的最后一個階段,它既是時間最長的一個階段,也是消耗人力最多的一個時期,在整個軟件生存期內,這個階段具有極其重要的意義。軟件維護主要是指根據需求變化或硬件環境的變化對應用程序進行部分或全部的修改,使軟件系統在新環境下適應新的業務需求,修改時應充分利用源程序和設計文檔。
國內軟件項目由于前期需求考慮不周全,業務需求變化快,在開發完成進入維護階段后容易產生較多變更。但由于項目規模不大基于成本和管理等因素考慮,不能完全把運營、維護、測試等團隊和軟硬件嚴格分開,外包公司“包打天下”的情況比較普遍。在高度依賴軟件系統的行業,系統的安全可靠運行變得越來越重要,需要采取有效的措施加強軟件維護項目的管理。
本文闡述了軟件維護及其在項目管理中的重要性,結合軟件工程方法學,并根據作者在軟件管理和軟件維護實踐中積累的經驗,總結出行之有效的軟件維護方法。
軟件維護活動類型總起來大概有四種:糾錯性維護、適應性維護、完善性維護、預防性維護。除此四類維護活動外,還有一些其它類型的維護活動,如:支援性維護(如用戶的培訓等)。
針對以上幾種類型的維護結合作者實際工作,在下面做簡要闡述。
1.糾錯性維護
糾錯性維護是指在系統開發階段已發生而系統測試階段尚未發現的錯誤。這方面的維護工作量要占整個維護工作量的17%~21%。所發現的錯誤有的不太重要,不影響系統的正常運行,其維護工作可隨時進行;而有的錯誤非常重要,甚至影響整個系統的正常運行,其維護工作必須制定計劃,進行修改,并且要進行復查和控制。
這部分的維護工作實際上就是在軟件系統運行過程中修改前期沒有發現的bug,在修改舊bug過程中也可能會引入新的bug,這部分工作以會成為新的糾錯性維護工作。在軟件開發過程中加強評審和測試,可以有效減少這部分的維護工作。
2.適應性維護
適應性維護是指使用軟件適應信息技術變化和管理需求變化而進行的修改。這方面的維護工作量占整個維護工作量的18%~25%。由于目前計算機硬件價格的不斷下降.各類系統軟件層出不窮,人們常常為改善系統硬件環境和運行環境而產生系統更新換代的需求;企業的外部市場環境和管理需求的不斷變化也使得各級管理人員不斷提出新的信息需求。這些因素都將導致適應性維護工作的產生。
3.完善性維護
完善性維護是為擴充功能和改善性能而進行的修改,主要是指對已有的軟件系統增加一些在系統分析和設計階段中沒有規定的功能與性能特征。這些功能對完善系統功能是非常必要的。另外,還包括對處理效率和編寫程序的改進,這方面的維護占整個維護工作的50%~60%,比重較大,也是關系到系統開發質量的重要方面。完善性維護是軟件維護工作中的主要部分,觸發這類維護工作的常常是用戶業務交易增加了,或是業務流程改變了,需要修改軟件;也可能是軟件系統不能再滿足業務量要求,需要在性能上有所提高。
4.預防性維護
預防性維護為了改進應用軟件的可靠性和可維護性,為了適應未來的軟硬件環境的變化,主動增加預防性的新的功能,以使應用系統適應各類變化而不被淘汰。這方面的維護工作量占整個維護工作量的4%左右,是維護工作中占比最少的一部分工作。
很多人都不愿意做維護工作,都想做開發者,做首席架構師,認為那才是軟件“創造者”,而維護人員不過是對軟件的修修補補,是一個無名的軟件“修理工”。實際上不管是開發者,還是維護者,都是軟件工程中的必不可少的組成人員,只不過后者更傾向是一個幕后英雄??梢宰鲆粋€不太適當的比喻,維護工作做不好,軟件系統可能會英年早逝,維護工作做好了,軟件系統就會長命百歲。
軟件維護階段作為軟件生存周期中的最后一個階段,是歷時時間最長的一個周期,是最消耗人力物力的一個時期,維護階段管理的好壞,工作效率的高低,直接影響著軟件的使用和體驗,也直接影響維護成本。有的軟件系統前期開發得很好,文檔也齊全,但由于維護階段管理不善,經過一段時間的修改后,文檔與代碼對不上了,維護越來越難,最后甚至變成不可維護了。有的軟件系統在開發階段可能不是太完美,但如果維護階段管理得好,軟件系統的維護性會越來越好。
1.改變觀念,愛上軟件維護工作
首先要正常認識軟件維護在軟件生命周期中的重要性,做維護工作雖然不能成為臺前英雄,但卻是一個實實在在的的幕后英雄。實際上很多所謂的開發人員所做的開發工作就為軟件增加新功能,修改業務流程,這其實就是在做完善性維護工作。軟件維護工作同樣存在大量的挑戰,同樣需要創造性、靈活性、耐心、訓練和良好的溝通。愛好是學習最好的老師,只要喜歡上軟件維護工作,你就會在這一領域中發揮你的聰明才智,收獲屬于你的一片藍天。
2.建設高效,穩定的維護團隊是首要任務
在維護團隊建設初期,大家有一個普遍的認識:維護工作沒有成就感。不僅枯燥,乏味,而且沒有技術含量。程序員最頭疼的就是修改別人寫的代碼,而且這些代碼往往沒有健全的文檔和注釋。這種認為“軟件維護是不入流的技術人員所做的工作”的思想,使得維護工作舉步維艱。
為了改變這一現狀,在維護初期,多次組織和開展了項目組的交流會議和培訓工作。必須首先讓大家擺正心態,正視維護工作。在培訓過程中,重點關注項目組成員的個人發展,以此為起點,引導大家從思想上有所轉變,把項目組的利益和個人利益相結合,達到共同提高的目的。
3.熟悉軟件系統
熟悉所維護軟件的功能是非常重要的,也是進行軟件維護工作的第一步。首先閱讀現有的文檔,最好能對文檔中提到的內容親自進行測試??梢詮腝A部門找出他們的測試計劃文檔,并且照著文檔再把測試做一遍。掌握現實中軟件的使用方法,確保你要知道最常用的使用情形。有時候用戶會要求提供一些已經存在的功能特性,只是因為他們不知道軟件中已經具有了這些功能。
最后只能研究代碼了,試著去理解函數、模塊和組件在軟件中所扮演的角色。使用調試器單步執行程序中不同的分支,查看當代碼的不同部分執行時將會發生什么。要把熟悉軟件的體系結構當作一個持續進行的過程,而不是一次就能完成的事情。當你修正bug或添加新的特性時,可能會對系統有更好的理解。以上過程一定要記錄結果,這樣會對維護工作有巨大幫助。
4.與用戶溝通

與用戶溝通是非常重要的。許多軟件開發者都很內向,他們寧愿與技術打交道,也不愿意去與用戶溝通。然而,軟件就是為了人們使用才開發的。而且在軟件的維護階段,已經有用戶在使用我們的軟件了。試著建立一種簡單而有效的機制用于用戶提交bug報告和增加需求,當他們提出一個問題時,要及時給他們反饋,即使你不能馬上解決這個問題,至少讓他們知道你正在處理這個問題,而沒有怠慢他們。最后,要誠實的告訴他們問題的最新解決情況,如果由于某些原因不能滿足他們的需求,也要及時告訴他們。
5.保留修改記錄
有很多種保留修改記錄的方法。最常見的方式是在每次提交代碼前要進行注釋說明,還有些人喜歡把修改的記錄列表寫到文件的頂部,在電子表格中保留一份修改列表也是很方便的。無論你采用哪種方式,一定要重視它。一份精確的修改記錄對成功地維護工作來說是無價的。
6.盡量保持程序原貌,避免重構
在軟件維護的很多時候,你會被某些模塊中的代碼弄得很沮喪。真想把這些代碼刪除然后從頭重寫。事實上,無論何時我們對代碼進行修改,不管是多么微小的修改,都存在引入新的bug的風險。避免重構,盡管在開發階段重構是一項很有用的技術,但在軟件的維護階段,它可能只會給你帶來麻煩。即使你使用重構沒有破壞任何東西,至少也增加了維護記錄的復雜度,使源代碼管理系統中不同版本間的差別變大。
7.重視測試
測試永遠是軟件質量保證中重要的一環,當你接手軟件的維護工作時,也許你需要做的第一件編碼任務是為該軟件寫一份回歸測試集——除非你已經有了一份。即使只是對代碼做了一點修改,但是運行整個回歸測試卻會花費很長的時間。這種情況下,我們可以取出回歸測試集的一個子集進行一次“冒煙測試”——只覆蓋了回歸測試集中的一部分測試用例的測試。每次修改后你都可以進行“冒煙測試”,而在周末或晚上進行回歸測試。自動測試在這方面是一個很好的測試工具。
軟件的安全運行,離不開維護工作的效率和管理質量的提高。軟件維護工作有它獨特的挑戰性,迎接這些挑戰需要技巧和方法,與開發工作是一樣的。作者全面分析了軟件維護的類型,不同類型維護工作的工作內容和工作比重,總結了做好軟件維護工作的幾點實踐經驗。
(作者單位:中鋁財務有限責任公司)