DevOps落地笔记-03|用户故事:对用户需求达成共识的关键

上一讲主要跟你介绍了如何使用影响地图这个工具来进行产品定义、里程碑规划和用户需求分析。影响地图让我们始终以达到目标为核心,并让功能和需求不偏离该目标,从而让交付更有重点。可视化、结构化的思维导图为技术和业务人员创建了共享的整体视图,从而加强了彼此之间的协作。

那么,你有没有遇到这样的错乱情况?对于一个用户需求,产品、开发和测试对这个需求的理解完全不一样,最终交付的产品根本不是用户想要的,这种情况在实际开发中非常普遍。今天的课程内容就可以帮你解决这样的老大难问题。

今天介绍的用户故事也是一种将需求可视化的工具,它通过将需求拆分成一个一个的用户故事,来组织软件开发。每一个用户故事都是软件开发过程中相关角色沟通的媒介,所以用户故事也是一种通过合作沟通的方式来理解用户需求的工具。下面就让我们来开始吧。

软件开发是一项团体项目
我们都知道,软件是由一个又一个的功能组成的,而每个功能又都经历了从需求分析,到代码开发,到测试,到部署的整个开发流程。

在整个开发流程中,功能就像篮球比赛中的篮球一样,从一个队员(角色)的手里传递到下一个队员(角色)的手里,最后交给队伍里位置最好或投篮最准的队员(角色)投入篮筐。这个球在每次进攻的过程中,不管是控球后卫从后场带球到前场,中锋从篮板上抢球下来,得分后卫三分线的一处跳投…每个队员的共同目标就是将球投入篮筐。

回到软件开发这个流程里,功能从需求开始流经整个软件开发过程,其中会涉及多种角色,产品经理对功能的需求分析,开发人员对功能的代码实现,测试人员对功能的功能测试,最后运维人员将功能部署到生产环境交付给用户…同样,每个领域的人员都有一个共同的目标:最终将功能交付给用户。

团队协作是个老生常谈的话题,但真正做到高效协作并非易事。在软件开发流程中涉及的各个人员,都有自己的工作规范,语言和节奏也各不相同。同时,软件开发中的功能与篮球不同,看不见摸不着,当功能在每个角色之间流转时,是将自己领域的产出交付下一个角色,产品经理交付开发功能需求,开发交付测试代码,测试交付运维是的制品。由于交付物不同,增加了彼此之间沟通协调的难度。

因此,我们需要一种能够让大家达成共识的方法。这就需要让软件开发过程中的每个角色都能理解用户的需求是什么,工作内容是什么。比如:产品经理提出“”下订单时,送货地址从地址簿里选择“”的需求,产品经理、开发人员、测试人员三者对这个需求的理解是不一样的。地址簿是下拉列表显示还是弹窗?这个隐含的需求决定了开发人员如何编写代码,测试人员如何编写测试用例。所以只有达成共识了,才能保证大家的工作方向是一致的。

共享文档并不代表达成共识
写文档,其实是软件开发过程中的通用动作,但是我先介绍一下写文档存在的问题。在传统开发模式中,产品经理通过先写一份用户需求说明书,然后传给开发、测试等相关人员,并期望他们能够按照这个文档去开发、测试,最终实现用户需求,但最终交付的软件常常并不能达到用户需求。

事实上,人们习惯性地根据经验见识在文档范围内去思考,难免对内容理解不到位,造成误解。比如,还是上面的例子,产品经理想说的是“送货地址从地址簿里选择”,而开发就认为下拉列表的形式也是满足要求的,但用户可能需要一个弹窗的形式。很明显,文档并不能让人们彼此之间达成共识。

这是2018年我在广州塔上拍的一张照片,鸟瞰广州夜景。当你看到这张照片时,你可能会说:“广州夜景好美啊”,但是当我看到这张照片的时候,我会回想起当天晚上人山人海排队上广州塔的情景,回想起女儿为了快点上去不耐烦的情景,回想起一边排队一边和朋友聊天的情景。当到了塔顶,坐到缆车里,整个广州,尽收眼底,非常漂亮。

看文档,就像看旅游时拍的照片一样。当我们在看文档时,重要的并不是文档里记录的内容,而是当我们阅读文档时,脑子里能够回忆起什么。所以只有面对基于讨论写出的文档,参与讨论的各方才能对文档有一致的理解。没有参与讨论的人,是无法通过仅阅读文档来了解这些细节的。

因此,达成共识的唯一方法是各相关方坐到一起,用有效的方式进行讨论,最终寻求一致的理解。这种有效的方式就是讲用户故事。

用户故事之所以叫“故事”,是因为它是用来“讲”,而不是用来“写”的。它从用户的角度来讲述如何使用软件的功能,带来怎样的收益。整个软件团队通过讲用户故事,让大家获得对软件产品的一致理解,然后共同创造出更符合用户需求的产品。

