提起用户故事拆分,我们听得最多的就是INVEST原则(关于INVEST原则可以参考文章“用户故事等于需求说明”——你一定没有写好用户故事),但很多人面临的问题是拿到一个较大的用户故事时,该如何拆分才能使得它满足Small的原则呢?接下来,就和大家一起讨论一下如何拆分用户故事。
 
首先,拆分可以参考以下流程:评估待拆分用户故事-按方法拆分-评估拆分结果。(文末有彩蛋,不要错过)

评估待拆分用户故事

拆分前,我们需要知道手中的用户故事是否需要拆分,就是目前是否已经符合了Small的原则。我们推荐一个用户故事在1-2天内能完成,最多不超过3天,则符合Small原则。有些地方给出的说法是1/5-1/10团队速率,这个算法和你每个迭代天数以及团队成员数有关系,所以我个人还是喜欢简单的说,1-2个工作日能完成算Small。在这种情况下如果你的用户故事已经符合了INVEST其他原则的话,那就没必要拆成多个用户故事了,因为再拆就增加了管理成本(这里不包括拆成多个task,task可以再多拆分的)。
 
好,当你已经根据上面评估了用户故事,发现依旧需要拆分的话,那么可以按下面方法进行拆分。

按方法拆分

目前业界比较好的方法是Richard Lawrence的方法,原文请参考https://agileforall.com/patterns-for-splitting-user-stories/,下图为已官方翻译的中文版本。

图片来自Lawrence官方

原文里有作者的切分方式,这里我只根据我的理解选择更熟悉的例子,同时合并了其中一些方法。

方法一:按流程拆分

作为有爱心的有财力的中国人,我可以从国外进口口罩捐给武汉。
 
这个用户故事涉及的过程就很多了,需要找到国外可靠的口罩供应商,然后付款,运回国内,再送到武汉捐给指定医院等等。我们可以先分析整个用户故事成一个一个连续的流程,如果每个小流程作为一个用户故事,能对用户有价值,那我们就先这么拆开。结果比如下面
  • 作为有爱心的有财力的中国人,我可以寻找个国外的朋友帮忙寻找可靠的口罩来源。
  • 作为有爱心的有财力的中国人,我可以在这个来源付款购买指定数量的口罩。
  • 作为有爱心的有财力的中国人,我可以将口罩从外国运回国内。
  • 作为有爱心的有财力的中国人,我可以将口罩从国内某地送到武汉捐给医院。

方法二:按操作种类划分

作为有爱心的中国人,我可以在口罩购买平台上操作以完成购买。
 
如果是一个业务更简单的系统的话,对应的就是增删改查动作。这里的操作会复杂些,把每个操作拆分成一个用户故事即可。
  • 作为有爱心的中国人,我可以在口罩购买平台上购买。
  • 作为有爱心的中国人,我可以在口罩购买平台上退货。
  • 作为有爱心的中国人,我可以在口罩购买平台上查询。
  • 作为有爱心的中国人,我可以在口罩购买平台上卖货。

方法三:拆出主要的工作

作为有爱心的中国人,我可以购买N95/KN95/医用外科三种口罩进行捐赠。
 
整个购买捐赠流程就很复杂了,还要买不同种类的口罩,明显这三种口罩可以拆成三个故事,同时考虑一点,就是无差别的完成购买一个口罩进行捐赠的故事后,剩下的两种需要的工作量就会很少了,同时这里如果没有区分三种口罩的优先级的话,我们可以先拆出一个作为主要工作,再看剩下的两个是合到一起还是继续拆分。
 
比如拆成如下
  • 作为有爱心的中国人,我可以购买其中一种(N95/KN95/医用外科)口罩进行捐赠。(3个故事点)
  • 作为有爱心的中国人,我可以购买另外一种(N95/KN95/医用外科)口罩进行捐赠。(1个故事点)
  • 作为有爱心的中国人,我可以购买最后一种(N95/KN95/医用外科)口罩进行捐赠。(1个故事点)
如果后两个都比较小,合道一起也没问题的话,也可以拆成如下
  • 作为有爱心的中国人,我可以购买其中一种(N95/KN95/医用外科)口罩进行捐赠。(3个故事点)
  • 作为有爱心的中国人,我可以购买另外两种(N95/KN95/医用外科)口罩进行捐赠。(2个故事点)

方法四:业务规则分类

作为有爱心的中国人,我可以购买三十万个口罩捐赠给武汉。
 
