淺談軟件度量

淺談軟件度量

時間:2004-11-17 15:20:43 來源:中國金融電腦雜誌社 作者:周 凡 陸 斌
 

 

隨着金融信息化總體水平的提升,軟件工程的各種開發技術被不斷引入這個行業。“如何衡量軟件技術的有效性?如何評價所採用的軟件開發過程模式的合理性?如何確認最終的軟件產品是否符合既定的需求和質量標準?”是金融軟件項目管理中的常見問題。
 
回答這些問題的是一門新興的學科——軟件度量。通過度量,可以獲得軟件評估的依據、跟蹤軟件開發的進展情況、評估程序代碼的質量,幫助我們確定最合適的實施方案。

一、爲什麼要度量
 
Lord Kalvin曾說過:“當你能夠度量你所談論的事物,並且用數字把它表達出來,那你對此事物已經有所瞭解;當你無法度量它,則你的知識並不足以瞭解它”。
 
人們通常藉由“比較”來了解事物。比如,這個項目規模比那個項目大,這個人工作效率比那個人高。但是,僅僅這樣是不夠的。我們還要知道,這個項目規模爲什麼比另一個項目規模大?大多少?優秀程序員和一般程序員到底有多大的差異?於是,我們通過分析“程序行數” 的大小,來判斷程序A與程序B的規模差異;通過分析“每小時發現的錯誤數”的多少,來衡量測試員的工作效率。
 
度量是經驗世界到規範的數學世界的映射。我們用數學表示法來描繪和分析實體與其屬性,並使用這些數字符號,來揭露出更多的在直接觀察時不易發現的規律和特徵。通過計量某一個實體的特徵,我們可以更深入地瞭解和利用它們。軟件工程領域也不例外。
 
軟件度量就是經過計量軟件開發過程、軟件產品和所投入資源的特定屬性的數值,再通過整理、分析和比較所產生的結果,來預測或評估軟件開發項目,進而達到軟件工程的主要目標——在預定的時間與資源預算下,開發出合乎用戶需求的軟件系統。
 
首先,度量有助於我們理解軟件開發和維護過程。我們總是通過分析和評價當前情況,確定未來的目標和行爲基線。在這種情況下,度量使得過程和產品的各方面變得“可視化”,讓我們更好地理解我們所採取的活動和活動對象之間的關係。
 
其次,度量讓我們能夠加強對項目的管理和控制。在我們深入理解了軟件開發中各項活動和產品之間的關係的基礎上,我們可以更好地預測項目的進展情況和可能的變更,建立合理的項目計劃,調整項目中的活動,以達到項目目標。比如,我們通過監測代碼的複雜度,可以判斷哪些模塊超過了可接受範圍,進而對這些模塊採取一定的複覈措施來確保其正確性。
 
另外,度量鼓勵我們改進我們的過程和產品。比如,軟件能力成熟度模型(CMM)就是這樣的一個度量體系。


二、軟件度量的幾個術語
 
實體(Entity):在度量過程中抽象出的觀察目標,它可以是一個對象(如一個人或者一個程序模塊)或者一次事件(如一個軟件項目的測試階段)。
 
屬性(Attribute):實體的某種特徵或性質,我們通過它來描述、區分不同的實體。每個實體的屬性又可以分爲內部屬性和外部屬性,其中內部屬性可以通過直接度量得到,而外部屬性必須通過間接度量得知。對於一段程序而言,代碼長度就是它的一項內部屬性,而可維護性、可靠度等則是外部屬性。
 
度量(Measurement):按照一定的過程定義,給軟件實體屬性賦值的過程。
 
度量指標(Metric):已定義的測量方法和測量尺度,軟件環境中指定對象的屬性的量化表現。
 
度量值(Measure):在實體上採集到的數據,是對軟件產品、過程的特徵量化計數的結果。
 
軟件工程的實體分爲三大類:
 
①過程(Process):軟件開發中活動的集合。不同的軟件開發模式中,所採用的流程和活動也不一樣;
 
②產品(Product):軟件過程活動的結果,可以是一個程序、一個軟件文檔或其他任何交付物;
 
③資源(Resource):實施這些活動所需要的對象,可能是人力、設備、時間等。


