原文鏈接:https://dannorth.net/whats-in-a-story/
行為驅(qū)動(dòng)開(kāi)發(fā)是一種由外到內(nèi)的開(kāi)發(fā)方式总滩。它首先從外部定義業(yè)務(wù)成果闰渔,再深入到能實(shí)現(xiàn)這些成果的特性集合中去向挖。每個(gè)特征都會(huì)轉(zhuǎn)化成相應(yīng)的包含了驗(yàn)收準(zhǔn)則和范圍的“故事”何之。這篇文章介紹行為驅(qū)動(dòng)開(kāi)發(fā)的實(shí)現(xiàn)方式,定義和標(biāo)識(shí)故事及其驗(yàn)收標(biāo)準(zhǔn)蒜危。
介紹
軟件交付是關(guān)于編寫軟件來(lái)實(shí)現(xiàn)業(yè)務(wù)功能的部翘。聽(tīng)起來(lái)容易新思,但總是有政治或者環(huán)境因素使我們忘記初衷夹囚。有時(shí)候軟件交付就表現(xiàn)得像遞交報(bào)告來(lái)迎合高層管理人員,或者僅是創(chuàng)建“忙碌的工作”來(lái)保持人們持續(xù)支付費(fèi)用鞍历。額堰燎。秆剪。仅讽。我們還是另開(kāi)題目改天再討論軟件交付吧。
業(yè)務(wù)功能開(kāi)發(fā)通常是很粗糙的徽千,其表現(xiàn)為直接編寫程序(你是怎么開(kāi)始編寫“節(jié)省5%的運(yùn)營(yíng)成本”功能的?)牍汹。所以我們需要用某些中介形式定義需求來(lái)讓工作美滿完成慎菲。
行為驅(qū)動(dòng)開(kāi)發(fā)就是瞄準(zhǔn)你能將需求轉(zhuǎn)化成實(shí)現(xiàn)睬棚,編寫可測(cè)試的,生產(chǎn)環(huán)境可運(yùn)行的新荤,簡(jiǎn)單篱瞎,高效的代碼的這個(gè)環(huán)節(jié)牵素,當(dāng)然前提是需求是清晰明確,每個(gè)人都能理解的赠幕。為了做這項(xiàng)工作,我們需要一種讓業(yè)務(wù)人員逆屡,分析師,開(kāi)發(fā)者和測(cè)試者都明白需求是怎么實(shí)現(xiàn)滿足的方法來(lái)描述需求挨约。由此大家都能同意這項(xiàng)工作“完成”。借此我們能避開(kāi)“這不是我想要的”和“我忘記告訴你還有其他情況”夕土。
接下來(lái)我們講解“故事”的規(guī)則拷获。它必須用于描敘需求和它的業(yè)務(wù)效益赢笨,其包含一組所有人都同意“完成”的標(biāo)準(zhǔn)。這是一個(gè)比其他敏捷方法更為嚴(yán)謹(jǐn)?shù)亩x桐筏。這個(gè)描述等同于“一個(gè)場(chǎng)景下的承諾”和“一個(gè)特征的描述”除破。一個(gè)“故事”可以描述非功能性需求,只要它的工作可以度量剖毯,評(píng)估和同意土铺。
“故事”的結(jié)構(gòu)
行為驅(qū)動(dòng)開(kāi)發(fā)提供一個(gè)結(jié)構(gòu)給一個(gè)“故事”,這不是強(qiáng)制要求的,你可以用不同的故事形式來(lái)做行為驅(qū)動(dòng)開(kāi)發(fā)赫蛇。但我在這里仍然要展示例子給你,因?yàn)檫@已經(jīng)在不同形態(tài)大小的項(xiàng)目中證明能夠工作雾叭。最起碼的要求悟耘,你的“故事”必須在模板中包含所有描述元素≈“故事”模板大概是這樣的:
標(biāo)題(用一行來(lái)描述故事)
敘事:
作為(一個(gè)角色)
我想要(某些特征)
因此我可以得到(收益暂幼,效益)
驗(yàn)收標(biāo)準(zhǔn):(場(chǎng)景描述)
場(chǎng)景1:標(biāo)題xx
給定 (語(yǔ)境)
和(更多語(yǔ)境)
當(dāng)(某個(gè)事件發(fā)生)
就會(huì)有(某個(gè)結(jié)果)
和(某個(gè)結(jié)果)
場(chǎng)景2:...
Title (one line describing the story)
Narrative:
As a [role]
I want [feature]
So that [benefit]
Acceptance Criteria: (presented as Scenarios)
Scenario 1: Title
Given [context]
And [some more context]...
When [event]
Then [outcome]
And [another outcome]...
Scenario 2: ...
"講故事"
一個(gè)故事應(yīng)該能夠轉(zhuǎn)化成有幾個(gè)人參與的對(duì)話。業(yè)務(wù)分析師跟業(yè)務(wù)相關(guān)的人員討論特性或者需求赚瘦,然后幫助他們構(gòu)建“故事”的描述粟誓。測(cè)試人員幫助定義“故事”的描述范圍--寫在表格的驗(yàn)收標(biāo)準(zhǔn)奏寨,也幫助決定哪些場(chǎng)景重要起意,哪些是無(wú)用的。技術(shù)代表會(huì)提供一個(gè)大概的關(guān)于“故事”包含了哪些工作的評(píng)估病瞳,提供可選擇的實(shí)現(xiàn)方式揽咕。好多關(guān)于系統(tǒng)的好主意都是來(lái)自開(kāi)發(fā)和第一個(gè)要求這個(gè)事情的人。
這做起來(lái)像一個(gè)迭代過(guò)程套菜。相關(guān)人員會(huì)產(chǎn)生關(guān)于想要什么的想法亲善。但他們通常不知道有多少工作要被包含進(jìn)來(lái),或者工作是怎么分配的逗柴。通過(guò)技術(shù)專家和測(cè)試專家的幫助蛹头,他們會(huì)明白每個(gè)場(chǎng)景的花費(fèi)和收益,并決定他們是否需要戏溺。當(dāng)然渣蜗,這是與另外一個(gè)需求相關(guān)的,我們要決定先覆蓋更多這個(gè)“故事”的場(chǎng)景還是先覆蓋另外一個(gè)“故事”的場(chǎng)景旷祸。
有時(shí)候開(kāi)發(fā)團(tuán)隊(duì)做的工作評(píng)估可能不是很好耕拷。這種情況下,為了更加清晰理解需求托享,他們可以選擇進(jìn)行一些調(diào)查工作(類似極限編程里面的spike
概念)骚烧。(我將在往后的文章中討論更多細(xì)節(jié)浸赫。)
一個(gè)好“故事”的特征
使用《介紹行為驅(qū)動(dòng)開(kāi)發(fā)》里面的例子,讓我們來(lái)一起觀察關(guān)于ATM提款這個(gè)需求需求赃绊。
故事:賬戶持有人提取現(xiàn)金
作為一個(gè)賬戶持有人既峡。
我想從ATM中提取現(xiàn)金。
這樣就算銀行營(yíng)業(yè)廳關(guān)門碧查,我都能夠取到錢涧狮。
場(chǎng)景1:賬戶里面有足夠的資金
假設(shè) 賬戶里面有300元
而且 銀行卡是合法的
而且 ATM里面存放了足夠的錢
當(dāng) 賬戶持有人請(qǐng)求提取200元
因此 ATM機(jī)器應(yīng)該吐出200元
而且 賬戶里面的余額該為100元
而且 銀行卡應(yīng)該會(huì)被退返
場(chǎng)景2:賬戶里面沒(méi)有足夠的資金
假設(shè) 賬戶里面有100元
而且 銀行卡是合法的
而且 ATM里面存放了足夠的錢
當(dāng) 賬戶持有人請(qǐng)求提取200元
因此 ATM機(jī)器不應(yīng)該吐出任何錢
而且 ATM機(jī)器會(huì)說(shuō)賬戶余額不足
而且 賬戶里面的余額該為100元
而且 銀行卡應(yīng)該會(huì)被退返
場(chǎng)景3:銀行卡已經(jīng)被取消
假設(shè) 銀行卡已經(jīng)被取消
當(dāng) 賬戶持有人請(qǐng)求提取200元
因此 ATM機(jī)器收回這張銀行卡
而且 ATM機(jī)器會(huì)說(shuō)銀行卡已經(jīng)被收回
場(chǎng)景4:銀行卡已經(jīng)被取消
code here...
你能看到,這里有很多場(chǎng)景需要考慮么夫,有些是關(guān)于賬戶余額的者冤,有些是銀行卡的,有些是關(guān)于ATM機(jī)器自身的档痪。讓我們一起來(lái)分析故事是否足夠優(yōu)秀涉枫。
標(biāo)題應(yīng)該描述一項(xiàng)活動(dòng)
“故事”的標(biāo)題,“賬戶持有人提取現(xiàn)金”腐螟,描述了一個(gè)關(guān)于賬戶持有人提款的活動(dòng)愿汰。賬戶持有人沒(méi)辦法從ATM提取現(xiàn)金直到我們完成這個(gè)特征。一旦我們交付乐纸,我們會(huì)得到一個(gè)很明確的“完成”標(biāo)識(shí)來(lái)表示是否完成衬廷。
如果我們的標(biāo)題是“帳戶管理”或者“ATM工作方式”,我們必須話費(fèi)時(shí)間去看內(nèi)容才能明白怎么算完成汽绢,而且界定范圍可能更加模糊吗跋。舉個(gè)例子,“帳戶管理”可能不合適做申請(qǐng)貸款宁昭,而且“ATM工作方式”可能包括改變我銀行卡的PIN碼跌宛。“故事”標(biāo)題應(yīng)該總是描述一個(gè)系統(tǒng)用戶的實(shí)際行為积仗。
描述應(yīng)該包含角色疆拘,特征,收益
模板做為一個(gè)“X角色”寂曹,我想要“Y特征”哎迄,由此得到“Z收益”
有很多好處。在敘述中明確角色隆圆,你會(huì)明白誰(shuí)在討論“特征”漱挚。在敘述中明確收益,你會(huì)明白“故事”的作者為什么他們會(huì)想要這個(gè)“特征”匾灶。
有意思的是如果你發(fā)現(xiàn)你寫的特征不能實(shí)際地表達(dá)收益棱烂。這通常意味著你有一個(gè)失蹤的故事。一個(gè)故事是描述當(dāng)前特征阶女,表達(dá)的收益卻不相同颊糜,意味著這是一個(gè)隱藏故事哩治,你需要編寫不同的特征來(lái)表達(dá)收益。
故事例子告訴我們有一個(gè)賬戶持有人關(guān)心所交付的功能衬鱼,因此我們知道怎么去探索這個(gè)功能需要做的事情业筏。
情景的標(biāo)題應(yīng)該說(shuō)明有什么不同
你應(yīng)該有能力將場(chǎng)景排列出來(lái),同時(shí)僅僅是使用題目來(lái)描述他們的不同鸟赫。在我們的例子當(dāng)中蒜胖,我們可以看到情景描述僅僅說(shuō)明每個(gè)場(chǎng)景之間的差異。你不用在標(biāo)題中寫“一個(gè)賬戶持有人從一個(gè)資金不足的賬戶中提取金錢抛蚤,他不能夠完成交易”台谢。同時(shí),這個(gè)場(chǎng)景對(duì)比其他場(chǎng)景你是否關(guān)心是很明顯的岁经。
場(chǎng)景應(yīng)該是基于給定的描述朋沮,事件和結(jié)果
應(yīng)用行為驅(qū)動(dòng)開(kāi)發(fā)方法,這在團(tuán)隊(duì)中是簡(jiǎn)單強(qiáng)大的行為轉(zhuǎn)移缀壤。用“假定/當(dāng)/然后”詞匯就可以使業(yè)務(wù)人員樊拓,分析師,測(cè)試人員塘慕,開(kāi)發(fā)者共同發(fā)現(xiàn)一個(gè)模糊的世界消失了筋夏。
不是所有場(chǎng)景都這么簡(jiǎn)單。事件序列是最好的表現(xiàn)图呢。描述為“假設(shè)(某些內(nèi)容)条篷,當(dāng)(我做某事),就會(huì)(產(chǎn)生某個(gè)結(jié)果)岳瞭,當(dāng)(我做另外的事情)拥娄,就會(huì)(發(fā)生另外的事情)蚊锹,如此繼續(xù)瞳筏。一個(gè)例子就是向?qū)骄W(wǎng)站(你會(huì)一步一步進(jìn)入場(chǎng)景,來(lái)構(gòu)建你的數(shù)據(jù)模型)牡昆。這完美地將事件結(jié)果序列混合在一起姚炕,只要你有這方面思考的習(xí)慣。
一個(gè)有趣且緊急的行為是對(duì)話質(zhì)量改變丢烘。你會(huì)很快發(fā)現(xiàn)你有錯(cuò)誤的假設(shè)柱宦,或者忘記驗(yàn)證結(jié)果。這是我在一個(gè)特別的項(xiàng)目中觀察到的播瞳,他們的技術(shù)負(fù)責(zé)人告訴我掸刊,有些時(shí)候,分析師和工程師討論問(wèn)題赢乓,但他們都沒(méi)有辦法來(lái)展示他們的意圖忧侧。介紹了幾日“假定/當(dāng)/就”詞匯之后石窑,他就能看到他們的交流有非常優(yōu)秀的提升。
在不超過(guò)所需的背景的前提下蚓炬,“假設(shè)”應(yīng)確定所有條件松逊。
不論是從技術(shù)上還是業(yè)務(wù)上,任何附加的條件都會(huì)令第一次閱讀“故事”的人感覺(jué)理解困難肯夏。缺少假定的情況同理经宏。如果你從相同的假定條件中能夠得到不同的結(jié)果,這肯定少了某些假設(shè)情況驯击。
在例子中烁兰,第一個(gè)場(chǎng)景說(shuō)了某些關(guān)于賬戶余額的情況,銀行徊都,ATM機(jī)器缚柏。所有這些都要求完整地定義場(chǎng)景。在第三個(gè)場(chǎng)景中碟贾,我們不說(shuō)任何有關(guān)賬戶余額的事情币喧,或者ATM是否有足夠的資金。這表明機(jī)器會(huì)收回銀行卡無(wú)論賬戶余額剩余多少袱耽,或者ATM的機(jī)器狀態(tài)是怎么樣杀餐。
事件應(yīng)該描述特征
事件本身很簡(jiǎn)單,通常是一個(gè)簡(jiǎn)單的調(diào)用生產(chǎn)代碼朱巨。當(dāng)我們討論這個(gè)的時(shí)候史翘,某些場(chǎng)景是比這個(gè)復(fù)雜得多的,但大部分“故事”場(chǎng)景會(huì)轉(zhuǎn)化為一個(gè)單一事件冀续。他們的差別僅僅在于給定的假設(shè)內(nèi)容和得到的結(jié)果不一樣琼讽。
故事應(yīng)該足夠小來(lái)適應(yīng)迭代。
這里沒(méi)有關(guān)于怎么做迭代的硬道理或者第一定理洪唐,只要你能夠明顯地分切塊钻蹬。通常來(lái)說(shuō),如果這里有超過(guò)5個(gè)或者6個(gè)場(chǎng)景凭需,一個(gè)“故事”可能可以拆分成更小的分組问欠。
我們不能夠說(shuō)清楚ATM例子的“故事”的場(chǎng)景到底需要多少個(gè),但我懷疑這里需要幾個(gè)甚至更多粒蜈。本質(zhì)上來(lái)說(shuō)顺献,我們?cè)谶@個(gè)故事里面有三個(gè)moving part
,分別命名為賬戶余額枯怖,銀行卡狀態(tài)注整,和ATM狀態(tài)。我們可以討論一下關(guān)于銀行卡的細(xì)節(jié):如果它過(guò)期了會(huì)怎么樣?我不能夠用它提款肿轨,但ATM仍然會(huì)返回給我嗎借浊?如果ATM在交易過(guò)程中發(fā)生故障會(huì)怎樣?如果我的賬戶有透支的情況呢萝招?
這可能將一個(gè)“故事”分拆成三個(gè)“故事”更好蚂斤。
- 賬戶持有人提取現(xiàn)金(假設(shè)ATM工作良好且銀行卡合法)
- 賬戶持有人用非法卡提取現(xiàn)金(假設(shè)ATM工作良好)
- 賬戶持有人在壞的ATM上提取現(xiàn)金(假設(shè)銀行卡合法)
這雖然像是故意而為之的,這讓你可以展示過(guò)程給業(yè)務(wù)團(tuán)隊(duì)槐沼,而且給你更多的數(shù)據(jù)點(diǎn)去追蹤曙蒸。重要的事情是根據(jù)業(yè)務(wù)線來(lái)決定是否要打破這個(gè)“故事”。(同時(shí)假設(shè)明確)岗钩,而不是根據(jù)技術(shù)線來(lái)做(一次是數(shù)據(jù)庫(kù)工作纽窟,一次是圖形界面工作)。這樣大家能夠展示過(guò)程兼吓,而不僅僅取決于你說(shuō)的話臂港。
跟用例之間有什么區(qū)別呢?
這是用例视搏,這就是用例审孽。對(duì)于Alistair Cockburn 描述用例的方法(),我是他的大粉絲浑娜。假設(shè)我在用例驅(qū)動(dòng)項(xiàng)目中沒(méi)有什么經(jīng)驗(yàn)佑力,我會(huì)讓其他人來(lái)做這個(gè)比較。
其次筋遭,我同意他從低精度(成果打颤,目標(biāo))到高精度的方法,因?yàn)楫?dāng)你行動(dòng)的時(shí)候漓滔,你會(huì)發(fā)現(xiàn)更多意外場(chǎng)景编饺。這意味從業(yè)務(wù)結(jié)果開(kāi)始,一直貫穿到高層次的功能領(lǐng)域响驴,這是為了深入到包含驗(yàn)收標(biāo)準(zhǔn)的特定故事透且。
在現(xiàn)實(shí)世界中,你的過(guò)程是否標(biāo)識(shí)明確或者需求描述詳細(xì)并不重要踏施。如果能夠幫助你組織你的想法石蔗,你想寫需求文檔也是好的。但畅形,如果是為了一直通過(guò)這些文檔,好像它們實(shí)際上封裝了你的想法诉探,這就有問(wèn)題了日熬,因?yàn)樗鼈儧](méi)有!你應(yīng)該將需求文檔或者用例堆放到一邊并重新開(kāi)始從業(yè)務(wù)成果中定義故事肾胯。這樣在知識(shí)方面是安全的竖席,因?yàn)槟愕那趭^工作已經(jīng)表明了所有在你腦中的答案--至少耘纱,有足夠好的理解來(lái)描述你現(xiàn)在能在看到的工作。
總結(jié)
行為驅(qū)動(dòng)開(kāi)發(fā)用故事來(lái)作為基本的工作單元毕荐,并以此來(lái)做交付束析。故事里面已經(jīng)包含了驗(yàn)收標(biāo)準(zhǔn),從效果上看憎亚,它們定義了行為的范圍员寇,同時(shí)生成了一個(gè)大家都能理解的“完成”。它也可以用來(lái)基本評(píng)估我們要做的工作計(jì)劃第美。
最重要的是,故事是項(xiàng)目負(fù)責(zé)人什往,業(yè)務(wù)分析師扳缕,測(cè)試人員,開(kāi)發(fā)者溝通交流的結(jié)果别威。行為驅(qū)動(dòng)開(kāi)發(fā)更關(guān)注的方面是不同人在項(xiàng)目中的相互作用躯舔,同時(shí)亦關(guān)注開(kāi)發(fā)過(guò)程的輸出結(jié)果。