这里购买的口罩可以选择多种类型,价格不一样,效果不一样,这就是我们要区分的不同的业务规则,拆分后可能如下
  • 作为有爱心的中国人,我可以购买三十万个最贵的口罩捐赠给武汉。
  • 作为有爱心的中国人,我可以购买三十万个口罩捐赠给武汉,不区分口罩种类。
  • 作为有爱心的中国人,我可以购买三十万个口罩捐赠给武汉,只要N95和KN95级别的。

方法五:简单到复杂

作为有爱心的中国人,我可以购买口罩捐赠给武汉。
 
简单一句话,涉及的业务可以是购买何种口罩,如何捐赠,给什么机构等,明显不能作为一个故事进行交付,需要拆分。但是业务太复杂,一开始无法全都想清楚,可以先做最基本的,然后再根据方法四的业务规则分类进行扩展。
  • (简单)作为有爱心的中国人,我可以购买口罩捐赠给武汉。
  • (复杂)在XXX日期购买。
  • (复杂)通过不同的运输通道送到武汉。
  • (复杂)捐赠给XXX不同的医院。

方法六:推迟性能实现

作为有爱心的中国人,我可以明天购买口罩捐赠给武汉。
 
明天这个性能太高了,实现起来可能比较困难,我们先实现购买和捐赠,不考虑哪天能完成,再考虑明天这个性能要求。
  • 作为有爱心的中国人,我可以购买口罩捐赠给武汉。
  • 作为有爱心的中国人,我可以明天购买口罩并完成捐赠给武汉。

方法七:探针

作为有爱心的中国人,我可以明天购买口罩捐赠给武汉。
 
这个可能对我来说太复杂了,完全不知道该买什么类型的口罩,买30万个大概多少钱,渠道买比较靠谱,怎么捐赠,给哪个机构,如果现在就强行做计划的话,可能最后发现,我手上的钱是不够的,或者周期太长,到最后才发现的话,会损失很多。所以一般都是先去探探路。
  • 调查市场上口罩类型、价格、渠道。
  • 调查捐赠方式,靠谱的接受机构。
  • 实施捐赠(需要等前面的工作完毕后重新评估)

评估拆分结果

拆分完毕后,再用INVEST原则进行评估,如果符合,那就没问题了。但是有的时候会不符合其中某些原则,比如独立性,但是实际业务就只能这样。比如上面提到的方法三的拆分,这个是必然有关系的,不可能先做第二个用户故事后做第一个。这时只能选择不符合独立性原则。

彩蛋

看了上面这么多拆分方法,是否迷糊了?是否每次拆分都要对照上面的方法一个一个的试?其实不需要的,根据经验,拆分用户故事最重要的是,先捋清楚整个业务(划重点,这个最重要,之前很多例子你感觉切分的不如作者好,都是因为对举例的业务不熟悉),然后按照最重要的原则-纵着切即可。如下图所示。

图片来自网络

纵着切的意思是,每个切分出来的需求是个单独对用户有价值的,就像上图中切出来的一块蛋糕,是独立的个体,包括这一块蛋糕的所有层次以及上面的小人。对比的横着切的意思是所有的需求放一起将前台、后台、数据库操作这样切分出来,结果就是先用几个迭代将所有的需求前台工作做完了,再开发后台的,这样无法尽早交付有价值的需求,比如先将蛋糕上上所有的小人都切下来了。
 
如果业务比较复杂,那么就以MVP的思想,先交付一个简单的端到端的业务,再慢慢扩展复杂程度。如果过于复杂,就尝试探针方法。
 
如果捋清楚了需求,尝试纵着切,发现很难下手,这时候再来看上面提到的Lawrence的七个方法,寻求帮助。
 
 

