軟件項(xiàng)目的估算歷來(lái)是比較復(fù)雜的事,因?yàn)檐浖旧淼膹?fù)雜性、歷史經(jīng)驗(yàn)的可重復(fù)性、估算工具的缺乏以及一些人為錯(cuò)誤,都會(huì)導(dǎo)致軟件項(xiàng)目的估算往往和實(shí)際情況相差甚遠(yuǎn)。據(jù)有關(guān)機(jī)構(gòu)調(diào)查發(fā)現(xiàn),約有60%的軟件項(xiàng)目的失敗是因?yàn)楣浪闫钜鸬模皇且驗(yàn)榧夹g(shù)實(shí)力不夠。因此,估算偏差已被列為軟件項(xiàng)目失敗的四大原因之一。
從軟件工程學(xué)上,我們知道軟件需求和估算是軟件項(xiàng)目的基礎(chǔ)。因?yàn)橹挥袦?zhǔn)確的了解客戶(hù)的需求,以之為基礎(chǔ),并使用科學(xué)的方法對(duì)目標(biāo)軟件系統(tǒng)的規(guī)模、工作量和進(jìn)度做出合理的估算,我們才能在預(yù)算內(nèi)按時(shí)按質(zhì)順利的完成項(xiàng)目。然而,軟件估算作為軟件項(xiàng)目的基礎(chǔ)領(lǐng)域卻常常被人們所忽視。我在近期的一個(gè)開(kāi)發(fā)項(xiàng)目中嘗到忽視軟件規(guī)模估算帶來(lái)的苦果,結(jié)果是項(xiàng)目進(jìn)行到一半時(shí)發(fā)現(xiàn)不但工期嚴(yán)重滯后于計(jì)劃,而且項(xiàng)目的各種資源也嚴(yán)重的不足和缺乏,項(xiàng)目被迫暫停下馬。
常見(jiàn)的項(xiàng)目規(guī)模估算失準(zhǔn)原因
一直以來(lái),軟件項(xiàng)目的規(guī)模估算(Size Estimation)是個(gè)爭(zhēng)論不休的問(wèn)題。不論是對(duì)軟件開(kāi)發(fā)團(tuán)隊(duì)還是對(duì)軟件用戶(hù),軟件規(guī)模估算的重要性都是不容置疑的。因?yàn)樗軜O大的影響著甲方對(duì)發(fā)包軟件的成本估算,乙方對(duì)自身開(kāi)發(fā)成本的預(yù)測(cè),以及乙方對(duì)開(kāi)發(fā)過(guò)程的量化管理等諸多方面。而且,只有相對(duì)合理和相對(duì)準(zhǔn)確地估算軟件規(guī)模,才能對(duì)項(xiàng)目的進(jìn)度安排、資源分配等各個(gè)環(huán)節(jié)進(jìn)行合理的部署。所以,軟件項(xiàng)目的規(guī)模估算是軟件項(xiàng)目中相當(dāng)重要的一環(huán)。但是,以下的原因卻使到我在這次項(xiàng)目的實(shí)際操作中對(duì)項(xiàng)目規(guī)模估算失準(zhǔn)了:
(1)對(duì)項(xiàng)目規(guī)模估算認(rèn)識(shí)不足
項(xiàng)目規(guī)模估算一般分為兩種應(yīng)用場(chǎng)景:一是招投標(biāo)的時(shí)候用來(lái)估價(jià)、報(bào)價(jià);二是用來(lái)安排進(jìn)度計(jì)劃和指導(dǎo)項(xiàng)目具體工作的分配。因此,如果對(duì)規(guī)模估算認(rèn)識(shí)不足的話(huà),將可能會(huì)在這兩種應(yīng)用場(chǎng)景中估算失準(zhǔn)。例如,如果項(xiàng)目規(guī)模低估的話(huà)會(huì)造成人力估算低估、成本預(yù)算低估、日程過(guò)短,終人力資源耗盡,成本超出預(yù)算。后為了完成項(xiàng)目不得不趕工,不但會(huì)影響到項(xiàng)目質(zhì)量,甚至?xí)䦟?dǎo)致項(xiàng)目失敗。而如果規(guī)模高估的話(huà),會(huì)因估價(jià)過(guò)高而降低了招投標(biāo)時(shí)的競(jìng)爭(zhēng)力,或在進(jìn)度安排時(shí)提高了開(kāi)發(fā)成本和浪費(fèi)資源。由于對(duì)規(guī)模估算的認(rèn)識(shí)不足,使到我在這次項(xiàng)目中嘗到一個(gè)大苦果,是低估項(xiàng)目規(guī)模導(dǎo)致項(xiàng)目需要多次的追加預(yù)算。我不但多次受到公司領(lǐng)導(dǎo)的批評(píng),而且還受到客戶(hù)的多次投訴。
(2)個(gè)人經(jīng)驗(yàn)估算法帶有一定的局限性
一般來(lái)說(shuō),依靠歷史或個(gè)人經(jīng)驗(yàn)的規(guī)模估算方法都有一定的局限性。原因是很難在項(xiàng)目分析和計(jì)劃階段對(duì)軟件的規(guī)模進(jìn)行相對(duì)準(zhǔn)確的估算。因?yàn)楣浪闶且揽吭u(píng)估人員的經(jīng)驗(yàn),所以對(duì)評(píng)估人員的能力要求比較強(qiáng),并且難以由第三方對(duì)評(píng)估人員的工作偏差作出修正。在這次項(xiàng)目的初期,我片面的只是根據(jù)個(gè)人經(jīng)驗(yàn)進(jìn)行估算,結(jié)果是輕率的估算了項(xiàng)目規(guī)模。這是后導(dǎo)致項(xiàng)目失利的原因之一。另外,不同軟件項(xiàng)目使用的技術(shù)不一樣,這一點(diǎn)也非常影響到軟件規(guī)模的估算。例如同一個(gè)功能,使用JAVA語(yǔ)言和使用Ruby語(yǔ)言所涉及的代碼行相差數(shù)十行,甚至數(shù)百行。即使同為JAVA語(yǔ)言,使用不用的框架所需要編寫(xiě)的代碼行也不一樣。
(3)對(duì)項(xiàng)目估算時(shí)缺乏數(shù)據(jù)支持
因?yàn)樵谲浖_(kāi)發(fā)初期時(shí)對(duì)規(guī)模估算都是很難準(zhǔn)確量化的,所以到底需要多少資源、多長(zhǎng)時(shí)間或者規(guī)模估算到什么的程度才算是合理的是沒(méi)有一個(gè)標(biāo)準(zhǔn)的。但一個(gè)好的項(xiàng)目估算,是離不開(kāi)一個(gè)準(zhǔn)確的、可信的、客觀(guān)的數(shù)據(jù)作為基礎(chǔ)。如果在項(xiàng)目規(guī)模估算時(shí)只憑項(xiàng)目管理人員的經(jīng)驗(yàn)進(jìn)行估算,而缺乏大量的數(shù)據(jù)支持,那么估算終會(huì)變成常見(jiàn)的"三拍"現(xiàn)象:"首先是項(xiàng)目經(jīng)理拍腦袋估算,然后是項(xiàng)目經(jīng)理估算失準(zhǔn)時(shí)拍馬屁的補(bǔ)救,后是項(xiàng)目失敗時(shí)拍屁股走人"。當(dāng)然,這只是個(gè)玩笑。不過(guò)由此可見(jiàn)項(xiàng)目規(guī)模估算不能只依靠經(jīng)驗(yàn)來(lái)估算,而應(yīng)該是要有大量的數(shù)據(jù)來(lái)支持。
什么是軟件項(xiàng)目的規(guī)模估算?
軟件開(kāi)發(fā)項(xiàng)目管理中的一項(xiàng)重要任務(wù)是開(kāi)發(fā)項(xiàng)目的規(guī)模估算,這是極其重要但卻很容易被忽視的一項(xiàng)內(nèi)容。因?yàn)闆](méi)有正確的規(guī)模估算,項(xiàng)目計(jì)劃會(huì)失去成功的基礎(chǔ)。可惜大部分的開(kāi)發(fā)團(tuán)隊(duì)都很難做到對(duì)項(xiàng)目規(guī)模進(jìn)行準(zhǔn)確的估算。
(1)什么是項(xiàng)目規(guī)模估算?
做好軟件項(xiàng)目管理的基礎(chǔ)是要做好項(xiàng)目的規(guī)劃工作,而做好項(xiàng)目規(guī)劃的前提是要做好軟件估算。也是說(shuō),是沒(méi)有好的軟件估算,項(xiàng)目的規(guī)劃、跟蹤和控制根本無(wú)從談起。因此,軟件估算是項(xiàng)目計(jì)劃活動(dòng)的基礎(chǔ)之一。
軟件估算一般是通過(guò)主觀(guān)經(jīng)驗(yàn)和客觀(guān)分析兩種方法進(jìn)行,包括有四個(gè)重要方面:規(guī)模估算、工作量估算、進(jìn)度估算和成本估算。其中,對(duì)規(guī)模進(jìn)行估算是為了將項(xiàng)目范圍進(jìn)行量化。規(guī)模估算是整個(gè)軟件估算中核心、基礎(chǔ)的環(huán)節(jié),也是整個(gè)軟件估算的第一步。規(guī)模估算有兩個(gè)主要作用:一是通過(guò)規(guī)模估算建立項(xiàng)目基線(xiàn);二是利用基線(xiàn)對(duì)項(xiàng)目生產(chǎn)率和狀態(tài)進(jìn)行評(píng)價(jià),并確定軟件過(guò)程的進(jìn)度目標(biāo)。也是說(shuō),規(guī)模估算是一切估算的基礎(chǔ),是能直接決定和影響到其它三個(gè)估算的決策。
(2)常用的軟件規(guī)模估算方法
估算是建立在客觀(guān)事實(shí)上對(duì)未來(lái)可能發(fā)生的事情的一種合理性預(yù)測(cè)。估算本身的不確定性,決定了它不可能是百分之百準(zhǔn)確無(wú)誤的,但是依據(jù)某種方法進(jìn)行合理估計(jì)顯然比瞎猜好得多。軟件估算方法有很多,大致分為基于技術(shù)分解模型和基于經(jīng)驗(yàn)?zāi)P蛢纱箢?lèi)。目前基于技術(shù)分解模型的方法有:功能點(diǎn)估算法、LOC估算法、MARK II等;基于經(jīng)驗(yàn)?zāi)P偷姆椒ㄓ校篒BM模型、普特南模型、COCOMO模型等。目前基于技術(shù)分解的常用方法是FP功能點(diǎn)估算法和LOC代碼行估算法。本文重點(diǎn)介紹這兩種方法。
①FP功能點(diǎn)法
功能點(diǎn)分析法 (FPA:Function Point Analysis) 是一種相對(duì)抽象的方法,是一種人為設(shè)計(jì)的估算方式。它是從系統(tǒng)的復(fù)雜性和系統(tǒng)的特性這兩個(gè)角度來(lái)估算系統(tǒng)的規(guī)模,它的關(guān)注點(diǎn)在于程序的"功能性"和"實(shí)用性",是對(duì)軟件和軟件開(kāi)發(fā)過(guò)程的間接估算。初是由 IBM 工程師艾倫艾爾布策提出的,隨后被IFPUG 方法繼承,是目前國(guó)際上主流的軟件規(guī)模估算方法。