軟體專案管理 6.7.引數估演算法

專案管理事業的愛好者 發表於 2022-06-07
演算法 專案管理

【公眾號@ “專案管理研究所” 將會第一時間更新文章並分享《行業分析報告》】
歸檔於軟體專案管理初級學習路線
第六章 軟體專案成本計劃
《初級學習路線合集 》


前言

大家好,這節我們學習軟體專案管理---引數估演算法,重點介紹COCOMO模型。

一、引數估演算法——定義

引數估算也稱為模型估算,是根據專案資料集合出來的模型,程式碼行,人數,時間,工時等都是專案資料。

軟體專案管理 6.7.引數估演算法

所以引數估算模型是通過統計技術得出的數學模型,然後根據這個模型估算軟體專案的規模或者成本,引數模型是基於歷史專案資料,專案型別不同,專案環境不同,專案資料也就不同,資料不同得出的模型也就不同。

有很多組織根據自己的研究物件得出不同的估算模型。

例如:這些模型的輸入是程式碼行(LOC)

軟體專案管理 6.7.引數估演算法

這些模型的輸入是功能點(FP)

軟體專案管理 6.7.引數估演算法

儘管模型各不相同,但是有基本相似的公式模式,如圖所示:

軟體專案管理 6.7.引數估演算法

接下來我們通過研究2個模型來了解引數模型的思路,既 Walston-Felix模型和COCOMO模型。

二、Walston-Felix模型

Walston-Felix模型是1977年,IBM的Walston和Felix根據63套專案資料,迴歸分析得出的。

軟體專案管理 6.7.引數估演算法

其中E = 5.2 * 程式碼行的0.91次冪,表示程式碼行與工作量的關係。

其中D = 4.1 * 程式碼行的0.36次冪, 代表程式碼行與專案進度的關係。

其中最後一個模型公式,既文件頁數 = 49 * 程式碼行的1.01次冪 。

便知道我們不能隨便照抄別人的模型,因為不同的企業團隊要求不同,文件頁數肯定也不同,所以應該採用適合自己專案的模型。

下面我們舉個例子:某專案採用JAVA語言來完成,估計有366個功能點,根據自己定義的該專案 程式碼行與功能點的關係。

軟體專案管理 6.7.引數估演算法

既 L(程式碼行)等於366 * 46 約等於16.386K程式碼行,則根據模型估算公式 E(工作量)等於66人月,DOC(文件頁數)約等於826頁。

三、COCOMO模型

COCOMO模型既結構化成本模型,是目前應用最廣泛的引數型軟體成本估計模型,最初是由Boehm在1981年提出的,稱為COCOMO 81模型。他是通過60多套專案資料分析得出的模型,20世紀90年代中期,隨著軟體工程技術的發展,又提出了COCOMO II模型。

COCOMO模型基本原理如下圖所示:

軟體專案管理 6.7.引數估演算法

COCOMO模型分為三個級別:基本COCOMO模型,中等COCOMO模型,高階COCOMO模型。
級別不同,估算的精度也不同。
軟體專案管理 6.7.引數估演算法
針對每個級別的模型又分為三個專案型別:既有機型,嵌入式型,半嵌入式型或者叫半有機型。

先介紹COCOMO 81的三個級別模型。

  1. 基本COCOMO模型是靜態單變數模型,不考慮任何成本驅動,適合在開發的初始階段,專案的相關資訊很少,只適合粗略的技術估算。
  2. 中等COCOMO模型是在專案的需求確定以後,對專案有所瞭解之後使用,在基本模型的基礎上通過產品,平臺,人員,專案等方面的屬性影響因素來調整工作量的估算,估算精度提高了。
  3. 高階COCOMO模型是在設計完成後使用,考慮開發不同階段,影響因素的不同影響,對專案進行精確化的估算,一但軟體的各個模組都已經確定,估算者就可以使用高階COOMO模型,所以他的估算精度是最高的。

針對上面的每個模型,將專案分為三種型別,有機型,嵌入式,半嵌入式或者叫半有機型。

