徐建軍,陳衛華,王 浩,候 斌
(中廣核工程有限公司核電安全監控技術與裝備國家重點實驗室,廣東 深圳 518172)
“十四五”以來,我國企業數字化轉型被提升到重要的戰略位置,數字經濟和數字產業發展速度正在加快。新形勢下,我國軟件業界不斷通過提升管理水平主動轉型,圍繞著軟件度量構建的進度、成本、質量、效率等指標,持續改進軟件開發過程、提升軟件產品的交付效率和交付質量。在軟件業務規模快速發展的同時,我國軟件行業的管理水平依然相對落后,綜合競爭能力與軟件產業強國相比仍相對較低。據近年發布的中國軟件行業研究報告,我國軟件行業還存在項目成本高、產品交付周期難以控制等問題。尤其是作為項目成本評估的軟件工程規模度量、費用估算標準化問題,一直沒有得到科學有效的解決。其主要原因是缺乏標準化、智能化的軟件管理手段以及過度依賴人工經驗。
軟件項目的規模度量和過程控制一直都比較困難。軟件具有不可見性、抽象性和知識密集型的特點。與硬件相比,軟件沒有明顯的生產制造階段,屬于非實物性的腦力勞動。隨著企業對軟件需求的不斷發展,業界曾運用預算倒推法、工作分解法、源代碼行法以及文檔頁碼數等評價方法,開展軟件規模度量和成本估算[1]。但以上方法大都嚴重依賴評估人員的工作經驗和能力,且存在軟件開發語言、開發工具、應用環境等方面的差異。客觀來看,過度依靠人工方式度量軟件規模,不可避免地會給成本估算帶來不確定性和效率低下的問題。鑒于此,基于專業和普適的模型和規范,找到1種科學、合理的軟件規模度量和成本自動估算方法尤顯必要和緊迫。
國內外對軟件項目的開發質量和進度控制已有較深入的研究。美國卡內基梅隆大學軟件工程研究所在20世紀80年代就提出了能力成熟度模型集成(capability maturity model integration,CMMI),通過軟件度量幫助軟件企業和軟件項目提高項目管理水平和改進軟件質量[2]。2018年,CMMI研究院正式發布CMMI 2.0中文版,為軟件項目敏捷過程提供直接方法指導。周伯生等對CMMI進行了初次研究,并提出了軟件度量模型構建方法和質量模型構建方法[3]。楊勛姮等嘗試利用軟件自動化技術開展軟件過程和質量控制的研究[4],設計了輔助實施質量保證的自動化軟件管理工具。冀建偉對相關法規標準,以及軟件全過程質量控制的方法開展研究[5]。
本文在長期實踐的基礎上,提出了基于軟件系統用例與功能點相結合的軟件成本自動計算方法。該方法通過功能點數的自動計算,利用人工智能、機器學習、自然語言處理等方法,自動從需求文檔、技術規范等文本抽取、識別功能點數以提高功能點計數的準確性、提升軟件規模和費用估算的智能化水平和效率。該方法具有一定的創新性和較高的應用價值。
業界傳統的軟件規模度量方法有專家決策法、類比估算法、源代碼行法、功能點估算法等[6]。這些估算法都有各自的適用范圍和優缺點。專家決策法是在專家個人和集體判斷的基礎上形成的1種相對主觀的估算方法。該方法的特點是簡單、直觀,可直接依靠專家團隊的集體經驗,得出軟件開發成本價格。類比估算法是從軟件項目或產品歷史庫中找到與當前待評估軟件項目的應用領域、運行環境、復雜度、規模盡可能一致的同類項目,通過1套行之有效的評價與分析機制,得出估算成本。類比估算法雖然簡單、直觀,但其前提是必須要建有相對完整、可靠的軟件項目數據庫;其不足是對缺乏歷史參考數據的嶄新項目的估算有難度。源代碼行法是對軟件項目各功能模塊的源代碼長度進行累計。源代碼行法雖然簡單、直觀,但代碼行必須從技術開發的角度估算,因此非專業技術人員很難理解和估算[7]。
功能點估算法是近年來業界比較流行的1種軟件規模度量方法。該方法通過識別軟件需求的內外部邏輯文件及其功能來評估軟件的規模。相比專家決策法和類比估算法,功能點估算法在估算方法上更具客觀的標準依據,可有效避免對評估人員技術背景的影響[8]。然而,該方法還需通過人工方式計算實現。隨著軟件規模的增大和項目數量的增多,傳統人工估算法的統計效率亟待提高,不能與軟件工程智能化發展趨勢相適應。用例與功能點相結合的軟件規模度量法,正是在借鑒如上常用估算法優劣勢的基礎上,基于實踐提出的1種自動估算方法。
用例是軟件系統參與者與系統之間一系列交互行為序列的集合。以用例為核心的需求模型如圖1所示。

