敏捷开发中史诗故事与用户故事的颗粒度

敏捷开发用户故事规范 个人工作规划总结文档。从用户故事的概念,用户故事与用例的区别,优秀用户故事的特性,用户故事的划分,划分用户故事的原则,用户故事的验收测试的技术等几方面对用户故事进行阐述。 立即下载

       作者:陈勇

       出处:blog.youkuaiyun.com/cheny_com

      

用户故事的颗粒度一直是一个谈论已久的话题,但参加了很多研讨会,搜索了很多网络资源后发现一直没有定论,只好在这里原创一下。

 

前言:为何需要讨论用户故事的颗粒度

 

其实需求颗粒度的问题由来已久,即使是在传统开发中,也没有提及在需求分析阶段应该把需求做到什么颗粒度才可以开工。所以在下面这些分析之后会发现,其实即使反推到传统开发中,下面提及的方法也依然有效。

为何要对用户故事做一个颗粒度约束呢?

笔者在开发实践中发现,如果大小不一的“用户故事”堆积在一起,很难看出一个产品到底实现了哪些功能(或一个项目到底有哪些需求)。如果回溯到敏捷开发的源头就会发现,由于敏捷开发中设定用户故事是为了描述开发任务(尽管是从客户价值角度)而非产品功能或项目需求,因此并没有区分用户和开发人员到底分别看到什么。

其实各种“用户故事”中,大致可以分为史诗Epic、故事Story、增强Enhancement、缺陷Defect、技术债务TechDebts、重构Refactor等几种。其中史诗和故事大致形成树状结构,很容易勾勒出产品或项目的结构,是最需要展示给用户的;增强和缺陷在一定程度上需要展示给用户,但除了评审中或交付后客户提出来的之外,都可以不展示给用户,而且即使展示,“展示”的层次也应该不同于史诗和故事;而技术债务和重构由于太技术化,不适合直接展示给用户,而更适合展示给Product Owner及开发团队。

本文所讨论的,就是用于“展示产品或项目结构”的史诗与故事的颗粒度问题。

好的用户故事的标准

 

先看看好的用户故事的标准(内容及观点与《敏捷开发与用户故事》中大致相同):

封闭性:完整地交付一个客户价值

针对性:只包含一个用户,因为多个用户常常有细微的差别

独立性:故事间没有依赖

这几条标准中最有价值的观点应该是独立、完整地交付一个客户价值,这在敏捷开发中是至关重要的。传统的开发会说要交付一个软件功能,而敏捷开发则认为用户必须使用这个功能以获得自己的价值(请回忆一下用户故事的编写语法)。

不过仅仅如此就说能方便地划分故事颗粒度,似乎还有点模糊,下面会引用两个成熟体系中对颗粒度划分的标准来做进一步说明。

 

功能点分析方法与用户故事

 

第一个是国际标准功能点分析方法(FPA,Fuction Point Analysis)中对内部逻辑文件及基本过程的定义。

内部逻辑文件-基本过程树是一个潜在的史诗-故事树的原型。

 

一个ILF(ILF,Internal Logical File)就是一组逻辑上的数据,用户能够理解和识别它,对其进行的操作都是用户的业务操作。

比如如果我们要开发一个“Scrum开发管理平台”,那么有一些明显的“逻辑”数据:系统用户,用户故事,迭代,剩余时间……它们不同于数据库表或程序中的类,因为远在程序被设计之前,就可以判断它们是否存在。

一个基本过程(Essensial Process)就是对用户有意义的一次业务操作,在完成这次操作后客户得到其业务价值,而且数据稳定完整。

比如我们“增加一个用户故事”,需要完成的细节过程很多:显示输入界面,在界面中输入数据,数据校验,数据写入数据库表,显示“成功”信息……但只有这一切都完成,从用户角度看才能获得其业务价值,数据也才稳定完整,因此“增加一个用户故事”就是一个基本过程,而“数据校验”等则不是。

