摘要:
一件用戶通過系統(tǒng)完成他一個有價(jià)值的目標(biāo)(買一罐飲料)的事。這樣的過程就叫“用戶案例(user case)”或者“用戶故事(user story)”。本文描述了敏捷開發(fā)的技巧:如何以用戶故事管理項(xiàng)目.
什么是用戶故事(user story)
假定這個項(xiàng)目的客戶是個飲料自動售貨機(jī)的制造商。他們要求我們?yōu)樗麄兊氖圬洐C(jī)開發(fā)一款軟件。我們可以找他們的市場經(jīng)理了解這個軟件的需求。
因此,我們的客戶就是他們的市場經(jīng)理。談需求的時候,有一回他這樣說:“用戶往售貨機(jī)每塞一個硬幣,售貨機(jī)都要顯示當(dāng)前該客戶已經(jīng)投了多少錢。當(dāng)用戶投的錢夠買某一款飲料時,代表這款飲料的按鈕的燈就會亮。如果那個用戶按了這個按鈕,售貨機(jī)就放一罐飲料到出口,然后找零錢給他。”
上面的話描述的是一件事情,一件用戶通過系統(tǒng)完成他一個有價(jià)值的目標(biāo)(買一罐飲料)的事。這樣的過程就叫“用戶案例(user case)”或者“用戶故事(user story)”。也就是說,上面我們的客戶所說的話,就是在描述一個用戶故事(user story)。
(我解釋一下為什么用故事這個詞,沒興趣也可以忽略。在一個系統(tǒng)面前,每個用戶要完成同樣的目標(biāo),都要做這個系統(tǒng)設(shè)定的例行的事,這件事情不是一個例子,所以不叫事例,這也不是故事,也不能算一段歷程,而是一個例行的事。)
????如果我們想要記下這段用戶故事,我們可能會用這樣的格式:
????名稱:賣飲料
????事件:
????1. 用戶投入一些錢。
????2. 售貨機(jī)顯示用戶已經(jīng)投了多少錢。
????3. 如果投入的錢足夠買某種飲料,這種飲料對應(yīng)的按鈕的燈就會亮。
????4. 用戶按了某個亮了的按鈕。
????5. 售貨機(jī)賣出一罐飲料給他。
????6. 售貨機(jī)找零錢給他。
????注意到,一個用戶故事里面的事件可以這樣描述:
????1. 用戶做XX。
????2. 系統(tǒng)做YY。
????3. 用戶做ZZ。
????4. 系統(tǒng)做TT。
????5.??...
用戶故事只是描述系統(tǒng)的外在行為????一個用戶故事只是以客戶能夠明白的方式,描述了一個系統(tǒng)的外在行為,它完全忽略了系統(tǒng)的內(nèi)部動作。比如,下面有下劃線的那些文字,就屬于不應(yīng)該出現(xiàn)在用戶故事中的系統(tǒng)內(nèi)部動作:
????1. 用戶投入一些錢。
????2. 售貨機(jī)將塞進(jìn)來的錢存在錢箱里,然后發(fā)送一條命令給屏幕,屏幕顯示目前已經(jīng)投入的金額。
????3. 售貨機(jī)查詢數(shù)據(jù)庫里面所有飲料的價(jià)格,判定錢足夠買哪些飲料,對于錢足夠買的那些飲料,對應(yīng)的按鈕的燈就會亮起來。
????4. 用戶按下一個亮起來的按鈕。
????5. 售貨機(jī)賣出一罐飲料給用戶,然后將數(shù)據(jù)庫里面該飲料的存貨數(shù)量減1。
????6. 售貨機(jī)找零錢給用戶。
????不管是口頭描述的,還是書面形式,這樣的內(nèi)容是描述用戶故事時一個很常見的錯誤。特別的,千萬不要提及任何有關(guān)數(shù)據(jù)庫,記錄,字段之類的對客戶一點(diǎn)意義都沒有的東西。
評估發(fā)布時間????用戶故事是用來干嘛的?假定客戶希望在50天內(nèi)遞交這個系統(tǒng)。我們做得了嗎?為了解答這個問題,我們就要在項(xiàng)目開始的階段,試著找出所有的用戶故事,然后評估一下,每一項(xiàng)歷程需要多長的開發(fā)時間。可是,怎么評估呢?
????比如,我們現(xiàn)在收集了下面這些用戶故事:
????賣飲料:如上面所說的。
????取消購買:在投入了一些錢后,用戶可以取消購買。
????輸入管理密碼:授權(quán)的人可以輸入管理密碼,然后增加存貨,設(shè)定價(jià)格,拿走里面的錢等等。
????補(bǔ)充飲料:授權(quán)的人可以在輸入管理密碼后增加存貨。
????取出錢箱里的錢:授權(quán)的人在輸入管理密碼后,可以取出錢箱里的錢箱里面的錢。
????安全警報(bào):有些事情經(jīng)常發(fā)生的話,系統(tǒng)會自動打開安全警報(bào)。
????打印月銷售報(bào)表:授權(quán)的人可以打印出月銷售報(bào)表。
????然后找出里面最簡單的用戶故事(這里的“簡單”,意思是說實(shí)現(xiàn)周期最短)。我們不一定非常精準(zhǔn)的判斷哪個最簡單。只要挑出你覺得最簡單的就行了。比如,我們覺得“輸入管理密碼”是最簡單的用戶故事。然后我們判斷說,這個用戶故事算1個“故事點(diǎn)(story point)”。
????????????????????????
用戶故事??????????故事點(diǎn)
賣飲料????????
取消購買????????
輸入管理密碼?? 1
補(bǔ)充飲料????????
取出錢箱里的錢????????
安全警報(bào)????????
打印月銷售報(bào)表????????
不過一般我們不會列出清單,而是做出一堆卡片貼在墻上,每張卡片記錄一個用戶故事,然后將故事點(diǎn)寫在卡片上面:
什么是用戶故事(user story)
假定這個項(xiàng)目的客戶是個飲料自動售貨機(jī)的制造商。他們要求我們?yōu)樗麄兊氖圬洐C(jī)開發(fā)一款軟件。我們可以找他們的市場經(jīng)理了解這個軟件的需求。
因此,我們的客戶就是他們的市場經(jīng)理。談需求的時候,有一回他這樣說:“用戶往售貨機(jī)每塞一個硬幣,售貨機(jī)都要顯示當(dāng)前該客戶已經(jīng)投了多少錢。當(dāng)用戶投的錢夠買某一款飲料時,代表這款飲料的按鈕的燈就會亮。如果那個用戶按了這個按鈕,售貨機(jī)就放一罐飲料到出口,然后找零錢給他。”
上面的話描述的是一件事情,一件用戶通過系統(tǒng)完成他一個有價(jià)值的目標(biāo)(買一罐飲料)的事。這樣的過程就叫“用戶案例(user case)”或者“用戶故事(user story)”。也就是說,上面我們的客戶所說的話,就是在描述一個用戶故事(user story)。
(我解釋一下為什么用故事這個詞,沒興趣也可以忽略。在一個系統(tǒng)面前,每個用戶要完成同樣的目標(biāo),都要做這個系統(tǒng)設(shè)定的例行的事,這件事情不是一個例子,所以不叫事例,這也不是故事,也不能算一段歷程,而是一個例行的事。)
????如果我們想要記下這段用戶故事,我們可能會用這樣的格式:
????名稱:賣飲料
????事件:
????1. 用戶投入一些錢。
????2. 售貨機(jī)顯示用戶已經(jīng)投了多少錢。
????3. 如果投入的錢足夠買某種飲料,這種飲料對應(yīng)的按鈕的燈就會亮。
????4. 用戶按了某個亮了的按鈕。
????5. 售貨機(jī)賣出一罐飲料給他。
????6. 售貨機(jī)找零錢給他。
????注意到,一個用戶故事里面的事件可以這樣描述:
????1. 用戶做XX。
????2. 系統(tǒng)做YY。
????3. 用戶做ZZ。
????4. 系統(tǒng)做TT。
????5.??...
用戶故事只是描述系統(tǒng)的外在行為????一個用戶故事只是以客戶能夠明白的方式,描述了一個系統(tǒng)的外在行為,它完全忽略了系統(tǒng)的內(nèi)部動作。比如,下面有下劃線的那些文字,就屬于不應(yīng)該出現(xiàn)在用戶故事中的系統(tǒng)內(nèi)部動作:
????1. 用戶投入一些錢。
????2. 售貨機(jī)將塞進(jìn)來的錢存在錢箱里,然后發(fā)送一條命令給屏幕,屏幕顯示目前已經(jīng)投入的金額。
????3. 售貨機(jī)查詢數(shù)據(jù)庫里面所有飲料的價(jià)格,判定錢足夠買哪些飲料,對于錢足夠買的那些飲料,對應(yīng)的按鈕的燈就會亮起來。
????4. 用戶按下一個亮起來的按鈕。
????5. 售貨機(jī)賣出一罐飲料給用戶,然后將數(shù)據(jù)庫里面該飲料的存貨數(shù)量減1。
????6. 售貨機(jī)找零錢給用戶。
????不管是口頭描述的,還是書面形式,這樣的內(nèi)容是描述用戶故事時一個很常見的錯誤。特別的,千萬不要提及任何有關(guān)數(shù)據(jù)庫,記錄,字段之類的對客戶一點(diǎn)意義都沒有的東西。
評估發(fā)布時間????用戶故事是用來干嘛的?假定客戶希望在50天內(nèi)遞交這個系統(tǒng)。我們做得了嗎?為了解答這個問題,我們就要在項(xiàng)目開始的階段,試著找出所有的用戶故事,然后評估一下,每一項(xiàng)歷程需要多長的開發(fā)時間。可是,怎么評估呢?
????比如,我們現(xiàn)在收集了下面這些用戶故事:
????賣飲料:如上面所說的。
????取消購買:在投入了一些錢后,用戶可以取消購買。
????輸入管理密碼:授權(quán)的人可以輸入管理密碼,然后增加存貨,設(shè)定價(jià)格,拿走里面的錢等等。
????補(bǔ)充飲料:授權(quán)的人可以在輸入管理密碼后增加存貨。
????取出錢箱里的錢:授權(quán)的人在輸入管理密碼后,可以取出錢箱里的錢箱里面的錢。
????安全警報(bào):有些事情經(jīng)常發(fā)生的話,系統(tǒng)會自動打開安全警報(bào)。
????打印月銷售報(bào)表:授權(quán)的人可以打印出月銷售報(bào)表。
????然后找出里面最簡單的用戶故事(這里的“簡單”,意思是說實(shí)現(xiàn)周期最短)。我們不一定非常精準(zhǔn)的判斷哪個最簡單。只要挑出你覺得最簡單的就行了。比如,我們覺得“輸入管理密碼”是最簡單的用戶故事。然后我們判斷說,這個用戶故事算1個“故事點(diǎn)(story point)”。
????????????????????????
用戶故事??????????故事點(diǎn)
賣飲料????????
取消購買????????
輸入管理密碼?? 1
補(bǔ)充飲料????????
取出錢箱里的錢????????
安全警報(bào)????????
打印月銷售報(bào)表????????
不過一般我們不會列出清單,而是做出一堆卡片貼在墻上,每張卡片記錄一個用戶故事,然后將故事點(diǎn)寫在卡片上面:
敏捷開發(fā)的必要技巧完整版