當(dāng)我第一次聽(tīng)到敏捷的時(shí)候汁胆,看名知意梭姓,敏捷即快速。聽(tīng)聞些許公司用敏捷開(kāi)發(fā)嫩码,心里曾想誉尖,莫不是用什么高效率的開(kāi)發(fā)方式來(lái)開(kāi)發(fā)稱為敏捷開(kāi)發(fā)。
眾所周知铸题,IEEE830需求(瀑布式需求)铡恕。但是用戶故事與IEEEE830需求的區(qū)別是什么呢?
IEEEE830需求聲明關(guān)心解決方案的特征丢间,用戶故事關(guān)心用戶目標(biāo)探熔。IEEEE830需求鼓勵(lì)團(tuán)隊(duì)在寫(xiě)代碼之前完成所有的需求聲明,而不是像用戶故事那樣使用迭代的方式千劈。寫(xiě)需求聲明需要花費(fèi)很大的精力來(lái)確保文字表達(dá)了正確的意思祭刚;用戶故事鼓勵(lì)通過(guò)口頭的交流澄清細(xì)節(jié)。
一.用戶故事
1.初始化
用戶故事必須要了解的一個(gè)就是用戶故事卡墙牌。
由于用戶故事的描述信息都是以傳統(tǒng)的手寫(xiě)方式寫(xiě)在直至卡片上涡驮,所以Ron Jeffries對(duì)這三個(gè)方面起了一個(gè)非常好的以相同的英文字母開(kāi)頭的名字:
卡片(Card):用戶需求
對(duì)話(Conversion):開(kāi)發(fā)根據(jù)卡片同客戶討論用戶需求的細(xì)節(jié)
確認(rèn)(Confirm):確認(rèn)用戶需求
2.卡片
一個(gè)優(yōu)秀的用戶故事卡應(yīng)該保證有以下幾個(gè)特征:
- 獨(dú)立的:每一個(gè)故事卡是一個(gè)很小的需求,卡與卡之間(需求與需求之間)沒(méi)有關(guān)系連接喜滨,保證卡是獨(dú)立的
- 可以討論的:一個(gè)卡里面的內(nèi)容可以與客戶進(jìn)行交流捉捅,才是一個(gè)好的卡,不能交流的卡完全喪失了敏捷故事卡存在的意義
- 對(duì)用戶或者客戶有價(jià)值的:記住對(duì)用戶有價(jià)值的東西虽风,才能避免多做很多沒(méi)有價(jià)值的事
- 可以估計(jì)的:可以估計(jì)這張卡完成的時(shí)間
- 小的:史詩(shī)級(jí)別的卡(特別大的需求卡)棒口,就如同需求文檔一般,這將會(huì)變得毫無(wú)意義辜膝,喪失了敏捷開(kāi)發(fā)的特點(diǎn)
- 可以測(cè)試的:成功通過(guò)了測(cè)試表示開(kāi)發(fā)人員實(shí)現(xiàn)了這個(gè)故事卡无牵。
3.對(duì)話
用戶故事卡是作為對(duì)話的前提,避免了需求過(guò)于精確的假象厂抖,如果是需求文檔茎毁,做的最好的無(wú)非就是完成了需求文檔上面所有的精確的需求,然而,對(duì)話可以完成文檔背后的需求七蜘。
4.確認(rèn)
測(cè)試谭溉,用于表達(dá)和編檔故事細(xì)節(jié)并且可以確定用戶故事什么時(shí)候能夠完成。
5.意圖
故事卡的主要目的是用來(lái)提醒開(kāi)發(fā)人員和客戶團(tuán)隊(duì)對(duì)功能進(jìn)行討論的橡卤,既然是一個(gè)提醒扮念,那么就要保持它的簡(jiǎn)介性。假如需要的細(xì)節(jié)碧库,以便聯(lián)想到繼續(xù)對(duì)話的切入點(diǎn)柜与,但不要在故事卡上面加入太多的細(xì)節(jié)并以此取代對(duì)話。
總結(jié):編寫(xiě)用戶故事卡就是在一個(gè)卡上正面寫(xiě)上最好一句話就可以描述完成的小需求谈为,不要寫(xiě)太多的細(xì)節(jié)旅挤,細(xì)節(jié)自己和客戶討論(因?yàn)榭ㄉ厦鎸?xiě)上過(guò)多的細(xì)節(jié)會(huì)讓人過(guò)于關(guān)注細(xì)節(jié)而忘記討論才是正事)踢关;卡的背面則可以寫(xiě)上這個(gè)故事卡所需要的測(cè)試伞鲫。
二.用戶角色建模
1.初始化
在很多項(xiàng)目中,需求分析人員只是從一個(gè)角度寫(xiě)用戶故事签舞,這樣往往容易疏忽一些需求故事秕脓,因?yàn)楣适箩槍?duì)的并不是系統(tǒng)的一般用戶。
我們將通過(guò)用戶角色儒搭,角色建模吠架,角色映射和虛擬人物,模擬出更多的用戶搂鲫,編寫(xiě)更多不同角度細(xì)節(jié)的故事傍药,來(lái)開(kāi)發(fā)更好的軟件。
2.為什么需要用戶角色建模
因?yàn)榇蟛糠猪?xiàng)目小組只考慮到了單一的用戶類型魂仍,這樣會(huì)導(dǎo)致軟件疏忽原本需要的一些用戶的模型拐辽。
為了避免從單一用戶的角度編寫(xiě)所有故事,要識(shí)別與軟件交互的不同用戶角色擦酌。通過(guò)每個(gè)用戶角色定義的相關(guān)的特征俱诸,可以更加清楚地看到不同角色之間的不同點(diǎn)。
對(duì)于有些用戶而言赊舶,用代表人物來(lái)描述會(huì)很有幫助睁搭。虛構(gòu)人物是假想出來(lái)的用戶角色代表。他們有名字笼平,有照片园骆,還有足夠的相關(guān)的細(xì)節(jié),因?yàn)閷?duì)項(xiàng)目成員來(lái)說(shuō)寓调,很真實(shí)锌唾。
對(duì)于有些應(yīng)用程序而言,極端人物可能有助于搜集原本被遺漏的故事捶牢。
總結(jié):角色建模就是不光要考慮到最普通大眾的需求鸠珠,還要考慮到其他一些不同類型用戶的需求巍耗。
三.搜集故事
1.初始化
如何和用戶一起工作,如何通過(guò)與他們溝通來(lái)發(fā)現(xiàn)故事渐排。為什么一定需要溝通:因?yàn)樾枨缶拖耵~(yú)一樣炬太,會(huì)成長(zhǎng),也可能會(huì)死亡驯耻。
2.用戶訪談
只需問(wèn)用戶“你們需要什么是不夠的“亲族,因?yàn)榇蟛糠钟脩舨惶朴诶斫猓y以表達(dá)他們的真實(shí)需求可缚。
僅僅因?yàn)橛行﹩?wèn)題是由用戶提出的就認(rèn)為只有用戶才有資格提出解決方案霎迫,這種觀點(diǎn)是不對(duì)的。
3.搜索需求
通過(guò)開(kāi)放式的帘靡,與背景無(wú)關(guān)的提問(wèn)更容易獲得有用的答案知给,例如:”高速我你想怎么搜索工作“,就勝于”你要通過(guò)什么職位名稱來(lái)搜索工作“描姚。
我們可以通過(guò)用戶訪談涩赢,觀察用戶,問(wèn)卷調(diào)查和舉辦故事編寫(xiě)工作坊來(lái)發(fā)現(xiàn)有用的用戶故事轩勘。
總結(jié):面對(duì)用戶故事卡筒扒,如何與客戶交流來(lái)搜索到更有用的信息需求。
四.與客戶代理合作
1.初始化
我們可能期望與不同的用戶進(jìn)行接觸绊寻,這些用戶代表來(lái)產(chǎn)品的不同角度花墩,當(dāng)我們無(wú)法接觸到他們時(shí),就代表我們需要求助于用戶的代理(user proxy)澄步,他們自己可能不是用戶冰蘑,但他們?cè)陧?xiàng)目里面代表著用戶。
2.可能的用戶代理
- 用戶的經(jīng)理
- 開(kāi)發(fā)經(jīng)理
- 銷(xiāo)售人員
- 市場(chǎng)營(yíng)銷(xiāo)團(tuán)隊(duì)
- 以前的用戶
- 客戶
- 領(lǐng)域?qū)<?/li>
- 培訓(xùn)師和技術(shù)支持
- 業(yè)務(wù)分析師或者系統(tǒng)分析師
總結(jié):因?yàn)椴豢赡芙佑|到所有的用戶驮俗,只好委托一下用戶代理來(lái)幫助我們更好地了解到用戶的真實(shí)意圖來(lái)寫(xiě)用戶故事懂缕。
五.用戶故事驗(yàn)收測(cè)試
1.初始化
驗(yàn)收測(cè)試提供了確認(rèn)故事是否被完整實(shí)現(xiàn)的基本標(biāo)準(zhǔn)。
2.測(cè)試的兩步流程
- 將測(cè)試要點(diǎn)記錄在故事卡的背面王凑,任何時(shí)候發(fā)現(xiàn)新的測(cè)試都可以記錄在故事卡的背面搪柑。
- 將測(cè)試要點(diǎn)編程全面的側(cè)首,這些測(cè)試可以用來(lái)演示故事已經(jīng)正確索烹,完整的實(shí)現(xiàn)了工碾。
總結(jié):驗(yàn)收測(cè)試就是寫(xiě)在用戶故事卡背面的測(cè)試,在編寫(xiě)功能代碼之前寫(xiě)下來(lái)的測(cè)試百姓,當(dāng)功能代碼編寫(xiě)完畢渊额,通過(guò)了之前寫(xiě)的測(cè)試,那么驗(yàn)收測(cè)試也算是完成了。
六.估算用戶故事
1.初始化
估算這個(gè)故事卡旬迹,需要多長(zhǎng)的時(shí)間才能夠完成火惊。
2.估算
估算的目的是知道整個(gè)項(xiàng)目的工作量,所以最后我們總是要將估算換成時(shí)間奔垦。
3.故事點(diǎn)
故事點(diǎn)沒(méi)有特別準(zhǔn)確的定義屹耐,完全根據(jù)團(tuán)隊(duì)而定。有的團(tuán)隊(duì)認(rèn)為一個(gè)故事點(diǎn)為一個(gè)理想周的工作椿猎,有的團(tuán)隊(duì)則把一個(gè)故事點(diǎn)作為故事復(fù)雜度的測(cè)量惶岭。
4.正確地使用故事點(diǎn)
- 你的團(tuán)隊(duì)的故事點(diǎn)和我的團(tuán)隊(duì)的故事點(diǎn)事不一樣的。你的團(tuán)隊(duì)估算的故事有三個(gè)故事點(diǎn)犯眠,而我的團(tuán)隊(duì)則估算的是5個(gè)故事點(diǎn)按灶。
- 一個(gè)故事(可能是一個(gè)史詩(shī)故事)分解成一些小故事,這些小故事估算的總和不需要與開(kāi)始那個(gè)史詩(shī)故事估算的故事點(diǎn)相同筐咧。
- 故事點(diǎn)好似故事復(fù)雜度鸯旁,工作量或者工期的相對(duì)估算。
- 故事點(diǎn)應(yīng)該由團(tuán)隊(duì)估算嗜浮。
總結(jié):估算故事點(diǎn)就是估計(jì)這個(gè)需求需要完成的時(shí)間羡亩。
七.發(fā)布計(jì)劃
1.初始化
大部分軟件以2-6個(gè)月為一個(gè)發(fā)布周期,這是最好的危融。
2.什么時(shí)候發(fā)布
可迭代的,由故事驅(qū)動(dòng)的過(guò)程使我們很容易確定一個(gè)日期雷袋,確定在指定日期里交付哪些哪些功能卻比較困難吉殃。
3.優(yōu)先級(jí)
對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō),應(yīng)該先做最有風(fēng)險(xiǎn)的事楷怒,還是先做最有的價(jià)值的事蛋勺?
敏捷方法旗幟鮮明地支持先做最有價(jià)值的部分。
4.迭代長(zhǎng)度
短迭代允許項(xiàng)目更加頻繁地作出調(diào)整鸠删,項(xiàng)目進(jìn)度也更加透明抱完;但是每一輪迭代會(huì)有少許額外開(kāi)銷(xiāo)。加入不確定迭代長(zhǎng)度刃泡,請(qǐng)選擇迭代短的而不是迭代長(zhǎng)的巧娱,使用長(zhǎng)迭代更加容易犯錯(cuò)。
5.初始速率
執(zhí)行一輪迭代以獲取初始速率事一個(gè)很好的方法烘贴。但很多時(shí)候禁添,這個(gè)方法并不可行。
所以可以考慮使用歷史值或者猜測(cè)桨踪。
總結(jié):分好了需求的優(yōu)先級(jí)老翘,估計(jì)好了初始速率,計(jì)算好了迭代的長(zhǎng)度,大概確定好了發(fā)布日期铺峭,所做的這一系列的便是發(fā)布計(jì)劃墓怀。一個(gè)發(fā)布計(jì)劃中可能有多輪迭代。
八.迭代計(jì)劃
1.初始化
利用發(fā)布計(jì)劃卫键,我們可以將粗粒的故事分配到發(fā)布中的多輪迭代捺疼。
在開(kāi)始一輪迭代之前,再做更精細(xì)的進(jìn)一步的計(jì)劃也非常的重要永罚。
2.迭代計(jì)劃會(huì)議
整個(gè)團(tuán)隊(duì)會(huì)舉行一個(gè)迭代計(jì)劃會(huì)議為下一輪的迭代做計(jì)劃啤呼。
迭代計(jì)劃會(huì)議的內(nèi)容:
- 討論故事
- 從故事中分解故事
- 開(kāi)發(fā)人員成段每個(gè)任務(wù)的職責(zé)
- 討論所有的故事,并且接受了所有的任務(wù)后呢袱,開(kāi)發(fā)人員單獨(dú)估計(jì)他們所承擔(dān)的任務(wù)官扣,以確保他們不會(huì)做出過(guò)于樂(lè)觀的承諾。
總結(jié):迭代會(huì)議就是分解任務(wù)羞福,開(kāi)發(fā)人員選擇自己要做的任務(wù)惕蹄。
總結(jié)
用戶故事與敏捷方法其實(shí)就是拋棄了瀑布式的需求文檔,選擇了輕巧的故事卡治专,通過(guò)建立與用戶長(zhǎng)時(shí)間的需求交流卖陵,模擬了不同類型的用戶的想法,來(lái)完成相對(duì)精確需求的代碼編寫(xiě)张峰,驗(yàn)收測(cè)試的完成也代表了故事卡的完成泪蔫。
通過(guò)迭代計(jì)劃以及發(fā)布計(jì)劃來(lái)規(guī)劃了一次發(fā)布的幾輪迭代,一輪的迭代會(huì)議是對(duì)下一輪迭代的進(jìn)一步的計(jì)劃:故事的拆分喘批,故事的優(yōu)先級(jí)撩荣,迭代的時(shí)間速率,開(kāi)發(fā)人員對(duì)故事卡的自我選擇饶深。