在FPA定义中,基本过程还根据分为外部输入/外部输出/外部查询这三种。简单说,我们常说的“增删改查”都是基本过程。为了防止总是从技术角度谈增删改查,常常使用用户业务术语来描述,比如“起草”(输入)、“编辑”(输入)、“发送”(输出)等。

 

使用FPA中的内部逻辑文件-基本过程树作为史诗-故事树的颗粒度原型有下面几个好处:

基本过程有严格的定义,已经形成了ISO标准,歧义少;

基本过程面向客户价值交付,与敏捷开发的价值观接近,也很容易用用户故事描述;

文件和基本过程的数量被业界证实与软件的工作量有很好的对应关系,已经有多个国家如日韩澳荷芬等将其作为软件计价标准,工信部也已经进行国标立项,面向政府、银行、电信等大量软件外包场景中的造价估算,本文作者是技术专家组成员。

 

使用FPA中的内部逻辑文件-基本过程树作为史诗-故事树的颗粒度原型,将作出以下约束:

只有独立完整地交付一个客户价值才算是故事,而缺陷、增强等均不作为有效故事对待;

只有用户可以直接作为业务操作使用的功能(可以是人-机或机-机交互)才算是有效故事,“开发一个某某函数”(即使这个函数很有客户价值)等均不算是故事;

多个过程不能合并为一个故事,比如“……,可以对故事进行增删改查,……”。这样可以防止过于粗糙的功能描述阻碍用户价值的有效传达,也利于合理计算用户故事的数量。

 

MVC与用户故事

 

第二个是MVC中对Controller和Action的定义。

Controller-Action树是另一个潜在的史诗-故事树的原型。

FPA和MVC居然能扯上关系?是的,上面提到的FPA中的内部逻辑文件,与MVC中的Controller有很好的对应(有的不能),而基本过程(输入输出查询)与MVC中Controller的Action有很好的对应关系。比如如果有一个“UserStoriesController”(UserStories可以看作ILF),就会有一堆Create / Edit / Delete / Index……这就是4个基本过程(从前面“增加一个用户故事”的例子可以看出,Create + [HttpPost]Create两者一起才组成一个完整的基本过程)。

基本过程对应Action还是好理解的,但为何对应内部逻辑文件的是Controller而非Model?因为Controller是面向用户写的,而Model是面向实现技术的。何以见得?因为如果要访问“增加一个用户故事”,我们会输入/UserStories/Create,而其中可能会用到几个Model:UserStories, Statuses, Priorities, Owners……用户无法直接访问Model,但可以直接访问Controller。所以MVC的Model更像是DataModel,而Controller才是BusinessModel(有时不是),是“一组逻辑上的数据,用户能够理解和识别它”。

 

使用MVC中的Controller-Action树作为史诗-故事树的颗粒度原型有以下几个好处:

Action是一类特殊的面向用户业务和价值的函数,还是客户可以直接感知并调用的函数;

Action的数量多,客户可感知的功能一般也就多(相对于一般函数);

Action是一类可单独演示、单独测试的函数,很适合作为故事使用;

Action很容易被程序员所理解,使用MVC的程序员更容易回答“你们的软件有多少真正的用户故事?”。

 

使用MVC中的Controller-Action树作为史诗-故事树的颗粒度原型,将作出以下约束:

多个过程不能合并到一个故事中(与前面FPA的观点相同),因为不能用一个Action实现“增删改查”。

Controller的Action将只包含有意义的用户故事。有些程序员为了调用方便,会在Controller里定义一些不期待用户直接调用的函数(尤其是直接定义在controller.cs中),应挪到Model中实现。

 

 

限制与风险

 

实际上在FPA中,文件与基本过程并非树形结构,一个基本过程完全可能访问多个文件;而在史诗-故事树中,很多故事其实也是跨史诗的;只有MVC强制Action必须属于一个Controller,不过“故事结构 Category-Story”到底应该放在CategoriesController中还是UserStoriesController中?这是一个两难的选择。