如何“讲”好用户故事
有很多人并不清楚什么是用户故事。

用户故事的概念比较抽象。我举个例子,用户说:“当我在输入‘送货地址’的时候,能立即显示出目前存在的地址。这样就可以从列表中选择一个,而不是每次都需要重新输入。”这是一个典型的用户使用场景,是一个用户故事。

就像上面提到的,用户故事是用来“讲”的,而不只是“写”的。上面的例子中,如果这个不讨论用户故事,你能知道【立即显示】是输入 1 个字、 2 个字,还是有光标就能显示呢?因此,“讲故事”是本课时的核心观点,用户故事的关键就是“讲”。那么,怎样才能“讲”好用户故事呢?

聚焦全景
我们都知道,软件开发最终交付给用户的是一个可以工作的软件,这就需要先实现一个一个单独的功能。因此,我们需要将一个大需求进行合理拆分,拆分后的需求就称为“用户故事”。

我们可以通过拆分用户故事的方式来组织开发产品,每个用户故事完成后,都需要与整个软件进行集成。不过值得提醒注意的是,当我们在将大需求拆解为用户故事,或者在讨论单个用户故事时,都需要从整体的视角出发,和团队一起理解正在开发的产品,共同讨论每个故事在整个产品中的定位、优先级、共同权衡和取舍。杰夫·巴顿(Jeff Patton)将这种做事的方法称为“用户故事地图”。

马丁·福勒(Martin Fowler)在给杰夫·巴顿(Jeff Patton)的《用户故事地图》一书作序时说:“故事地图是一门在需求拆分过程中保持全景图的技术。”全景图为一致的用户体验提供了基准,可以帮助团队之间,以及团队与用户之间进行有效的沟通。下图是百度效率云产品中用户故事地图功能的示例图。
在这里插入图片描述
在该用户故事地图的顶部是主干。主干通常分两级:

& 一级是组成该产品的基本骨架,如图中的用户场景层级,包含账号管理、产品首页、商品列表页等;

& 另一级是每个用户场景下包含的用户任务层级,如产品首页场景,包含首页轮播图、产品橱窗、产品搜索等。

从左到右看,整个用户故事地图的主干是一个所有用户和他们使用该软件产品的完整故事。从左到右的顺序,也是我们在讲故事时候的叙事主线,更容易被接受和理解。

再往下是具体的产品发布路线图,是团队根据市场需求和用户要求综合考虑后,决定要发布的用户故事。每个用户任务下的用户故事按照从上到下的顺序排列优先级。通常,选择那些对用户价值较大的用户故事进行发布。

有了这个用户故事全景图,团队中的每个角色都能清晰地知道本次迭代中需要交付的用户故事内容,用户是如何使用的,以及产品能够给用户带来什么帮助。有了对用户故事的一致理解,后续大家在交付每个用户故事的过程中就有了统一的目标,不容易产生误解。

3C 原则
上面我们说到讲用户故事要基于全景视图,但这样并不能表示能讲好用户故事,因此下面为你介绍 3C 原则。

3C 原则是在由 Ron Jeffries(罗恩·杰弗里斯) 等人在《极限编程实施》一书中提出的。3C 原则描述的是为了更有效的使用用户故事进行需求分析时应该遵循的原则:

& 卡片(Card):在卡片上写下所期望的软件特性。

& 交谈(Conversation):聚在一起对要开发的软件进行深入讨论。

& 确认(Confirmation):对完成的特性进行确认。

1. 卡片(Card)

卡片是用户故事的载体,用来记录用户想要的每一个产品特性,上图中的每一个用户故事卡片都对此有所体现。

通过这种方式,可以很容易地组织这些卡片,比如通过拖拽的方式选择本次迭代需要交付的用户故事,排列用户故事的优先级等。

2. 交谈(Conversation)

创建好卡片后,我们并不是直接将卡片甩给团队中的其他角色。而是请相关人员围绕卡片中的用户故事进行讨论。在讨论过程中:

& 每个参与者都可以通过提问来表达自己的疑惑,其他参与者则可以帮助解答。如果在某个问题上有分歧,则所有参与人员共同讨论决定。

& 除了使用创建好的卡片之外,还可以借助像思维导图、流程图、原型图等有助于理解的可视化工具,避免参与人员通过手势对着空气挥舞。

& 讨论中所涉及的问题都需要进行标记、并在事后进行修正整理。

总之,交谈的目的是让所有参与者对用户故事达成一致的理解,并一起努力找到解决问题的最佳方案。就像看到旅行照片一样,团队成员当看到这张卡片时就能回忆起当时讨论的细节。

3. 确认(Confirmation)

