用户故事地图(User Story Mapping)之初体验
北京这几日的天儿真是好的出奇,白天风和日丽,晚上繁星漫天;在这样一个周六的下午,小编参加了一次北京敏捷社区(微信号:Agile1001)组织的活动:《用户故事地图User Story Mapping 实战工坊》,虽然对用户故事地图是第一次接触,但也有一些小小的体会,回到家中是在按捺不住想写下来分享给大家。
今天的活动由《百度方法+》发起人,软件工程团队负责人李涛引领大家进行实战体验,他也是《用户故事地图》这本书中文版的译者。
《用户故事地图》这本书的原作者 Jeff Patton 是一位独立顾问,讲师和敏捷教练;他所提出的用户故事地图的方法主要用于解决敏捷需求分析过程中的问题:
– 只见树木不见林,重要的待办项容易淹没在各种细节中看不到全貌,因而难以排列优先级
– 不能明显地聚焦于用户需求
– 很难了解不同粒度故事(史诗故事、主题故事以及故事)之间的关系
– 不能方便地了解系统提供的功能的完整性
– 不能方便地了解系统提供的工作流以及价值流
– 不能方便地利用递增和迭代的方式去确定发布计划以及发布目标
小编之前使用敏捷方法带过几个项目,对这些问题深有体会。当我们开始进行一个产品或者项目规划的时候,首先需要梳理出一个backlog,在其中按照优先级列出所要实现的场景和具体功能。这时我们首先遇到的一个问题就是如何确保我们的backlog覆盖了最重要的用户体验路径,是否我们当前所规划的场景确实可以为用户提供价值?这点对于敏捷开发非常重要。对精益有一定了解的朋友一定知道MVP(Most Variable Product 最小化可用产品)的概念,MVP的目的是以最小的投入发布对用户有价值的产品,帮助我们快速试错,并通过不停的迭代最终找到产品的正确方向。这个思路很好,但如何确认我们的backlog中的内容是那个“最小的”而且“可用”的产品却是件很困难的事情。我在和团队一起讨论初始产品需求的时候常常会因为大家的理解不同而花费大量的时间进行梳理,但却发现每次即便我们将结果用文档记录下来,大家仍然缺乏对产品的总体认识,这就是所说得“只见树木不见林”的状态 … … 因为,缺乏一种将用户故事可视化的方法。
用户故事可视化 – 起床故事
今天的实战工坊中最精彩的部分就是团队演练,李老师首先对用户故事地图的结构进行了简单介绍,然后要求我们分组讨论一个最简单的场景:早上起床出门。以下就是我和小伙伴们整理的第一个用户故事地图:
每个人都非常熟悉这个场景,但是当我们开始讨论的时候,2个问题开始浮现
– 每个人习惯不同,如何统一我们的故事?
– 从起床到出门要经历几个不同的阶段,到底应该如何确定阶段?
第一个问题其实是“用户故事”要解决的首要问题,这个场景的角色(Persona)是谁?第二个问题其实就是确认需求的粒度过程。
在敏捷需求分析过程中,对Persona的确认非常关键,如何统一大家的思路并让大家可以在讨论某个场景的时候可以聚焦到特定的Persona上是我之前经常遇到的问题。讨论中经常会跑偏,本来谈这个Persona,结果跑到另外一个Persona上去了。今天讨论中,我们首先将Persona的定义通过卡片贴在了时间线的左侧,这个很小的动作,却让团队的成员可以非常专注于当前Persona的场景讨论,效率很高。
再说说粒度,以前经常有人问我backog item的粒度如何确定,而我的回答经常是从实现的角度来考虑,比如:控制在2-3天的工作量上。其实这是个非常不靠谱的建议,因为在讨论需求的过程中还无法确认是否要做,更谈不上评估工作量。
这里暴露了Scrum的一个最主要的问题,backlog解决的是在story确认以后如何进行开发过程规划的问题,而对story该如何产生,如何设计的问题并没有给出很好的解决办法。我们往往把story当成需求来看,而实际上敏捷使用story来描述需求的目的是为了协助团队进行讨论,以便最终确认需求(也就是specification)。用户故事地图的作用就是将user story的简单描述:
As a …. I want to … so that …
用可视化的方式展现在团队面前,让团队可以仔细梳理,讨论,确认这个story包含的内容,最终产出specification进行开发。
用户故事地图的结构
– 每个用户故事地图代表一个完整的用户故事
– 地图的核心是一条从左到右的时间线
– 时间线的上部放置最大粒度的内容(可以理解为Epic)
– 时间线的下部的第一行放置二级粒度内容(可以理解为backlog item),并在每个一级粒度下按照从左到右的优先级进行放置
– 每个二级粒度内容的下面,自上而下放置三级粒度内容(可以理解为task)
最终我们绘制出来一个完整的端到端的用户故事。今天的“起床故事”体验中感受最强烈的是:大家专注,目标明确,讨论完成的故事非常完整。
用户故事地图如何衔接开发计划
因为有时间线和卡片放置方式的约束,可以很容易的划分出每个Release所需要完成的需求,如下图:
自上而下,我们可以划分出不同的Release;同时因为每个Release都是和时间线平行的,确保了在放入Release的过程中必须考虑故事的完整性。
小结
今天下午短短的4个小时,对用户故事地图只能说有了一个非常肤浅的了解;个人觉得这是一个非常简单易行的方法,确实能够解决敏捷需求分析/设计阶段的问题。而这,恰恰是Scrum中所缺失的部分。
小编也很喜欢实战工坊的组织形式,很感谢北京敏捷社区的组织者们,这才是用敏捷的方式学习敏捷!
这里也附上北京敏捷社区2016年活动预告,感兴趣的同学自己扫码关注吧。
附上几张照片,让大家也体会一下现场的火爆:
小编在现场也忍不住体验了一把产品经理, 一个字:爽!
推荐这本书大家,封面上这行字道出了用户故事地图的真谛 “洞察真需求,研磨好产品”。不过,此书还未正式出版(应该很快了),大家先不要急着去搜,今天小编在现场也是第一次见到“毛(坯)书”,只可惜没有抢到。索性定了英文原著,待我仔细研读后再和大家分享。
请关注微信公众号 devopshub,获取更多关于DevOps研发运维一体化的信息
用户故事地图(User Story Mapping)之初体验的更多相关文章
- 创建用户故事地图(User Story Mapping)的8个步骤
[小编]上周六了解了用户故事地图后,小编又查阅了一些资料,找到了以下这篇关于如何组织用户故事地图规划的文章,分享给大家.也希望大家如果有好的实践,也可以留言一起交流. 原文地址:http://winn ...
- oreilly 用户故事地图
这本书是完全买亏了,一点作用也没有. 整篇有用的字很少,还花了我¥16,总结如下: 用户故事模板: 作为用户角色(who),我想要某项功能(what),这样我可以 XXX(原因,why)
- UDAD 用户故事驱动的敏捷开发 – 演讲实录
敏捷发展到今天已经在软件行业得到了广泛认可,但大多数敏捷方法都是为了解决某一特定问题而总结出来的特定方法或实践,一直缺乏一个可以将整个开发过程串接起来的成体系的方法.用户故事驱动的敏捷开发(User ...
- 用户故事驱动的敏捷开发 – 2. 创建backlog
本系列的第一篇[用户故事驱动的敏捷开发 – 1. 规划篇]跟大家分享了如何使用用户故事来帮助团队创建需求的过程,在这一篇中,我们来看看如何使用这些用户故事和功能点形成产品backlog.产品backl ...
- 使用Leangoo玩转故事地图
转自:https://www.leangoo.com/9944.html 用户故事是在敏捷开发中表达需求的主要方式,我们在做敏捷开发的时候都有需求池的概念,在Scrum中这个需求池就是产品backlo ...
- 《Swell数学》用户故事
一.用户故事基础知识: 1. 从用户的角度来描述用户渴望得到的功能. 2. 用户故事是描述对用户有价值的功能,好的用户故事应该包括角色.功能和商业价值三个要素. 3. 一个用户故事只是以客户能够明白的 ...
- (l老陈-小石头)典型用户、用户故事、用例图
一.典型用户 老陈 小石头 二.用户故事 老陈:作为一个家长,我希望能利用软件在电脑上储存一些数学题目,以便在繁忙的工作中也能帮助到孩子提高数学. 小石头:作为一个小学二年级的小学生,我希望能利用软件 ...
- 用户故事(User Story)
摘要: 一件用户通过系统完成他一个有价值的目标(买一罐饮料)的事.这样的过程就叫“用户案例(user case)”或者“用户故事(user story)”.本文描述了敏捷开发的技巧:如何以用户故事管理 ...
- 专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现
专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现 专访OPPO李紫贵:ColorOS用户过千万 软硬融合生态版图初现
随机推荐
- 127.0.0.1\SQLEXPRESS连接异常
当你的数据库为SQLEXPRESS时,在程序的数据库连接字符串的服务Server使用127.0.0.1\SQLEXPRESS时,如下: 它会显示一异常: Server Error in '/' App ...
- 局部(或全局)设置<a>标签的target属性
对于超链接<a>标签,target属性的设置是比较关键的,在不同的用户场景下选用适合的新页面载入方式,可以大大的提高访客的体验感.我们一般对target的设置可以挨个来,但 ...
- 在使用vs2012中的MVC4出的错误!类型“System.Data.Entity.DbContext”在未被引用的程序集中定义
理解决方案的nuget程序包2.选中已安装的包,找到EntityFramework,点击管理 由于我是在Taobao_DAL中用到了EF的“数据上下文对象”,他报错了.所以我们要选中它,将EF5.0安 ...
- 炉石传说 C# 开发笔记 (源代码整理公开)
源代码已经整理过了,去除了不需要的项目. 注意:以前文章中出现过的Git已经变更过了,请以前关注过,Fork过的朋友,重新Fork一下. GitHub地址 卡牌XML文件的做成:(Git上面是没有XM ...
- SqlServer中的自增的ID的最后的值:
SqlServer中的自增的ID的最后的值: SELECT SCOPE_IDENTITY() --返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.SELECT @@I ...
- mysql,命令导入\导出表结构或数据
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看: mysqldump 最常用的: mysqldump -uroot -pmysql databasefo ...
- Hack语言的类型系统
基础类型 PHP中主要的基础类型可以在Hack中进行显式类型标注.包含: bool int float string array resource <?hh namespace Hack\Use ...
- Java主要知识结构
Java基础(建议看java编程规范): Java语言基础:数据类型,命名规则,权限控制符,注释 操作符:算术操作符,逻辑操作符,关系操作符,移位操作符,按位操作符 流程控制 数组 字符串 Java高 ...
- python验证登录
一个web2.0时代的网站,自然少不了用户注册,登录,验证的功能,那么python可以怎样实现登录验证呢 这里我们使用装饰器来做登录验证 网站构成 假设我们有这样一个网站,是一个类似与博客园这种多个用 ...
- Java经典实例:纪元秒和本地日期时间互换
Java版本:1.8开始 import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; /** ...