開(kāi)卡(Kick-off)和驗(yàn)卡(Desk-check)是2016年我在ThoughtWorks University做教練時(shí),學(xué)到的實(shí)踐。
這兩個(gè)迭代開(kāi)發(fā)中進(jìn)行質(zhì)量?jī)?nèi)建的重要實(shí)踐,能讓團(tuán)隊(duì)“投資少見(jiàn)效快”地持續(xù)糾偏和又快又好地交付軟件。
做開(kāi)卡和驗(yàn)卡前,要做好如下準(zhǔn)備工作。
在迭代開(kāi)發(fā)的需求梳理會(huì)上,團(tuán)隊(duì)討論下一迭代的用戶故事,拆分故事,編寫(xiě)驗(yàn)收條件(主流程)和測(cè)試用例(全部流程,包括主流程)。
這些驗(yàn)收條件和測(cè)試用例,就是開(kāi)卡和驗(yàn)卡的物料。
開(kāi)卡過(guò)程
- 開(kāi)發(fā)人員每次開(kāi)始為一個(gè)新用戶故事卡編寫(xiě)代碼前,自己閱讀該故事卡的用戶故事、驗(yàn)收條件和測(cè)試用例,思考其中的疑問(wèn)點(diǎn)和風(fēng)險(xiǎn),并記錄下來(lái)。
之后請(qǐng)來(lái)相關(guān)的需求和測(cè)試人員,三人當(dāng)面澄清和討論這些疑問(wèn)和風(fēng)險(xiǎn)。
此時(shí),需求和測(cè)試人員,可以請(qǐng)開(kāi)發(fā)人員用自己的話,講述一下這些驗(yàn)收條件和測(cè)試用例,確保三方理解一致。
為什么要請(qǐng)開(kāi)發(fā)人員講驗(yàn)收條件?因?yàn)榕隆爸R(shí)的詛咒”——需求和測(cè)試人員自己很理解驗(yàn)收條件,也天然地認(rèn)為開(kāi)發(fā)人員也同樣能理解。但事實(shí)卻經(jīng)常恰恰相反。
況且需求和測(cè)試人員之間,也會(huì)出現(xiàn)對(duì)驗(yàn)收條件理解上的差異。所以讓開(kāi)發(fā)人員自己講一遍,也會(huì)啟發(fā)需求和測(cè)試人員發(fā)現(xiàn)他們之間的理解也是不同的。
開(kāi)卡由開(kāi)發(fā)人員驅(qū)動(dòng),針對(duì)其將要編寫(xiě)代碼的一個(gè)故事而做,而不是團(tuán)隊(duì)一起開(kāi)會(huì)開(kāi)卡,這能提高什么質(zhì)量?
這能提高開(kāi)發(fā)人員對(duì)于故事卡的需求的思考質(zhì)量。
因?yàn)殚_(kāi)發(fā)人員馬上就要寫(xiě)代碼了,會(huì)比團(tuán)隊(duì)需求討論會(huì)的思考更深入,因?yàn)槟菚r(shí)候還不知道誰(shuí)要開(kāi)發(fā)哪個(gè)故事卡。
為什么開(kāi)卡能解決網(wǎng)上程序員最怕產(chǎn)品“改需求”的段子中所說(shuō)的矛盾?
因?yàn)檫@些段子中的矛盾,往往源自程序員在寫(xiě)代碼前,沒(méi)有做開(kāi)卡確認(rèn),而是基于對(duì)需求錯(cuò)誤的理解編寫(xiě)代碼,能不出錯(cuò)嗎。
開(kāi)卡能降低什么成本?
開(kāi)卡能降低修改代碼的成本,因?yàn)椤案男枨蟆钡某杀驹诖a編寫(xiě)之前趨近于零,而在代碼編寫(xiě)之后會(huì)急劇上升。
開(kāi)卡能在編寫(xiě)代碼前澄清最新的需求,減少改需求的幾率和成本。
若需求和測(cè)試人員在開(kāi)卡過(guò)程中,發(fā)現(xiàn)之前編寫(xiě)的驗(yàn)收條件和測(cè)試用例有問(wèn)題,則立即修復(fù)。
開(kāi)發(fā)人員完成開(kāi)卡后,就把卡片從看板的“本迭代待辦項(xiàng)”移至“開(kāi)發(fā)中”,并貼上自己的頭像。

驗(yàn)卡過(guò)程
- 開(kāi)發(fā)人員每寫(xiě)完一個(gè)用戶故事的代碼,并在“非本地”測(cè)試環(huán)境上測(cè)試通過(guò),則找到需求和測(cè)試人員,按照驗(yàn)收條件,為他們進(jìn)行演示(即驗(yàn)卡)。
為什么一定要在“非本地”環(huán)境驗(yàn)卡?
程序員的另一個(gè)段子是:“啥?在測(cè)試環(huán)境上運(yùn)行不了?可剛才明明在我電腦上運(yùn)行的好好的。”
環(huán)境的差異也需要解決,所以驗(yàn)卡要在“非本地”環(huán)境進(jìn)行。
驗(yàn)卡應(yīng)該是由開(kāi)發(fā)人員驅(qū)動(dòng),針對(duì)其剛剛編寫(xiě)完代碼的一個(gè)故事驗(yàn)卡,而不是一次驗(yàn)多個(gè)卡。這能提高什么質(zhì)量?
能做到持續(xù)糾偏,又快又好。
這能省什么時(shí)間?
能節(jié)省一次驗(yàn)多個(gè)卡所發(fā)生的等待時(shí)間。
- 若驗(yàn)卡時(shí)發(fā)現(xiàn)問(wèn)題,開(kāi)發(fā)人員立即修復(fù)。這能省哪4個(gè)時(shí)間?
- 能省測(cè)試人員在系統(tǒng)中記錄和跟蹤軟件缺陷的時(shí)間
- 能省開(kāi)發(fā)人員在系統(tǒng)中閱讀軟件缺陷的時(shí)間
- 能省開(kāi)發(fā)人員切換思路進(jìn)行修復(fù)的時(shí)間
- 能省開(kāi)發(fā)人員很晚才返工所耽誤的時(shí)間
開(kāi)發(fā)人員修復(fù)完成后,再次驗(yàn)卡。測(cè)試人員對(duì)于驗(yàn)卡所發(fā)現(xiàn)的問(wèn)題不必在系統(tǒng)中記錄軟件缺陷。
若在非本地測(cè)試環(huán)境驗(yàn)卡時(shí),未發(fā)現(xiàn)問(wèn)題,則開(kāi)發(fā)人員將故事卡移交測(cè)試人員進(jìn)一步進(jìn)行測(cè)試,并把卡片從看板上“開(kāi)發(fā)中”移至“待UAT測(cè)試”一列。
想要“投資少見(jiàn)效快”地提高軟件開(kāi)發(fā)團(tuán)隊(duì)代碼質(zhì)量,優(yōu)先嘗試開(kāi)卡和驗(yàn)卡。