反对迭代0:停止拖延,开始迭代

很多项目都不会一开始就完全就绪——例如,需要分配人员和准备工作。为了处理这些项目开始前的任务,很多团队使用了“迭代0”的做法。虽然理解其由来,但我仍然感到担心。以下是我的理由。

停止“迭代0”的三个理由:

首先,尽管很难相信,但绝大多数的项目都是可以立刻启动的。我所听过的所有声称需要在Scrum项目启动前完成的事项有:需要组建团队,包括调配人员到项目上或雇佣新人;需要获取或者设置硬件设备;需要写一个初始的产品待办列表(即使只是高度概要的)。然而现实情况是:诸如技术环境、初始产品待办列表之类的事项都可以在第一个迭代中完成(一个完全是正常的和传统模式的迭代一),同时至少还可以交付了某些潜在可发布产品增量。

其次,有了“迭代0”就制造了一个特例,即某些迭代或者迭代类型可以有特别的规则。例如,团队实施迭代0,就违背了在迭代结束时要提供潜在可发布产品增量的理念。毕竟如果迭代的目的是组建产品开发团队,又怎么可能提供潜在可发布产品增量呢。提供潜在可发布产品增量的要求,有助于帮助Scrum团队避免出现分析瘫痪和感受迭代中开发工作的紧迫性。只有具备适度的紧迫感才能使团队产生更大的创造力。这条规则也有助于帮助团队保持诚实,它能避免团队在没有真正完成任何待办项的情况下声称有进展。

第三,对于少数项目,确实需要进行前期工作(我称之为项目前项目)。这些前期工作可能需要花费一个甚至更多的迭代来完成。毕竟,大项目是真的需要开展前期工作的。这种情况下,我们可能真的需要一个迭代0、迭代0.5、迭代0.75,直到前期工作结束。

但如果我们是例外的少数,该怎么做?

因此,大多数项目不需要前期工作,因为其准备工作可以和开发工作一起进行。但如果说,你们的项目恰恰是少数需要项目前项目的项目,该如何确保分析工作不会停滞不前以及不会比那些第一时间就开始的项目成本更高呢?

提示1:保持“项目前项目”轻量化,甚至可以使用Scrum来管理项目前项目,在团队中使用受时间盒限制的迭代来工作。在每个迭代结束时,都要问一个问题“我们现在可以开始迭代一了吗”,即使项目前项目的规模很小,我们也要决策剩下的时间如何进行。通常,如果你创造性地思考问题,都能够找到解决方法。

提示2:细分工作。就算只是对潜在系统的分析工作,也可以分解成更小的、可完成的任务。例如,假设你们正在决策是否开发一个新的医院系统,或该开发哪种医院系统。不要仅仅把任务描述成“访谈所有相关干系人”,团队可以先访谈所有药剂师的基本需求,任务完成后就可以访谈所有医生。或者可以把工作细分成不同的细分领域:向所有相关干系人访谈其对系统处方部分的需求。这种情况下,团队在迭代中的访谈对象可以不仅限于药剂师,也可以访谈医生、护士等,但与这些相关干系人讨论的内容仅限于系统处方部分。团队可以将来回来再继续向相关干系人访谈其他功能。然而现在,团队可以说已经完成了关于处方部分的相关干系人需求分析。

再说一遍:绝大多数开发项目在开始之前并不需要项目前项目,任何时候分析工作都可以在实际的迭代中完成。当你们确实需要进行前期工作时,把它细分成可完成的小块,紧急快速地完成。

本文译者:李洁(Jerry Li) ,CSM,CSP,Scrum中文网资深敏捷顾问和培训师,敏捷教练

原文作者:Mike Cohn

文章转自:scrum中文网

文章链接:http://www.scrumcn.com/agile/scrum/18813.html

时间: 2024-08-07 14:37:19

反对迭代0:停止拖延,开始迭代的相关文章

如何准备启动敏捷-迭代0如何做?

