最佳实践:敏捷需求管理——如何写好用户故事丨IDCF

丁仿,圣略咨询首席敏捷教练,研发效能(DevOps)工程师(中级)课程学员

在敏捷项目管理中,用户故事(User Stories)是需求管理的核心工具。本篇文章将从用户故事的基本概念、编写技巧、常见误区及最佳实践四个方面展开,为大家提供一份详尽的指南。

一、用户故事的基本概念

1.1 用户故事的定义

用户故事是一种简单且非正式的描述,用于捕捉产品需求,从用户的角度出发,明确用户希望实现的功能或解决的问题。通常,一个用户故事格式如下:

作为[用户角色],我希望[实现某个目标],以便[达到某个目的]。

1.2 用户故事的特点

  • 简单明了:用户故事应简短,易于理解,避免复杂的技术细节。

  • 用户导向:始终从用户的需求和视角出发。

  • 可讨论:用户故事的目的是引发团队讨论,以进一步细化需求。

  • 独立性:每个用户故事应尽可能独立,以便能够独立开发、测试和交付。

  • 可测试:每个用户故事应包含可验证的验收标准,以确定完成情况。

1.3 为什么要使用用户故事

1.3.1 促进沟通与协作

用户故事的简洁和用户导向性使得它们非常适合在团队中引发讨论和协作。通过用户故事,团队成员能够更好地理解用户需求,从而在开发过程中更好地合作,减少误解和沟通障碍。

1.3.2 提高灵活性

用户故事短小精悍,便于快速调整和迭代。这种灵活性使得团队能够更快地响应变化,不断优化和改进产品,确保最终交付的产品更符合用户需求。

1.3.3 聚焦用户价值

用户故事强调用户价值,每个用户故事都围绕用户希望实现的目标展开。这有助于团队在开发过程中始终关注用户需求,确保所开发的功能真正对用户有用。

1.4 用户故事与需求文档的区别

图片

1.4.1 表达方式

传统需求文档通常详尽而繁琐,包含大量的技术细节和业务逻辑。而用户故事则简洁明了,关注用户需求和用户价值,以便于团队理解和讨论。

1.4.2 适应性

传统需求文档往往在项目初期就固定下来,后续修改难度大。而用户故事具有高度的灵活性,可以在开发过程中不断调整和优化,更好地适应变化的需求。

1.4.3 目标导向

需求文档通常以系统功能和技术实现为导向,缺乏用户视角。而用户故事则始终从用户角度出发,确保开发的每个功能都对用户有价值。

1.4.4 沟通方式

需求文档通常需要花费大量时间阅读和理解,可能导致沟通不畅。而用户故事简单易懂,能够快速引发团队讨论,促进沟通和协作。

二、编写高质量用户故事的技巧

2.1 清晰定义用户角色

清晰定义用户角色是编写用户故事的第一步。了解用户的背景、需求和痛点,有助于编写更贴近实际的用户故事。可以通过创建用户角色画像(Persona)来深入理解用户。

例子:

  • 作为在线购物者,我希望在结账时看到商品的运费,以便了解总支付金额。

  • 作为内容管理员,我希望能够编辑和发布文章,以便保持网站内容的更新和质量。

2.2 采用INVEST原则

高质量的用户故事通常遵循INVEST原则:

  • Independent(独立的):用户故事应独立存在,不依赖其他故事。

  • Negotiable(可协商的):用户故事应简洁,不拘泥于细节,以便在讨论中进一步完善。

  • Valuable(有价值的):用户故事应对用户或业务有明确的价值。

  • Estimable(可估量的):用户故事应有足够的信息,使团队能够估算工作量。

  • Small(小型的):用户故事应足够小,以便在一个迭代中完成。

  • Testable(可测试的):用户故事应包含明确的验收标准,以验证完成情况。

例子:

作为客户,我希望能够搜索产品,以便快速找到我需要的商品。

  • Independent:搜索功能独立存在,不依赖其他功能。

  • Negotiable:搜索结果页面的布局可以在讨论中确定。

  • Valuable:用户能够快速找到所需商品,提高购物体验。

  • Estimable:开发团队能够估算出搜索功能的开发时间。

  • Small:搜索功能可以在一个迭代中完成。

  • Testable:测试用例包括搜索特定商品和检索正确结果。

2.3 引入验收标准

验收标准是用户故事的关键组成部分,它定义了用户故事完成的条件。验收标准应具体、可测量,以确保开发团队理解需求并能验证完成情况。

例子:

作为在线购物者,我希望在结账时看到商品的运费,以便了解总支付金额。

