目錄·序言

14.6 開(kāi)發(fā)階段的日常管理

移山之道:VSTS軟件開(kāi)發(fā)指南 作者:鄒欣


  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è)試
代碼復(fù)審
同步/解決代碼沖突
簽入代碼

準(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 還有多少事


上一章目錄下一章

Copyright ? 讀書網(wǎng) ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號(hào) 鄂公網(wǎng)安備 42010302001612號(hào)