劉凱, 陳軍, 梁欣, 張俊萍, 鄭思廣
(1. 航天器在軌故障診斷與維修重點實驗室, 西安 710043;2. 西安衛(wèi)星測控中心, 西安 710043; 3. 63871部隊, 華陰 714200)
現(xiàn)代軟件行業(yè)的經(jīng)驗表明:盡管軟件的可靠性已經(jīng)一再提高,但是軟件中的bug卻始終存在[1]。可見,軟件維護(在軟件交付使用后,為了改正錯誤或滿足新的需求而修改軟件的過程)是不可避免的。隨著軟件規(guī)模和復雜度的日益提高,軟件維護日益成為軟件生存周期中費用最高、難度最大的一個階段。與此同時,如何對軟件進行維護性評估(對軟件維護性進行定性或定量評價)、及時發(fā)現(xiàn)并改正軟件的維護性設計缺陷從而優(yōu)化軟件維護性日益成為一個重要的研究課題。目前,由于國內軟件維護領域的理論研究相對匱乏,大多軟件維護工作仍然依賴于維護人員對整個系統(tǒng)的熟悉程度,缺乏相關的標準來指導和約束軟件維護性評估[2]。為了保證軟件維護性評估的質量,建立一個完善的軟件維護性評估指標體系是非常必要的。
借鑒美國空軍軟件維護性評估手冊,本文從軟件產品和開發(fā)過程兩個角度深入分析了軟件維護性的影響因素。在此基礎上,本文建立了一個相對完善的軟件維護性評估指標體系,用于指導軟件維護性評估的實施。
對軟件維護性進行評估是圍繞影響軟件維護性的諸多要素展開的,因此,實施軟件維護性評估的首要工作是明確軟件維護性的影響要素,確定軟件維護性評估指標。尼德.查牝指出:“軟件維護費用高昂的根本原因在于人們對當前程序和系統(tǒng)文檔理解上的障礙。這些障礙的起因主要有以下幾個:程序不可理解、對程序理解不準確、系統(tǒng)文檔與程序的可用信息不充分、軟件的復雜性、程序理解上存在的混淆、誤解與遺忘?!盵3]由此可見,要想控制維護費用,人們必須改善對程序源代碼和系統(tǒng)文檔的理解。因此,下面主要從文檔和源代碼兩個方面闡述其對軟件維護性的影響。
首先,軟件文檔資料的缺失或者文檔結構的雜亂、文檔管理的無序均會影響軟件的維護性,引起軟件維護時間和費用的增長。這里,軟件文檔是指在軟件開發(fā)過程中生成的、陸續(xù)進行需求、概要設計、詳細設計、測試等說明的一系列文檔。舉例來說,軟件文檔可能包括軟件系統(tǒng)/子系統(tǒng)規(guī)格說明、系統(tǒng)/子系統(tǒng)設計說明、軟件需求說明、接口需求說明、軟件設計說明、接口設計說明、軟件測試計劃、軟件產品說明、軟件測試說明、軟件測試報告等。除上述文檔外,作為需求分析和設計之間的橋梁的軟件體系結構設計文檔也日益受到軟件開發(fā)和維護人員的重視??傊?,有必要統(tǒng)一軟件文檔結構,改進和補充不完善的軟件文檔,這將有助于維護人員對軟件結構、界面功能和內部流程的理解[4]。尤其是在人員變動很快、跳槽率日益上升的軟件行業(yè)的今天,完備的軟件文檔成為實施軟件維護工作的重要參考依據(jù)。
其次,影響軟件維護性的另一個重要因素是程序的源代碼。由于用戶需求變更或者環(huán)境變化而對程序進行部分修改時,容易引起程序一系列其它部分的改動,這種現(xiàn)象在軟件維護領域被稱之為“波動效應”[5]。實際上,任何系統(tǒng)都存在潛在的波動效應。完全由沒有任何耦合關系的模塊組成的系統(tǒng)是不存在的。這種情況下,采用模塊低耦合、高內聚、可控制等程序結構化設計,可減少與其它模塊的關聯(lián),大大提高程序模塊的獨立性,將波動效應的負面影響降至最小。這種結構化設計模塊的優(yōu)勢體現(xiàn)在以下兩點:其一,對該類結構化模塊進行增刪修改時,僅需對該模塊進行改動即可,不致產生過大的波動效應,從而簡化維護工作[6];其二,對于模塊化的程序,可以應用備用件(用一個新的結構良好的模塊替換掉整個模塊),從而避免局部修改模塊而引入新錯誤,大大提高軟件的維護性。另外,程序設計語言的選擇,對程序的維護性影響也很大[7]。舉例來說,查詢語言、圖形語言、報表生成器等第四代語言編制出的程序都很容易理解和修改,其指令條數(shù)可能要比COBOL等低級語言編制出的少一個數(shù)量級,但開發(fā)速度快許多倍??梢哉f,新一代語言要比早期的語言更易于維護[8-9]。此外,程序風格的一致性、程序的簡潔性、數(shù)據(jù)完整性以及構件的復用性也在一定程度上影響著軟件的維護性,不再贅述。
另外,隨著軟件二元性概念——“軟件包括軟件產品和軟件開發(fā)過程”的提出,僅從軟件產品(包括了文檔和源代碼)的角度查找軟件維護性的影響要素是很片面的。從過程角度上講,常見的維護性影響因素有軟件開發(fā)方法、軟件維護性分析與設計技術、軟件維護性審查方式以及復審技術等。有時,軟件開發(fā)時間、費用等軟件成本因素也會左右軟件維護性的設計標準。此外,軟件生命周期中軟件資源(包括軟件編程工具、計算機輔助軟件工程工具等)、硬件資源(包括軟件運行環(huán)境、接口等)、軟件維護及糾錯工具(維護性度量模型、方法、技術等)的可用性對軟件維護性也有很大影響。還有,軟件開發(fā)團隊的規(guī)模與組織管理情況,程序員、需求分析師、文檔編制人員等人員的技能與素質也間接影響著軟件的維護性??梢?,影響軟件維護性的過程因素眾多,但由于不易對其度量,本文尚未對該類過程因素進行深入研究。
上述軟件維護性的影響要素繁多,有些要素可以量化度量,如模塊的耦合性,而有些要素則需要人憑借感官進行定性評價,如程序風格的一致性,還有些要素很難進行評價,如人員素質。因此,不可能對上面所列出的產品和過程方面的因素盡數(shù)進行維護性評估,需要權衡要素的重要程度和可度量性進行對象與指標的選取。這里把握兩個原則:一是數(shù)量不宜過多,要能突出主要因素(如文檔和程序的易理解性)的影響;二是保證在可承受的度量成本范圍內可通過主觀或客觀的手段進行度量,數(shù)據(jù)收集方便,可度量。
考慮到維護性評估的目的是“檢驗軟件產品(文檔、源代碼)是否達到維護性技術標準、是否需要采取措施提高軟件維護性”,這里將軟件產品中的文檔、源代碼以及軟件實現(xiàn)(同時檢查軟件文檔和源代碼,以全面評估軟件)作為本文維護性評估的研究對象,如表1所示。
表1 若干研究對象的軟件維護性評估指標
本文借鑒美國空軍軟件維護性評估手冊,選取可描述性、模塊化、可擴展性、簡易性、結構化、可追溯性、一致性、可測試性和約定性這9項維護子特性作為對軟件文檔、源代碼(模塊源代碼和計算機軟件單元(CSU)源代碼)以及軟件實現(xiàn)進行評估的指標,如表1所示。下面逐項對這些指標進行分析。
1) 可描述性:當軟件文檔或源代碼中包含需求、假設、約束、輸入/輸出、組件及其關系、外部接口、修訂狀態(tài)等重要信息時,可以說文檔或源代碼具有可描述性。
2) 可追溯性:可以在文檔之間、文檔與源代碼之間進行特定信息的查找時,稱軟件文檔具有可追溯性。
3) 結構化:當可以快捷、方便地定位信息時,稱軟件文檔具有結構化這一特性。
4) 簡易性:源代碼的簡易程度直接關系到程序的可理解性。源代碼采用的技術和結構越簡單,維護人員對其理解越容易,系統(tǒng)的維護性越好。因此,可以說簡易性是軟件維護性的精髓。
5) 模塊化:由于小模塊(代碼塊)比大的或復雜的模塊更易于理解,因此對由大量獨立模塊組成的軟件進行維護和管理要容易許多。
6) 一致性:當軟件源代碼采用一致的注釋、術語和符號時,可以說源代碼具有一致性,這將有助于維護人員對源代碼進行不同抽象層次的理解。
7) 可測試性:如果源代碼中還有錯誤識別和錯誤處理的語句,稱源代碼具有可測試性。
8) 可擴展性:指在一定時間段內,對軟件源代碼的數(shù)量、類型、方法進行修改或者增刪的容易程度。
9) 約定性:采用工程化的約定有助于對軟件的理解。該特性要求軟件產品使用統(tǒng)一的標記、術語和符號,并保持這些約定符號在文檔和源代碼中的一致性。
對于不同的評估對象(軟件文檔、模塊源代碼、CSU源代碼、軟件實現(xiàn)),軟件維護性評估的側重點是不一樣的。舉例來說,對文檔進行維護性評估側重于檢查文檔的可描述性,而對源代碼進行評估則主要審查代碼的簡易性[8-9]。相同的軟件維護性評估指標反映在不同軟件對象上的評估準則也是不一樣的。
1) 對軟件文檔進行維護性評估時,主要根據(jù)可描述性、可追溯性和結構化三項指標對文檔的格式和內容進行審核。理想情況下,軟件維護性評估是貫穿于軟件生命周期過程中的。不同階段(如需求分析、設計、編碼、測試、驗收、交付使用等)所實施的軟件維護性評估的評審文檔對象是不一樣的,如需求分析階段根據(jù)系統(tǒng)/子系統(tǒng)規(guī)格說明、系統(tǒng)/子系統(tǒng)設計說明、軟件需求說明、接口需求說明等進行維護性評估,而測試階段將軟件測試計劃、軟件測試說明、軟件測試報告等作為評估對象。通常將文檔印制成冊供維護性評估專家審核,有時也會采取網(wǎng)上評審的方式。
2) 對模塊源代碼進行維護性評估時,主要審查模塊源代碼的格式與內容,以及模塊相關文檔和源代碼的一致性。模塊源代碼的維護性評估指標主要有可描述性、可追溯性、簡易性、模塊化、一致性、可測試性和可擴展性。
3) 對CSU源代碼進行評估時,主要審查CSU源代碼的格式和內容,以及評估CSU相關文檔和源代碼的一致性。CSU源代碼的維護性評估指標主要包括可描述性、可追溯性、簡易性、模塊化、一致性和可擴展性。評估是按照由簡單到復雜、由粗略到具體的原則展開的,例如,在評估人員審閱CSU內部源代碼之前,應事先評審CSU的注釋塊及其接口。另外,CSU相關參數(shù)、數(shù)據(jù)結構等也是軟件維護性評估的對象。
4) 對軟件實現(xiàn)進行軟件維護性評估用于發(fā)現(xiàn)那些只有同時檢查文檔和源代碼才能發(fā)現(xiàn)的軟件維護性問題,以保證軟件產品得到全面評估。軟件實現(xiàn)的維護性評估指標包括簡易性、模塊化、可擴展性和約定性。有些維護性評估指標準則看似與源代碼中的評估準則相同,但對象不同,這里是對整個系統(tǒng)提出的,而非單獨的模塊。
由于篇幅有限,僅列出了對模塊源代碼進行軟件維護性評估的準則,如表2所示。
按照表2中所列的模塊源代碼的軟件維護性評估準則,評估人員可以根據(jù)軟件與指標的符合程度通過定性專家打分或者定量人工/工具度量的方式給出軟件模塊源代碼可描述性、模塊化、可擴展性、簡易性、可追溯性、一致性、可測試性這七項維護性指標的分數(shù)。對于每個問題的特殊情況評估人員要進行書面說明,并給出針對性的修改建議。然后,根據(jù)重要程度分別分配給模塊源代碼中可描述性、模塊化、可擴展性、簡易性、可追溯性、一致性、可測試性這七項維護性評估指標其相應的權重。最后,對各指標的維護性分數(shù)進行加權處理,即可得出模塊源代碼的維護性分數(shù)。采用同樣的方法可分別計算出軟件文檔、CSU源代碼和軟件實現(xiàn)的維護性分數(shù)。對軟件文檔、模塊源代碼、CSU源代碼和軟件實現(xiàn)的維護性分數(shù)進行加權綜合,即可計算得出軟件的整體維護性水平。
表2 模塊源代碼的維護性評估準則
指標說明評估準則可追溯性要求源代碼的描述文檔之間以及文檔和模塊源代碼之間都有可追溯性信息,以實現(xiàn)信息在頂層需求到底層詳細實現(xiàn)之間的追溯。1. 文檔中包含對源代碼的詳細描述,以方便模塊追溯2. 文檔中包含對數(shù)據(jù)項的可追溯性描述信息,以方便模塊追溯3. 數(shù)據(jù)庫文檔中包含對數(shù)據(jù)庫數(shù)據(jù)項的可追溯性描述信息,以方便模塊追溯簡易性簡單的模塊更易于理解??蓮哪K規(guī)模、數(shù)據(jù)結構復雜度、控制結構復雜度、編碼復雜度等方面度量模塊的簡單性。1. 模塊中可執(zhí)行語句的行數(shù)適當2. 模塊中操作符的數(shù)量適當3. 模塊包含大量的控制分支語句4. 模塊中使用的嵌套語句可以控制5. 模塊中使用的大量數(shù)據(jù)項易于處理6. 模塊中使用的大量復合數(shù)據(jù)結構易于處理7. 模塊中使用的復雜公式易于處理8. 模塊內不存在技巧性的程序設計9. 模塊不包含外來代碼10. 模塊運用大量易處理的機器相關技術或語言進行擴展模塊化程序由大量相互獨立的簡單模塊構成,且模塊具備低耦合、結構化、功能內聚和可控制等特性。1. 模塊與其它模塊低耦合2. 模塊高內聚3. 模塊內功能上相關的數(shù)據(jù)元素被組織為邏輯數(shù)據(jù)結構4. 模塊中未過多使用全局變量一致性要求源代碼文檔、代碼注釋塊和源代碼保持一致。1. 注釋塊信息與相關的源代碼一致2. 文檔的輸入/輸出信息與源代碼一致3. 文檔中模塊控制流、數(shù)據(jù)流和數(shù)據(jù)處理信息與源代碼一致可測試性源代碼具備錯誤識別和錯誤精確處理的邏輯。1. 對非法輸入進行適當處理2. 對模塊內可能發(fā)生的錯誤進行適當處理可擴展性在一定時間內,能夠快捷、方便地對模塊源代碼的數(shù)量和類型等進行增刪或者修改。1. 模塊內常量和數(shù)據(jù)結構的維數(shù)要參數(shù)化
在對軟件維護性影響要素進行深入剖析的基礎上,文章把握突出重要因素的作用以及指標可度量、可評估兩項原則,選取9項軟件維護特性評估指標(可描述性、可追溯性、結構化、簡易性、模塊化、一致性、可測試性、可擴展性和約定性)對軟件文檔、模塊源代碼、CSU源代碼和軟件實現(xiàn)進行維護性評估,針對不同評估指標分別提出了相應的評估準則,為進一步的軟件維護性定性或定量評估指明了方向。今后,本課題還需在軟件維護性評估指標權重的計算方法上進行深入研究。