软件工程 估计方法
?
上回書說到 -
一個小組的同學(xué) (6-8 人) 決定要徒步遍歷中國陸地邊界, 假設(shè)供給裝備齊全, 估計需要多長時間?
用什么樣的辦法能讓同學(xué)們方便地交流各自的估計, 最后到達大致理性和統(tǒng)一的共識?
一般這個時候教室里一定非常熱鬧,? 大家各抒己見, 爭執(zhí)得不亦樂乎。 但是最后往往誰也說服不了誰, 還有一些同學(xué)無動于衷, 覺得無從下手, 干脆不參加討論。? 在這種情況下, 可以考慮通過 Wide-band delphi 來達到快速溝通和達到意見的一致。
網(wǎng)上有不少關(guān)于這類方法的介紹:
http://www.stellman-greene.com/aspm/content/view/23/38/
http://en.wikipedia.org/wiki/Wide-band_delphi
http://drdobbs.com/article/printableArticle.jhtml?articleId=184414570&dept_url=/? (Dr. Drobb’s)
?
這個方法看起來復(fù)雜, 其實挺簡單的:
1) 找到一個主持人 (facilitator/moderator)
2) 主持幾輪討論,? 每一輪統(tǒng)計大家的估計, 并且詢問大家估計值的前提假設(shè)是什么, 找到合理的假設(shè), 然后繼續(xù)。
例如:? 第一輪, 大家的估計和假設(shè)是:
a) 300 年???????????????? 假設(shè): 要按照邊界走, 爬到珠穆朗瑪峰就掛了
b) 2 年;?????????????????? 假設(shè): 兩萬多公里的陸上邊境線。參考紅一方面軍在長征時候的記錄,12個月走1萬兩千公里。所以2年即可。
c) 5 年;?????????????????? 假設(shè): 3 萬公里, 一年工作 300 天, 每天20公里,?
d) 1 年;?????????????????? 假設(shè): 邊界大概有10個省份, 每個省份在當(dāng)?shù)毓策叿赖膸ьI(lǐng)下, 一個月就搞定了。 有兩個月用于和各地政府取得聯(lián)系。
e) 5 個月????????????????? 假設(shè): 南宋后再無中國, 只好沿著南宋的邊界走, 走走玩玩, 很快就走完了。
f) 不可能????????????????? 假設(shè): 被有關(guān)部門請去喝茶
?
[我在微博上看到還有人說 50 天的, 不知道他的假設(shè)是什么樣子…]
…
?
大家對各自的假設(shè)做了分析, 得出了新的共同假設(shè):?
??????? 沿著邊界 = 離邊界最近的公路或小路走, 青藏高原可以繞一下, 不必親自到每一塊界碑跟前拍照留念。 不過還得自己走。?
??????? 陸地邊界 = 中國現(xiàn)在的邊界, 不是南宋的。 約等于2 萬公里
在這樣的前提下, 大家又有新的一輪估計:
??? … …
然后又澄清一些假設(shè),
??? … …
最后大家的估計收斂到一個大家都比較滿意的精度數(shù)值。于是估計就結(jié)束了. 注意在精度上, 大家不必太拘泥, 根據(jù)這個題目的情況, 用月做單位即可。 不必爭論到底會用 1002 天還是1003 天。
主持人要記住在每一輪的估計中, 探詢數(shù)值背后的假設(shè), 這是作為項目經(jīng)理最重要的能力.? 另外, 要推動數(shù)值收斂, 這要求大家的假設(shè) (也就是用戶需求分析) 也要收斂, 不要天馬行空。在每一輪的討論中, 估計值的上界和下界要不斷接近。
注意, 最后得到的估計數(shù)值, 也許和某人最初提出的數(shù)值很接近, 但是這意義并不大, 因為最后達成的假設(shè)也許和最初的假設(shè)大相徑庭。? Wide-band delphi 的目的不是比誰的第一輪估計猜得準(zhǔn), 而是在較短的時間內(nèi)讓團隊充分溝通, 交換意見。
?
在這個練習(xí)中, 很重要的一點是要估計團隊自身的能力, 你看到別人能每天行軍30公里, 你自己未必能夠。 你聽說編程大牛幾天寫好某模塊, 你自己卻花了幾個星期。? 在上課的時候, 有同學(xué)提到團隊要先培訓(xùn)幾年, 這也是很好的角度, 在開始使用一個全新的技術(shù)前, 一段時間的培訓(xùn)和練習(xí)是很有必要的。 你的估計中是否包括這些因素?
?
還有一個高級PM能考慮到的問題, 既然這是一個長期項目, 那不可避免地有人員的投入 (commitment)和變動 (attrition) 問題。 大家走著走著, 有人受傷怎么辦? 有人和當(dāng)?shù)厣贁?shù)民族少女墜入愛河怎么辦? 有人打退堂鼓怎么辦???????
?
軟件開發(fā)的一個特點是, 軟件項目的確有不少東西可以重用別人的結(jié)果, 但是項目中最有價值的部分, 別人都還沒做過, 還得自己動手. 這就要求我們?nèi)ヌ剿? 發(fā)現(xiàn)這樣的工作到底需要多長時間。?? 問題是 - 探險者總是高估自己的能力,低估未知的困難 - 不然他們就不會出門探險了!
?
據(jù)說, 早期的西班牙探險者到美洲達科羅拉多河大峽谷的時候, 他們站在峽谷南岸俯瞰深谷中蜿蜒的河流, 覺得那不過是一條細細的小溪而已。 隊長估計用不了一天的時間就能跨越, 于是大隊人馬開始出發(fā)。? 等他們下到山谷的一半, 才發(fā)現(xiàn)河流湍急, 自身的裝備不夠, 人困馬乏, 只好又悻悻返回, 同時已經(jīng)累得半死。
我們在做項目的時候, 也有很多次發(fā)現(xiàn)原來估計很容易的地方原來 “水很深”, 往前走, 也許會被淹死, 往回退, 會耽誤大量的時間。 這時候大家心里都暗想 - 當(dāng)時要是在項目計劃的時候多做深入分析和估計就好了!? 但是回過頭來, 對于這種情況, 大家如果坐在峽谷邊 wide-band delphi 一整天, 也依然會得出非常樂觀的結(jié)論,因為沒有人提出不同的 “假設(shè)”。 這時候, 我們可以考慮參考前人的經(jīng)驗,打聽一下當(dāng)?shù)厝丝缭酱髰{谷要幾天。 有些事情花的時間是客觀規(guī)律, 不是由個人能力決定。? 例如生一個小孩大約需要10個月, 這個估計和你的 S 是大號, 中號, 還是小號無關(guān), 和婚禮來賓的數(shù)量也無關(guān)。 要是還不滿意懷孕時間長, 再加上幾個精壯男子幫忙, 也無濟于事。??世界上很多事情都有人做過了, 即使和你的具體情況有種種區(qū)別, 還是可以作為參考, 例如你想徒步走遍全國, 貌似前無古人, 但是不妨看看一個騎自行車走遍全國的例子:
?[鏈接: http://www.lvye.cn/article-26533-1.html]
這些老人騎車用了大約200天,? 小伙子走路能比他們快么??? 另外, 老人們走的是城市間的連接線, 大學(xué)生們要走邊境線, 難度比較一下, 原來那些小于300 天的估計都可以推翻了。
另外一個辦法是快速原型法 -? 用一兩個先鋒去探路。 例如一個項目如果能用上 Microsoft Azure 平臺, 那貌似會給我們帶來很多好處.? 如果你光看 Azure 的宣傳資料, 你覺得這簡直太容易了, 咱們趕緊上馬!? 且慢, 這時不妨派一個人寫一個簡單的Azure Hello World 應(yīng)用, 實際看看開發(fā)/調(diào)試/部署/支持的情況如何, 這樣才能給項目估計提供更好的數(shù)據(jù)支持。
?
我自己在長期的革命斗爭中, 摸索出一套經(jīng)驗公式: 你問一個開發(fā)人員兩件事 – 對某件事的估計時間 X, 以及他做過類似開發(fā)工作的次數(shù) N.? 那么他最終需要的時間
Y = X +/- X/N???? //注: 中間的 +/- 表明或者加上, 或者減去。
例如果凍估計某個模塊需要 3 天, 但是果凍從來沒有做過, 那么這件事情實際花費的時間有兩種可能 Y = 3 +/- 3/0.??
就是說, 這事情也許是 (3 + 無窮大),? 在項目時間內(nèi)壓根就做不了。 例如一個學(xué)生團隊一度想做 “用玩家的人臉做拳皇游戲”?
或者是 (3 - 無窮大), 不但不用做, 而且這個員工會搞出很多新的bug 來, 讓團隊花更多的時間來處理, 把項目拖垮.?
?
比如果凍說要實現(xiàn)網(wǎng)絡(luò)用戶的管理, 結(jié)果發(fā)現(xiàn)Asp.net 早就實現(xiàn)了. 但是果凍不服,非得要自己寫一個。 結(jié)果寫得漏洞百出,? 很多其他員工來幫他擦屁股。 最后把他的代碼扔了, 用標(biāo)準(zhǔn)控件來實現(xiàn)。
?
當(dāng) N 等于 1 的時候, 一項工作估計的實際花費范圍是 [0 .. 2X],?? 如果員工一直做類似的項目, 他們的 N 值都在 1 以上, 估計變化的范圍會越來越小, 準(zhǔn)確度越來越高。當(dāng)然, 技術(shù)在變, 市場在變, 員工的心態(tài)也在變, 員工是不甘于, 也不能一直做雷同的項目的。??
如果把這個公式展開一下, 項目的復(fù)雜程度
???? a) 需求的復(fù)雜程度 - 程序員是第幾次實現(xiàn)類似的需求???有些外行看起來很復(fù)雜的需求 (如銀行業(yè)務(wù)流程), 如果一個程序員已經(jīng)做過多次相關(guān)的銀行項目, 其實不向外人看的那么難。
???? b) 技術(shù)的復(fù)雜程度 - 程序員是第幾次用這個技術(shù)實現(xiàn)??
??? 一個極端的例子: 幾個程序員用他們從來沒用過的技術(shù) (例如 HTML5) 去實現(xiàn)一個他們以前沒碰到過的需求 (例如銀行業(yè)務(wù)), 他們的時間估計一定很飄忽...
業(yè)界的專家也有類似的分析, 例如這個項目/過程復(fù)雜度的二維圖 (圖來自 Danc? “Managing game design risk: Part I”? )
?
一個案例:? 大牛在完成一項任務(wù), 他原計劃 3 天完成, 現(xiàn)在是第三天的下午, 他馬上就可以做完. 但是在實現(xiàn)功能的過程中, 他越來越意識到自己原來的想法不是最好, 他應(yīng)該采取另一個辦法, 才能避免后面集成階段的額外工作. 但是他如果現(xiàn)在就改弦更張, 那勢必要影響自己原來估計的準(zhǔn)確性. 這樣他的老板, 同事會因此看不起他?? 如果他按部就班, 最后整個團隊還要花更多時間在后續(xù)集成上, 但是就不是他個人的問題了. 怎么辦?
?
整個軟件項目的時間估計也可以從兩個方面來看 -
a) 自底向上? 團隊成員各自估計底層模塊和單個功能 (和單元測試) 所需的時間, 再加上集成, 及基本測試的時間, 就是大概的開發(fā)時間。 這還沒有考慮各個模塊之間的相互依賴性.
b) 回溯?????? 團隊從整個項目最終交付之日往回倒推 -??
如果在十一就要交付整個軟件, 那么九月一號就要完成基本測試
如果九月一號要完成基本測試, 那么八月一號就要代碼完成 (Code Complete)
如果八月一號要代碼完成, 那么我們要有16 周的開發(fā)任務(wù), 那意味著我們四月一號就要開始, 而且四月一號要有第一批設(shè)計規(guī)格說明書 (spec)
我倒! 今天已經(jīng)四月七號了! 你還在看博客!
?
在敏捷開發(fā)的項目中, 團隊一般不過分強調(diào) “估計”的價值,因為它就是一個“猜”字。 “猜得準(zhǔn)”不是團隊的目標(biāo)。 團隊的目標(biāo)是把軟件寫出來, 讓用戶滿意。?? 如果猜錯了,沒關(guān)系,微調(diào)項目進度即可,不要為了“猜得準(zhǔn)” 而躊躇不前; 或者為了讓當(dāng)初的猜測看起來靠譜而不如實報告進度。
?
在敏捷的開發(fā)流程中, 還有不少看似山寨的辦法, 我接觸到的有:
估計撲克牌 – 撲克牌上面是1, 2, 3, 5, 8, 13, … 等數(shù)字, 大家出牌來估計某功能花費的時間。 這副牌我給了我們項目的PM, 她拿去打拖拉機了。
劃拳估計法 - 幾人一聲吶喊, 同時出拳, 幾個手指代表幾天, 我們項目組還沒有正式演練過.
t-shirt 尺寸法 – 用 S, M, L, XL 代表估計的時間長度, 對于尺寸超大的任務(wù), 要考慮把它們分解為比較細小可掌控的小任務(wù).
這些方法都是強調(diào)快速得到粗粒度的估計, 然后進入實現(xiàn)階段. 一個團隊經(jīng)過一次里程碑之后, 再回過頭看看原來的估計和實際花費時間的差距。? 經(jīng)過一兩次里程碑, 成員們就可以了解在我們項目中, 一個尺寸為 S 的任務(wù)大概要多少天。
?
關(guān)于時間估計, 這里有更多相關(guān)內(nèi)容:
http://www.pmhut.com/agile-estimating-%E2%80%93-estimation-approaches
?
回到上一個博客提到的目標(biāo), 決心和估計的區(qū)別, 當(dāng)一個程序員果凍聽到大老板說 - 果凍, 這個項目十一要交付使用, 你估計能行么?
果凍首先想到的不是用哪一種時間估計方法, 而應(yīng)該反問? - 老板, 您已經(jīng)給了一個商業(yè)目標(biāo), 現(xiàn)在你是想聽客觀的估計呢?? 還是我主觀的決心?
老板一定會對果凍另眼相看的
?
另一個目標(biāo)/決心/估計的故事: 某項目本來進行得很順利, 大領(lǐng)導(dǎo)非要全體人員脫產(chǎn)開一天的動員大會,?會議結(jié)束時, 領(lǐng)導(dǎo)熱情地問大家: 大家對如期完成項目有信心么??? 這時, 項目經(jīng)理站起來說: 我們本來是可以按期完成的, 現(xiàn)在開了一天會, 我們已經(jīng)延期了一天。 對這樣的經(jīng)理, 我要點【贊】。?
?
Steve McConnel 曾經(jīng)詳細說明了軟件估計的 10 種罪, 很值得一讀:
??? http://www.ewh.ieee.org/r5/central_texas/austin_cs/presentations/2004.08.26.pdf?
?
既然是一個面試問題, 下面是我的一些打分標(biāo)準(zhǔn):
6 分及格, 10分優(yōu)秀。
總結(jié)
- 上一篇: 软件使用手册模板_我的印象笔记使用手册(
- 下一篇: 现代软件工程讲义 4 团队和流程