验收标准:

  • 用户能够在购物车页面看到每件商品的运费。

  • 用户能够在结账页面看到总运费。

  • 运费计算准确无误。

2.4 使用BDD(行为驱动开发)格式

行为驱动开发(BDD)提供了一种更结构化的用户故事编写方式,通过Given-When-Then格式,明确描述用户故事的场景、操作和预期结果。

例子:

作为在线购物者,我希望在结账时看到商品的运费,以便了解总支付金额。

验收标准:

Given 用户在购物车页面

When 用户点击结账按钮

Then 系统应显示商品的运费

2.5 定期审视和重构用户故事

用户故事并不是一成不变的。随着项目的进展和需求的变化,用户故事需要定期审视和重构,以保持其相关性和准确性。定期的需求审查会议是确保用户故事质量的有效方式。

例子:

一个初始用户故事可能是:

作为内容管理员,我希望能够编辑和发布文章,以便保持网站内容的更新和质量。

经过讨论和重构后,可能细化为多个小用户故事:

1. 作为内容管理员,我希望能够编辑文章标题和正文,以便修正内容错误。

2. 作为内容管理员,我希望能够添加和编辑文章标签,以便分类和检索文章。

3. 作为内容管理员,我希望能够将文章标记为发布或草稿,以便控制文章的发布状态。

三、常见误区及解决方案

3.1 用户故事过于详细

许多团队在编写用户故事时,倾向于将其写得过于详细,涵盖大量技术细节。这样会限制团队的灵活性和创造性。解决方案是保持用户故事简洁,详细信息可在讨论中补充。

例子:

过于详细的用户故事:

作为XX用户,我希望系统能够在数据库中存储我的订单信息,并在结账时从数据库中读取,以便确保订单数据的持久性。

改进后的用户故事:

作为XX用户,我希望系统能够保存我的订单信息,以便在结账时查看订单详情。

3.2 缺乏验收标准

没有验收标准的用户故事难以验证完成情况,容易导致需求偏差。解决方案是始终为每个用户故事定义明确的验收标准,确保其可测试性。

例子:

没有验收标准的用户故事:

作为用户,我希望能够搜索商品。

改进后的用户故事:

作为用户,我希望能够搜索商品,以便快速找到所需商品。

验收标准:

  • 用户在搜索栏输入关键词后能够看到相关商品列表。

  • 搜索结果包含商品名称、价格和缩略图。

  • 搜索结果准确匹配关键词。

3.3 用户故事过大

过大的用户故事难以在一个迭代中完成,容易导致延迟。解决方案是将大用户故事拆分为更小的、独立的用户故事,遵循“Small”原则。

例子:

过大的用户故事:

作为普通用户,我希望能够管理我的账户信息,包括更改密码、更新个人资料和查看订单历史。

改进后的用户故事:

1. 作为普通用户,我希望能够更改密码,以确保账户安全。

2. 作为普通用户,我希望能够更新个人资料,以保持信息准确。

3. 作为普通用户,我希望能够查看订单历史,以便追踪我的购买记录。

3.4 忽视用户价值

一些用户故事关注技术实现而忽视用户价值,导致产品不符合用户需求。解决方案是始终从用户角度出发,确保每个用户故事都能为用户或业务带来明确的价值。

例子:

关注技术实现的用户故事:

作为开发者,我希望系统能够使用MySQL数据库,以便实现数据存储。

改进后的用户故事:

作为用户,我希望系统能够保存我的订单信息,以便在结账时查看订单详情。

四、最佳实践

4.1 用户故事工作坊

组织用户故事工作坊是提升用户故事质量的有效方式。在工作坊中,产品负责人、开发团队、用户代表等共同参与,通过头脑风暴和讨论,明确需求和编写高质量的用户故事。

例子:

在一次用户故事工作坊中,团队讨论了在线购物平台的需求。通过头脑风暴和讨论,生成了多个用户故事:

1. 作为购物者,我希望能够通过分类浏览商品,以便快速找到感兴趣的商品。

2. 作为购物者,我希望能够添加商品到购物车,以便一次性购买多件商品。

3. 作为购物者,我希望能够查看商品评价,以便做出购买决策。

4.2 持续用户反馈

持续收集和分析用户反馈,有助于及时调整用户故事,确保其符合用户需求。可以通过用户访谈、调查问卷、用户测试等方式,获取第一手用户反馈。

例子:

通过用户访谈了解到用户在结账时常常忘记使用优惠券,团队据此增加了一个新用户故事:

作为购物者,我希望在结账时提醒我使用优惠券,以便节省费用。

4.3 使用工具和模板