此外FPA中整体认为Options、Config这类内容均非要被“卖给”客户的功能,因此不计算内部文件;但在开发中,却需要为其设计Controller来完成工作,两者立足点不同,处理问题会有所差异。

就像明明分子-原子-中子-质子-电子就可以组成世界了,但上帝还是“额外”设计了几百种夸克一样,关于史诗-故事的正确结构应该如何,与增强、缺陷、技术债务、重构的有机关系应该如何,这些内容的合理展现形式应该如何,还需要同行们更多的讨论。

 

后语:殊途同归的各流派思想

 

FPA,大致产生于1970年左右,由IBM的开发人员为了处理银行业务而产生,其目的是以一种客户可以理解的方式来描述和计数产品功能或项目需求。

MVC,大致产生于????左右,由一些软件开发者为了改善软件结构而产生,其目的是通过分离客户业务与实现技术,增强在客户业务变化时软件的可重用性、可维护性。

敏捷开发,大致产生于1998年左右,由一群资深开发人员为了改善繁重的开发过程而产生,其目的是减少不体现客户价值的中间环节和文档,快速适应需求变更,追求客户价值最大化。

但最后居然大致归于:

 

内部文件 ≈ Controller ≈ 史诗

基本过程 ≈ Action ≈ 故事

 

世界是没有银弹的,为了不同的目的不同的人发明了不同的方法,也遗留下不同的悬而未决的问题,只有各种方法互相包容借鉴,才可能发明出更加完善的解决方案。

 

点击下载免费的敏捷开发教材:《火星人敏捷开发手册》

 

AI 代码赋能短视频带货:服装及多赛道批量内容生产全流程实操 本文聚焦 AI 技术在短视频带货领域的落地应用,以服装赛道为核心,延伸至花卉绿植、图书、茶具等热门领域,系统拆解 AI 工具在选品、素材处理、视频制作(含动态效果、场景搭建)、运营优化等环节的实操方法。针对从业者普遍面临的 “内容生产低效”“无专业技术难出优质视频”“流量运营踩坑” 等痛点,提供从基础工具使用到高阶视频制作的全流程技术方案,助力相关从业者借助 AI 实现批量、高效的短视频内容产出。 阅读详情

相关推荐

PCB之AD层次化原理图设计

PCB之AD层次化(模块化)原理图设计 软件版本:AD17.1.9(bBuild 592) 先上效果图: 可以看到,图中有RS485和W5500这两个部分是复用了原理图,当项目中需要多个功能相同的电路时,这种设计就可以大大节约PCB布局布线的时间,方法后面介绍; 1.首先确定好项目中个部分电路的功能模块 不同功能的电路分开不同原理图画,然后给出输入输出端口,这样方便复用,下面是实例项目的功能划分 2.单个模块电路的接口设计 这里以W5500以太网接口电路为例说明: 主要就分为通讯接口和电源接口:

洋洋洋的博客 3万+

关于用户故事

用户故事,User Story,这个词儿来自于敏捷方法Scrum。到底什么是用户故事,因为近期重拾Redo一些项目方面和产品方面的工作,来整理整理相关知识。用户故事与另外几个概念,如用户故事切分、用户故事地图、用例、场景,都有啥关联或关系呢。

taizans Blog 7730

用Plecs搞定半桥LLC谐振变换器仿真:从开环模型搭建到闭环PI调参全流程

本文详细介绍了使用Plecs仿真工具进行半桥LLC谐振变换器从开环模型搭建到闭环PI调参的全流程操作。涵盖仿真环境准备、关键元件参数计算、波形异常排查、闭环控制实现及PI参数整定等核心内容,特别针对仿真中的收敛性问题提供实用解决方案,助力电力电子设计者高效完成LLC变换器仿真验证。

weixin_28455801的博客 571

划分用户故事(user-story)的原则