??万事开头难! ??对于启动敏捷而言,启动前安排一个准备阶段将对顺利的开展第一个迭代很有帮助.整理了下文试图来说明如何准备启动敏捷. ??迭代0是指在启动敏捷开发前的准备工作阶段,迭代0一般的时间长度不超过所选择的迭代周期. 对于看板类做法,如果没有明确的迭代周期,那么建议不超过2周,为方便,将看板类的准备工作阶段仍然称为迭代0. (附带推荐-对于看板类做法,仍然推荐安排迭代用于回顾和定期展望等等活动) ??迭代0主要完成的任务是组建团队和准备团队工作环境,就具体事务整理了如下具体完成定义条目

C语言之文件操作06——写数据到文本文件遇0停止

//文件 /* =============================================================== 题目:输入10个篮球运动员的身高数据(cm)保存至D盘文件high.txt: 0表示输入完毕. x= 180 182 179 185 191 178 184 185 183 192 =============================================================== */ #include<stdio.h> v

输出一个字符串遇见‘\0’停止并返回字符串字符的个数

#include<stdio.h> int strlenn(char *string) { int length = 0; int i = 0; for (i = 0; i < 6; i++) { if (*string != '\0') { printf("%c", *string); } if(*string++!= '\0') { length += 1; } } return length; } int main() { char arr1[]="a

[转] React之Immutable学习记录

从问题说起:熟悉 React 组件生命周期的话都知道:调用 setState 方法总是会触发 render 方法从而进行 vdom re-render 相关逻辑,哪怕实际上你没有更改到 Component.state this.state = {count: 0} this.setState({count: 0});// 组件 state 并未被改变,但仍会触发 render 方法 为了避免这种性能上的浪费, React 提供了一个 shouldComponentUpdate 来控制触发 vdo

理清递归、迭代、循环的概念

loop.iterate.traversal和recursion这几个词是计算机技术书中经常会出现的几个词汇.众所周知,这几个词分别翻译为:循环.迭代.遍历和递归.乍一看,这几个词好像都与重复(repeat)有关,但有的又好像不完全是重复的意思.那么这几个词到底各是什么含义,有什么区别和联系呢?下面就试着解释一下. 循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如,while语句. 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项.比如,for语句.大都会娱乐

程序算法艺术与实践:递归策略之递归,循环与迭代

众所周知,递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的,同时影响效率的.递归是利用系统的堆栈保存函数当中的局部变量来解决问题的,而递归就是在栈处理栈上一堆的指针指向内存中的对象,这些对象一直不被释放,直到递归执行到最后一次后,才释放空间. 循环效率与递归效率 递归与循环是两种不同的解决问题的典型思路.当然也并不是说循环效率就一定比递归高,递归和循环是两码事,递归带有栈操作,循环则不一定,两个概念不是一个层次,不同场景做不同的尝试.

迭代、递归替代循环

循环(迭代)与递归的区别 1. 递归算法与迭代算法的设计思路区别在于:函数或算法是否具备收敛性,当且仅当一个算法存在预期的收敛效果时,采用递归算法才是可行的,否则,就不能使用递归算法. 当然,从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然,然而代价通常都是比较高的. 但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现,这就像动多态的东西并不总是可以用静多态的方法实现一样.这也是为什么在结构设计时,通常采用递

C#迭代语句、跳转语句--C#基础

foreach每执行一次内含的代码时,循环变量就会一次读取集合中的一个元素,不需要个数.循环变量只是一个只读的局部变量,这个值是不能修改的.char后的word是 foreach语句的迭代变量,它是只读的,不允许修改. 源程序: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 表达式 { cla

python当中的 可迭代对象 迭代器

学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样理解,一个容器类型的数据,比如 列表[ ]  .元组 () 和 字典 { }, 我们可以把这样类型的数据放入for temp in [1,2,3] 当中,temp 被一次一次的赋值成为后面容器内数据,然后我们拿到temp进行一些想做的事情.那么for 循环中自动的帮我们把数据一次一次的取出来,可以理