軟體專案管理 6.7.引數估演算法

  1. 有機型專案是最常規簡單的專案型別,例如各種網站專案,資訊化系統等等,相對較小,較簡單的軟體專案,開發人員對開發專案等目標理解比較充分,與軟體系統相關的工作經驗比較豐富,對軟體的使用環境比較熟悉,受硬體的約束比較小,程式的規模不是很大。

  2. 嵌入式專案型別,他主要是各類系統程式,例如實時處理。控制系統等等。通常與某種硬體裝置緊密結合在一起,對介面,資料結構,演算法的要求比較高,軟體規模任意,例如航天用的控制系統,大型指揮系統等等。

  3. 半嵌入式專案型別,他是介於上述兩種軟體之間,規模和複雜度都屬於中等或者更高,例如編譯器,聯結器,分析器等等。

這是基本COCOMO-81模型公式:E=a * (KLOC)的b次冪。

軟體專案管理 6.7.引數估演算法

a和b的取值與專案型別有關,如下圖是不同專案型別的係數表:

軟體專案管理 6.7.引數估演算法

下面舉一個33.3k程式碼行的軟體開發專案例子:最後得出的結果也就是專案規模是152人月。

軟體專案管理 6.7.引數估演算法

我們再看中等COCOMO-81模型,他是對基本模型的調整,在基本模型的基礎上再乘以 乘法因子,乘法因子是根據成本驅動屬性得來的,其中a,b才是根據不同專案型別有不同取值。

軟體專案管理 6.7.引數估演算法

中等COOCMO-81模型關鍵是乘法因子,它來自於成本驅動屬性,分4個大類,分別是產品屬性,平臺屬性,人員屬性,過程屬性。

軟體專案管理 6.7.引數估演算法

這四個大類又細分為15個驅動因子,例如產品屬性有3個因子,可靠性,資訊量,複雜性。每個驅動因子的取值範圍有很低,低,正常,高,非常高,極高階別。

軟體專案管理 6.7.引數估演算法

例如產品複雜性驅動因子很低的取值為0.7,非常高的取值為1.30,既複雜性越高取值越大。

我們再看分析員能力這個驅動因子,非常低是為1.46,非常高是為0.71,既能力越高取值越低 。

乘法因子等於這15個驅動因子取值後相乘,如果大於1說明工作量往高調整,小於1說明工作量往低調整。

我們繼續看一個33.3k程式碼行的軟體開發專案例子:採用中等CoCoMo模型計算專案規模,乘法因子根據15個驅動因子取值相乘後得出1.09,代入公式得出專案規模成本為166人月。

軟體專案管理 6.7.引數估演算法
對比前面的基本模型,估算值有了一定的調整,因為我們對專案的產品,人員,平臺,過程有了更細的瞭解。

我們再看高階COCOMO模型,他比前面兩個模型的精度又提高了,主要體現在兩個方面。第一個方面是針對不同的子系統採用的不同的模型估算,另外一方面是針對模型屬性進行更加細化的調整。

軟體專案管理 6.7.引數估演算法

15個因子,每個因子在不同的階段影響不同,取值不同。例如應用經驗AEXP這個驅動因子,在開發的不同階段,其作用是不同的,影響最大的階段是需求階段,設計階段弱化了。

那麼針對每個等級,這個驅動因子在不同階段取值是不同的,例如對於非常低的級別,需求和產品設計階段的取值為1.40,在詳細設計階段的取值為1.30,編碼和測試階段的取值為1.25,因此提高了估算的精度,但是實踐中實施起來會比較麻煩。

軟體專案管理 6.7.引數估演算法

四、COCOMO II

COCOMO II是95年左右,Boehm在81模型的基礎上,結合了軟體工程技術的發展提出來的。

COCOMO II模型也分為3個等級,應用組裝模型,早期設計模型,後體系結構模型。他們分別適合規劃階段,設計階段,開發階段使用。
軟體專案管理 6.7.引數估演算法

應用組裝模型適合原型構造或者複用構件組合專案時採用。他基於應用點或者稱為物件點 除以一個標準的應用點的生產率,應用點數量的估算可以是顯示的螢幕數、網頁數、報表數量、程式模組數量等等。