现在,团队成员已经对用户故事达成了一致,这时就需要考虑如何判断这个用户故事是否已经完成开发,也就是明确验收条件。

一般情况下,当开发完成后需要通过单元测试、SIT 测试、UAT 测试,通过测试后该用户故事才算完成。剩下的就是根据业务需要随时发布该功能到生产环境中,完成最终的用户交付。

使用故事模板
现在你了解了讲好用户故事需要注意的几个方面,但作为软件从业人员来说,这还不够。相对于产品和市场人员来说,很多开发人员不知道如何去讲用户故事,也不习惯讲用户故事。这时,你需要使用用户故事模板,这样就能够对卡片上的内容有一个指引,方便讨论。如下图所示:
在这里插入图片描述
也就是说,大家在创建卡片的时候主要考虑这几个问题:用户是谁?用户需要什么特性?用户需要这个特性是要解决什么问题?

在讨论之前,如果不能回答这几个问题,就无法知道我们交付这个用户故事的价值,也就不清楚这件事的意义,就无法交付对用户真正有用的东西。

通过统一的故事模板,就是为了统一团队成员之间沟通交流的语言。而基于故事模板内容来引发讨论,能提升讨论的效果。

为了达到更好的讨论效果,这里罗列几个讨论清单:

& 讨论用户角色。 不要单纯地将所有使用软件的人抽象为“用户”,要更加具体,比如企业用户还是个人用户,个人用户又可以根据年龄、性别进行细分。每一个用户群体对软件的诉求是不一样的。

& 讨论要做的功能。 不要只讨论用户能够看得见摸得着的界面功能,也要考虑界面后所调用的后台服务,其他服务与服务之间的调用关系、服务调用时的鉴权功能等也需要考虑。因为这些才是软件可工作的基础。

& 讨论该功能的价值。 讨论为什么用户需要这个功能。提问也是一门艺术,可以通过 5 Why 提问法,多问几个为什么,就可以发现隐藏在背后的真正原因。

& 讨论异常情况。 讨论可能出现的异常情况,以及出现异常后的解决方案。

& 讨论开发周期。 讨论用户故事什么时间完成开发,什么时间完成测试,什么时间最终交付给用户…为这些时间点提供一个预估的计划表。

用户故事及用户故事地图,很多企业的研发团队中都有使用。就像开头提到的那样,软件开发是一个团队项目,在团队中沟通协调是至关重要的。

大多数时候,软件本身的功能并不复杂,但团队之间若因为沟通不到位,理解不一致,最终导致开发的产品与用户想要的不一样,可能会错过最佳的市场机会。这种因为疏忽,大意失荆州的事情是我们所有工作中都应该尽力去避免的。

总结

今天,我从团队协作入手,强调了高效沟通在软件开发中对于达成目标共识的重要作用,分析了单纯使用文档来达成团队共识的问题所在,并提出通过对用户需求的讨论才能真正达成团队的一致理解,从而引出了敏捷软件开发中使用的用户故事这个绝佳工具。

用户故事是一个强大的工具,这里主要强调如何“讲”好用户故事,并列举了“讲”好用户故事需要注意的事项和遵循的原则。如果你的团队也经常出现对用户需求理解不一致的情况,不妨试一试!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI视野·今日Robot 机器人论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 15 Jan 2024 Totally 14 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Learning Joint Space Reference Manifold for Reliable Physical Assistance Authors Amirreza Razmjoo, Tilen Brecelj, Kri…

VUE3+elementPlus 之 Form表单校验器 之 字符长度校验