圖1 以用例為核心的需求模型
所有用例的集合就組成軟件系統需求全集。用例代表了用戶的需求,其數學定義為UC=(ACTOR,CON,AHE,{PRO},EXT,RES,REG,REQ)。其中:UC代表圖例;ACTOR代表軟件系統中完成一系列任務的各類角色;CON代表基本事件過程的觸發條件;AHE代表基本事件過程的前提條件;{PRO}代表基本事件集合;EXT代表異常;RES代表后果;REG代表業務規則;REQ代表技術需求。
基于用例來定義系統軟件需求,實際上就是以用例需求為核心,通過描述實現該用例的業務邊界、業務規則、功能要求、性能要求、界面規范及接口交換等諸多功能,完成各類角色的具體任務和目標[9]。
對用例進行功能點計算,需依據事先確定好的標準,計算出系統用例中每類功能單元所包含的功能點數量。依照國際功能點用戶組織(International Function Points User’s Group,IFPUG)標準,目前功能點計算涉及5個功能單元。其中:2個為數據功能單元,分別為內部邏輯文件(internal logical file,ILF)和外部接口文件(external interface file,EIF);3個為事務功能單元,分別為外部輸入(external input,EI)、外部輸出(external output,EO)和外部查詢(external query,EQ)[9]。
傳統的用例功能點估算由人工完成。為提高計算效率,本文估算方法可由計算機對每個用例模板文檔進行遍歷自動計算。功能點計算步驟如下。①確定用例功能點估算范圍與邊界。②計算功能單元ILF、EIF、EI、EO和EQ出現的次數。③逐一計算出每個功能單元每次出現的復雜度值。④由復雜度值確定每個功能單元出現的權重。⑤計算得到未校正的功能點數Ufp。根據以上步驟,可得未校正的功能點數Ufp計算式為:
Ufp=NEIWEI+NEOWEO+NEQWEQ+NILFWILF+
NEIFWEIF
(1)
式中:Ufp為未校正的功能點數;NEI、NEO、NEQ、NILF、NEIF分別為EI、EO、EQ、ILF和EIF出現的次數;WEI、WEO、WEQ、WILF、WEIF分別為EI、EO、EQ、ILF和EIF的復雜度加權因子。
經整理,式(1)可簡化為:
(2)
式中:Ni,j為第i個功能單元在復雜度j時的出現次數;Wi,j為第i個功能單元在復雜度j時的加權因子。
根據IFPUG公布的相關標準,軟件系統的復雜程度可根據系統特征的性能復雜度、界面復雜度、代碼復用要求、系統應用類型、開發語言類型等14項影響因子逐個分析賦值,再按IFPUG公布的調整系數求和式(3),計算得出調整系數Vaf。
(3)
式中:Vaf為求和后的調整系數;N為確定的實際系統性能特征個數,取值為1~14;Ni為第i個影響因子的復雜程度。
軟件系統的影響因子影響程度,可按每個影響因子的復雜程度賦值0~5。其中:0為無影響或未出現;1為偶發影響;2為輕度影響;3為一般影響;4為重影響;5為極重影響。需要強調的是,在利用14項影響因子加權調整功能點計算時,可根據具體軟件系統的特殊情況,適應性地增加新的影響因子。權值的賦值范圍調整可以根據不同的軟件系統用線性插值法獲取[10]。下面以其中軟件應用類型、開發語言類型2個影響因子為例進行說明。本文通過參考中國軟件行業基準數據分析報告(CSBMK-202010),綜合應用類型、開發語言類型特點和實踐經驗,獲得相應類型的參考調整系數權值。表1為應用類型及應用范圍調整系數參考表。

表1 應用類型及應用范圍調整系數參考表
表2為開發語言類型及其調整因子參數表。