三、軟件度量指標的選取
 
軟件度量的目的不是爲了收集數據。當我們在軟件開發管理過程中進行度量活動時,我們首先需要弄清以下問題:爲什麼需要度量?什麼東西需要度量?誰參與度量活動?什麼時候度量?在哪裏進行度量?
 
我們可以用很多不同的方式來對目標進行度量。比如度量軟件規模時,我們可以計算程序行數,也可以計算功能點數,或者計算對象和方法數。不同的處理方式,得到的答案也不一樣。因此,必須針對特殊的目標和問題來選擇合適的度量指標。
 
類似於軟件過程,我們把軟件度量活動的集合叫做軟件度量過程,它可能由這樣一些具體內容構成:定義度量目標;制定度量計劃;進行度量;收集數據;分析數據並整理經驗。在整個過程中,爲保證度量活動的有效性,可以遵循以下步驟(GQM方法)選取度量指標。
 
第一,確定目標(Goal)。合理的目標通常是一項活動能否成功的關鍵。軟件度量活動也需要明確的目標,包括:研究對象、研究意圖、關注目標,以及出發立場及相關環境;
 
第二,提出問題(Question)。針對既定的研究目標,提出一系列問題,這些問題描繪出達到目標所需要關注的各個方面;
 
第三,定義度量指標(Metric)。根據問題,選擇相應的度量指標。
 
例如,如果我們關注的目標是“從項目管理者的角度出發,改進變更請求的處理過程”,那麼可能提出這樣的相關問題“當前的變更處理速度是多少?”、“處理過程改進了沒有?”,進而採用“平均週轉時間”以及“標準偏差”等度量指標來回答第一個問題,採用“當前平均週轉時間/上年平均週轉時間”來回答第二個問題。


四、常用軟件產品度量技術和指標
 
任何度量活動都需要遵循一定的程序和規則,規則有助於度量的一致性,同時也爲度量所取得的數據的分析提供一致的準則。一些經典的軟件度量技術,對於我們在應用軟件開發過程中實施量化管理有着非常重要的參考價值和借鑑意義。
 
這裏,讓我們來看看對軟件產品內部屬性的度量。
 
每一個軟件產品都是一個物理實體,因此,也可以使用“尺寸”進行描述和衡量。軟件的“尺寸”由3個特徵體現:長度、複雜度、功能性。
 
1.長度
 
軟件長度是軟件的物理屬性。當我們面對諸如“我們開發的最大/最小/平均項目是哪一個?我們的最大/最小/平均模塊長度是多少?我們的軟件開發生長率如何?模塊長度是否和程序缺陷數量有關?”問題的時候,作爲一個最基本的參照系,“長度”是分析解答問題的必要依據。
 
(1)代碼行數(LOC)
 
度量程序長度,最直接、應用最普遍的度量指標就是LOC。通過對程序行簡單的計數,我們可以得到代碼行數的度量值。它衡量的是軟件的物理規模——長度,此項指標與所採用的程序設計語言類型無關。不過,對計數對象的選擇和如何計數必須給予充分的重視,因爲對空行、註釋行、數據定義和變量申明等情況的不同處理方式,度量結果可能出現5倍的差異。
 
(2)Halstead方法
 
Halstead度量方法不僅僅度量了程序長度,還描述了程序的最小實現和實際實現之間的關係,並據此闡釋程序語言的等級高低。它以程序中出現的操作符和操作數爲計數對象,以它們的出現次數作爲計數目標來測算程序容量和工作量。
 
任意程序P,總是由操作符和操作數通過有限次的組合連綴而成。P的符號表詞彙量η=η1+η2(η1:惟一操作數數量,η2:惟一操作符數量)。設N1是P中出現的所有操作數,N2是程序中出現的所有操作符。度量指標如下:
 
程序長度N=N1+N2
 
程序容量V=N×log2η
 
當我們編寫程序的時候,代碼體積會因實現方式和編寫者的習慣有所差異,還會因所採用的程序語言(比如保留字的數量,語句的結構等)而有所不同。因此,又有如下標準:
 
程序語言等級L=V/V(V是程序實現時可能的最小代碼容量)
 
編寫程序的效率E=V/L
 