【DevCloud · 敏捷智库】如何拆分用户故事的更多相关文章

  1. 【DevCloud · 敏捷智库】两种你必须了解的常见敏捷估算方法

    背景 在某开发团队辅导的回顾会议上,团队成员对于优化估计具体方法上达成了一致意见.询问是否有什么具体的估计方法来做估算. 问题分析 回顾意见上大家对本次Sprint的效果做回顾,其中80%的成员对于本 ...

  2. 【DevCloud·敏捷智库】如何利用用户故事了解需求

    摘要:这篇文章主要解决因为不能很好地理解需求而估算做不好的问题,在这里可以了解下如何利用用户故事了解需求. 背景 很多团队在应用敏捷开发时,对估算经常感到困惑.这里所说的估算是指产品列表条目(PBI, ...

  3. 敏捷:什么是用户故事(User Story)

    摘要: 一件用户通过系统完成他一个有价值的目标(买一罐饮料)的事.这样的过程就叫"用户案例(user case)"或者"用户故事(user story)".本文 ...

  4. 菜鸟Scrum敏捷实践系列(一)用户故事概念

    菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 敏捷开发 ...

  5. 产品经理-需求分析-用户故事-敏捷开发 详解 一张图帮你了解Scrum敏捷流程

    产品经理-需求分析-用户故事-敏捷开发 详解 用户故事是从用户的角度来描述用户渴望得到的功能.一个好的用户故事包括三个要素:1. 角色:谁要使用这个功能.2. 活动:需要完成什么样的功能.3. 商业价 ...

  6. 敏捷开发用户故事系列之十一:CSDN博客用户故事分析

    这是敏捷开发用户故事系列的第十一篇.(栏目目录) 经常有人问起有没有完整的用户故事案例.本人在网上找了一下,大约能找到两三篇,但多数只是为了描述用户故事的语法而已,都不涉及用户故事的颗粒度.大量故事的 ...

  7. 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划

    菜鸟Scrum敏捷实践系列索引 菜鸟Scrum敏捷实践系列(一)用户故事概念 菜鸟Scrum敏捷实践系列(二)用户故事验收 菜鸟Scrum敏捷实践系列(三)用户故事的组织---功能架构的规划 采用Sc ...

  8. UDAD 用户故事驱动的敏捷开发 – 演讲实录

    敏捷发展到今天已经在软件行业得到了广泛认可,但大多数敏捷方法都是为了解决某一特定问题而总结出来的特定方法或实践,一直缺乏一个可以将整个开发过程串接起来的成体系的方法.用户故事驱动的敏捷开发(User ...

  9. 用户故事驱动的敏捷开发 – 2. 创建backlog

    本系列的第一篇[用户故事驱动的敏捷开发 – 1. 规划篇]跟大家分享了如何使用用户故事来帮助团队创建需求的过程,在这一篇中,我们来看看如何使用这些用户故事和功能点形成产品backlog.产品backl ...

随机推荐

  1. 0day堆(2)堆的调试实验

    堆的调试实验 调试态堆管理策略和常态堆管理策略:前者只使用空表不用块表,不真实 使用调试器加载函数会触发前者 __asm int3 调试最真实的栈 未启用块表的堆区信息 堆区起始位置(假设为0x005 ...

  2. thinkphp5.0 url跳转

    <a href="{:url('member/index/index',['id'=>5])}">跳转</a> define()自定义常量在thiin ...

  3. 2019-2020-1 20199328《Linux内核原理与分析》第三周作业

    加载内核 这里可以看出有些东西隔一段时间就会打印出来 查看mymain.c 开头的一些语句不再描述 每10000次循环打印一次 这里还是针对的mymain.c文件,这里我们可以根据自己的计算机对频率进 ...

  4. Ubuntu 设置 log 级别

    Linux环境下使用rsyslog管理日志 rsyslog linux运维 linux 22.7k 次阅读  ·  读完需要 22 分钟     在 Linux 系统中,日志文件记录了系统中包括内核. ...

  5. Omnicore RPC API中文文档

    2019独角兽企业重金招聘Python工程师标准>>> OmniCore是比特币核心的一个分支,它在比特币协议之上实现了一个新的Omni协议层,用于代币发行.众售等应用,USDT就是 ...

  6. 数学--数论--Find Integer(勾股数定理)

    Problem Description people in USSS love math very much, and there is a famous math problem give you ...

  7. pycharm(py 文件中添加作者、时间)

    1.打开 Pycharm,点击 File,再找到 Settings... 2.选择 Editor ----> File and Code Templates ----> Python Sc ...

  8. 给springboot增加XSS跨站脚本攻击防护功能

    XSS原理 xss攻击的原理是利用前后端校验不严格,用户将攻击代码植入到数据中提交到了后台,当这些数据在网页上被其他用户查看的时候触发攻击 举例:用户提交表单时把地址写成:山东省济南市<scri ...

  9. Automatic Reference Counting

    NSObject简化版alloc: struct obj_layout { NSUInteger retained; }; + (id)alloc { int size = sizeof(struct ...

  10. wmic 内网使用

    先决条件: 1.远程服务器启动Windows Management Instrumentation服务,开放TCP135端口,防火墙放开对此端口的流量(默认放开): 2.远程服务器的本地安全策略的“网 ...