写点什么

【DevCloud · 敏捷智库】如何拆分用户故事

  • 2020-06-12
  • 本文字数:2813 字

    阅读完需:约 9 分钟

【DevCloud · 敏捷智库】如何拆分用户故事

提起用户故事拆分,我们听得最多的就是 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 的七个方法,寻求帮助。


2020-06-12 20:241157

评论

发布
暂无评论
发现更多内容

微信业务架构图与“学生管理系统”毕设架构设计

唐尤华

架构实战营

微信业务架构图、学生管理系统毕业架构设计

石小天

架构实战营

架构设计图

风中奇缘

架构实战营 「架构实战营」

基于esbuild的universal bundler设计

字节跳动终端技术

json 字节跳动 前端 火山引擎 lynx

虎符宣布开启平台币回购计划 HOO应声大涨20%

区块链前沿News

Hoo虎符 Hoo 虎符交易所 虎符平台币

2021总结和2022趋势--《香帅中国财富报告》(7/100)摘录

hackstoic

投资

投稿开奖丨“轻量应用服务器”征文活动(11&12月)大奖公布

阿里云弹性计算

阿里云 轻量应用 征文投稿开奖

架构学习【01】——架构图初探

tiger

架构实战营

25 Prometheus最佳实践原则

穿过生命散发芬芳

Prometheus 1月月更

【架构训练营-模块一】

默光

微信 架构设计

有的时候我觉得我不会 Markdown

冴羽

前端 写作 markdown markdown语法 vuepress

03uniapp的生命周期【uniapp 专题 03】

坚果

小程序 uniapp 1月月更

从交换机安全配置,看常见局域网攻击

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

Flink 实现 MySQL CDC 动态同步表结构

腾讯云大数据

flink 源码 流计算 Oceanus

从重大漏洞应急看云原生架构下的安全建设与安全运营(下)

腾讯安全云鼎实验室

云原生 安全漏洞 容器安全 安全服务

sonic:基于 JIT 技术的开源全场景高性能 JSON 库

火山引擎开发者社区

原生云

从零开发区块链应用(十)--golang协程使用

杰哥的技术杂货铺

golang 区块链 gotoutine

IDEA注释模板,惊艳了,动作要快,姿势要帅

碌碌无为小码农

Java 架构 程序人生 编程语言 经验分享

对管理金字塔游戏的感悟:管理的本质是协作

panda

管理

01uni-app基础教程 环境配置【uniapp专题1】

坚果

uni-app 1月月更

学生管理系统架构设计

孙强

架构实战营

2021 大促 AntMonitor 总结 - 云原生 Prometheus 监控实践

SOFAStack

云原生 分布式架构 SIGMA

介绍一种在ABAP内核态进行内表高效拷贝的方法,和对应的Java和JavaScript版本的伪实现

汪子熙

Java JavaScript abap 1月月更

从零开发区块链应用(六)--gin框架使用

杰哥的技术杂货铺

golang 区块链 gin框架

【译】什么是测试驱动开发

宇宙之一粟

测试驱动开发 1月月更

发布uniapp【uniapp 专题 02】

坚果

1月月更

一线开发人员,你对项目了解多少?

蜜糖的代码注释

Java 程序员 后端技术

干掉 PowerDesigner,这款数据库设计神器真的绝了!!!

沉默王二

RocketMQ 源码探究 -- 延迟队列实现

周文童

RocketMQ #java

从零开发区块链应用(七)--gin框架参数获取

杰哥的技术杂货铺

golang 区块链 gin框架

从零开始学Mysql - 字符集和编码(下)

懒时小窝

【DevCloud · 敏捷智库】如何拆分用户故事_研发效能_华为云开发者联盟_InfoQ精选文章