详解敏捷过程中的需求管理

问题分析

在交流中,笔者了解到每家公司的情况:

  • 第一家企业在第一个迭代认领了15个故事,团队很容易就完成了;老板觉得以团队的能力可以做到每个迭代完成30个故事,于是后续每个迭代都希望团队认领30个故事,团队认领30个任务后,累死累活只能完成20左右的故事;
  • 第二家企业研发团队8人,每个迭代总有两个成员工作完不成:团队每天早会正常开,但是总感觉那两个成员整个迭代都在做那一两个故事,做的功能也没啥进展,有时候还做不完;
  • 第三家企业使用了一个新框架,近两个迭代团队按以往的速率进行任务认领,结果由于团队对框架不熟,每个迭代只完成了冲刺待办列表中一半的故事。

笔者结合交流结果及以往经验,对需求延期交付的原因进行了如下分析:

需求延期交付通常有两方面原因——团队主观原因以及客观原因。客观原因通常是由过程方面的阻塞造成的,比如团队需要购买一批云资源,公司规定资源采购需要老板最终审批签字方可实施,正巧赶上老板出差无法签字,导致工作卡在最终审批环节无法交付。

没有客观因素干扰,需求无法按时交付通常就是指团队手头工作在迭代结束前无法全部完成,这是主观原因。造成团队手头工作完不成的原因有很多,背景中提到的原因可概括为以下三种:

冲刺待办列表故事过多

冲刺待办列表是计划会议的输出之一,计划会议上团队根据团队速率认领故事,形成冲刺待办列表;如果团队速率被高估或者个别故事估值偏小,则冲刺待办列表中的故事点数相对团队真实速率就会偏多,最终导致工作过多,迭代结束时部分需求无法按时交付。

冲刺待办列表中故事过多还有一种可能:计划会议输出的冲刺待办列表是合理的,可是由于一些突发因素,产品负责人向迭代插入了新的任务,导致冲刺待办列表故事太多。

工作技术难度较高

项目使用了新的框架、语言、工具等,团队之前没接触过,需要一定时间去磨合,所以前期难免出现延迟交付。工作技术难度较高是相对于团队平均水平来说的,如果团队整体技能水平偏薄弱,比如都是团队成员都是刚入行的新人,普通研发工作相对这个团队来说都很困难,这种情况也很容易出现延迟交付。

个别员工工作完不成

团队某位成员请假了,原本计划完成的工作因为请假只做到一半,所以最后无法按时交付;另外如果团队成员没做到自组织,在项目中出工不出力,也容易导致迭代结束手头工作没有完成;最后如果团队成员工作遇到障碍被卡住,该成员不向团队暴露障碍,而是一直自己孤军奋战,也会导致需求延期交付。

除请假外,其他两种情况都可以通过敏捷的风险管控方法(如每日站会)避免发生,所以这种情况也可以总结为团队风险管控没有做好。

解决措施

针对分析中客观原因部分,团队可以通过建立Backup的形式进行避免。以采购为例,项目经理或老板秘书做老板的Backup,当老板由于自身原因无法亲自审批时,Backup可向老板汇报,征得老板同意后代替老板审批,避免流程方面的因素影响团队交付,也体现了敏捷宣言中的“个体与交互胜过流程与工具”。

针对团队主观原因部分,本文基于合理开展敏捷活动给出如下措施。

针对冲刺待办列表故事过多

冲刺待办列表故事过多的主要原因是高估团队速率,故事大小估算错误以及迭代中有新需求插入。针对这三种情况,给出如下解决方案:

合理估算团队速率,按照速率认领故事

团队速率是团队在迭代中认领多少故事的依据。

在敏捷转型初期,由于团队没有历史数据做参考,很容易估算错团队速率,导致冲刺待办列表中故事过多或过少——故事过多则可能导致延期交付;故事过少,则会浪费开发资源。如何估算团队速率呢?

确定开发团队每天在开发工作上投入的时间(刨除会议,接打电话,收发邮件等时间),将时间乘以迭代天数,即可得出迭代中团队用于开发冲刺任务的生产力。然后团队从产品待办列表中选择一系列故事,预估这些故事的完成时间和用于开发冲刺任务的生产力相近,然后统计这些故事的点数,即可估算出团队速率。起初估算结果可能不准确,但是通常团队对速率的估算会随着迭代进行而愈加准确。