Halstead的度量分析指出,在軟件開發中,把系統劃分爲單獨的模塊所帶來的實質性利益,在於短代碼的難度要比長代碼低。
 
2.複雜度
 
20世紀70年代開始,軟件系統被認爲已經變得極其複雜。經驗告訴我們,出現錯誤的可能性隨着軟件複雜程度的增加而增加,越複雜的軟件就越難於理解和維護。
 
由於觀察的出發點不同,對複雜度的分析涉及若干方面:問題的複雜度、認知的複雜度、算法的複雜度以及程序結構的複雜度。其中,程序複雜度度量的是軟件的內部屬性,可通過McCube方法度量。
 
McCube的度量方法是基於對程序拓撲結構複雜度的分析。在軟件工程活動中,廣泛使用於幾個方面:作爲程序設計和管理指南;作爲測試的輔助工具;作爲網絡複雜性的一種度量方法。
 
McCube方法包括若干項度量指標。常用的有如下幾項:
 
(1)圈複雜度(Cyclomatic Complexity)
 
圈複雜度是用來衡量一個模塊判定結構的複雜程度。
 
在程序控制流程圖中,節點是程序中代碼的最小單元,邊代表節點間的程序流。一個有e條邊和n個節點的流程圖F,其圈複雜度爲
 
VF=e-n+2。
 
圈複雜度越高,程序中的控制路徑越複雜。McCube指出,典型的程序模塊的圈複雜度爲10。
 
(2)基本複雜度(Essential Complexity)
 
基本複雜度是用來衡量程序結構化程度的。
 
如果流程圖G中的結構化子圖的數量是m,則其基本複雜度爲
 
EVF=VF-m
 
當基本複雜度爲1,這個模塊是充分結構化的;當基本複雜度大於1而小於循環複雜度,這個模塊是部分結構化的;當基本複雜度等於循環複雜度時,這個模塊是完全非結構化的。
 
(3)模塊設計複雜度(Module Design Complexity)
 
模塊設計複雜度用來衡量模塊判定結構,即衡量模塊與模塊的調用關係。
 
從模塊流程圖中移取那些不包含調用子模塊的判定和循環結構時求得的循環複雜度就是模塊設計複雜度。
 
3.功能性
 
通過對需求說明書的分析,我們可以使用“功能點”來對軟件產品提供給用戶的功能加以度量。程序長度和複雜性都是對程序的事後分析,軟件功能性卻可在軟件開發的初期進行分析,這對我們預測項目規模,規劃項目時間表非常有幫助。軟件功能性特徵可使用Albrecht方法度量。

Albrecht的度量方式是先按需求描述對功能點計數,得到未調整功能點,再按系統涉及的技術功能點對該數值進行修正。
 
按照軟件表示技術,一項需求可描述爲若干外部輸入、外部輸出、外部請求、外部文件、內部文件的集合。對集合中每一子項進行計數,並按其複雜性指派相應的權重,可得未調整功能點UFC:
         
  
任何需求的實現,都與一定的技術有關。Albrecht定義了14項技術特性,對應每一特性有一個從0到5的關聯值Fi(0說明此項技術特性與功能實現毫無關係,5說明此項技術特性是系統建立必不可少的組成部分)。一項需求的技術複雜性特性值TCF即由這些評分合成,公式如下:
              
TCF=0.65+0.01Fi
 
最後,功能點的度量值FP,爲以上二者的乘積:
              
EP=UFC×TCF
 
Fred S.Roberts說過:“高度發展的學科和發展較慢的學科,造成重要差異的原因之一就在於事務可以被度量的程度。”
 
日益規範的項目管理活動中,我們需要精確的數字來支持我們的決策,軟件度量就是這樣一個破除軟件開發過程“混沌”狀態的利器。它告訴我們項目的成敗(項目是否在指定的時間和開支範圍內完成);過程的效率(附加的評審活動在多大程度上改善了產品質量);資源的充分程度(有經驗的程序員與普通程序員的工作效率有多少差距)。引入量化管理,強化量化管理,可以使項目管理知識體系發揮更大的作用。
 
我們應該記住軟件度量領域的經典語句:“我們不重視我們不度量的東西,我們對不度量的東西不能有所作爲。”

 
發佈了12 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章