14.6開(kāi)發(fā)階段的日常管理
14.6.1閉門造車(leave me alone)
荔荔:我今天真失?。≡谵k公室里坐了10個(gè)小時(shí),但是真正能花在開(kāi)發(fā)工作上的可能只有3個(gè)小時(shí),然后我的工作進(jìn)展大概只有兩個(gè)小時(shí)!
阿超:那你的時(shí)間都花到哪里去了?
荔荔:就是我們以前說(shuō)的“我沒(méi)看見(jiàn)你在寫軟件,你到底在忙什么”上面列出來(lái)的破事兒。每一件隨機(jī)事情看起來(lái)都是挺重要的,我就放下手里的開(kāi)發(fā)工作。但是好不容易做完了,剛想進(jìn)入狀態(tài),又一件隨機(jī)事情來(lái)了……
阿超:你要厚著臉皮,說(shuō)“不”。
當(dāng)場(chǎng)景、功能都計(jì)劃好的時(shí)候,要給員工足夠多的時(shí)間,讓他們投入到工作中去,而不要經(jīng)常打斷他們。
要盡量減少非開(kāi)發(fā)時(shí)間,不要?jiǎng)硬粍?dòng)就開(kāi)“全體會(huì)議”。團(tuán)隊(duì)成員們自我時(shí)間管理也很重要。由于MSF鼓勵(lì)溝通,TFS也設(shè)置了不少提示(Alert)自動(dòng)報(bào)告全體成員項(xiàng)目個(gè)方面的情況,因此團(tuán)隊(duì)的E-mail會(huì)特別多。在這種情況下不要整天被E-mail牽著鼻子走。在Outlook上設(shè)置好郵件規(guī)則,按下面的規(guī)則把郵件自動(dòng)分類到不同的郵件夾中:
?。?)從直接老板來(lái)的,發(fā)給你一個(gè)人的——馬上處理。
?。?)從團(tuán)隊(duì)成員來(lái)的、和項(xiàng)目有關(guān)的事情,自動(dòng)分配到一個(gè)叫“Team”的郵件夾中。
?。?)從TFS來(lái)的狀態(tài)信息,如團(tuán)隊(duì)的check-in email,自動(dòng)分配到一個(gè)叫“Check-In”的郵件夾中。
?。?)從其公司他同事來(lái)的與工作無(wú)關(guān)的消息(如笑話,大減價(jià)的消息等),自動(dòng)分配到一個(gè)叫“Other”的郵件夾中。
最好每隔兩三小時(shí)集中閱讀和回復(fù)一下E-mail。
荔荔:河對(duì)岸的河曲數(shù)碼經(jīng)常把所有人都拉去做“封閉開(kāi)發(fā)”,這樣是否就能避免干擾?
阿超:我們做開(kāi)發(fā)軟件,并不是讓團(tuán)隊(duì)像被關(guān)在監(jiān)獄里一樣。要有大家自由交流的時(shí)間,團(tuán)隊(duì)成員們?cè)跓o(wú)拘束的環(huán)境中,會(huì)更樂(lè)意提問(wèn)和分享,這會(huì)比召開(kāi)正式會(huì)議,強(qiáng)迫每個(gè)人分享好得多。在“封閉開(kāi)發(fā)”的情形下,領(lǐng)導(dǎo)也更有可能每天、每小時(shí)來(lái)詢問(wèn)項(xiàng)目的進(jìn)度,這種團(tuán)隊(duì)內(nèi)部的干擾源,并不會(huì)因?yàn)閳F(tuán)隊(duì)搬到一個(gè)監(jiān)獄里而消失。大家還記得MSF的“充分的授權(quán)和信任”?
果凍:我這里還有筆記。
小飛:另外,我經(jīng)常去看測(cè)試人員又發(fā)現(xiàn)了什么bug,有時(shí)就花時(shí)間研究和修復(fù)它們。
阿超:可以等第二天會(huì)診之后再看看是否值得馬上修復(fù)。
果凍:這樣新建的bug 要等到第二天門診之后才能給開(kāi)發(fā)人員處理,是不是影響進(jìn)度?
阿超:不一定。
提示:
?。?)開(kāi)發(fā)人員在開(kāi)發(fā)階段最重要的任務(wù)是把規(guī)定的功能完成!
?。?)在項(xiàng)目初期,可以不用集體會(huì)診,開(kāi)發(fā)/測(cè)試人員可以直接處理“缺陷”,不必等待。
?。?)在任何時(shí)候,測(cè)試人員都可以把“缺陷”交給開(kāi)發(fā)人員,但是只有會(huì)診的人員才能改變會(huì)診決定。
14.6.2每日構(gòu)建
阿超:我好像有幾天沒(méi)有受到每日構(gòu)建(Daily Build)的報(bào)告了。
小飛:已經(jīng)有一陣子 Daily Build 沒(méi)成功了。
阿超:哦?我們上課的時(shí)候不是說(shuō)過(guò)“每日構(gòu)建”的重要性么?
小飛:我同意在我們有時(shí)間的情況下,我們要做每日構(gòu)建,但是當(dāng)我們忙的時(shí)候,我們的確實(shí)沒(méi)有時(shí)間去管構(gòu)建的問(wèn)題。
阿超:這么說(shuō)還是應(yīng)了那句話——在理論上,理論和實(shí)踐是一回事,而在實(shí)踐上,理論和實(shí)踐是兩回事。
阿超指著窗外,河對(duì)面的工地。
阿超:他們?cè)诮欠堪伞?br />
小飛:對(duì),據(jù)說(shuō)是軟件學(xué)院的新大樓。
阿超:那,他們的腳手架自從搭好了之后,就沒(méi)有垮下來(lái)過(guò)吧。
小飛:那當(dāng)然不會(huì),俺爹是干這一行的,所有的工人和材料都得運(yùn)上運(yùn)下,腳手架要搭得特別結(jié)實(shí)。
阿超:那你爹他們有沒(méi)有因?yàn)楣て诰o,就湊合著搭個(gè)架子,就往上蓋樓?或者腳手架倒了也不管?
小飛:那哪成!要倒下了,就要出人命了,哪還能蓋樓?!
阿超:對(duì)呀,我們的軟件構(gòu)建,就和腳手架一樣,每天都要立著,倒下來(lái)就麻煩了。
小飛:不過(guò),我們搞開(kāi)發(fā)的都有點(diǎn)不屑搞構(gòu)建,沒(méi)有寫程序來(lái)勁。
阿超:不會(huì)建腳手架的小工,你爹會(huì)要么?
小飛:不會(huì)。
阿超:不會(huì)做構(gòu)建的程序員,就像不會(huì)搭腳手架的小工,運(yùn)球不熟練的球員。這樣的程序員,我們也不要。
小飛:我明白了。
下午,阿超在喝水的時(shí)候碰到小飛來(lái)報(bào)告說(shuō)Daily Build正在運(yùn)行中。發(fā)現(xiàn)的幾個(gè)錯(cuò)誤都改正了。估計(jì)晚上就可以產(chǎn)生一個(gè)新的構(gòu)建了。
阿超:了不起,這么快就做好了。
小飛:超總,我想提一個(gè)和我職業(yè)發(fā)展有關(guān)的問(wèn)題。我們接受的可都是本科軟件工程教育,我們當(dāng)時(shí)的院領(lǐng)導(dǎo)說(shuō)我們畢業(yè)后都是要朝CTO發(fā)展的,至少是軟件金領(lǐng),我當(dāng)然知道這是遙遠(yuǎn)的將來(lái)的事,但是我總覺(jué)得我可以做一個(gè)軟件白領(lǐng)吧,這些構(gòu)建之類的事情,嘿嘿,是不是要由所謂軟件藍(lán)領(lǐng)來(lái)做?
阿超:?jiǎn)栴}提得好……
他望著這位將來(lái)的CTO、軟件金領(lǐng),突然想抄起身邊的塑料水桶,把水都從他的白領(lǐng)里灌進(jìn)去。他喝了一大口水,退到窗邊,勉強(qiáng)把這個(gè)念頭壓了下去。阿超看著窗外的操場(chǎng)——
阿超:聽(tīng)說(shuō)你籃球打得不錯(cuò)?
小飛:還行,常和二柱幾個(gè)玩。
阿超:你提到大學(xué)的課程,讓我想起大學(xué)的籃球課。我們當(dāng)時(shí)考試的科目之一是定點(diǎn)投籃。老師叫每個(gè)要考試的同學(xué)站在罰球線上,別的同學(xué)負(fù)責(zé)撿球,考生就站著不動(dòng),一個(gè)一個(gè)地瞄準(zhǔn)了投,如果進(jìn)了一個(gè)球,老師才開(kāi)始算分。平時(shí)玩球的同學(xué)都是十個(gè)進(jìn)七八,連運(yùn)動(dòng)細(xì)胞不多的同學(xué)都是十個(gè)球中五個(gè)以上,皆大歡喜,好像大鯊魚奧尼爾罰球也不過(guò)50%上下,大家都有NBA球星的感覺(jué)。另一個(gè)考試科目是兩人配合上籃,當(dāng)然這是在球場(chǎng)空蕩蕩的時(shí)候進(jìn)行的,大家接/傳/投一氣呵成,頗有馬龍和斯多克頓的風(fēng)范,覺(jué)得籃球“技止此耳”!考試后,我們意猶未盡,和在一邊玩球的同學(xué)打球賽,盡管我們“定點(diǎn)投籃”和“二人配合”的分?jǐn)?shù)都很高,但是我們都輸?shù)煤軕K……
小飛:為啥?
阿超:因?yàn)槲覀冞\(yùn)球、傳球都不熟。這都是我們平時(shí)不屑練習(xí)的東西,即使勉強(qiáng)到了籃下,投籃都是在踉蹌之中完成,當(dāng)然沒(méi)有考試時(shí)候的準(zhǔn)星。
小飛:超總,您把我繞遠(yuǎn)了,您的意思是?
阿超:我覺(jué)得大學(xué)的軟件工程課,本來(lái)要教全面的技術(shù),但是考試往往只考定點(diǎn)投籃和無(wú)防守情況下的配合。所以有些大學(xué)的高材生到了實(shí)際工作中,很多“藍(lán)領(lǐng)”的基本功,比如實(shí)戰(zhàn)中的運(yùn)球、傳球都不靈,他們津津樂(lè)道的定點(diǎn)投籃十中八九的功夫也沒(méi)有發(fā)揮的機(jī)會(huì)了。我還沒(méi)有見(jiàn)過(guò)從天而降的白領(lǐng)或者金領(lǐng)。所謂的大拿們都是從藍(lán)領(lǐng)摸爬滾打出來(lái)的。換句話說(shuō),我眼里沒(méi)有白領(lǐng)或藍(lán)領(lǐng),只有“汗領(lǐng)”——就是大家都得出汗干活。
小飛:你是說(shuō)構(gòu)建就像運(yùn)球、傳球……好,我明白了。超總,下班后我們球場(chǎng)見(jiàn)!
14.6.3構(gòu)建大師
頭碰頭會(huì)上,大家發(fā)現(xiàn),最近連續(xù)幾個(gè)構(gòu)建都不成功,測(cè)試組都拿不到新的版本,沒(méi)法進(jìn)行測(cè)試。
阿超手里拿了小飛整理的“導(dǎo)致構(gòu)建失敗的失誤列表”分送到每人手里,表上列舉了錯(cuò)誤的類型和導(dǎo)致錯(cuò)誤的簽入,以及牽涉的成員。
大拴: 看來(lái)拿不到新的構(gòu)建版本的原因有這些——
?。?)構(gòu)建在開(kāi)發(fā)人員本地機(jī)器上就不成功。
(2)構(gòu)建在本地成功,在服務(wù)器上失敗。
?。?)構(gòu)建在本地及服務(wù)器上成功,但是基本功能不能使用,導(dǎo)致無(wú)法進(jìn)行測(cè)試。
阿超:試著對(duì)癥下藥,很多事情我們?cè)谂嘤?xùn)時(shí)都講過(guò)了——
(1)強(qiáng)調(diào)基本開(kāi)發(fā)流程(注意編譯要產(chǎn)生debug|release兩個(gè)版本)。
?。?)簽入時(shí),必須從TFS同步下所有最新的版本再編譯,而且個(gè)人的簽入要做成一個(gè)Shelveset,成為原子操作,而不能把一次修改中的所有文件分成幾次簽入。
?。?)這時(shí),我們以前做的單元測(cè)試和構(gòu)建驗(yàn)證測(cè)試(BVT)就要發(fā)揮作用了,每一個(gè)開(kāi)發(fā)人員在簽入前都要運(yùn)行所有的單元測(cè)試和構(gòu)建驗(yàn)證測(cè)試,確保沒(méi)有問(wèn)題后,才能簽入。
我們要讓團(tuán)隊(duì)中做事不仔細(xì)的人慢下來(lái),這樣能減少他們的危害。
欲取之,必先予之。阿超進(jìn)而建議——
對(duì)于下一個(gè)導(dǎo)致構(gòu)建失敗的成員,授予“構(gòu)建大師”(Build Master)稱號(hào),構(gòu)建大師做下面的事:
(1)負(fù)責(zé)管理構(gòu)建服務(wù)器。
(2)調(diào)試構(gòu)建,負(fù)責(zé)找錯(cuò),并分析出錯(cuò)的原因。
(3)負(fù)責(zé)把“構(gòu)建大師”稱號(hào)和責(zé)任交給下一個(gè)導(dǎo)致構(gòu)建失敗的成員。
(4)“構(gòu)建大師”同時(shí)向團(tuán)隊(duì)的“腐敗基金”存入50元,以供大家將來(lái)“腐敗”之用(此項(xiàng)可選)。
14.6.4寬嚴(yán)皆誤
上次頭碰頭會(huì)議后,各個(gè)小組都進(jìn)一步強(qiáng)化了單元測(cè)試和BVT。
下午,果凍發(fā)了一封E-mail,標(biāo)題是“我受不了啦!”內(nèi)容如下——
我的簽入流程:
?。?)代碼寫好,本地測(cè)試通過(guò),代碼復(fù)審?fù)ㄟ^(guò)??梢院炄肓?。
?。?)同步TFS上最近更新,編譯debug |release,解決版本沖突(半小時(shí))。
?。?)安裝最新版本,運(yùn)行本地單元測(cè)試,BVT(一個(gè)小時(shí))。
?。?)提交到TFS上,發(fā)現(xiàn)有版本合并沖突,因?yàn)樵?、3步的時(shí)候,有人簽入了和我的代碼有關(guān)的新修改。
?。?)如果我簡(jiǎn)單地合并版本,并且簽入,很有可能會(huì)導(dǎo)致TFS 上編譯失敗。但是如果我為了保證質(zhì)量,在合并后,本地編譯并運(yùn)行各種測(cè)試,這相當(dāng)于重復(fù)了2、3步。當(dāng)我再次提交簽入(重復(fù)第4步)時(shí),有可能碰到新的版本沖突。這樣循環(huán)往復(fù)以至無(wú)窮……
二柱發(fā)了E-mail,第一句話就是:
在理論上,理論和實(shí)踐是一回事,而在實(shí)踐上,理論和實(shí)踐是兩回事。
然后也抱怨了類似的問(wèn)題,似乎大部分時(shí)間都花在了沒(méi)有價(jià)值的“同步/編譯/驗(yàn)證/再同步……”的循環(huán)中。
荔荔:似乎應(yīng)該在簽出一個(gè)文件的時(shí)候,加上一個(gè)“防止別人簽出”的鎖,這樣就沒(méi)有沖突了。
果凍:但是如果你鎖住了file1,要簽出file2;與此同時(shí),我鎖住了file2,要簽出file1,這樣我們都進(jìn)入了死鎖……
小飛:我剛剛同步TFS,然后編譯就不成功了。我在一臺(tái)全新的機(jī)器上重新試了一次,也不行。這至少證明不是我引起的問(wèn)題?,F(xiàn)在我已經(jīng)沒(méi)法工作,我只好到“頂球”喝兩杯去了。誰(shuí)把錯(cuò)誤修好了,就給我發(fā)短信,我就回來(lái)上班。
阿超:除了構(gòu)建大師,所有開(kāi)發(fā)人員都可以到“頂球”去玩。
構(gòu)建大師:我已經(jīng)連續(xù)三天錯(cuò)過(guò)了午飯時(shí)間,誰(shuí)能幫我從頂球帶兩個(gè)燒餅回來(lái)?另外,能不能不要在午飯前安排構(gòu)建?要不然鐵打的胃也受不了。
經(jīng)過(guò)一個(gè)多小時(shí)的忙碌,構(gòu)建終于好了,但是構(gòu)建大師問(wèn)阿超,現(xiàn)在構(gòu)建成功了,明天呢?
阿超:讓我想想……
阿超晚上把情況和同事們的意見(jiàn)報(bào)告了愚公,阿超在E-mail最后寫到:
有兩條路團(tuán)隊(duì)可以實(shí)行:
?。?)很嚴(yán)的規(guī)則和流程控制,這樣會(huì)保證很高的簽入成功率,如果一個(gè)人根據(jù)流程來(lái)做,幾乎肯定能成功。這樣構(gòu)建質(zhì)量高,但是團(tuán)隊(duì)的進(jìn)展會(huì)受到限制。極端情況下,整個(gè)團(tuán)隊(duì)的進(jìn)展被序列化為一系列個(gè)人串行簽入操作。
?。?)寬松的規(guī)則和流程,每個(gè)人隨時(shí)可以簽出簽入,簽入時(shí)的成本很低,但是簽入成功率不高,構(gòu)建質(zhì)量低,極端情況下,所有人都可以簽入,同步,但是沒(méi)有人能正常工作。
哪一種是最好的呢?
第二天一早,阿超就看到了愚公的回復(fù):
不審勢(shì)即寬嚴(yán)皆誤,從來(lái)治蜀要深思。
阿超心想,那什么是我們這個(gè)團(tuán)隊(duì)目前的“勢(shì)”呢?他列出了對(duì)每一個(gè)步驟,寬、嚴(yán)各是什么做法,當(dāng)前團(tuán)隊(duì)的情況(勢(shì))是什么,這樣就得出了一個(gè)用“寬”或者“嚴(yán)”的決定,如表14-7所示。
當(dāng)行為只是影響到個(gè)人的時(shí)候,盡量放松,讓個(gè)人根據(jù)自己情況處理;當(dāng)行為影響到整個(gè)團(tuán)隊(duì)的時(shí)候,盡量嚴(yán)格,因?yàn)檎麄€(gè)團(tuán)隊(duì)都有可能會(huì)受影響。同時(shí),我們要提高可預(yù)見(jiàn)性——明確構(gòu)建大師的職責(zé),公開(kāi)顯示固定的構(gòu)建時(shí)間。
表14-7寬嚴(yán)表
步驟 |
寬 |
嚴(yán) |
勢(shì) |
簽出 |
自由簽出 |
簽出時(shí)候,將文件上鎖 |
很多人都會(huì)同時(shí)編輯同一文件 |
本地單元測(cè)試 |
不要求 |
要求 |
每個(gè)模塊都要求寫單元測(cè)試 |
本地check-in test(簽入測(cè)試) |
不要求 |
要求 |
BVT還沒(méi)有完成 |
簽入時(shí)間 |
任何時(shí)候 |
每天固定時(shí)間開(kāi)放 |
目前簽入情況很混亂 |
簽入沖突處理 |
合并后即可簽入 |
合并后,再重新編譯,測(cè)試,再提交 |
重新測(cè)試會(huì)花費(fèi)比較多的時(shí)間 |
續(xù)表
步驟 |
寬 |
嚴(yán) |
勢(shì) |
簽入必須經(jīng)過(guò)代碼復(fù)審 |
隨意 |
必須 |
開(kāi)放人員有一半是新員工,必須通過(guò)代碼復(fù)審建立良好的規(guī)范 |
簽入時(shí)必須運(yùn)行代碼分析工具 |
不要求 |
要求 |
代碼分析工具尚未配置好 |
簽入時(shí)單元測(cè)試必須同時(shí)簽入 |
不要求 |
要求 |
每個(gè)模塊都要求寫單元測(cè)試 |
簽入必須是多個(gè)相關(guān)文件同時(shí)簽入 |
不要求,可以簽入單個(gè)文件 |
要求 |
保證每一個(gè)簽入都不會(huì)導(dǎo)致構(gòu)建失敗 |
簽入必須和一個(gè)工作項(xiàng)關(guān)聯(lián) |
不要求 |
要求 |
所有的工作必須有工作項(xiàng)跟蹤 |
設(shè)定專用網(wǎng)絡(luò)服務(wù),自動(dòng)處理提交的ShelveSet,構(gòu)建,BVT,然后簽入代碼 |
不要求 |
設(shè)置 |
需要很多人力來(lái)設(shè)計(jì)并維護(hù) |
簽入必須經(jīng)過(guò)代碼復(fù)審 |
隨意 |
必須 |
開(kāi)放人員有一半是新員工,必須通過(guò)代碼復(fù)審建立良好的規(guī)范 |
簽入時(shí)必須運(yùn)行代碼分析工具 |
不要求 |
要求 |
代碼分析工具尚未配置好 |
簽入時(shí)單元測(cè)試必須同時(shí)簽入 |
不要求 |
要求 |
每個(gè)模塊都要求寫單元測(cè)試 |
表14-8 具體流程
時(shí)間 |
總體 |
管理/程序 經(jīng) 理 |
開(kāi)發(fā) |
構(gòu)建 大師 |
測(cè)試 |
8am~10pm |
開(kāi)發(fā)人員可以同步代碼,這時(shí)只有非常要緊的簽入才能經(jīng)過(guò)批準(zhǔn),簽入TFS |
9am—— 頭碰頭會(huì)議,bug會(huì)診,分配bug |
同步代碼,構(gòu)建,根據(jù)自己的任務(wù)/bug情況決定今天的工作 |
測(cè)試新版本,新建bug |
|
10pm~12pm |
代碼簽入時(shí)間,經(jīng)過(guò)正常代碼復(fù)審及其他流程后,代碼(連同單元測(cè)試)才能簽入 |
程序經(jīng)理組織必要的會(huì)議 |
單元測(cè)試 |
準(zhǔn)備構(gòu)建服務(wù)器 |
|
12pm~1pm |
午飯時(shí)間 |
續(xù)表
時(shí)間 |
總體 |
管理/程序 經(jīng)理 |
開(kāi)發(fā) |
構(gòu)建 大師 |
測(cè)試 |
1pm~3pm |
構(gòu)建/安裝/基本測(cè)試/宣布版本質(zhì)量(見(jiàn)后) |
待命,隨時(shí)準(zhǔn)備攻克問(wèn)題 |
全程監(jiān)督執(zhí)行,負(fù)責(zé)把導(dǎo)致構(gòu)建失敗的缺陷(找人)修復(fù)并簽入 |
運(yùn)行基本測(cè)試 |
|
3pm~6pm |
開(kāi)發(fā)/測(cè)試人員繼續(xù)工作 |
運(yùn)行BVT后,宣布此次構(gòu)建質(zhì)量(失敗/可測(cè)/可用) |
聰明的測(cè)試人員此時(shí)就開(kāi)始測(cè)試并報(bào)告缺陷 |
||
6pm |
晚飯及機(jī)動(dòng)時(shí)間 |
阿超:我特地把緊張的構(gòu)建及待命階段安排在午飯之后,這樣大家至少可以安心吃飯了。
14.6.5 小強(qiáng)地獄(Bug Hell)
在這一次的頭碰頭會(huì)議上,平時(shí)不主動(dòng)發(fā)言的阿亨也說(shuō)話了。
阿亨:開(kāi)發(fā)的同志們,你們手里有那么多小強(qiáng),為什么都揣著掖著,不舍得修復(fù),讓測(cè)試人員有事情做?測(cè)試人員反映因?yàn)楝F(xiàn)有的小強(qiáng)沒(méi)有被修復(fù),有越來(lái)越多的小功能點(diǎn)不能進(jìn)行測(cè)試,我們都要沒(méi)事做了。
大拴:我們的開(kāi)發(fā)任務(wù)很重,必須先把新功能全部實(shí)現(xiàn)后,再修復(fù)舊的小強(qiáng)。
阿亨:這是不對(duì)的,我們有些小強(qiáng)在你們手頭很久了,看似舉手之勞,為什么不盡快修復(fù),讓我們測(cè)試組能繼續(xù)完成測(cè)試?
二柱:我們都是按優(yōu)先級(jí)來(lái)進(jìn)行,開(kāi)發(fā)新功能的優(yōu)先級(jí)遠(yuǎn)大于修復(fù)小強(qiáng)。
阿亨:但是有些開(kāi)發(fā)人員手里頭有二三十個(gè)小強(qiáng),難道數(shù)量不是一個(gè)考慮因素?
阿超:我同意,隨著項(xiàng)目的深入,每個(gè)人同時(shí)要開(kāi)發(fā)新的功能,修復(fù)以前的缺陷。由于沒(méi)有明確的優(yōu)先次序,一般人都愿意把時(shí)間花在開(kāi)發(fā)新功能上。但是我們的確需要平衡進(jìn)度和質(zhì)量。有這樣的一種方法:
小強(qiáng)地獄(Bug Hell)
如果開(kāi)發(fā)人員的小強(qiáng)(bug)數(shù)量超過(guò)一規(guī)定值,則此君被送入“小強(qiáng)地獄”,在地獄中,他能做的唯一一件事就是修復(fù)小強(qiáng),直到小強(qiáng)數(shù)量數(shù)量低于此閾值。
這一閾值由團(tuán)隊(duì)根據(jù)實(shí)際情況來(lái)確定,要注意:開(kāi)發(fā)人員同時(shí)“入獄”的人數(shù)應(yīng)在全體成員的5%~30%之間,若比例太高,則要考慮閾值或者小強(qiáng)數(shù)量的計(jì)算方式是否合理(是否只包括某一嚴(yán)重程度以上的bug)。
在項(xiàng)目過(guò)程中,閾值不宜頻繁調(diào)整,最好事先宣布閾值。
大拴:但是我們已經(jīng)違反了“最好事先宣布閾值”這一規(guī)定。
阿超:如果我們現(xiàn)在要讓20% 的同志入獄,我們馬上運(yùn)行一個(gè)TFS 查詢看看這一個(gè)閾值是多少?是15?好,那我們現(xiàn)在宣布給大家三天時(shí)間,第三天后,小強(qiáng)數(shù)量達(dá)到或超過(guò)15 的開(kāi)發(fā)人員請(qǐng)入獄,然后每天早上9點(diǎn)頭碰頭會(huì)議時(shí)統(tǒng)計(jì)并宣布入獄/出獄名單。
大牛: 其實(shí)先把所有的功能寫完也不錯(cuò),至少我可以告訴客戶“功能寫完了”,讓他們高興高興。
大拴:大牛,這不就是咱們以前項(xiàng)目的情況么?你一直問(wèn)“功能都寫完了,為什么還不能用”? 我們一直說(shuō)“還有一些小問(wèn)題”,然后小問(wèn)題總是不能解決,因?yàn)橐嬲鉀Q這些“小問(wèn)題”的話,我們還得重寫一些功能。
阿超:對(duì),很多問(wèn)題,甚至是大問(wèn)題,都隱藏在目前的小強(qiáng)后面,如果一味趕所謂的“進(jìn)度”,到時(shí)候有些小強(qiáng)就變成了大怪物,因?yàn)槲覀円呀?jīng)在錯(cuò)誤的基礎(chǔ)上搭建了很多新的邏輯和功能,這時(shí)再來(lái)處理一些歷久彌新的小強(qiáng),就有投鼠忌器的麻煩。
阿亨:那怎么辦?
阿超:我們要分析小強(qiáng),看看這是一個(gè)小問(wèn)題,解決了就萬(wàn)事大吉呢?還是冰山的一角,解決后也許會(huì)發(fā)現(xiàn)更多、更棘手的問(wèn)題?;蛘呖此撇唤?jīng)意的一個(gè)小強(qiáng)會(huì)讓很多人加班重新實(shí)現(xiàn)功能——這就成了設(shè)計(jì)變更需求——DCR。
14.6.6 DCR Tell mode v.s. Ask mode設(shè)計(jì)變更
在項(xiàng)目早期,如果大家覺(jué)得要做一個(gè)設(shè)計(jì)變更,可以用告知模式(Tell-mode)的形式,就是說(shuō),修改方必須通告所有關(guān)系人:“我在這里修改了某某界面。”但是修改方不必取得其他關(guān)系人(或者模塊)的事先同意,就是說(shuō)可以先行設(shè)計(jì)并編碼。當(dāng)然,如果其他關(guān)系人不同意,修改還是不能簽入。
當(dāng)項(xiàng)目進(jìn)行到穩(wěn)定階段,Tell-mode 要改為請(qǐng)求模式(Ask-mode),這時(shí),修改方必須先問(wèn)“我是否可以在這里修改某某界面?”(當(dāng)然還要有更詳盡和充分的理由)得到肯定的答復(fù)后,才能進(jìn)行修改。這時(shí)的缺省回答是“不”。
14.6.7 每周進(jìn)度報(bào)告——還有多少事沒(méi)做完
頭碰頭會(huì)議。
大拴:我有一點(diǎn)不太放心……
大牛:哦,為啥?我們大家都干得很歡。完成任務(wù)應(yīng)該沒(méi)問(wèn)題吧。
大拴:我們每天都在簽入新的代碼,每人都很忙,但是我總覺(jué)得不太對(duì)勁。會(huì)不會(huì)越做事情越多呢?
阿超:這時(shí)我們可以看看各種報(bào)表,首要推薦的是“RemainingWork”。
請(qǐng)看下頁(yè)的圖14-2。
這個(gè)報(bào)表告訴我們究竟還剩下多少事情要做。我們要分析這么多簽入到底是否解決(Resolve)了相應(yīng)的任務(wù),如果是,那么我們的任務(wù)數(shù)量應(yīng)該逐漸下降,但是從圖上我們看到紅色的任務(wù)和缺陷還在緩慢增長(zhǎng)。而綠色的“已完成任務(wù)”,卻一動(dòng)不動(dòng),這就要引起我們的注意了。
可以在報(bào)表設(shè)置控制板中,進(jìn)一步選擇你要報(bào)告的內(nèi)容,如:Iteration,選擇里程碑;Area,選擇項(xiàng)目的不同部分,也可以修改報(bào)告的起始和終止日期等。
圖14-2 還有多少事