举个例子:团队5个开发人员,其中三个人每天有6.5小时用来工作,其余二人每天有6小时可以工作,迭代两周(10 工作日),那么团队可工作的时间总和就是(6.5×3+6×2)×10=315。我们从产品待办列表中选择315小时左右的故事放入冲刺待办列表。冲刺待办列表详细信息如下(本文故事由华为云DevCloud进行管理):

由图可看出团队速率大概是33左右。也就是说,计划会议中团队从产品待办列表中选择30个故事点的故事放到冲刺待办列表,进行开发,团队有可能全部交付,而选择50个,则全部交付是有困难的。

根据团队速率认领故事,可以让团队量力而行,有效地减少延期交付。

正确估算故事大小

除了对团队速率估算错误,对故事大小估算错误也容易导致延迟交付,关于故事大小的估算方法可以参考【DevCloud · 敏捷智库】如何估算第二篇:利用核心概念解决估算常见问题

需求置换

敏捷迭代中由于时间盒和工作量都固定,如果有新需求加入迭代——比如生产环境突然发现一个之前没测出的Bug,需要修复,迭代工作量可能会超出团队生产力,导致延迟交付。

出现这种情况时,团队应该如何应对?

  • 首先团队需要向产品负责人确认新需求是否应纳入本轮迭代,做到需求来源唯一;
  • 当确定需求要做,产品负责人将新需求以用户故事形式放入冲刺待办列表中,然后和团队一起重新梳理冲刺待办列表;
  • 将工作量与新故事相近的低优先级故事移出本轮迭代,放回产品待办列表,以确保当前迭代团队工作总量不变,形成需求置换。

Tips

团队在计划会议领取任务时,不要领取的太满,最好预留一些缓冲时间,以便于应对突发情况。

如果产品负责人迫于领导或客户压力,不允许需求置换,只能向冲刺待办列表中硬塞故事,这时候应该怎么办呢?在敏捷中,Scrum Master作用之一是扮演团队的“保护伞”,让团队集中精力去完成迭代目标。如果产品负责人强制的向迭代中添加故事,Scrum Master可与对方沟通,弄清楚对方为什么向迭代中插入故事——之前整理故事有遗漏或者发现了以前未测出的Bug,还是对方不知道Scrum不建议向进行中的迭代插故事。如果是需求遗漏,应该在回顾会议上总结经验,日后避免;如果对方不了解Scrum,可以通过讲解Scrum相关知识,让对方理解为什么Scrum不建议向进行中的迭代加入新故事,以后避免这种情况发生。

加班也是一个应对突发问题的选择,但是研究表明短期加班会提高效率,长期加班团队成员会因休息不足,注意力不集中等原因降低效率。长期加班除了不利于团队建设之外,不定时的加班对团队速率也有很大影响,而敏捷提倡可持续发展,所以加班解决突发问题属下策。

针对工作技术难度较高

对于项目技术难度要求超出团队能力,成员无法估算工作量或无从下手导致项目交付延期的情况,可以利用“探针(Spike)”技术评估项目。

探针是一种敏捷实践。当遇到无法估算,或无从下手的故事时,团队可以从这个大故事中分割出一个小故事,然后对小故事进行开发,这个小故事就是探针。探针的开发完成时间可作为估算整个故事完成时间的依据,后续估算有了依据,就会准确很多,延迟交付的风险也会随之减少。

当然除了探针技术,团队成员的技术培训也是必不可少的——团队内技术分享或培训,可以提高团队整体技术水平,从而提高研发效率、减少特性延迟交付的风险。

针对个别员工工作完不成

每日站会是一个很好的风险管控工具。迭代中的每一天都可以看成是一个小迭代,每日站会通过保证小迭代正常运行,进而保证整个迭代的稳定进行。每日站会如果只汇报工作,通常会变得浮于形式,各种风险可能也无法被确认,最后导致每日站会发挥不了自身作用。认真开好每日站会可以预防延迟交付。

团队成员在每日站会“前一天做了什么”,“今天要做什么”的基础上,陈述工作详细情况以及具体进度,这样可以让团队的工作状态更加透明。从团队风险管控角度来看“我昨天用了5小时开发A功能,目前A功能开发了50%,今天预计再投入5小时,开发至80%”比“我昨天开发了A功能,今天要继续开发A功能”要好得多。

