【導(dǎo)讀】
對(duì)于估算,團(tuán)隊(duì)常常會(huì)有這樣的困惑:花了大把時(shí)間來估算,最后卻發(fā)現(xiàn)與實(shí)際還是有不小的偏差,到底有沒有必要做估算,怎樣來做估算?
俗話說,行百里者半九十,意思是說一百里的路走了前面九十其實(shí)只完成了一半,剩下的十里仍需要花很大的功夫。那么現(xiàn)實(shí)的生活和工作中,我們是不是也經(jīng)常遇到這樣的情況呢?
回想一下,會(huì)不會(huì)有這樣一種經(jīng)歷:打掃衛(wèi)生,讓房子從凌亂到整潔只需要20%的努力,要讓房子從整潔到一塵不染卻要花費(fèi)80%的努力。那么我們就要審視一下,在精力有限的情況下,從整潔到一塵不染的過程有沒有必要,房子從凌亂變到了整潔是不是就已經(jīng)足夠。我想沒有潔癖的一般人,就如我,都會(huì)覺得后面那個(gè)過程的性價(jià)比實(shí)在太低,完全沒有必要。
回過頭來看看我們?cè)陧?xiàng)目中的估算是不是也可以類比,從無估算到有估算其實(shí)花的是比較有限的精力,但是從有估算到追求“準(zhǔn)確”估算卻是個(gè)漫長(zhǎng)的過程,并且有數(shù)據(jù)顯示我們花一些時(shí)間得到的估算數(shù)據(jù)跟花費(fèi)大量時(shí)間而得到的結(jié)果不會(huì)差很多。《敏捷估計(jì)與規(guī)劃》這本書中提到,估計(jì)的準(zhǔn)確度和投入的工作量之間存在以下關(guān)系:
因此我推薦在進(jìn)行估算的時(shí)候不必強(qiáng)求精確,更何況我們也無法做到精準(zhǔn),估算只是估算,只要做到盡量合理,盡量貼近真實(shí)值即可。
估算單位的選擇
有的團(tuán)隊(duì)往往會(huì)在估算開始時(shí)糾結(jié)于如何選擇估算單位,因?yàn)楹侠淼倪x擇是影響估算成功的關(guān)鍵因素。那么究竟該如何選擇呢?
1/3 理想人日
理想人日是指成員在不受干擾的情況下,全部時(shí)間都用于開發(fā)一需求所需的天數(shù)。
理想人日的劣勢(shì)在于:小組成員對(duì)技術(shù)和項(xiàng)目的熟悉程度,個(gè)人的經(jīng)驗(yàn)和能力不同,都會(huì)導(dǎo)致基于理想人日的估算值有一定差異。例如,你問一個(gè)擅長(zhǎng)C語言的成員某個(gè)需用java開發(fā)的功能的理想人日,他也許會(huì)告訴你是5天。但是你問一個(gè)擅長(zhǎng)java的成員同樣的問題,他的回答也許就是1天。這樣的差異會(huì)導(dǎo)致我們對(duì)任務(wù)規(guī)模認(rèn)識(shí)的偏差,很難衡量項(xiàng)目的實(shí)際“大小”。而它的優(yōu)勢(shì)則在于:對(duì)于團(tuán)隊(duì)外部的人來說理想人日更容易被理解,無需解釋。對(duì)于團(tuán)隊(duì)而言,它使估算更容易開始。
2/3 理想人時(shí)
理想人時(shí)是對(duì)應(yīng)理想人日而存在的,只不過它的粒度更小。當(dāng)熟悉需求的情況下,用理想人時(shí)的估算會(huì)更準(zhǔn)確些。想象一下,讓你估算接下來1個(gè)小時(shí)能完成多少工作任務(wù)和接下來一天能完成多少任務(wù),哪個(gè)的會(huì)更接近真實(shí)情況些?我想應(yīng)該是前者吧。因?yàn)橐惶靸?nèi)能做多少工作,我們需要去除很多“雜事”(如喝水,上廁所,跟同事嘮嗑,戳網(wǎng)頁...)來估算純干活的時(shí)間,這一點(diǎn)往往較難一些,總會(huì)存在一些偏差。但是如果要估算接下來1個(gè)小時(shí)能做什么,應(yīng)該就比較容易了。理想人時(shí)的估算優(yōu)勢(shì)就在于:在充分理解需求的情況下,能幫助團(tuán)隊(duì)做到更靠近真實(shí)值的估算。而缺點(diǎn)是:對(duì)于一些大的需求無法做到如此細(xì)粒度。
3/3 故事點(diǎn)
故事點(diǎn)是來自于敏捷的概念,是對(duì)任務(wù)規(guī)模的估計(jì),它是一種相對(duì)概念。例如:需求X為4個(gè)故事點(diǎn),需求Y為8個(gè)故事點(diǎn),則表示Y的規(guī)模是X的兩倍,但并不表示開發(fā)Y比開發(fā)X要多一倍的時(shí)間,因?yàn)檫@還取決于是由什么樣技術(shù)熟練度的人員開發(fā)。故事點(diǎn)的優(yōu)勢(shì)在于:
一方面,基于故事點(diǎn)的估算更純粹,不會(huì)因?yàn)殚_發(fā)人員的變更,時(shí)間的推移而改變。換句話說,項(xiàng)目半途有成員離職,加入新的成員,此時(shí)我們不需要對(duì)每個(gè)任務(wù)都重新估計(jì),只需要重新評(píng)估一下是否有需要調(diào)整插入到當(dāng)前迭代的故事點(diǎn)數(shù)。
另一方面,由于人們往往更擅長(zhǎng)于相對(duì)估算,所以故事點(diǎn)會(huì)讓估算更迅速。想象一下,讓你估算一杯水是另一杯水的幾倍,是不是會(huì)比讓你估算兩杯水各是多少毫升來的更容易呢?劣勢(shì)在于:一方面,而且由于編程語言不同或者業(yè)務(wù)分塊,大家很難找到一個(gè)共同熟悉的需求作為基準(zhǔn),那么用故事點(diǎn)的作為估算單位的方式就很難開展了。另一方面,故事點(diǎn)相對(duì)于其他估算單位更難被理解,這也使估算難以開始。
估算的幾種常用方式
1/3 自底向上的估算
由每個(gè)開發(fā)人員估算自己的任務(wù)時(shí)間,然后將所有的任務(wù)匯總,并考慮過任務(wù)間的依賴關(guān)系后,就排出了計(jì)劃。該方式適用于具有以下特點(diǎn)的團(tuán)隊(duì):成員間業(yè)務(wù)獨(dú)立性強(qiáng),相互之間的業(yè)務(wù)熟悉度不高且熟悉成本較大,較難進(jìn)行共同估算;各成員的經(jīng)驗(yàn)相對(duì)豐富,對(duì)自己的任務(wù)能進(jìn)行較好的評(píng)估。
在這樣的團(tuán)隊(duì)?wèi)?yīng)用該估算方式有以下優(yōu)勢(shì):
1.估算效率較高,各自任務(wù)的估算可以并行。
2.準(zhǔn)確度也會(huì)較高,因?yàn)閷?duì)各自的任務(wù)比較熟悉。
2/3 專家判斷
由一個(gè)或多個(gè)專家根據(jù)相應(yīng)開發(fā)的情況給出任務(wù)的估算值,但前提是你能找到這樣一個(gè)熟悉整個(gè)項(xiàng)目所有業(yè)務(wù)和整個(gè)項(xiàng)目團(tuán)隊(duì)成員的專家或?qū)<医M,在筆者所在的團(tuán)隊(duì)一般會(huì)有開發(fā)leader來充當(dāng)這樣的角色。
它的好處顯而易見:
1.通常不需要太多的時(shí)間,一個(gè)人估算就不存在太多的交流成本
2.準(zhǔn)確度也有一定的保障。甚至有證據(jù)說這種估算方法比其他的分析性方法更準(zhǔn)確。
3/3 撲克估算
是以撲克牌的形式進(jìn)行團(tuán)隊(duì)估算。估算開始前,每個(gè)估計(jì)者會(huì)分到一疊撲克牌,每張上有一個(gè)數(shù)值,如0,1,2,3,5,8•••然后由負(fù)責(zé)人對(duì)某個(gè)需要進(jìn)行估算的需求或者任務(wù)進(jìn)行講解,講解完之后,所有人可以向該負(fù)責(zé)人提問關(guān)于該條需求或任務(wù)的問題,直至足夠了解以做出估算。所有成員各自挑選一張撲克牌代表自己對(duì)該條目的估算。例如A給出8,而B只給了2,這樣就需要A和B各自給出理由說明自己估算的理由,這樣一輪下來,大家對(duì)該條目又加深了了解,然后進(jìn)行第二輪估算,如果相差還是很大,則繼續(xù)下一輪。大多數(shù)情況下至多經(jīng)過兩輪,大家的估算值已經(jīng)非常接近了,就可以取平均值作為對(duì)該條目最終的估算。
撲克估算的好處在于:
1.集合了所有團(tuán)隊(duì)成員的意見,比一個(gè)人的估算少了很多主觀成分;
2.其次,在估算過程中,強(qiáng)化和深入了大家對(duì)需求和任務(wù)的理解,將其考慮地更加細(xì)致,降低了不確定性給計(jì)劃帶來的沖擊;
3.最后,這種形式使相對(duì)嚴(yán)肅的計(jì)劃和估算會(huì)變得更加有趣。但是不得不承認(rèn),這需要比前兩種方式更多的時(shí)間成本。
實(shí)際應(yīng)用中的估算
團(tuán)隊(duì)1
組成:4人團(tuán)隊(duì)(3人開發(fā),1人測(cè)試)。
現(xiàn)狀:團(tuán)隊(duì)穩(wěn)定合作近2年,嘗試敏捷一年多,開發(fā)語言統(tǒng)一,成員間對(duì)相互的業(yè)務(wù)也都比較熟悉。
估算單位和估算方法:由于很容易找到大家熟悉的一個(gè)用戶故事作為基準(zhǔn),目前團(tuán)隊(duì)正應(yīng)用基于故事點(diǎn)的撲克估算。團(tuán)隊(duì)在經(jīng)過幾次迭代之后,基本上確定團(tuán)隊(duì)的開發(fā)速率(每個(gè)迭代能完成的故事點(diǎn)數(shù))。在接下來的迭代中,團(tuán)隊(duì)通過撲克估算確定每個(gè)用戶故事的故事點(diǎn),再根據(jù)用戶故事的優(yōu)先級(jí)一個(gè)個(gè)插入迭代開發(fā)計(jì)劃中,直到不能再承諾完成為止。
團(tuán)隊(duì)2
組成:9人團(tuán)隊(duì)(7人開發(fā),2人測(cè)試)
現(xiàn)狀:團(tuán)隊(duì)組建不到3個(gè)月,開發(fā)語言不統(tǒng)一,成員比較年輕,對(duì)系統(tǒng)的熟悉程度也不高。
估算單位和估算方法:一方面,由于成員之間的業(yè)務(wù)熟悉度不高且開發(fā)語言不統(tǒng)一,團(tuán)隊(duì)無法輕易找到一個(gè)合適的基準(zhǔn)用戶故事,所以團(tuán)隊(duì)的估算都是基于理想人天開展的。另一方面,由于開發(fā)人員數(shù)量較多且一部分成員經(jīng)驗(yàn)比較欠缺,無法很好的進(jìn)行團(tuán)隊(duì)估算,所以團(tuán)隊(duì)目前采用專家判斷(開發(fā)leader給出估算)為主的方式進(jìn)行計(jì)劃。
團(tuán)隊(duì)3
組成:13人團(tuán)隊(duì)(9人開發(fā),4人測(cè)試,2人運(yùn)維)
現(xiàn)狀:團(tuán)隊(duì)組建約1年多,產(chǎn)品模塊較多,不同模塊有不同的負(fù)責(zé)人,成員對(duì)自己模塊的業(yè)務(wù)邏輯比較清楚,但是對(duì)其他模塊的業(yè)務(wù)了解甚少。
估算單位和估算方法:由于成員間業(yè)務(wù)熟悉度不高且開發(fā)語言不統(tǒng)一,團(tuán)隊(duì)無法找到合適的基準(zhǔn)故事點(diǎn),所以團(tuán)隊(duì)選擇采用理想人日作為估算單位。另一方面,也由于模塊較多,開發(fā)leader不能熟知各業(yè)務(wù)邏輯,所以團(tuán)隊(duì)采用了自底向上的估算方式。由成員各自估算各自的任務(wù),進(jìn)而給出開發(fā)計(jì)劃。
團(tuán)隊(duì)4
組成:4人團(tuán)隊(duì)(3人開發(fā),1人測(cè)試)
現(xiàn)狀:團(tuán)隊(duì)組建2年多,產(chǎn)品已經(jīng)處于成熟期,目前大部分工作處于查漏補(bǔ)缺的階段。各成員對(duì)自己負(fù)責(zé)的部分比較精通。項(xiàng)目采用1周的短迭代形式。
估算單位和估算時(shí)間:由于迭代時(shí)間較短,團(tuán)隊(duì)成員又在自己的領(lǐng)域比較精通,故能做到基于理想人時(shí)的自底向上的估算,估算的偏差一般較小。
通過以上幾個(gè)例子,筆者想說明的是:各種估算單位和估算時(shí)間本身并沒有好壞之分,只有合適不合適只說。每個(gè)團(tuán)隊(duì)都需要根據(jù)成員和項(xiàng)目的現(xiàn)狀來進(jìn)行選擇。如果生搬硬套只會(huì)弄巧成拙,得不償失。
關(guān)于估算,我們必須明白
1.我們要知道,估算僅僅是一個(gè)預(yù)測(cè),當(dāng)對(duì)外承諾項(xiàng)目完成時(shí)間的時(shí)候,最好提供一個(gè)日期范圍,讓聽者知道你的估算只是估算;
2.不管是用什么估算方法,更小塊的工作總是更容易被估計(jì);
3.團(tuán)隊(duì)需要練習(xí)估算并且收集反饋,沒有反饋的估算最終將被證明是毫無價(jià)值的。每一次估算對(duì)應(yīng)的開發(fā)結(jié)束后,大家需要回過頭看看我們當(dāng)初做的估算是否合理;
4.估算也許需要反復(fù)進(jìn)行,當(dāng)項(xiàng)目進(jìn)行到一半時(shí),發(fā)現(xiàn)估算過于樂觀了,那么就需要對(duì)剩下的工作進(jìn)行重新的估算。
(本資訊于2017-12-11首次發(fā)布)