這個項目要多久開發(fā)完成?
這個問題是我最常碰到的一個,也是我最難回答的一個践磅。對這種問題最好的回答方式是用全職員工來推算天數(shù)按傅。這非常容易,你只需要找出有多少個不重疊的功能特征服协,然后每個人負責(zé)一個绍昂。一旦各個功能塊被分成了不能再分的任務(wù),你計算需要多少人天偿荷,這就是你的答案治专。你無論如何都不可能用比這更少的時間開發(fā)完這個項目。
“一個女人生一個孩子要10個月遭顶,不論你再增加多少個女人來做這事张峰,都不會縮短這個時間”
“只有當(dāng)一個任務(wù)的完成可以分配多個人,并且不需要他們之間相互交流合作的情況下能完成時棒旗,人和月才能互相替換喘批×萌伲”
“往一個已經(jīng)延遲的項目里添加程序員只會使項目進一步延遲”(因為項目中現(xiàn)有的人需要培訓(xùn)新來的人)
--《人月神話》
不幸的是,大部分人只想知道一個項目需要多少時間完成饶深。這實際是個偽命題餐曹,因為90%軟件成本的產(chǎn)生是發(fā)生在軟件發(fā)布之后。這些費用會產(chǎn)生于修復(fù)bug敌厘、增加欠缺的功能台猴、性能的改進、對新平臺進行支持(安卓就是一個大債主)或重寫質(zhì)量差的老代碼來減少技術(shù)債務(wù)俱两。即使是項目發(fā)布前饱狂,對于如何合適的處理每一種報錯情況,這也是無法預(yù)先估計全的宪彩。從某種程度上休讳,你就是被別人問了這樣一個問題:“我有一個問題,我想解決它尿孔,但我無法說清問題是什么俊柔。請問解決這個問題需要多少時間?”
盡管預(yù)估很難,但程序員最終要找到一種預(yù)估的方法活合。雖然無法知道一個確切的答案雏婶,但我有3種方法能大致估計出一個軟件項目要花多少時間:
想要搞清楚一個事情需要多少時間完成,這最好的方法是找一個程序員已經(jīng)完成的白指、相似的項目留晚。對一些簡單的網(wǎng)站和應(yīng)用來說非常有效,或者那些使用標準CRUD的項目也是適用侵续。當(dāng)項目小且簡單時這種方法最好用倔丈。這種方法可以用在軟件1.0版本時,但以后的版本就不行了状蜗,因為這時你跟相參照的項目開始慢慢的產(chǎn)生差異需五,這時寫的代碼是你以前沒有寫過的。
我的好朋友轧坎、并且是以前的同事JohnWalker喜歡用這種方法宏邮。把項目拆解成最小的任務(wù)。然后記錄完成每個任務(wù)你認為可能需要多少小時缸血、天蜜氨、周、月捎泻。遵循這種原則飒炎,如果一個任務(wù)需要幾小時,就是算成一天笆豁,如果需要數(shù)天郎汪,就是算成一周赤赊,如果是數(shù)周,就算成一月煞赢。如果超過一個月抛计,那你就無法知道需要多少時間了,或你根本不知道要做什么照筑。
我有自己的預(yù)估方法吹截,但事實上跟John的把任務(wù)拆分成最小的子任務(wù)的方法非常相似。我是以最壞的情況下每個最小單元需要的完成時間為標準凝危。匯總波俄,然后乘以4。再向上取舍到最近的素數(shù)媒抠,就算是對我的這種沒譜的方法的諷刺吧弟断。
對于大型的咏花、獨特的項目趴生,程序員幾乎無法知道它需要多少時間開發(fā)。它就是像在問“需要花多少時間能找到治療癌癥的方法?”然而昏翰,大部分的管理部門都拒絕接受這種答案苍匆,于是,程序員只好玩一些花招棚菊,先弄清楚老板們希望聽到的時間浸踩,然后加入一些余地。還能有什么辦法?通常都是超近路统求,這都是因為要去追趕那個本不應(yīng)該設(shè)置的最后期限检碗。你需要明白,預(yù)估是困難的码邻,需要運行計劃上的變更折剃。除非你的程序員能將任務(wù)拆分小于一個月的子任務(wù),千萬不要在軟件發(fā)布時間上做任何市場活動計劃像屋。
這最后一件需要注意的事是怕犁,當(dāng)你在一個現(xiàn)有的軟件(比如2.0版,3.0版….)上增加新功能時己莺,你需要追加20%用來對現(xiàn)有代碼進行重寫的時間(程序員稱之為重構(gòu))奏甫。這是為了償還技術(shù)債務(wù),或為未來的行動鋪路凌受。人們以為Google是拿出20%的時間用來創(chuàng)新阵子,但我敢打賭,其實這大部分是來償還技術(shù)債務(wù)的胜蛉。
估計一件事情要花多少事情是非常難的挠进,通常也是不可能的智蝠。雖然你曾在一些小項目上有成功的預(yù)測,但隨著項目的發(fā)展你會感覺到越來越難奈梳。一個好的方法是給程序員留足額外的時間杈湾。很多年輕的程序員通常沒有這方面的經(jīng)驗,所以攘须,項目經(jīng)理必須把他們估計出的時間乘以4漆撞。