為什么程序員預(yù)估的時(shí)間都不靠譜
一個(gè)我曾經(jīng)共事過(guò)的很有經(jīng)驗(yàn)的項(xiàng)目經(jīng)理曾宣稱說(shuō),他會(huì)拿程序員估計(jì)出的時(shí)間乘以π值,然后再提高一個(gè)數(shù)量級(jí),這樣得出的才是正確的開(kāi)發(fā)所需要的時(shí)間。1天時(shí)間經(jīng)過(guò)變換后是3.14周。他經(jīng)過(guò)慘痛的教訓(xùn)才認(rèn)識(shí)到程序員預(yù)估的時(shí)間都是不靠譜的。為了能更精確的對(duì)程序員估計(jì)的時(shí)間進(jìn)行換算,我創(chuàng)建了一個(gè)時(shí)間換算表,重點(diǎn)說(shuō)明究竟是什么地方出了問(wèn)題。
估計(jì)時(shí)間 | 程序員的思考 | 程序員忽略的事情 | 真正所 需時(shí)間 |
---|---|---|---|
30秒 | 只需要對(duì)代碼進(jìn)行很小的改動(dòng)就搞定了。我清楚的知道程序應(yīng)該在哪里做修改、怎么修改。只需要30秒時(shí)間。 | 啟動(dòng)電腦的時(shí)間,啟動(dòng)開(kāi)發(fā)環(huán)境的時(shí)間,獲取源代碼的時(shí)間。編譯、測(cè)試、提交代碼和文檔修改的時(shí)間。 | 1小時(shí) |
5分鐘 | 一個(gè)小問(wèn)題,我只需要上谷歌上查查它正確的語(yǔ)法就能搞定。 | 你不可能***次就能精確的查找到正確的信息,就算是找到了,在使用它之前你也需要對(duì)它做一些調(diào)整。還有編譯、測(cè)試的時(shí)間等。 | 2小時(shí) |
1小時(shí) | 我知道該怎么做,但是這需要寫(xiě)一些代碼,所以要花一些時(shí)間。 | 1小時(shí)時(shí)間太緊張,沒(méi)有給任何未預(yù)料到的事情留下余地。總有一些你預(yù)料不到的事情。 | 2小時(shí) |
4小時(shí) | 這需要寫(xiě)一些代碼,但我基本知道該怎么做。我知道我們的標(biāo)準(zhǔn)框架里的Wizzabanga模塊能做這個(gè)事情,但我需要去查查文檔看如何正確的調(diào)用它。 | 這可能是唯一一個(gè)符合現(xiàn)實(shí)的估計(jì)。在任務(wù)不是很大、能夠處理的情況下,它給未預(yù)料到的問(wèn)題留下了足夠的時(shí)間。 | 4小時(shí) |
8小時(shí) | 我首先要重構(gòu)Balunga類,把它拆分成兩個(gè),然后在Wizzabanga模塊里加入調(diào)用代碼,***在界面上添加一個(gè)新的表單域。 | 系統(tǒng)的很多地方都對(duì)Balunga類有依賴關(guān)系。大概有40多個(gè)文件需要調(diào)整。界面上新添加的屬性的同時(shí)數(shù)據(jù)庫(kù)里也要新增字段。8小時(shí)是十分理想的狀況的時(shí)間。程序員在估計(jì)時(shí)間時(shí)總忽略了還有很多其它事情要做。 | 12-16小時(shí) |
2天 | 這需要寫(xiě)很多的代碼。我需要在數(shù)據(jù)庫(kù)中添加一些新表,用一個(gè)界面來(lái)顯示它們,然后還要寫(xiě)存取它們的邏輯代碼。 | 對(duì)大多數(shù)程序員來(lái)說(shuō),2天時(shí)間能完成多少東西都是很難說(shuō)的。肯定會(huì)有一些東西被遺忘。并不是指一些小的東西,一些主要功能上的重要東西也有可能在你估計(jì)時(shí)被遺漏。 | 5天 |
1周 | 哇塞…這可是個(gè)大任務(wù)。我還不知道如何實(shí)現(xiàn)它,我不是告訴你我不知道如何做。一周時(shí)間應(yīng)該足夠了,但愿,希望能夠,但我不會(huì)要求更多的時(shí)間,不然的話他們會(huì)說(shuō)我能力不行。 | 這樣一個(gè)任務(wù)對(duì)于大多數(shù)程序員來(lái)說(shuō)都很難理解消化。這個(gè)任務(wù)應(yīng)該發(fā)回給架構(gòu)師,讓他把任務(wù)拆分成更小的模塊,對(duì)各模塊應(yīng)該如何執(zhí)行給出一些指導(dǎo)。架構(gòu)師應(yīng)該能找到實(shí)現(xiàn)它的一些簡(jiǎn)單的方法——或者認(rèn)識(shí)到這個(gè)任務(wù)的工作量比他預(yù)期的要多。 | 2-20天 |
預(yù)估時(shí)間本身就很難。每個(gè)程序員的估計(jì)都會(huì)跟真正需要的時(shí)間有些差距。估計(jì)時(shí)間短了說(shuō)明有些事情被忽略了(編譯,測(cè)試,提交代碼)。估計(jì)時(shí)間超了說(shuō)明任務(wù)太大,難以理解。
對(duì)于資歷較淺的程序員,這種估計(jì)誤差是混亂的,他們經(jīng)常會(huì)輕視一些任務(wù),同時(shí)又對(duì)一些稍微有難度的任務(wù)過(guò)分高估。我認(rèn)為,對(duì)一個(gè)有經(jīng)驗(yàn)的程序員,一個(gè)任務(wù)的時(shí)間應(yīng)該在半小時(shí)到24小時(shí)之間,超出24小時(shí)的任務(wù)都需要拆分。程序員在腦中想一想可能會(huì)認(rèn)為要60小時(shí),但實(shí)際上即使是很有經(jīng)驗(yàn)的程序員也需要將任務(wù)分成可控的模塊再來(lái)分析做決定。
還有一個(gè)很重要的需要認(rèn)識(shí)到的一點(diǎn)是,編程上的經(jīng)驗(yàn)并不等同于時(shí)間估計(jì)上的經(jīng)驗(yàn)。一個(gè)從沒(méi)有做過(guò)工期估計(jì)的程序員不會(huì)擅長(zhǎng)估計(jì)時(shí)間。如果不去拿真正需要的時(shí)間和估計(jì)出的時(shí)間進(jìn)行比較,你不可能從其它反饋信息之得到正確估計(jì)時(shí)間的經(jīng)驗(yàn)。
每個(gè)程序員都會(huì)用到評(píng)估技巧。為了提高你的這項(xiàng)技能,你可以在你從事的每個(gè)任務(wù)上進(jìn)行鍛煉。在任務(wù)開(kāi)始時(shí)先預(yù)估開(kāi)發(fā)所需時(shí)間,拿它跟你最終真正用掉的時(shí)間進(jìn)行對(duì)比。這樣,你不僅在對(duì)任務(wù)細(xì)節(jié)的理解上有提高,同時(shí)也提高了你對(duì)時(shí)間預(yù)估的技能。
英文原文:Programmer Time Translation Cheatsheet -or- Why Programmers Are Bad at Estimating Times
本文鏈接:http://www.aqee.net/why-programmers-are-bad-at-estimating-times/