范松豪, 王斌, 徐敏
(工業(yè)和信息化部電子第五研究所華東分所, 江蘇 蘇州 215011)
近年來, 隨著軟件行業(yè)的快速發(fā)展, 軟件開發(fā)成本度量的重要性也日益增加。 在軟件開發(fā)成本度量方面, 國家和地方最近幾年也發(fā)布了一些標(biāo)準(zhǔn)和規(guī)范, 如GB/T 36964—2018 《軟件工程 軟件開發(fā)成本度量規(guī)范》[1]。 軟件開發(fā)成本在項目中所占的比重也越來越大, 為了保證項目在實施期間能夠順利地完成, 在預(yù)算及招投標(biāo)期間就應(yīng)該做好軟件開發(fā)成本評估工作, 為項目的預(yù)算提供強(qiáng)有力的支撐和依據(jù)。 因此, 本文對軟件開發(fā)成本度量進(jìn)行了研究。
隨著軟件和信息技術(shù)服務(wù)業(yè)的快速發(fā)展, 軟件產(chǎn)品和軟件密集型信息系統(tǒng)正在越來越多地應(yīng)用于各類企業(yè)和個人。 特別是在企業(yè)上云政策的推動下, 傳統(tǒng)硬件的采購越來越少, 軟件開發(fā)成本的支出越來越多。 軟件成本度量結(jié)果可作為項目開發(fā)預(yù)算的重要參考依據(jù)。 因此, 軟件成本度量對系統(tǒng)的開發(fā)、 測試和運(yùn)維有著重要的意義。
軟件規(guī)模測量是開展軟件量化工作的基礎(chǔ)和關(guān)鍵, 可用于量化過程的效率和有效性,管理軟件成本和相關(guān)系統(tǒng)。 目前, 常見的軟件規(guī)模測量方法主要包括下面5 種[2]。
a) 功能點分析法是最常用的軟件規(guī)模測量方法, 主要是根據(jù)功能來測量軟件規(guī)模。 功能點分析法現(xiàn)在主要有功能點估算(IFPUG)、 軟件規(guī)模估算(MkⅡ)、 軟件規(guī)模度量(COSMIC)、 多端元混合像元分解 (NESMA) 和功能規(guī)模測量(FiSMA) 5 種方法和相應(yīng)的國際標(biāo)準(zhǔn)。
b) 用例點(UCP) 估算方法是一種基于用例估算項目規(guī)模及工作量的方法。 UCP 測量方法主要是依靠已識別的用例和執(zhí)行者, 參照它們的復(fù)雜程度來劃分計算用例點。
c) 故事點主要用來描述用戶故事、 功能或工作大小。 使用這種方法進(jìn)行估算的時候, 我們需要設(shè)定一個值。
d) 對象點(Object Point) 估算法基于加權(quán)的概念, 將不同的對象賦予對應(yīng)的對象點數(shù)值并求和。 它包括3 個基本對象類型: 界面、 報表和組件。 這3 類對象的復(fù)雜性程度分為簡單、 適中、復(fù)雜3 個級別, 其復(fù)雜性程度根據(jù)界面、 報表中數(shù)據(jù)源的數(shù)量及來源進(jìn)行評估, 3 類對象的總和就是系統(tǒng)的對象點數(shù)。
e) 軟件源代碼行(SLOC) 測量方法是通過源代碼行數(shù)量來表示軟件規(guī)模。 目前主要有物理SLOC 和邏輯SLOC 兩類源代碼行測量方式, 物理SLOC 指的是文本形式的源代碼行數(shù), 需要去除注釋行, 邏輯SLOC 是指可執(zhí)行語句數(shù)量。
軟件規(guī)模測量方法對比如表1 所示。
表1 軟件規(guī)模測量方法對比
功能點分析法是最常用的軟件規(guī)模測量方法,比其他度量方法更為客觀。 主要有IFPUG、 MkⅡ、COSMIC、 NESMA 和FiSMA 5 種方法, 如圖1所示。
圖1 5 種方法和相應(yīng)的國際標(biāo)準(zhǔn)
以上這5 種功能點分析法的計算規(guī)則各不相同, 在應(yīng)用方面也各有特點。 表2 和表3 分別從技術(shù)角度和用戶角度對這5 種方法進(jìn)行比較。
表2 功能點分析法對比(技術(shù)角度)
表3 功能點分析法比較(用戶角度)
通過對比可以看出, IFPUG 方法和NESMA 方法整體優(yōu)勢較為明顯, 下文中筆者會重點對這兩種方法進(jìn)行講解。
2.1.1 IFPUG 方法
IFPUG 方法[3]從用戶對應(yīng)用系統(tǒng)功能的需求出發(fā), 對應(yīng)用系統(tǒng)的事務(wù)功能和數(shù)據(jù)功能需求進(jìn)行分析。 其中, 事務(wù)功能又分為3 種子類型: 外部輸入(EI)、 外部查詢(EQ) 和外部輸出(EO); 數(shù)據(jù)
功能分為內(nèi)部邏輯文件(ILF) 和外部接口文件(EIF)[2]。 這幾個概念聽起來可能會有點抽象, 下面筆者將用便于理解的描述對其進(jìn)行講解。
事務(wù)功能是用戶能夠看到的, 主要包括EI、EO 和EQ。 EI 一定會穿越系統(tǒng)邊界, 對ILF 進(jìn)行維護(hù)。 例如: ILF 進(jìn)行增刪改操作, 從其他系統(tǒng)同步信息, 批量導(dǎo)入信息, 修改系統(tǒng)用戶權(quán)限等。EO 要穿越系統(tǒng)邊界, 將數(shù)據(jù)或控制信息發(fā)送出去。 例如: 輸出統(tǒng)計分析后的報表數(shù)據(jù), 用戶登錄時根據(jù)不同的權(quán)限來展示不同的頁面, 采用圖形展示分析后的數(shù)據(jù)等。 EQ 是給用戶展示沒有處理的信息, 給系統(tǒng)外面?zhèn)鬟f信息或發(fā)送數(shù)據(jù), 這個過程一定會穿越系統(tǒng)邊界, 必須沒有計算、 衍生數(shù)據(jù),也不能更新任何ILF。 例如: 文檔搜索, 查詢?nèi)藛T信息, 信息篩選、 分組和排序等。
數(shù)據(jù)功能包括ILF 和EIF, 需要識別業(yè)務(wù)對象或業(yè)務(wù)規(guī)則, 然后確定邏輯文件數(shù)量。 ILF 指的是系統(tǒng)內(nèi)部數(shù)據(jù), 例如: 機(jī)房管理系統(tǒng)中的設(shè)備管理信息、 人員信息和工單信息就是ILF。 EIF 指的是在本系統(tǒng)邊界外需要調(diào)用其他系統(tǒng)數(shù)據(jù), 例如: A系統(tǒng)調(diào)用B 系統(tǒng)的人員信息。
IFPUG 方法規(guī)定的5 種功能類型之間的關(guān)系如圖2 所示。
圖2 5 種功能類型關(guān)系圖
IFPUG 方法的功能點計數(shù)過程如圖3 所示。
圖3 IFPUG 方法功能點計數(shù)過程
表4 5 類功能按復(fù)雜性程度級別與功能點數(shù)之間的對應(yīng)關(guān)系
IFPUG 方法, 需要先確定功能點的復(fù)雜度, 然后按照計算方法計算出未調(diào)整功能點數(shù)(UFP),最后對5 種功能點進(jìn)行加權(quán)累加:
為了有效地反映非功能規(guī)模對規(guī)模估算的影響, IFPUG 方法根據(jù)14 個通用系統(tǒng)特征對系統(tǒng)影響的不同程度分別賦予0~5 中的某個權(quán)值, 然后按下面的公式對系統(tǒng)的功能點調(diào)整:
式(2) 中: UFP——未調(diào)整的功能點數(shù);
VAF——值的調(diào)整因子。
式(3) 中: Ai的取值范圍為0~5, 因此VAF 的取值范圍為0.65~1.35。
IFPUG 方法適用于所有的項目, 尤其適用于所有類型的軟件開發(fā)和軟件維護(hù)項目。
2.1.2 NESMA 方法
NESMA 方法[4]與IFPUG 方法高度類似, 與IFPUG 方法完全兼容, 需要識別的功能類型及其復(fù)雜性程度的確定與IFPUG 方法相似, 其估算過程分以下6 個步驟:
1) 收集現(xiàn)有的文檔;
2) 確定軟件用戶;
3) 確定估算類型;
4) 識別功能類型并確定其復(fù)雜性程度;
5) 與用戶驗證估算結(jié)果并進(jìn)行結(jié)果校正;
6) 與功能點分析專家驗證估算結(jié)果。
NESMA 方法在各功能類型的復(fù)雜性程度確定后, 可用表5 所列的復(fù)雜性程度矩陣來確定各個組件的功能點值。
表5 NESMA 方法復(fù)雜性程度矩陣
NESMA 方法提供了3 種類型的功能點分析方法: 詳細(xì) (Detailed) 功能點分析方法、 估算(Estimate) 功能點分析方法和預(yù)估功能點分析方法。
a) 詳細(xì)功能點分析是常規(guī)的方法, 步驟如下:
1) 確定每個功能的類型 (ILF、 EIF、 EI、EO、 EQ);
2) 為每個功能測量復(fù)雜性程度級別 (低、中、 高);
3) 計算整體未調(diào)整功能點。
b) 估算功能點分析是指在確定每個功能部件(數(shù)據(jù)功能部件或事務(wù)功能部件) 的復(fù)雜性程度時使用標(biāo)準(zhǔn)值。
數(shù)據(jù)功能全部采用“低” 級復(fù)雜性程度, 事務(wù)功能全部采用 “中” 級復(fù)雜性程度計量。 步驟如下:
1) 確定每個功能的功能 類 型 (ILF、 EIF、 EI、EO、 EQ);
2) 為所有的數(shù)據(jù)功能選擇“低” 級復(fù)雜性程度,事務(wù)性功能選“中” 級復(fù)雜性程度;
3) 計算整體未調(diào)整功能點。
該方法與詳細(xì)功能點分析的唯一區(qū)別是不用為每個功能識別分配復(fù)雜性程度, 而是采用“默認(rèn)值”。
c) 預(yù)估功能點分析是指在度量時, 只識別出軟件需求的數(shù)據(jù)功能數(shù)量, 根據(jù)經(jīng)驗公式得出軟件規(guī)模。 步驟如下:
1) 先確定數(shù)據(jù)功能的數(shù)量(ILF、 EIF);
2) 用公式35×NroILFs+15×NroEIFs 直接計算未調(diào)整功能點的數(shù)量。
其中, NroILFs 表示ILF 的數(shù)量, NroEIFs 表示EIF 的數(shù)量。
估算功能點分析方法與預(yù)估功能點及詳細(xì)功能點分析方法的計算結(jié)果有較強(qiáng)的一致性和相關(guān)性。在軟件項目早期, 采用預(yù)估功能點分析方法較好。
軟件開發(fā)過程包括需求分析、 概要設(shè)計、 編碼實現(xiàn)、 集成測試和驗收交付等活動[5], 軟件開發(fā)的成本構(gòu)成如圖4 所示。
圖4 軟件開發(fā)的成本構(gòu)成
3.2.1 軟件開發(fā)成本估算
軟件開發(fā)的成本估算過程如圖5 所示, 具體的內(nèi)容如下所述。
圖5 軟件開發(fā)的成本估算過程
a) 軟件規(guī)模估算
需要明確系統(tǒng)邊界和系統(tǒng)需求。 本文中功能規(guī)模估算采用NESMA 方法, 并根據(jù)需求變更來調(diào)整因子計算調(diào)整后的功能點數(shù)。
需求變更調(diào)整因子: 根據(jù)提供的項目估算文檔所處的階段, 以及行業(yè)基準(zhǔn)數(shù)據(jù)來確定規(guī)模的需求變更調(diào)整因子CF。 概算、 預(yù)算階段取值1.39,投標(biāo)、 項目計劃階段取1.22, 需求分析階段取1.0[6]。 即:
式(4) 中: S——調(diào)整后的功能點數(shù);
UFP——未調(diào)整的功能點數(shù);
CF——需求變更調(diào)整因子。
b) 工作量估算
常用的方法有方程法、 類比法或類推法。 當(dāng)需求不明顯或未定時, 如果有高度類似的往期項目,采用類推法; 當(dāng)需求不明顯或未定時, 如果有類似的基準(zhǔn)數(shù)據(jù), 使用類比法; 當(dāng)項目需求明確, 功能點比較詳細(xì), 可采用方程法。 工作量估算時, 要結(jié)合軟件規(guī)模的復(fù)用程度、 軟件因素和開發(fā)因素等方面對工作量進(jìn)行準(zhǔn)確的估值。 工作量估算的結(jié)果不是固定的數(shù)值, 而是一個上下浮動的數(shù)值范圍。 本文采用方程法進(jìn)行工作量估算, 公式如下:
式(5) 中[7]: AE——調(diào)整后的估算工作量, 單位為人時;
S——調(diào)整后的軟件規(guī)模, 單位為功能點;
PDR——功能點耗時率, 單位為人時每功能點;
RUF——復(fù)用度調(diào)整因子, 復(fù)用程度分為3級, 復(fù)用程度高的對應(yīng)系數(shù)為33%, 復(fù)用程度中的對應(yīng)系數(shù)為67%, 復(fù)用程度低的對應(yīng)系數(shù)為100%;
SWF——軟件因素調(diào)整因子, 包含業(yè)務(wù)領(lǐng)域、應(yīng)用類型及質(zhì)量特性調(diào)整因子;
RDF——開發(fā)因素調(diào)整因子, 包括采用技術(shù)、團(tuán)隊經(jīng)驗。
c) 成本估算
軟件開發(fā)成本的計算公式如下:
式(6) - (7) 中[8]: HRC——直接人力成本與間接成本之和;
SDC——軟件開發(fā)成本, 單位為元;
AE——調(diào)整后工作量, 單位為人時;
HM2——人月折算系數(shù), 單位為人時每人月,取值為176;
F1——乙方平均人力成本費率(包括開發(fā)方直接人力成本、 間接成本), 單位為元每人月;
DNC——直接非人力成本, 單位為元。
本次評估由委托方根據(jù)實際情況進(jìn)行分析估算。 根據(jù)直接非人力成本的組成分類, 按照每一個分類單價乘以數(shù)量來計算, 公式如下:
式(8) 中: DNC——直接非人力成本, 單位為元;
Ci——第i 類直接非人力分類的數(shù)量;
Fi——第i 類直接非人力分類單價。
軟件開發(fā)費用(包含開發(fā)方合理利潤) 計算公式如下:
式(9) 中: P——軟件開發(fā)費用, 單位為元;
F2——平均人力成本費率(包括開發(fā)方直接人力成本、 間接成本及毛利潤), 單位為元每人月。
軟件開發(fā)成本度量對軟件項目的規(guī)劃、 建設(shè)、運(yùn)維等階段都具有重要的意義, 具體表現(xiàn)在以下3個方面:
1) 在預(yù)算及招投標(biāo)活動中, 軟件成本度量有助于制定合理的項目預(yù)算, 規(guī)范招投標(biāo)行為;
2) 在項目實施中, 軟件成本度量有助于合理地調(diào)配資源, 有效地控制項目范圍和質(zhì)量, 是軟件項目成功的重要保障;
3) 在項目決算及后評價階段, 軟件成本度量有助于項目交付、 總結(jié)和評價, 促進(jìn)軟件企業(yè)和行業(yè)的健康發(fā)展。
軟件開發(fā)成本度量有助于為軟件項目預(yù)算提供可靠的依據(jù), 優(yōu)化軟件生態(tài), 加快軟件行業(yè)發(fā)展。國內(nèi)對于軟件開發(fā)成本度量的應(yīng)用不夠廣泛, 建議加強(qiáng)軟件開發(fā)成本度量的推廣, 促進(jìn)我國軟件行業(yè)更好地發(fā)展。