另外借用一些项目管理工具,可以更直观的看出员工的工作状态。以华为云DevCloud项目管理功能为例,在故事中,可以清楚地看到员工的实际工时和故事的完成度,便于了解和把控故事延迟交付的风险。

没做好风险管控会影响故事的按时交付,每日站会通过“我遇到什么风险”识别团队遇到的风险。遇到风险时,首先团队成员可以指定团队中某一成员,让其帮忙清楚风险;当然团队成员也可以主动帮忙清除风险。如果团队内没有人能够清除风险,这时候Scrum Master就应该发挥“清道夫”的作用,通过协调内部或外部资源来解决风险,帮助团队扫清障碍,以确保项目可以按时交付。

以上就是详解敏捷过程中的需求管理的详细内容,更多关于敏捷过程中的需求管理的资料请关注我们其它相关文章!

(0)

相关推荐

  • 详解软件系统稳定性的三大秘密

    何谓系统稳定性? 控制系统理论认为:系统受到某种干扰而偏离正常状态,当干扰消除,如果系统的扰动能逐渐收敛并最终恢复正常状态,则系统是稳定的:反之,系统偏离越来越大,则是不稳定的,所以,稳定性是系统抗干扰和返回平衡状态的能力. 对于经典的传递函数的软件系统,一般我们讲的稳定指的是BIBO稳定,即有界输入有界输出稳定.一个系统如果对任意有界输入得到有界输出,它就是BIBO稳定的.一句话,稳定的系统对于各种输入需要有符合预期的输出. 随着软件复杂性越来越高,稳定性的保障越来越难,随着服务规模越来越大,

  • 浅谈如何降低软件复杂性

    前言 在进行软件开发时,我们常常会追求软件的高可维护性,高可维护性意味着当有新需求来时,系统易扩展:当出现bug时,开发人员易定位.而当我们说一个系统的可维护性太差时,往往指的是该系统太过复杂,导致给系统增加新功能时容易出现bug,而出现bug之后又难以定位. 那么,软件的复杂性又是如何定义的呢? John Ousterhout给出的定义如下: Complexity is anything related to the structure of a software system that ma

  • 如何理解软件系统的高并发

    概述 当前,数字化在给企业带来业务创新,推动企业高速发展的同时,也给企业的IT软件系统带来了严峻的挑战.面对流量高峰,不同的企业是如何通过技术手段解决高并发难题的呢? 引言 软件系统有三个追求:高性能.高并发.高可用,俗称三高.三者既有区别也有联系,门门道道很多,全面讨论需要三天三夜,本篇讨论高并发. 高并发(High Concurrency).并发是操作系统领域的一个概念,指的是一段时间内多任务流交替执行的现象,后来这个概念被泛化,高并发用来指大流量.高请求的业务情景,比如春运抢票,电商双十一

  • 浅谈软件工程师的自我修养

    概述 "对于知识,要求知若渴:对于自己,要虚怀若谷."优秀的软件工程师一定是在软件开发的道路上前行者.自学是其成长的一个重要手段,在自学的过程中,我们是可以通过考试的方式来收敛思绪,督促自己学习,从而提高自己的基本素质.诚然,原则和模式是软件工程质量的基石.但技术是工具, 是为人服务的,而不是相反的.我们不能为了迎合某种技术而束手束脚,让自己特别难受.与此同时,要让自己的能力发挥到极致,良好的心境是必须要有的,因为软件工程中的一个核心因素是人的因素. 诚然,在软件开发过程中,我们不仅要

  • 详解敏捷过程中的需求管理

    问题分析 在交流中,笔者了解到每家公司的情况: 第一家企业在第一个迭代认领了15个故事,团队很容易就完成了:老板觉得以团队的能力可以做到每个迭代完成30个故事,于是后续每个迭代都希望团队认领30个故事,团队认领30个任务后,累死累活只能完成20左右的故事: 第二家企业研发团队8人,每个迭代总有两个成员工作完不成:团队每天早会正常开,但是总感觉那两个成员整个迭代都在做那一两个故事,做的功能也没啥进展,有时候还做不完: 第三家企业使用了一个新框架,近两个迭代团队按以往的速率进行任务认领,结果由于团队

  • 详解C语言中动态内存管理及柔性数组的使用

    目录 一.malloc 二.free 三.calloc 四.realloc 1.realloc在扩容时的情况 2.realloc也能实现malloc功能 五.使用动态内存的常见错误 1.free空指针 2.对动态开辟的空间越界访问 3.对非动态开辟内容free 4.只free动态开辟空间的一部分 5.对同一块内存多次free 6.动态内存空间忘记释放(内存泄漏) 六.柔性数组 1.柔性数组的概念 2.柔性数组的特点 3.柔性数组的使用场景 4.柔性数组的优点 一.malloc 这个函数向堆区申请

  • 详解ABP框架中的日志管理和设置管理的基本配置

    日志管理 Server side(服务器端) ASP.NET Boilerplate使用Castle Windsor's logging facility日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方便的处理各种特殊的日志库,而且当业务需要的时候,很容易替换日志组件. 译者注释:Castle是什么:Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到

  • 详解C语言中的动态内存管理

    目录 一.动态内存管理 1.1为什么要有动态内存管理 1.2动态内存介绍 1.3常见的动态内存错误 一.动态内存管理 1.1为什么要有动态内存管理 1.1.1  在c语言中我们普通的内存开辟是直接在栈上进行开辟的 int i = 20;//在栈空间上开辟四个字节 int arr[10]={0}; //在栈中连续开辟四十个字节 这样开辟的特点是: (1)他所开辟的空间是固定的 (2)数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配 但对于空间的需求,我们有的时候并不知道,有可能空间

  • 详解node.js中的npm和webpack配置方法

    概述 Node.js用c++语言编写而成的,是一个基于chrome V8引擎的javascript运行环境,让javaScript的运行脱离浏览器服务端,可以使用javaScript语言书写服务器端代码 1.使用node来实现一个http服务器 下面创建了一个端口为8787的服务器.他与php,java等不同,像php本地还要基于阿帕奇服务器,node.js能用代码快速搭建一个服务器. // 引入http模块 var http = require("http"); // 调用http的

  • 详解JAVA Spring 中的事件机制

    说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作.这些listener是怎么实现的呢?说listener之前,我们先从设计模式开始讲起. 观察者模式 观察者模式一般包含以下几个对象: Subject:被观察的对象.它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify().目标类可以是接口,也可以是抽象类或具体类. ConcreteSubject:具体的

  • 详解Go语言中关于包导入必学的 8 个知识点

    1. 单行导入与多行导入 在 Go 语言中,一个包可包含多个 .go 文件(这些文件必须得在同一级文件夹中),只要这些 .go 文件的头部都使用 package 关键字声明了同一个包. 导入包主要可分为两种方式: 单行导入 import "fmt" import "sync" 多行导入 import( "fmt" "sync" ) 如你所见,Go 语言中 导入的包,必须得用双引号包含,在这里吐槽一下. 2. 使用别名 在一些场

  • 详解C++11中的线程库

    目录 一.线程库的介绍 1.1. 使用时的注意点 1.2. 线程函数参数 1.3. join与detach 二.原子性操作库 2.1. atomic 2.2. 锁 三.使用lambda表达式创建多个线程 四.条件变量 一.线程库的介绍 在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差.C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念.要使用标

  • 详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持

    本文介绍了详解在WebStorm中添加Vue.js单文件组件的高亮及语法支持,分享给大家,具体如下: 一个小遗憾 能来看这篇文章的想必不用我来介绍vue是什么了.先让我们膜拜大神!vue项目的创建者尤大写了个sublime下语法高亮的插件,有人问他how about webstorm support?他是这么回答的.默哀一分钟. 添加高亮和语法支持 这个我是通过插件来实现的.网上目前有两个插件: 插件1:https://github.com/henjue/vue-for-idea 插件2:htt

  • jQuery position() 函数详解以及jQuery中position函数的应用

    position()函数用于返回当前匹配元素相对于其被定位的祖辈元素的偏移,也就是相对于被定位的祖辈元素的坐标.该函数只对可见元素有效. 所谓"被定位的元素",就是元素的CSS position属性值为absolute.relative或fixed(只要不是默认的static即可). 该函数返回一个坐标对象,该对象有一个left属性和top属性.属性值均为数字,它们都以像素(px)为单位. 与offset()不同的是:position()返回的是相对于被定位的祖辈元素的坐标,offse

随机推荐