在敏捷开发过程中是通过用户故事来将需求具体化成可以进行迭代开发的一个个现实的可见的开发任务。因此在敏捷软件的开发过程中,用户故事的划分对于迭代和开发起着举足轻重的作用。 用户故事从其名字来看是站在用户的角度所描述的故事,同时也是用户所能看懂的故事,开发人员最容易犯下的一个错误就是站在自己的角度去思考和划分故事,这样就背离了用户故事的初衷。 那什么是用户故事?首先来说用户故事是对需求的细

rxr1st的专栏 2万+

瑞芯微RK3588系统重装实战:从Windows到Linux的完整烧录指南

本文提供了一份详尽的瑞芯微RK3588开发板系统重装实战指南,涵盖从Windows到Linux双平台的完整烧录流程。针对RK3588芯片特性,详细解析了驱动安装、工具使用、固件烧录步骤及常见问题排错,旨在帮助开发者高效、安全地完成系统切换与部署,快速投入AI推理与边缘计算等应用开发。

weixin_29164185的博客 360

【STM32/GD32】Keil uVision生成bin文件:从编译选项到Bootloader升级实战

本文详细讲解了如何在Keil uVision中配置STM32/GD32工程,使其在编译后自动生成Bootloader升级所需的bin文件。通过解析fromelf工具的使用、构建后命令的配置以及内存布局规划,深入阐述了bin文件在固件升级中的核心作用,并提供了串口Bootloader的实战框架与常见问题解决方案。

weixin_29190169的博客 391

用户研究系列:用户故事地图解释

一般是在故事编写工作坊准备阶段,首先由PD提主导产出,主要有几点内容:1.产品的目标用户。2.解决了哪些问题。3.用户目标。4.产品目标。将这些内容记录在黑板上,与大家讨论达成共识,最终确定产品定义。简单来说,需要明确“我们为什么要做这个?”以及“用户为什么要用这个?”明确业务诉求和用户诉求为之后的设计提供了指导,不仅可以在接下来在讨论的过程中不易迷失方向,还可以避免陷入设计细节纠结。基于业务诉求和用户诉求其实就是为了不忘初心,是为了明确设计的初衷。

u010291330的博客 1419

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1898

敏捷教练----敏捷项目管理-史诗、故事、主题

https://www.atlassian.com/agile 5.4 史诗、故事、主题 假设你和你的团队想做一些雄心勃勃的事情,比如发射一枚火箭进入太空。要做到这一点,你需要组织你的工作:从最大的目标到最细微的细节。你会希望能够对变化做出反应,汇报你的进展,并坚持一个计划。史诗、故事、主题和计划正是您需要的工具。 通过了解这些流行的敏捷方法如何帮助组织工作,您的团队可以在结构、灵活性和向太空发射火箭之间取得健康的平衡。什么是故事,史诗,方案和主题? 故事,也称为“用户故...

charce_you的专栏 6848

windows 10 等保3级配置核查与加固(附自动化加固脚本)

关闭注册表编辑器,然后重新启动计算机。\\r\\n 对于OPC通讯站(server\\\\client),【密码最长存留期】需要设置为0,即密码不过期。‌445端口‌:修改注册表禁用。打开命令提示符,运行命令“gpedit.msc”打开组策略编辑器,浏览到路径“本地计算机策略\\\\计算机配置\\\\Windows设置\\\\安全设置\\\\本地策略\\\\安全选项”,在右边窗格中找到“Microsoft网络客户端:将未加密的密码发送到第三方SMB服务器”,双击,配置为“已禁用”,确定。

悦分享 160

Unity-RetargetPro3-动画插件试用

一个名气大于实战的插件。

大话程序员 711

用户故事地图,产品经理必须掌握的分析利器

用户故事是方便达成共识的一种沟通工具,用户故事包含3个要素:用户、功能、价值,写用户故事,应该遵循6个原则:独立的、可讨论的、有价值的、颗粒度小的、可估算的、可验证(测试)的。用户故事地图是由用户故事组成,通过用户故事地图,可以更好的分析需求、版本规划,做到既见树木又见森林,创建用户故事地图,分为四步:产品定义、梳理骨干、拆分故事、沟通确认。用户故事地图,是由用户故事组成的全景图,用户故事由活动和用户故事组成,活动是完成用户目标的核心步骤,用户故事是根据核心步骤拆分出来的小任务。3、第三步,拆分故事。