如下圖所示 公式為:工作量 = NAP * (1-複用程式碼量的百分比)/ PROD

軟體專案管理 6.7.引數估演算法

早期設計模型適用於專案的初期,需求已經確定,在系統設計的初始階段只設計了基本的軟體結構,還沒有對體系結構進行詳細的設計,這一階段的主要任務是簡單、快速的完成一個大概的成本估算。

那麼公式如下圖所示:其中PM是工作量,A是常數,S是程式碼行的規模,E是指數比例因子,B可以校準(目前暫定為B=0.91),SF是指數驅動因子。

指數比例因子的效果是對規模較大的專案,預計的工作量將增加,那麼EM是工作量係數。

軟體專案管理 6.7.引數估演算法

因此軟體開發工作量需要程式碼量行數的非線性函式,既基於可用程式碼行以及5個規模指數因子,7個工作量乘數因子。

計算指數比例因子最重要的依據是驅動因子和工作量係數,5個指數驅動因子屬性和取值如表所示:

軟體專案管理 6.7.引數估演算法

事實上對於一個專案而言,這些屬性的缺乏將不成比例的增加更多的工作量,它分為很低、低、正常、高、很高、極高等級別。

早期設計的工作量係數有7個,這些係數可以評定為非常低、很低、低、正常、高、很高、極高等級別。

我們再來看COCOMO II的後體系結構模型,我們看一下公式,那麼該模型與早期設計模型基本是一致的,不同之處在於工作量係數不同。

Boehm講後體系結構模型中的工作量係數化成產品因素,人員因素,專案因素,平臺因素四個大類,共17個屬性的驅動因子。

與COCOMO-81模型的15個驅動因子相比,COCOMO II模型的後體系結構模型增加了一些軟體工程發展中的一些因素,同時也刪除了一些因素。
軟體專案管理 6.7.引數估演算法

複用模型

另外,如果需要估計複用程式碼或者已生成程式碼所需工作量,可以採用複用模型,公式如下:

軟體專案管理 6.7.引數估演算法
計算出等價程式碼行(ESLOC)後,ESLOC可以作為程式碼行的輸入,採用早期設計模型或者後體系設計模型來估算工作量。

總結

總之 引數模型是根據專案資料進行分析,基本上是進行迴歸分析,從而得出迴歸模型作為引數模型。

這個引數模型可以是線性的,也可以是非線性的,相當於是監督學習的迴歸分析方法,例如線性迴歸,多項式迴歸,邏輯迴歸,神經網路,整合方法等...

例如這是某專案的一些資料:
軟體專案管理 6.7.引數估演算法
通過線性迴歸分析,計算出引數模型,根據這個模型可以進行此類專案的估算。

軟體專案管理 6.7.引數估演算法

軟體專案管理 6.7.引數估演算法

軟體專案管理 6.7.引數估演算法

軟體專案管理 6.7.引數估演算法

那麼這是另外一類的專案資料,我們採用神經網路演算法進行模型估算。

軟體專案管理 6.7.引數估演算法

這是對專案資料進行數字化和歸一化的結果。

軟體專案管理 6.7.引數估演算法

我們採用三層的BP神經網路建模。

軟體專案管理 6.7.引數估演算法

通過隱層節點的數目,網路學習率,隱層和輸出層啟用函式的分析研究,可以確定網路權值和閾值的變化量,從而確認了引數模型。

軟體專案管理 6.7.引數估演算法

這是模型應用的誤差圖示,誤差率在可以接受的範圍之內。

軟體專案管理 6.7.引數估演算法

總之引數模型方法需要具有良好的專案資料為基礎,存在成熟的專案估算模型。特點是比較簡單,而且也比較準確。如果模型選擇不當或者資料不準,也會導致偏差。

到這裡,第六章 第七節引數估演算法就講解完畢了!下一節介紹專家估演算法~

如果您覺得這篇文章有幫助到您的的話不妨點贊支援一下喲~~😉

後續將持續更新【軟體專案管理初級學習路線】的全知識點,大家感興趣的多多關注博主喲~
————————————————