交付有价值的产品,先澄清用户故事吧!

戚建辉
• 阅读 61

在当下,处于VUCA时代的我们也在面临着来自客户的易变、不确定、复杂化、模糊化的需求。这种多变的需求推动着我们要加强与客户的沟通交流,通过用户故事来澄清客户需求,帮助客户打造对他们来说有价值的产品。所以我们该怎样澄清用户故事呢?

一、谁来编写用户故事?

用户故事是由谁来写呢?一般情况下, 一定是最接近用户的角色来负责编写用户故事,这个角色一般情况下是客户或者产品负责人。通常客户写出来的需求也不能称为严格意义上的用户故事,这就需要产品负责人在与客户确认的基础上再加工,形成一个完整的用户故事。

如果在某个团队中,用户故事是由测试人员或开发人员编写的,那我们也同样需要明确这个用户故事是经过客户和产品负责人确认过的。同样,用户故事优先级的排序也是需要最贴近用户侧的人员来进行确定,如果研发团队自行决定用户故事的优先级,那么就有可能出现最先实现的用户故事有可能不是最重要的,而是最好实现的。

那如何编写用户故事呢?可以通过对用户的访谈、市场调查等方式来发掘用户需求,然后按照INVEST原则来合理编写用户故事。
交付有价值的产品,先澄清用户故事吧!
在这个阶段,我们要注意的一个事情是,为了达成敏捷团队的自组织,提高团队成员的积极性与参与感,我们可以不明确到底是谁来编写用户故事,而是让每一位团队成员都参与编写用户故事。这样的话能够激发团队成员的责任意识,减少成员之间的互相推诿。

二、什么时候使用用户故事?

用户故事明确了什么角色想要什么功能,以便于实现什么价值或目的。所以在每实现一个功能之前,我们要明确为什么要做这个功能以及怎样才能达成这个目的或价值

但需要注意的是,不是所有的任务都需要用用户故事来表达,比如团队的一些事务性的功能就可以以任务的形式而非用户故事的形式来表达,因为这类事项不能产生对客户有益的价值。对于能够直接对客户产生价值的需求,我们可以用用户故事来表达。

因此,我们要真正弄清楚真正面对用户的用户需求(用户反馈的Bug、撰写用户手册的需求、产品功能性需求等),我们通过用户故事来表达;而一些团队内部的改进问题(如进行结对编程、内部发现的代码规范、某一部分的代码重构等),我们可以用团队达成共识的表述方式来呈现。

用户是谁?

在做项目管理的时候,我们一定要与用户接触、沟通,了解用户的真实需求和实际的使用场景。在一般情况下,很多公司只有销售人员在接触客户,研发侧人员以及产品负责人等离客户非常远,那在这种情况下,团队很容易出现“闭门造车”的现象,最终交付的东西无法投入到实际应用环境中,也不是用户真正需要的。
交付有价值的产品,先澄清用户故事吧!
所以整个技术团队需要搞清楚用户是谁、用户在哪以及用户有什么需求这几个问题。而在这个时候,我们可以用用户画像、影响地图、用户故事地图、同理心地图、客户旅程地图等实践(这些实践可以在融·软件项目管理推荐库中进行了解)找出真正的用户,进行精准的需求获取。而针对一些中间件、微服务等,我们可以通过将这些中间件及微服务的上下游系统定义为系统用户,也能够比较轻松地编写出这些系统用户的用户故事。

四、用户故事规范

用户故事的规范其实也是一个常见问题,我们可以通过一个小视频来详细了解如何来编写用户故事:如何写好用户故事?

五、勿以唯故事点论

虽然我们在估算用户故事的时候会使用故事点估算,但过度地关注故事点也会让我们适得其反。

首先我们要明确的是故事点估算没有一个统一的标准,每个团队都可以根据自身的实际情况确定自己的基准故事点

这里有几个关键环节我们要注意:

  • 在实际完成某一迭代的时候,我们要关注这个迭代交付了多少功能,而不是完成了多少故事点;
  • 不要做团队与团队之间的故事点横向对比,因为两组并不是完全一样的条件,所以没法进行直观地对比;
  • 我们只用故事点来执行迭代计划,不应该将故事点与绩效管理挂钩。

六、定义“就绪”“完成”与“验收标准”

在用户故事被放入迭代计划之前,我们要确认用户故事的“就绪”状态。团队之间要就“就绪定义”达成共识,比如共同制定出一个检查列表,通过此检查列表的用户故事即为“就绪”,可以排进迭代计划中。同时,可以根据用户故事的类型来制定不同类型的用户故事“就绪定义”。

此外,还有一个关键点在于,“就绪定义”需要定期检查更新。既然明确了用户故事的“就绪”,那么我们也要明确用户故事的完成标准。如果我们对用户故事完成没有一个统一的标准,那么就会出现研发人员觉得写完代码就算完成了,而测试人员认为编码后自测、然后通过功能测试之后才算完成的情况,这种情况会大大增加沟通成本,降低工作效率。

所以团队需要给用户故事一个完成的定义,比如通过自测、功能测试、集成测试才能算用户故事的“完成”,也就是我们所说的“DoD”。

那用户故事完成了,它能达到用户的满意吗?这里就牵扯出了一个细节问题,团队制定的用户故事的“完成定义”只是确认了这个用户故事或这个功能做完了,但是并不能明确这个功能可以满足用户的需求。

那为了解决满足用户需求这一问题,我们可以设置用户故事的验收标准。验收标准的设置需要用户、产品负责人及团队一起来讨论完成,它能够满足最初的用户故事的内容。

也就是说,如果我们要做一个网站注册功能,最终做出来了一个通过邮箱号完成注册的功能,这个功能是通过自测、功能测试后明确完成了的功能,但是用户希望能够通过手机号直接注册,这个完成了的功能并未满足用户的需求。

那这样的话我们做出来的功能并不是用户所期望的,所以我们要通过验收标准来满足用户的期望。我们可以通过“Given/When/Then格式”来编写验收标准,举个例子:

用户故事是“作为一个没有在这个网站上注册的用户,我希望能够开发一个网站注册功能,以便于我能在网站上发表自己的言论。”

那么该用户故事的验收标准则是:

  • 场景:网站用户注册登录;
  • Given:鉴于我的角色是网站未注册用户;
  • When:当我点击网站右上角的“注册”按钮;
  • Then:系统就会弹出注册页面;
  • When:当我输入手机号,点击发送验证码,并填写收到的验证码,点击“注册”;
  • Then:系统显示登录成功。

在做用户故事实践的时候,我们经常会遇到一些问题,那本文其实给用户故事提供了一些“解题思路”,也希望大家在项目过程中能够正确、有效地使用用户故事实践,来推动项目成功。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Stella981 Stella981
4年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这