u010291330的博客 1401

(八)DDR_PHY架构及功能——(PUB组成、初始化及Training流程、Clock关系)

文章目录一、DDR_PHY结构组成1.1、DDR Memory子系统1.2、DDR_PHY架构组成1.3、PUB模块功能实现流程1.3.1、DDR系统初始化流程1.3.2、PLL初始化流程 一、DDR_PHY结构组成 1.1、DDR Memory子系统   Memory子系统主要由DDR Controller和DDR_PHY(含DDR_IO)两个部分组成。DDR Controller主要承担其它子系统(如CPU)与Memory子系统进行数据交互时的传输效率及调度,DDR_PHY主要负责数据交互过程中的传输速

Mr.翟的博客 1万+

敏捷开发用户故事系列之五:用户故事的分类

这是敏捷开发用户故事系列的第五篇。(栏目目录) 引子在之一、之二、之三中,我们曾经提到了“作为一个……可以……以便……”的用户故事描述方式,还提到应该如何描述用户故事,才能更好地反映客户价值。下面请尝试一下描述这两个故事:1. 如果把“保存按钮”统一放在页面上端而非下面,有些屏幕上侧控件的修改,就无需滚屏即可保存。2. 所有自定义字段,统一改为4000长度的nvarchar。第一个勉强可以写为:“

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 8680

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

《火星人开发纪实:敏捷开发一千零一夜》第四个月:用户故事的分类(上)...

介系嘛故戏 用户故事嘛谁还不知道,如果大家仔细看我们第一个月的截图,就能看到所有故事的描述都被预先置为模板“作为……,可以……,以便……”,就等着填入实际内容了,可是没想到,怪物来了。请看介几个都系嘛故戏: 1. 如果把“保存按钮”统一放在页面上端而非下面,有些屏幕上侧控件的修改,就无需滚屏即可保存。 2. 所有XX字段,统一改为4000长...

weixin_33795833的博客 148

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

敏捷开发中的PingCode实践:史诗-特性-用户故事-任务全流程管理指南

Epic是项目的愿景目标,通过Epic的落地达成,使公司可以获得相应的市场地位和回报,具有战略价值,通常需要数月完成。Epic的特征:战略导向: 直接关联公司的业务战略和年度目标大而复杂: 无法在单个Sprint中完成需要拆分: 必须分解为多个Feature才能执行长期跟踪: 跨越多个版本和迭代Feature是可以带来价值的产品功能和特性,相比Epic更具体更形象,客户可以感知,具有业务价值,通常需要数周和多个Sprint完成。Feature的特征:客户可感知: 客户能够直接体验和使用。

一个bug是bug,多个bug能work 2064

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

敏捷工具:用户故事地图梳理需求全景

文长:2770字时长:8分钟针对人群:用户体验设计师,业务分析师,产品经理,研发工程师1 概念什么是用户故事:迭代开发的一种工具代表了可开发的一个工作单元帮助我们跟踪一...

hailang2ll的专栏 3322

敏捷开发用户故事系列之六:用户故事的产生与组织结构

这是用户故事系列的第六篇。(之一,之二,之三,之四,之五,之六,之七,之八,之九)一条需求敢跳出来,基本上就能被化成一条用户故事,看完一二三四五,上山打老虎都不怕,这个似乎已经不太难了。难的是,项目或产品的第一天,给一张白纸:“请列出有哪些故事”。那个时候其实不是大脑空空,而是有千言万语就是说不出。前年做另外一件事情的时候偶然得到一种方法,去年到今年用在一个敏捷项目上,果然很舒服地列...

diaogan4202的博客 245
上一篇: 敏捷开发中的MoSCoW优先级排序方法
下一篇: asp.net免费网站三剑客:WebMatrix + MojoPortal + SQLCE
火星人陈勇
博客等级 码龄18年 4899粉丝 381原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值