項目是指以一定的成本在一定時間內取得預期收益的系列活動。項目的“生命期”是管理項目的重要指標,而對項目周期的估算則是管理項目的重要一環。本期“專案管理”介紹對軟體項目周期進行估算的技巧。
估算是軟體開發中很重要的一個環節:項目周期估算過短會造成人力低估、成本預算低估、排程過短,最終人力資源耗盡,成本超出預算,為完成項目不得不 趕工,影響項目品質,甚至導致項目失敗;項目周期估計過長表面看來影響不大,但是實際上也會帶來成本估計過高、充分效率低下的後果。周期估算如同蓋樓房中 打地基,是後續工作的基礎,它的影響會貫穿整個項目。
但軟體開發是一項非常複雜的工程,不僅包含需求分析、設計、編碼、測試、實施、維護等不同的子過程,還涉及到開發工具、開發人員、專案管理、風險等眾多因素,不同因素對估算產生的影響不盡相同。在進行軟體估算時(包括利用工具輔助估算)必須考慮到這些方面,否則估算結果就會和實際結果有很大的偏差。下面,我們對幾個常見的因素做一些探討。
軟體規模是項目估算的基礎
軟體規模通常指的是軟體的大小,可以通過程式碼行的長度、功能函數的數量、資料庫中表的數量、資料庫的大小等要素來描述軟體規模。一般而言,軟體規模越大,所花費的開發週期就越長。但這並不是一個簡單的線性函數關係,也要考慮代碼重用問題。比如一個模組代碼很長,但是可能包含了很多公用函數,那麼在估算時就應適當減少程式碼數量。
軟體項目中包含的功能模組越多、越複雜(或者說軟體越大),開發週期越長。這個時間絕不是模組開發時間的簡單疊加,因為模組功能數量的增加直接帶來了軟 件模組間相互關聯度、複雜度的成倍增加,這導致了在需求、設計等階段需要花費更多的時間,比單獨考慮一個模組複雜得多。另一方面,對於產品化程度高的項目 開發,隨著模組數量增加,開發週期的增加卻不是特別明顯。這是因為相當數量的模組可以完全重用,實際開發量大大減少。
所以,在實際進行軟體開發週期估算的時候,軟體規模肯定是首先考慮的因素。具體估算時,在考慮軟體規模時要去除可重用的部分。另外,軟體功能之間的關聯所造成的複雜性也必須足夠重視。
風險影響周期
任何一個項目都或多或少存在風險,軟體項目開發過程中也避免不了這種情況而且有自己的特點。最常見的風險來自於:技術、客戶、項目人員等方面。開發週期估算時項目風險應該適當考慮,尤其是技術風險和客戶風險——
技術風險技 術風險主要來自於軟體本身的技術難度。對於一套成熟的產品,定製開發的技術風險相對非常小,因為重要的技術已經成型,客戶也很少有新的、能帶來高難度技術 問題的需求,這種風險較小。但是對於完全重新開發的項目,或是研發類的項目,技術風險必須特別重視。以開發平台為例,開發平台必須適合本項目所涉及的軟體 開發、滿足最終的需求,平台的錯誤選擇將導致龐大的開發工作量,即便滿足了使用者需求也可能造成系統效率低下、擴充性差的致命問題,軟體可能會很快被淘汰。
在實際估算中,建議將技術難度分為十級,每一級在初次估算的程式碼上增加10%,
最終估算代碼長度=初始估算代碼長度×(1+0.1×n)
假設模組A的初次估計程式碼為15000行,但考慮技術難度高的風險,設定技術難度層級為二級,最終程式碼的估算數量為15000×(1+20%)=18000。
由於技術風險的分析是一項技術性很強的工作,要求做技術風險分析的人必須是技術專家,在相關技術領域有著豐富的經驗。對重大技術風險的分析結果必須要經過評審,保證準確性。
客戶風險客戶風險存在於客戶化項目中,客戶行業特點不盡相同,技術、理解水平也相差甚遠。在我經曆開發的項目中,80%的項目延期是由於客戶方的原因,而且這種風險可控性很低,對項目影響超過技術風險。
在開發週期估算前,專案經理要仔細分析客戶的具體狀況,包括客戶方的電腦水平、管理水平、可溝通程度,在此基礎上結合以往的經驗綜合判斷是否會對開發 帶來明顯的影響,可以按照上述的技術風險的方式將客戶分級,最終確定開發週期。在這個過程中,專案經理的經驗極其重要,對客戶的分析基本上要依賴經驗做判 斷,要求管理員有大量的客戶經驗和行業分析能力。
項目團隊影響速度
對於軟體開發項目來說,人力資源是核心力量。人力資源對估算的影響表現在技術水平、理解能力、溝通能力等幾個方面。項目技術人員編程水 平、工作效率、團隊適應性、溝通能力等素質,都會對開發進度產生影響,其中技術水平是最關鍵的因素。評價程式員的技術水平可以從編程熟練程度、編程速度、 解決技術問題的能力等幾個因素考慮:編程熟練程度指的是程式員使用編程工具實現軟體的功能的熟悉程度;編程速度指的是完成某個功能的速度;解決技術問題的 能力可以反映程式員的技術功底—如果以100%作為總和,這三個因素分別占的合適比例為70%、15%和15%。
軟體開發週期估算前,應對開發人員定級,建議按新手、初級程式員、中級程式員、進階程式員來劃分,每一級人員再評定上述三個因素。初次估算時可以假定開發人員為中級程式員,然後依據項目組實際人員的水平做修正,這樣結果的準確度能大大提高。
寶貴的經驗
依據曆史資料估算軟體開發週期是一種比較常見的方法,這種方法以曆史軟體開發週期為依據,在估算時把當前軟體項目的情況與曆史資料加以對比,從而得出最終結果。
按照曆史資料估算開發週期的準確度還是相當高的,但這種方法只適用於對某類軟體的開發,比如某個行業業務系統的開發。當要估算的軟體與曆史軟體相差太 多,比如開發工具完全不同、或者項目類型完全不同,就不能再依賴這種方法,最起碼應該輔助使用其它估演算法。如果沒有曆史資料或是開發一種新領域軟體,可以 使用程式碼或功能點估演算法,在此基礎上再通過其它方法校正。
在實際使用曆史資料估演算法時,建議專案經理建立一個曆史項目資料庫。在庫中 包含以前所有項目的開發週期、項目規模、開發人員狀況、客戶狀況等詳細資料。當估算時根據當前項目的狀況在庫中尋找最類似的曆史項目,然後再比較兩個項目 之間在項目規模、項目風險、人力資源之間的區別,我們假定曆史項目開發週期為A,當前項目的周期可以依據下列公式得出:
估算項目周期 = A×(2×S+R+P+2×C)/6
S:代表軟體規模 R:代表風險 P:代表人力資源 C:代表客戶
(以上值均指當前項目與曆史項目的比率)
實際的比較因素應該不止這些,但軟體規模、風險、人力資源及客戶狀況是其中最重要的,對軟體開發的影響也最大,所以這個公式中只考慮了這些因素。其中軟體規模和客戶兩項占的權重最大,這也是根據專案管理經驗得出的,在實際使用曆史資料估演算法時還可以靈活加入其它因素