表2 開發語言類型及其調整因子參數表
本文在計算出Ufp的基礎上,再與求得的Vaf相乘,計算得到調整后功能點數FP,也就是軟件的規模。
FP=Ufp×Vaf
(4)
在計算出功能點數的基礎上,根據功能點耗時率計算出工作量。
Ae=Fp×PDR
(5)
式中:Ae為工作量;PDR為功能點耗時率,人時/功能點。
本文在計算出工作量的基礎上,根據人月成本,計算出軟件開發費用P。
(6)
式中:F為人月成本,元;176為按每月22 d、每天8 h計算得出的工作小時數,h。
設計文檔起草發文模塊用例如表3所示。
本文以核電設計文檔管理系統的1個用例規模度量為例,利用語義分析和文本挖掘技術,自動識別并抽取系統需求文檔用例表中功能點數,計算出軟件規模和價格。1個完整的軟件系統需求可以由諸多用例集合組成。而每個用例都可以用1個用例模板表來完整描述。只要通過軟件系統逐個對用例表中的功能點數進行標注和統計,就可以通過遍歷把整個軟件系統功能點數計算出來,再通過轉化實現軟件系統規模和價格測算的自動化和智能化。
軟件功能點計算智能化主要是利用語義分析及文本挖掘技術抽取用戶需求文本中的用例表,構建文本與功能點映射關系并自動計算功能點數,度量出軟件規模,從而計算費用[11]。功能點標注和計算應有文本自動識別讀取功能,且在用例表相應位置予以標注,并根據計算式自動計算功能點數。功能點自動估算算法如下。
偽代碼算法:[利用用例模板表計算功能點]
處理步驟A0:導入一張結構化用例表;
do{將用例添加到系統用例集;
do{標注用例表中每個類;
If(若該類為ILF)
{則添加到ILF集,并標注;}
else{則添加到EIF集,并標注;}
do{對事件的行為進行識別:
(1)若為EI,則添加到EI集,并標注;
(2)若為EO,則添加到EO集,并標注;
(3)若為EQ,則添加到EQ集,并標注;
} while (最后一個行為);
do{確定ILF集中的每個類:
(1)計算為該類的一個DET;
(2)計算為該類的一個RET;
(3)確定復雜度值和影響因子;
} while (最后一個ILF類);
do{確定EIF集中的每個類:
(1)計算為該類的一個DET;
(2)計算為該類的一個RET;
(3)確定復雜度值和影響因子;
} while (最后一個EIF類);
do{計算事務的復雜度:
累計EI、EO、EQ和RET、DET總復雜度值和影響因子;
} while (最后一個行為);
} while (最后一個類);
} while (遍歷最后一張用例表);
處理步驟A1:求和功能點數,計算出工作量和費用。
根據以上算法,可自動計算出設計文檔起草發文模塊用例校正后的功能點數,遍歷全部設計文檔管理系統用例集,累加計算出整個用例集的功能點數。
根據式(4),通過功能點數求出軟件系統的工作量Ae,再根據式(5)計算出軟件成本。功能點耗時率(PDR)和人月成本(F)2個常量值,可參考軟件行業普遍采用的平均水平,按功能點耗時率7.12人時/功能點、人月成本2.85萬元/人月進行計算。以上算法全部過程均可通過軟件代碼算法實現。計算結果如下。
Ae=Fp×PDR=512×7.12=3 645人時
為檢驗用例功能點自動計算方法的準確性,本文將計算結果與軟件系統實際工時進行比較。系統記錄實際工時數如表4所示。
項目軟件系統按用例功能點法自動計算所得工時合計為3 645人時,折算成軟件成本為59.02萬元,準確率為80.02%。項目事后實際記錄工時4 544人時、實際綜合成本75萬元,準確率為78.69%。
通過對比可知:從軟件規模看,通過功能點自動計算得到的工作量,與實際記錄的工作量數據相比準確度較高,準確率達80%左右,偏差為20%左右,遠小于接受范圍偏差(30%);從軟件成本造價看,通過功能點自動計算的工時成本為59.02萬元,占項目實際造價成本75萬元的78.69%,均在可接受范圍內。根據實際經驗,功能點估算的準確性主要依靠系統需求的準確性及完整性,因此本文估算方法的計算結果準確性依賴于用例表描述的準確性和完整性。所以在實際軟件度量計算中,可根據偏差不斷調試影響因子權值,通過迭代持續縮小估算偏差,并為以后的項目估算提供歷史經驗數據。
用例功能點軟件成本自動計算方法具有較高的應用價值。該方法以國家標準為依據,從用戶需求出發,對用例的功能點進行識別和計算。該方法明確且可量化,結果確定性強。從普適性方面來看,該方法適用于各種不同應用類型的軟件項目,可選擇與之相對應的調整系數和加權因子,具有應用范圍的普遍性。從可迭代方面來看,該方法可根據軟件實際評估中遇到的問題,不斷調整和優化方法和指標系數。隨著技術和業務的高速發展,用例功能點估算法應用場景會越來越多,包括大數據技術結合的功能點度量、云平臺上的軟件功能點度量等。這將進一步提升軟件過程控制的效率和智能化水平。