需求:校验字符长度,超过后仍可输入,error提示录入字符数与限制字符数 校验字符长度: /*** 检验文字输入区的长度* param {*} rule 输入框的rule 对象,field:字段名称* param {*} value …

【京东云新品发布月刊】2024年1月产品动态来啦

1)【莫奈可视化平台】新品上线 京东莫奈可视化平台通过自由拖拽、图形化编辑、所见即所得的方式,快速实现极致酷炫、直观清晰的视觉场景,将海量繁杂数据背后所蕴含的价值更直观、深层、全面的展现出来,辅助决策者合理决策。 2&a…

【Oracle云】OCI DevOps Services 构建自动化流水线 (1) - 基础架构流程 OCI 代码仓库使用

OCI DevOps Services 是 Oracle Cloud Infrastructure (OCI) 提供的一项独立的 CI/CD 服务,旨在支持用户构建自动化的流水线,实现更高效、可靠的软件交付。在本系列的第一篇文章中,我们将深入探讨 OCI DevOps Services 的基础架构流程&#x…

基于MATLAB实现的OFDM仿真调制解调,BPSK、QPSK、4QAM、16QAM、32QAM,加性高斯白噪声信道、TDL瑞利衰落信道

基于MATLAB实现的OFDM仿真调制解调,BPSK、QPSK、4QAM、16QAM、32QAM,加性高斯白噪声信道、TDL瑞利衰落信道 相关链接 OFDM中的帧(frame)、符号(symbol)、子载波(subcarriers)、导频…

JVM工作原理与实战(三十一):诊断内存泄漏的原因

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、诊断原因 二、MAT内存泄漏检测的原理 总结 前言 JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线…

网络异常案例五_SYN被丢弃

问题现象 公司同事使用的时候,反馈系统不稳定,访问的时候,有时候会出现白屏(连接超时),或者系统页面点击没有响应,过一会之后刷新系统又可以正常展示了。之前未收到过类似反馈,一直…

༺༽༾ཊ—Unity之-02-抽象工厂模式—ཏ༿༼༻

首先创建一个项目, 在这个初始界面我们需要做一些准备工作, 建基础通用文件夹, 创建一个Plane 重置后 缩放100倍 加一个颜色, 任务:使用 抽象工厂模式 创建 人物与宠物 模型, 首先资源商店下载 人物与宠物…

huggingface打不开,解决方法

解决方法 将 https://huggingface.co/hustvl/Vim-tiny替换成 https://hf-mirror.com/hustvl/Vim-tiny文章目录 解决方法摘要YoloV8改进策略:基于分层注意力的FasterViT,让YoloV8实现性能的飞跃YoloV8改进策略:InceptionNext主干替换YoloV8…

第九节HarmonyOS 常用基础组件21-ImageAnimator

1、描述 提供帧动画组件来实现逐帧播放图片的能力&#xff0c;可以配置需要播放的图片列表&#xff0c;每张图片可以配置时长。 2、接口 ImageAnimator() 3、属性 参数名 参数类型 描述 images Array<ImageFrameInfo> 设置图片帧信息集合&#xff0c;每一帧的帧…

【零基础学习CAPL】——CAN报文的发送(按下按钮同时周期性发送)

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.CAPL实现4.1.函数展示4.2.全量报文展示5.效果1.概述 本章主要介绍使用CAPL和Panel在按下按钮时发送周期性CAN报文。 本章主要在“【零基础学习CAPL】——CAN报文的发送(配合P…

二叉树-堆应用(1)

目录 堆排序 整体思路 代码实现 Q1建大堆/小堆 Q2数据个数和下标 TopK问题 整体思路 代码实现 Q1造数据CreateData Q2建大堆/小堆 建堆的两种方法这里会用到前面的向上/向下调整/交换函数。向上调整&向下调整算法-CSDN博客 堆排序 整体思路 建堆&#xff08;直…

android远程投屏应用

客户端app地址&#xff1a;https://gitee.com/youzilzk/blue1.git 服务端地址&#xff1a;https://gitee.com/youzilzk/blue-server1.git 一。服务端部署 1.安装postgres 2.导入项目下blue.sql文件 3.修改配置application.properties和config.properties&#xff0c;其中applic…

Flask框架开发学习笔记《6》前后端不分离基础框架

Flask框架开发学习笔记《6》前后端不分离基础框架 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 主要包含如下文件&#xff1a; static 目录中存储了图片templates 目录中存储了 html 文件utils.py 包含了 log 函数server.p…

人工智能福利站,初识人工智能,机器学习,第三课

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

备战蓝桥杯---数据结构与STL应用(优先队列的小细节)

很显然&#xff0c;我们先二分求X,对于验证&#xff0c;一开始我先想的是直接求每个的不足电量再除充电量后向上取整&#xff0c;然后判断与k的大小关系。事实上&#xff0c;如果让k很大&#xff0c;若有两只手机在下一刻多没电&#xff0c;显然上述方法得出的结论是错误的&…

Java的常见api以及异常情况-1

目录 1、什么是API &#xff1f; 2、Object类 3、equals方法 4、内存中的比较方法 5、instanceof 关键字 1、什么是API &#xff1f; 1.API(Application ProgrammingInterface,应用程序编程接口)2.Java中的API 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将…

前端JavaScript篇之实现一个将多维数组展示的方法有哪些,分别是?

目录 实现一个将多维数组展示的方法有哪些&#xff0c;分别是&#xff1f;方法一&#xff1a;递归展开成一维数组方法二&#xff1a;嵌套展示结构方法三&#xff1a;ES6新增的数组扩展方法 flat()方法四&#xff1a;apply() 结合 concat() 使用以展开成一维数组方法五&#xff…

快速排序|超详细讲解|入门深入学习排序算法

快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是&#xff1a;选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据都比另外一部分的所有数据都要小。然后&#xff0c;再按此方法对这两部分数据分别进…

低密度奇偶校验码LDPC(五)——译码算法概述

一、译码算法概述 二、置信传播原理 Bayesian点兵问题 Turbo原理