划分用户故事(user-story)的原则
在敏捷开发过程中是通过用户故事来将需求具体化成可以进行迭代开发的一个个现实的可见的开发任务。因此在敏捷软件的开发过程中,用户故事的划分对于迭代和开发起着举足轻重的作用。
用户故事从其名字来看是站在用户的角度所描述的故事,同时也是用户所能看懂的故事,开发人员最容易犯下的一个错误就是站在自己的角度去思考和划分故事,这样就背离了用户故事的初衷。
那什么是用户故事?首先来说用户故事是对需求的细化和切分,既然是细化,就得有一个度,需求的颗粒度需要多少才能称之为用户故事?这就牵扯出和用户故事一起出现的另外一个关键的单词叫史诗故事epic,通俗来说就是大型的故事。Epic有一些自身的特点:如是由许许多多的较大的不确定的需求(large fuzzy requirements)组成;另外epics本身具有更低的优先级,因为你不能直接通过其完成迭代和开发,而是首先需要划分成较小的真正的user-story;除了这两点,epics因为包含了太多的模糊性需求,所以常常混杂了很多不同的特性,而一个特性就是一组可以归为一类的需求,同时对某一特定的用户存在着交互的价值。
在用户故事的划分中有三要素,分别为card,conversation和confirmation。
card 故事描述:通过将故事写在note card上面,除了故事本身的描述之外,还应该包括故事的时间点估计及对应的测试行为等等。
conversation 通过交谈丰富内容:用户故事的具体细节不是某一个开发人员或者PO自己拍着脑袋定义出来的,而需要项目组中的成员与PO或者客户之间沟通得出的。
confirmation 验收测试能够确认故事已经完成:用户故事划分以后是由开发人员通过编码实现,但是不能仅靠开发人员自测确认故事完成,需要的是一系列的验收测试用以保证故事功能的完成及软件按照我们的预期运行。
关于用户的编写原则,有一个通用的模板用以站在用户的角度描述用户所期望得到的功能:
As a role, I want to do something or a piece of functionality, so that achieve some business value or statement of intent.
作为一个角色,通过某项操作,以便能够完成特定的目标。
在这个模板中有三个不同的点,分别为用户角色--who,某项操作--what,完成的目标--why(reason)。
如:作为一个国米的球迷,通过点击官网的最新新闻栏,以便能够实时了解最新的国米动态。
一个良好的User-story的编写应该遵循INVEST原则:
Independent:独立性
用户故事之间应该具有独立性(有点类似于UT中的test case),不应该依赖于其他的用户故事。如果用户故事存在依赖性那么就会导致用户故事之间存在着不同的优先级,只有被依赖的用户故事完成才能继续开发依赖的用户故事。一般可以通过组合用户故事或者分割用户故事来减少用户故事间的相互依赖性。
Negotiable:可协商
用户故事不是签订的商业合同contracts,它是由客户或者PO同开发小组的成员共同协商制定的,如果最开始像商业合同一样设定了太多的条条框框和限制就无法更好的沟通及协商,也就不可能划分出既让客户满意,也能让开发认同的好的用户故事。
Valuable:有价值
用户故事必须对于最终的用户是有价值的,因此应该站在用户的角度去编写,描述的是一个一个的feature,而非一个一个的task。
Estimable:可评估
对于一个用户故事的划分需要足够的领域知识,使得在划分i故事之时就能大致了解故事开发的周期,为了减少估算的不确定性,故事本身不能太大。
Small:短小
故事应该尽量的短小,当然也不是说越小越好。短小的故事可以减少划分过程中估算的误差,最好的故事是能够在一个迭代周期之内完成的。如果太大就应该考虑将其拆分为多个粒度更小的用户故事。
Testable:可测试
个人认为这一点在所有的特性中对于用户故事的重要程度最高。首先,如果一个用户故事无法进行测试,那么也就无法判断该故事是否完成。除此之外,对应的验收测试也最好是自动运行的,这样在任何时候都能触发该用户故事的检验。最后,必须在定义了验收测试通过的标准后才能认为故事划分完毕。
关于Testable,有一个较为经典的例子:
As a user, I want to be able to cancel a reservation so that I can get a refund for the trip not taken.
关于此用户故事前面所提到的几个要素who,what,why都满足,那么验收测试应该如何去做?模拟的应该是实际的真正场景,如:退款是全退还是部分退还;提前多久cancel才是有效的;退还款项如何与用户之间进行确认等等。
按照刚才的假设,做一个真实场景的验收测试用例,通过Given-When-Then的方式来设定:
Given:“我”付款1000RMB预定了一个3周后从成都飞往三亚的航班。
When:在航班起飞前一周“我”取消了该行程。
Then:“我”应该得到预定机票半价的退款(500RMB)
在对用户故事设定验收测试的条件时候,分别对应:starting state---》event---》final state
任何的user story,在验收测试的时候都必须至少设定一个defaule scenario。
https://blog.csdn.net/rxr1st/article/details/7479472
划分用户故事(user-story)的原则的更多相关文章
- 菜鸟Scrum敏捷实践系列(二)用户故事验收
菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 一.用户 ...
- 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程
产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...
- 【DevCloud·敏捷智库】如何利用用户故事了解需求
摘要:这篇文章主要解决因为不能很好地理解需求而估算做不好的问题,在这里可以了解下如何利用用户故事了解需求. 背景 很多团队在应用敏捷开发时,对估算经常感到困惑.这里所说的估算是指产品列表条目(PBI, ...
- 【DevCloud · 敏捷智库】如何拆分用户故事
提起用户故事拆分,我们听得最多的就是INVEST原则(关于INVEST原则可以参考文章“用户故事等于需求说明”——你一定没有写好用户故事),但很多人面临的问题是拿到一个较大的用户故事时,该如何拆分才能 ...
- 用户故事地图(User Story Mapping)之初体验
北京这几日的天儿真是好的出奇,白天风和日丽,晚上繁星漫天:在这样一个周六的下午,小编参加了一次北京敏捷社区(微信号:Agile1001)组织的活动:<用户故事地图User Story Mappi ...
- 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划
菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 采用Sc ...
- 菜鸟Scrum敏捷实践系列(一)用户故事概念
菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 敏捷开发 ...
- 《Swell数学》用户故事
一.用户故事基础知识: 1. 从用户的角度来描述用户渴望得到的功能. 2. 用户故事是描述对用户有价值的功能,好的用户故事应该包括角色.功能和商业价值三个要素. 3. 一个用户故事只是以客户能够明白的 ...
- UDAD 用户故事驱动的敏捷开发 – 演讲实录
敏捷发展到今天已经在软件行业得到了广泛认可,但大多数敏捷方法都是为了解决某一特定问题而总结出来的特定方法或实践,一直缺乏一个可以将整个开发过程串接起来的成体系的方法.用户故事驱动的敏捷开发(User ...
随机推荐
- DropDownList 控件的SelectedIndexChanged事件触发不了
先看看网友的问题: 根据Asp.NET的机制,在html markup有写DropDownList控件与动态加载的控件有点不一样.如果把DropDownList控件写在html markup,即.as ...
- nodejs nodejs模块使用及简单的示例
nodejs模块使用及简单的示例 参考菜鸟教程网:http://www.runoob.com/ 一.fs模块的使用: 1.文件操作: 读文件: //读文件 var fs=require('fs'); ...
- Oracle中date转为timstam可以函数to_timestamp的方式来转化
data 转为timstam可以函数to_timestamp的方式来转化 Select to_timestamp('2018-02-27 09:48:28','yyyy-mm-dd hh24:mi:s ...
- MySQL之常用命令
前言 在说MySQL命令之前,需要介绍一些navicat:navicat是一套快速.可靠并且价格相宜的数据库管理工具,它的出现简化了数据库的管理,降低了管理成本,提高了对数据库的管理效率.Navica ...
- silverlight browse information
public class Browser { /// <summary> /// During static instantiation, only the Netscape flag i ...
- luogu4240 毒瘤之神的考验(毒瘤乌斯反演)
link 题意:求出\(\sum_{i=1}^n\sum_{j=1}^m\varphi(ij)\),对998244353取模 多组数据,\(T\le 10^4,n,m\le 10^5\). 前置知识: ...
- 5分钟构建无服务器敏感词过滤后端系统(基于FunctionGraph)
摘要:开发者通过函数工作流,无需配置和管理服务器,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统.托管函数具备以毫秒级弹性伸缩.免运维.高可靠的方式运行,极大地提高了开发和运维效率,减小 ...
- 生成对抗网络(GAN)相关链接汇总
1.基础知识 创始人的介绍: “GANs之父”Goodfellow 38分钟视频亲授:如何完善生成对抗网络?(上) “GAN之父”Goodfellow与网友互动:关于GAN的11个问题(附视频) 进一 ...
- Spring注解实现定时功能以及Quartz定时器
一:Spring注解实现--------->Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz 1:maven配置: <!-- quartz--> <d ...
- for别名
name:for(int i =0 ;i< a.length;i++){ System.out.println(i); for(int j =0;j<i;j++){ continue na ...