利用敏捷管理工具和用户故事模板,有助于规范用户故事编写流程,提高效率。例如,某项目管软件提供了丰富的用户故事模板和插件,方便团队管理和追踪用户故事。

例子:

在软件中创建用户故事模板:

作为[用户角色],我希望[实现某个目标],以便[达到某个目的]。

验收标准:

- [条件1]

- [条件2]

- [条件3]

通过模板,团队能够快速创建和填充用户故事,提高工作效率。

4.4 设立用户故事验收会议

设立定期的用户故事验收会议,由团队共同审视和评估每个用户故事,确保其质量和可行性。这不仅能提高用户故事的质量,还能增强团队的协作和沟通。

例子:

在一次用户故事验收会议中,团队审视了以下用户故事:

作为购物者,我希望能够通过分类浏览商品,以便快速找到感兴趣的商品。

经过讨论,团队补充了以下验收标准:

验收标准:

  • 分类列表应显示在主页导航栏。

  • 用户点击分类后应看到相关商品列表。

  • 每个分类下至少显示20个商品。

4.5 与开发团队密切合作

用户故事不仅是产品负责人的工作,开发团队的参与同样重要。通过与开发团队密切合作,确保用户故事的可行性和实现路径。同时,开发团队的反馈也能帮助改进用户故事的编写。

例子:

在用户故事讨论会上,开发团队指出某些功能实现的技术难度较大,产品负责人据此调整了用户故事的优先级和实现方式:

原用户故事:

作为购物者,我希望能够在商品列表中看到实时库存,以便确认商品是否有货。

调整后用户故事:

作为购物者,我希望能够在商品详情页看到库存状态,以便确认商品是否有货。

通过调整,团队能够更高效地完成用户故事,满足用户需求。

结语

编写高质量的用户故事是敏捷需求管理中的重要一环。通过明确用户角色、遵循INVEST原则、引入验收标准、使用BDD格式、定期审视和重构用户故事,可以有效提升用户故事的质量,进而提高团队的工作效率和产品质量。同时,避免常见误区并采纳最佳实践,能够帮助团队更好地管理需求,满足用户的期望。希望本篇文章能为您在敏捷项目管理中提供有价值的指导和参考。

用户故事不仅是需求管理的工具,更是团队沟通和协作的桥梁。通过持续学习和实践,不断优化用户故事的编写方法,敏捷团队能够更好地响应变化,快速交付高质量产品,实现用户和业务价值的最大化。

参考书籍

  1. 《用户故事与敏捷方法》 Mike Cohn著

  2. 《Scrum精髓:敏捷转型指南》Kenneth Rubin 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复习之 java 锁

裁员在家,没有面试机会,整理整理面试知识点吧! 不得不知道的java 锁 Java 中,提供了两种方式来实现同步互斥访问(也就是锁):synchronized 和 Lock 多线程编程中,有可能会出现多个线…

期权中非常重要的行权!不懂行权先别交易!

今天带你了解期权中非常重要的行权!不懂行权先别交易!期权是金融市场中一种常见的衍生品工具,它给予持有者在特定时间内以特定价格购买或出售某个资产的权利。而“行权”是指期权持有者行使期权权利的行为。 期权行权是指期权持有者选择执行…

超网和无类间路由是什么?

​一、超网概述 超网是将多个连续的网络地址组合成一个增加的网络地址的技术。常用于减少路由器的路由表大小,网络的可扩展性。通过合并连续的子网,超网可以减少路由入侵的数量,从而提高网络的效率。 超网的实现基于合并多个具有连续IP地址…

java知识点详解——异常

