微軟由底而上的估算方法大致是這樣的:對項目各項工作進(jìn)行分解后(即俗稱的wbs:work breakdown structure,工作分解結(jié)構(gòu)),每個任務(wù)落實負(fù)責(zé)人,由負(fù)責(zé)人對自己的任務(wù)進(jìn)行估計。這個辦法有以下好處:
1. 終該任務(wù)是由這個人來完成的,他估計多少時間才能做完,這個時間才是接近實際的。
2. 負(fù)責(zé)該任務(wù)的人進(jìn)行估算的時候,肯定需要認(rèn)真思考這個任務(wù)的風(fēng)險,需要做哪些具體的工作,這樣更容易在未開始工作之前發(fā)現(xiàn)更多的潛在問題。相反如果由項目經(jīng)理來分配時間,這個人可能不會去思考這個任務(wù)了。
3. 做這個任務(wù)的人會有被重視和尊重的感覺,他會很重視自己承諾的完成時間,并且想法設(shè)法按時間完成。這樣會減少很多項目管理時間,因為每個任務(wù)負(fù)責(zé)人都會主動地跟蹤好自己的工作。
其實微軟這個方法根本沒有什么特別,所有正常人都可以想到這個方法,但仍然有很多人去追求那些不太靠譜的估算方法。
這個方法還是有這樣的一些問題的:
1.有人會估算偏小,比方他說需要5天,但往往10天還完不成。
2.有人估算過于保守。
3.項目的進(jìn)度要求是很緊,基本上你必須在指定時間內(nèi)完成,估算顯得毫無價值。
第一個問題是比較常見的,但我們要這樣想:估不準(zhǔn)也比不估算好,估算偏差哪怕超過,也比不估算好,至少有個譜。
大家是會進(jìn)步的,估不準(zhǔn)往往是對任務(wù)和自己能力認(rèn)識不到位,要讓大家不害怕估算,只要敢于估算,問題才會暴露出來,才能持續(xù)進(jìn)步。
第二個問題分兩種情況,有些人是確實是過分保守的對自己信心不太足,項目經(jīng)理可以多多來指導(dǎo)他的工作,看看他具體的進(jìn)展,讓他更加充分地了解任務(wù),更加充分了解自己的能力,增強他的信心,這樣他能持續(xù)進(jìn)步了。而另外一種情況比較惡劣,少數(shù)人會故意增大時間,這樣他平時工作不必全力以赴,可以比較悠閑,甚至可以利用工作時間干私事。如果發(fā)現(xiàn)這樣的情況,應(yīng)該嚴(yán)肅處理了,不要做爛好人,這樣的人在團(tuán)隊中存在是對團(tuán)隊的極大傷害。
第三個問題往往是各項目經(jīng)理心中的痛楚,他們會覺得:實在無奈!做項目是在有間有限資源內(nèi)做不可能完成的任務(wù),在這樣的情況下,你不要跟我扯估算了!
我們的項目大部分情況都是非常大壓力的,應(yīng)對這樣大的壓力越需要冷靜。實際上大部分項目盡管是有壓力,但只要發(fā)揮團(tuán)隊的聰明才智,還是可以高效地做好工作的,不需要加班或者少加班。本文稍后會介紹這個問題的應(yīng)對辦法。
介紹了這么多種估算方法,每種都有很多問題,那到底怎樣才能做好項目估算呢?
軟件項目的特點是項目簽訂時,價錢是死的,工期是死的,而需求和設(shè)計是不明確的。
我的經(jīng)驗告訴我,功能點法、代碼行法這些方法基本上是不靠譜的,我在實際項目中會綜合使用Dephi法和由底而上的估算方法,并予以改良,下面介紹一下我的一些心得體會。
1.項目估算與其說是估出來,還不如說是做出來的。
假設(shè)某項目是這樣的情況:
1)合同簽署的金額是100萬,工期是3個月。
2)需求只是大致寫了,并不明確。
3)老板要賺50萬,給你的預(yù)算只有50萬。
我們很多項目都是這樣的情況,不是等你估算出比較靠譜的數(shù)字,然后才去報價簽合同的,我們經(jīng)常要在老板指定的預(yù)算下完成項目。
你現(xiàn)在要負(fù)責(zé)這個項目,你會如何做估算呢?
你需要做好兩個事情,才能保證項目實際成本控制在預(yù)算內(nèi)。
第一個事情,控制好需求。需求不明確,這既是不利因素也是有利因素,應(yīng)盡量往有利的方向控制。不明確的好處是你有控制需求的空間,抓住客戶的關(guān)鍵需求,簡化不必要的花銷的需求,能極大地降低項目工作量。
第二個事情:想盡辦法降低開發(fā)工作量。不要因為進(jìn)度緊不認(rèn)真思考軟件的設(shè)計,應(yīng)盡量采用簡單的成熟的設(shè)計方案,簡化工作。
2.估算應(yīng)該持續(xù)進(jìn)行,持續(xù)細(xì)化。
項目初期很難對項目做完整估算,但能估計的部分應(yīng)先估計出來,并且針對不明確的部分安排計劃去搞清楚。
3.估算是項目各種工作估算的總和。
估算并不是只是得到一個項目估算的總體數(shù)字,項目的估算總數(shù)其實是由項目各種工作的估算組成的。
前文介紹了項目的各種工作,每一種工作都需要認(rèn)真估算。如果估算發(fā)生偏差,要能定位到具體是哪部分的估算出問題了,否則估算沒有指導(dǎo)項目工作的價值。功能點法、代碼行法的估算辦法,只能得到一個項目估算的總數(shù),而不能定位到具體的哪一部分工作,這樣得到的估算結(jié)果難以用來指導(dǎo)項目工作。
4.估算依賴項目組的整體實力。
如果你沒有軟件開發(fā)相關(guān)經(jīng)驗,只懂理論上的估算,你是不可能做好估算工作的。
項目組由項目管理、軟件設(shè)計、編碼、測試、實施等各類專業(yè)人才組成,每個人在自己方面都是專家,每個人都是整個項目組中有資格對自己專業(yè)方面的工作進(jìn)行估算。前文列出了的項目各方面的工作,應(yīng)該由相應(yīng)的項目成員為主進(jìn)行估算。
5.項目組應(yīng)該不斷學(xué)習(xí)、總結(jié)、進(jìn)步,提高整體水平。
需求不明確、設(shè)計不確定這是項目的特點,我們需要不斷地學(xué)習(xí)來提高水平,將這些不明確的因素逐步明確。
沒有什么妙方能解決這些不明確的因素,靠的還是我們的知識和能力。項目組每個人都應(yīng)該通過持續(xù)估算來發(fā)現(xiàn)自己的不足并提高水平。
6.公司應(yīng)該定期組織項目人士制定估算指南并持續(xù)更新。
我們公司有一份估算模板,里面匯集了以前的估算經(jīng)驗,列出了所有需要考慮的估算內(nèi)容以及詳細(xì)的說明。
我們以前沒有估算模板時,估算偏差會達(dá)到50%以上,總結(jié)經(jīng)驗發(fā)現(xiàn)偏差的主要原因是估漏!使用估算模板會幫助我們發(fā)現(xiàn)遺漏,后來我們的估算偏差基本可以控制在20%以內(nèi)。
前文的“估算要估啥”小節(jié),我列出了項目通常要考慮的各種工作,也列出了容易估漏和估計不足的地方,大家可在此基礎(chǔ)上根據(jù)自己公司實際情況,修改和擴充這些內(nèi)容,寫出自己公司的估算模板或估算指南。
先得到項目規(guī)模,再由規(guī)模導(dǎo)出工作量,這是一個很美好的想法,問題是和我們的實際情況相去甚遠(yuǎn)了。
將工作分解,直到分解到可以估計工作量的程度,這個可能是土有效的方法了。但你可能會問,這樣的估算方法,項目之間無法橫向比較了?
項目估算第一目標(biāo)是用來指導(dǎo)項目工作,如果這個目標(biāo)都達(dá)不到,那么不需要考慮項目之間的橫向比較了。
另外我要反問:為什么非要用這樣的方式來作項目之間的橫向比較?有什么好處?國外的軟件開發(fā)工作室不會做這樣無聊的事情,軟件開發(fā)可能是人類厲害的智力活動,你覺得一定能量化度量嗎?