項(xiàng)目時(shí)間評(píng)估:這個(gè)項(xiàng)目要多久開(kāi)發(fā)完成?
這個(gè)問(wèn)題是我最常碰到的一個(gè),也是我最難回答的一個(gè)。對(duì)這種問(wèn)題最好的回答方式是用全職員工來(lái)推算天數(shù)。這非常容易,你只需要找出有多少個(gè)不重疊的功能特征,然后每個(gè)人負(fù)責(zé)一個(gè)。一旦各個(gè)功能塊被分成了不能再分的任務(wù),你計(jì)算需要多少人天,這就是你的答案。你無(wú)論如何都不可能用比這更少的時(shí)間開(kāi)發(fā)完這個(gè)項(xiàng)目。
“一個(gè)女人生一個(gè)孩子要10個(gè)月,不論你再增加多少個(gè)女人來(lái)做這事,都不會(huì)縮短這個(gè)時(shí)間”
“只有當(dāng)一個(gè)任務(wù)的完成可以分配多人,并且不需要他們之間相互交流合作的情況下能完成時(shí),人和月才能互相替換。” “往一個(gè)已經(jīng)延遲的項(xiàng)目里添加程序員只會(huì)使項(xiàng)目進(jìn)一步延遲”(因?yàn)轫?xiàng)目中現(xiàn)有的人需要培訓(xùn)新來(lái)的人) |
不幸的是,大部分人只想知道一個(gè)項(xiàng)目需要多少時(shí)間完成。這實(shí)際是個(gè)偽命題,因?yàn)?0%軟件成本的產(chǎn)生是發(fā)生在軟件發(fā)布之后。這些費(fèi)用會(huì)產(chǎn)生于修復(fù)bug、增加欠缺的功能、性能的改進(jìn)、對(duì)新平臺(tái)進(jìn)行支持(安卓就是一個(gè)大債主)或重寫(xiě)質(zhì)量差的老代碼來(lái)減少技術(shù)債務(wù)。即使是項(xiàng)目發(fā)布前,對(duì)于如何合適的處理每一種報(bào)錯(cuò)情況,這也是無(wú)法預(yù)先估計(jì)全的。從某種程度上,你就是被別人問(wèn)了這樣一個(gè)問(wèn)題:“我有一個(gè)問(wèn)題,我想解決它,但我無(wú)法說(shuō)清問(wèn)題是什么。請(qǐng)問(wèn)解決這個(gè)問(wèn)題需要多少時(shí)間?”
盡管預(yù)估很難,但程序員最終要找到一種預(yù)估的方法。雖然無(wú)法知道一個(gè)確切的答案,但我有3種方法能大致估計(jì)出一個(gè)軟件項(xiàng)目要花多少時(shí)間:
- 想要搞清楚一個(gè)事情需要多少時(shí)間完成,這最好的方法是找一個(gè)程序員已經(jīng)完成的、相似的項(xiàng)目。對(duì)一些簡(jiǎn)單的網(wǎng)站和應(yīng)用來(lái)說(shuō)非常有效,或者那些使用標(biāo)準(zhǔn)CRUD的項(xiàng)目也是適用。當(dāng)項(xiàng)目小且簡(jiǎn)單時(shí)這種方法最好用。這種方法可以用在軟件1.0版本時(shí),但以后的版本就不行了,因?yàn)檫@時(shí)你跟相參照的項(xiàng)目開(kāi)始慢慢的產(chǎn)生差異,這時(shí)寫(xiě)的代碼是你以前沒(méi)有寫(xiě)過(guò)的。
- 我的好朋友、并且是以前的同事John Walker(不是這個(gè)John Walker)喜歡用這種方法。把項(xiàng)目拆解成最小的任務(wù)。然后記錄完成每個(gè)任務(wù)你認(rèn)為可能需要多少小時(shí)、天、周、月。遵循這種原則,如果一個(gè)任務(wù)需要幾小時(shí),就是算成一天,如果需要數(shù)天,就是算成一周,如果是數(shù)周,就算成一月。如果超過(guò)一個(gè)月,那你就無(wú)法知道需要多少時(shí)間了,或你根本不知道要做什么。
- 我有自己的預(yù)估方法,但事實(shí)上跟John的把任務(wù)拆分成最小的子任務(wù)的方法非常相似。我是以最壞的情況下每個(gè)最小單元需要的完成時(shí)間為標(biāo)準(zhǔn)。匯總,然后乘以4。再向上取舍到最近的素?cái)?shù),就算是對(duì)我的這種沒(méi)譜的方法的諷刺吧。
對(duì)于大型的、獨(dú)特的項(xiàng)目,程序員幾乎無(wú)法知道它需要多少時(shí)間開(kāi)發(fā)。它就是像在問(wèn)“需要花多少時(shí)間能找到治療癌癥的方法?”然而,大部分的管理部門(mén)都拒絕接受這種答案,于是,程序員只好玩一些花招,先弄清楚老板們希望聽(tīng)到的時(shí)間,然后加入一些余地。還能有什么辦法?通常都是超近路,這都是因?yàn)橐プ汾s那個(gè)本不應(yīng)該設(shè)置的最后期限。你需要明白,預(yù)估是困難的,需要運(yùn)行計(jì)劃上的變更。除非你的程序員能將任務(wù)拆分小于一個(gè)月的子任務(wù),千萬(wàn)不要在軟件發(fā)布時(shí)間上做任何市場(chǎng)活動(dòng)計(jì)劃。
這最后一件需要注意的事是,當(dāng)你在一個(gè)現(xiàn)有的軟件(比如2.0版,3.0版….)上增加新功能時(shí),你需要追加20%用來(lái)對(duì)現(xiàn)有代碼進(jìn)行重寫(xiě)的時(shí)間(程序員稱(chēng)之為重構(gòu))。這是為了償還技術(shù)債務(wù),或?yàn)槲磥?lái)的行動(dòng)鋪路。人們以為Google是拿出20%的時(shí)間用來(lái)創(chuàng)新,但我敢打賭,其實(shí)這大部分是來(lái)償還技術(shù)債務(wù)的。
估計(jì)一件事情要花多少事情是非常難的,通常也是不可能的。雖然你曾在一些小項(xiàng)目上有成功的預(yù)測(cè),但隨著項(xiàng)目的發(fā)展你會(huì)感覺(jué)到越來(lái)越難。一個(gè)好的方法是給程序員留足額外的時(shí)間。很多年輕的程序員通常沒(méi)有這方面的經(jīng)驗(yàn),所以,項(xiàng)目經(jīng)理必須把他們估計(jì)出的時(shí)間乘以4。
譯文鏈接:http://www.vaikan.com/how-long-would-this-project-take/