用户故事地图(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用户过千万 软硬融合生态版图初现
随机推荐
- DataTable转换为List<T>或者DataRow转换为T
这段时间开发ASP.NETMVC应用程序,从数据库获取数据之后,需要把记录转换为数据集在视图中显示.我们需要把DataTable转换为List<T>或者DataRow转换为T. 本篇中可以 ...
- 导出Excel文件(针对Dev)
文件类: using System;using System.Collections.Generic;using System.Linq;using System.Text;using System. ...
- Android Volley框架的使用(5)
6. 设置超时时间 可以为请求设置超时时间.最大重试次数.重试时间增长因子等.其中new DefaultRetryPolicy()的第一个参数是超时时间,第二个参数是最大重试次数.第三个参数是重试时间 ...
- IOS个人帐号推送证书创建
(IOS个人帐号推送证书制作所有步骤: 可以直接将产品推送证书和开发者推送证书一起制作到一个Identifier帐号下) 一. 首先需要创建一个id:有推送功能的(App ID Suffix)只有它才 ...
- HDU 5091---Beam Cannon(线段树+扫描线)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...
- MySQL配置文件mysql.ini参数详解、MySQL性能优化
my.ini(Linux系统下是my.cnf),当mysql服务器启动时它会读取这个文件,设置相关的运行环境参数. my.ini分为两块:Client Section和Server Section. ...
- SQL不同服务器数据库之间的数据操作整理(完整版)
---------------------------------------------------------------------------------- -- Author : htl25 ...
- 点击div全选中再点击取消全选div里面的文字
想做一个就是点击一个div然后实现的功能是div里面的文字都成选中状态,然后就可以利用浏览器的自带的复制功能,任意复制在哪里去了 在网上百度了一下 然后网上的答案感觉很大的范围 然后一些搜索 然后就锁 ...
- iOS上new Date出现Invalid Date的问题,
用angular的ngModel绑定time的时候,在安卓调试没问题,没想到在iOS上出现了NaN:NaN,后台丢过来的数据大概是这样的2016-03-08 20:14 然而问题就出在这个分隔符&qu ...
- 初试在线破解工具Hydra爆破3389服务器
hydra是一款全能的暴力破解工具,功能强大,几乎支持所有的协议,是著名黑客组织thc开发的. 在Kali Linux下已经是默认安装的,于是测试爆破一下自己的一台VM虚拟机服务器.hydra还支持G ...