当输入的数不是整数时 会报错 当输入的被除数为0时 会报错 在以前我们会使用if—else语句用来堵住漏洞,但是那样相当繁琐,很难穷举所有错误 Scanner in new Scanner(System.in); System.out.print("请输入被除数:"); int num1 in.nextInt(…

【Python快速入门和实践016】Python常用脚本-对视频抽取指定帧数并保存

一、功能介绍 这段代码的功能是从一个视频文件中抽取指定数量的帧,并将这些帧保存为图像文件。步骤如下: 设置路径和参数: video_path:视频文件的路径。image_folder:保存抽取图像的目录。num_frames_to_extract&#…

工业相机图像采集卡

什么是图像采集卡? 图像采集卡又称为图像卡,它将相机的图像视频信号,以帧为单位传送到计算机的内存和VGA帧存,供计算机处理,存储,显示和传输等使用。在机器视觉系统中,图像采集卡采集到的图像供…

【C语言】双链表

🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:C语言数据结构_小米里的大麦的博客-CSDN博客 🎁代码托管:黄灿灿/数据结构 (gitee.com) ⚙️操作环境:Visual Studio 2022 目录 一、什么是双链表? 二、双链表温习 1. 双链表的结构…

【Django开发】前后端分离django美多商城项目第2篇:展示用户注册页面,1. 创建用户模块子应用【附代码文档】

全套笔记资料代码移步: 前往gitee仓库查看 感兴趣的小伙伴可以自取哦~ 本教程的知识点为: 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计: 视图原型 2. 具体…

如何诱导AI犯罪-提示词注入

我们用到的大模型基本把政治类信息、犯罪相关信息都已屏蔽。但是,黑客依旧可以使用提示词诱导和提示词注入的方式对大模型进行攻击。 1、提示词诱导 如果直接让AI提供犯罪过程,AI会直接拒绝。虽然AI对于大部分知识了然于心,但因为经过了人工…

javase综合案例3 -- 通讯录

文章目录 一,项目要求基础功能拓展 二,导入jar包 pinyin4j.jar三,程序报下建立Pinyin4j类四,创建实体类Contact五,创建通讯录接口ContactDao六,创建ContactDao接口的视线子类ContactDaoImpl6.1 创建全局的M…

【Dash】Dash模块介绍

什么是Dash? Dash 是一个开源的 Python 框架,用于创建基于 Web 的应用程序。它由 Plotly 公司开发,专为数据科学家和分析师设计,以便他们可以构建自定义的数据可视化 Web 应用程序,而无需具备前端开发知识。Dash 提供…

NGINX项目实战

一、nginx四层代理 部署支持4层TCP/UDP代理的Nginx服务器 部署nginx服务器 编译安装必须要使用--with-stream参数开启4层代理模块。 [rootproxy ~]# rm -rf /usr/local/nginx/ #清理环境 [rootproxy nginx-1.16.1]# ./configure --with-http_ssl_module --with-stream #开…

Oracle特有的DECODE函数

Oracle中的DECODE函数是一种条件表达式函数,用于基于给定的条件从一组值中选择一个值返回。它的基本语法如下: DECODE(expression, search1, result1, [search2, result2, ...], [default])expression:要比较的表达式或列。searchN&#xff…

DDPM 核心代码解析(1)

所有代码 已上传至GitHub - duhanyue349/diffusion_model_learned_ddpm_main: 扩散模型基础框架源代码 目录结构如下 在train_cifar.py 中展示了扩散模型训练的所有代码 如果没有安装wandb 可以在create_argparser()设置 log_to_wandbFalse 一、加载模型参数 args 这里用了一…

直播圈不再只讲技术和千川,管理成为新焦点

直播圈不讲技术,也不讲千川啦,开始讲管理啦,感叹直播带货发展真快,都说要傻瓜化,讲的东西一年能迭代 3 个版本,甚至带货线下课不讲半天团队管理你的课都显得low。关键没一个能告诉你管理是什么管什么&#…

【1】CPU飙升到200%以上问题汇总

原链接 【1】CPU飙升到200%以上问题汇总 CPU飙升到200%以上是生成中常见的问题 注意: 1. linux的cpu使用频率是根据cpu个数和核数决定的 2. top,然后你按一下键盘的1,这就是单个核心的负载,不然是所有核心的负载相加,…

弹幕背后:B站UP主创作服务解析

引言 在B站,每一条飘过的弹幕都是一个故事的碎片,它们汇聚成一幅幅生动的社交画卷。这里,不仅仅是一个视频分享平台,弹幕背后更是一个充满活力的创作者生态系统。B站以其独特的弹幕文化,为创作者和观众之间搭建起了一座…

RxJava基础使用

Rx思想 事件从起点流向终点。 过程中可以对事件进行拦截,拦截时可以对事件进行处理,处理后将处理后的事件继续流向终点。 终点接收上一次处理后的事件。 获取网络图片并显示 基础实现 使用Observable.just(path) 创建图片路径的Observable。 使用m…

Unity | Shader基础知识(第二十集:应用-简易流光、LOD)

目录 一、前言 二、LOD 1.什么是LOD 2.代码如何调节LOD 三、流光 1.资源准备 2.uv移动 3.获取图片中的uv 4.改变uv去取流光的颜色(时间的应用) 5.图片叠加 6.透明图片的叠加 四、纯净代码 五、作者的碎碎念 一、前言 有小伙伴问&#xf…

Studying-代码随想录训练营day45| 115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

第45天,子序列part03,编辑距离💪(ง •_•)ง,编程语言:C 目录 115.不同的子序列 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 115.不同的子序列 文档讲解:代码随想录不同的子序列 视频讲…