文章

重新思考 Sprint 长度

我们的项目是在一个分布式的环境下展开的——开发团队和产品管理处在不同的地理位置。当我们第一次进入到这个项目的时候时,我们要做的是帮助一个已经存在了数年的随机开发项目,没有固定的迭代和发布计划,建立离岸的开发中心。它的业务并不复杂,但是代码质量低下,再有就是它的知识持有人不在场出现(或者远程操作)令项目启动比我们以及项目干系人所预期的要难得多。
我们用最开始的三到四个月时间学习代码库(通过修复漏洞和增加新的功能)。最后,我们已经清楚了要如何来做我们的项目。 我们知道我们想试一个敏捷方法,在许多讨论论辩之后,我们决定试 Scrum (这里的来龙去脉,Scrum之前是如何被介绍的,那么本来应该怎么介绍它,它是如何最终改变了公司运作的方式是我们另外一篇或者两篇文章的主题——也许是下次)。
 Scrum起航
我们刚刚开始的时候,我们选择用四周的sprint。我们的产品backlog方面,我们使用per-feature需求文档,我们称这个为feature specs。每一个feature的规格说明通常是一本三到五页的文档,里面包括特征描述,主要工作流以及截图。我们的特征规格是由产品经理远程制作的。
这些文件在一定程度上是有作用的。尽管这样, 时常需要收集下一个sprint所必需的一定量的规格让产品负责人很累。他和产品经理经常拼命去找时间来写规格。甚至有的时候,哪怕他们已经写下了这些规格,这种情况经常时有发生,他们所提供的信息不足以让开发人员来做出合理的估计。
团队觉得Sprints长度没有问题,但是管理团队认为他们需要更可视化的结果。 同时,我们想是否更短的sprint会帮助我们的团队专注,同时优化绩效。我们计划切换到尽可能最短的期限:仅仅一周。如果不成功的话,我们随时可以切换回来。
我们的部分改变带来了积极的结果。比方说,股东每周能收到更可视化的结果。尽管如此,但实际上是弊远大于利。第一,开发团队需要每周 deliver,他们开始感觉有压力。第二,要在一周时间以内提供有价值的功能有的时候是很有难度的。最后,启动和终结一个sprint的成本感觉很高,不管是团队时间方面的投入还是情感上的投入。

前面路还远,我们还不能休息
一周的sprints的结果很不如人意,我们决定还是返回到四周的sprints。
同我们之前所经历的很仓促的每周发布相比,接下来的一个月将会感觉很轻松。 因为我们开始调整进程到我们理想的样子(我们期望达到现实)我们努力开始提前收集规格,给项目人员和测试人员提供更多详细的说明。事情会有所改善的。尽管这样,当我们认真仔细地看我们的sprint 活动,我们意识到我们实际上在做的是三周 sprints加上一周最后未完成的sprint任务缓冲,而非四周sprint。这可真不是我们期望“我们的 Scrum”的样子。

喂! 我看到陆地了
自这个项目被外包至今已经超过一年了。事情得到了改善,但还没有达到我们期待的效果。在那时,我们对要求管理过程做了一个根本的改变:我们用轻量的用户故事 (受Mike Cohn的 《应用用户故事》的启发) 取代了我们的中级重量的规格说明书。
如我们希望的一样,用户故事在开发和产品经理之间的沟通得以提高。同时他们帮助团队增加了对于业务需要的理解。所以,公司内部的的信任和沟通得以提高。这个相应地提高了产品质量(产品质量的提高也得益于更细致的用户故事使得计划更加优化 ,增加的单元测试量以及增加的测试团队规模)。
达到先前所说的条件之后,我们计划试试更短的sprints。 以下的是我们要抓住的“野兔”,他们是曾被认为只要改变长度就能解决的。(对于野兔爱好者,这可真是乐事一桩,有些小动物还在野地里跳得欢呢。)
• 提高团队绩效。 团队已经有一种在sprint进展中丢失关注的倾向。为了阻止这种状况的发生,他们在第二周之后简单地开了另一个sprint计划会议,为了能找出目前的状态(尽管我们一直更新燃尽图),以及通过重新分配任务来纠正他们的计划。这不是一个理想的情形。
• 从产品管理团队(用户代理)得到更早的反馈,从而从产品真正的用户那里得到反馈。通常在sprints结束的时候,用户故事被用来评审。在三到四周时间里开发的大量的用户故事增加了管理的工作难度,他们会很难确定项目质量,以及为下一sprint计划bug fixing或者变更。
• 让公司做更频繁的发布。公司的正式计划是季度发布,但是我们希望有更加频繁的发布可能。
• 消除计划难度。做每月sprints,产品负责人需要提前四周进行计划,由于时常变化的商业优先级,有的时候有点困难,同时,这对于开发团队来说,也有困难——相当多的故事我们需要考虑,这样计划需要很长时间,同时经历也被耗费。
• 更快地学习。我们需要等待至少四周时间才能看到任何我们开发过程中的变化所产生的效果。而且我们经常希望在单一的sprint里做了那么多的改变以至于我们不可能专注于所有的事情。我们在sprint回顾中所确定的问题在后来的一些过程中又一而再再而三地出现。
还远远没有完成
截至目前为止,团队已经完成了三个双周sprints。在这个时间里,完成以下任务(或者抓住以下野兔):
• 提高团队表现。团队开始更加专注,这点他们自己也非常喜欢。现在他们还能够记住大部分sprint的用户故事,这让他们彼此之间沟通他们的状态更加轻松容易。但是他们中的有些人说,如果用户故事的难度提高或者内部复杂性增加,他们就不能够这么好的完成sprints 。
• 及早得到反馈。这点已经得到产品经理的确认:他们能够得到客户的更早反馈,得到开发人员的估计,以及更早地更新计划,继而缩小整个反馈环节。
• 降低计划难度。这一点所有受影响的人都可以看到。对于Alexey来说 (一们ScrumMaster),这样的计划是最难的:要考虑太多的故事,要大力好太漫长的会议。现在计划就像每日站会一样轻松简单了。
• 更快地学习。过去的六周里,我们已经开了三次回顾会议(如果我们进行每月sprint话,我们最多只能开两次),这个非常富有成效,并且易于操作。 参加的人员要列出所有的障碍也不匆忙,因为我们知道两周之后我们可以再来回顾一次。
截止目前为止,下面的目标还没有达到:
• 让公司做更多的发布。这依旧是下一个或两个季度的目标。.尽管上个月的质量有所提高,但依旧还没有不能够在还没有做一两个特殊sprints漏洞修复的情况下就可以直接发布软件。
所有这些积极的改变是因为我们切换成两周sprint带来的吗?不。缩短sprint 长度本身,产生了积极效果,但是倘若没有其他必须的改变,这些积极效果也是达不到了,比如增强团队的积极性和职业道德,提高和增加产品管理和开发人员之间的沟通 (在介绍产品故事方面)以及提高内部产品质量。
我们应该在一开始就做两周sprints 吗?我们不这么认为。我们还是认为要不是有这些良好的先决条件(信任,用户故事,良好质量,等等),我们就已经失败了。慢慢地开始,解决这些先决条件因素,我们慢慢的能够发布越来越快,然后很自然地调整sprint长度。毕竟,是要先学会走路,再学着跑。
原文地址:http://www.scrumalliance.org/articles/10-rethinking-sprint-length

经验主义—基于已知信息做决定

经验主义是一种基于已知信息做决定的一种行为。Scrum是一种以经验为依据的流程,有些时候被称作“可能的艺术”,实际上说的就是我们要利用好我们手头上掌握的所有信息尽力做到最好。

一个PO根据当前所有已知的信息进行版本发布计划。他会列出目标和特性,以及团队交付这些特性的能力,还有可能的成本和交付日期。这样看来,PO的职责就是根据团队的能力评估可能达到的目标,然后做出最好的决定以达成目标。由于技术、市场、需求以及人力等各个方面的权衡,有时候无法在合理的成本范围内达到目标;有时候虽然达成了目标,但是和PO原来的计划有所偏差。这就是经验主义的实践。

Scrum中的团队其实也在干同样的事情。团队和PO举行会议,对PO觉得接下来最重要的事情进行评估。一旦完成以后,团队就可以朝着PO希望的方向进发。团队会根据在接下来这个Sprint中他们能够完成最大工作量对产品待办列表中的条目进行挑选。由于团队的人力成本和Sprint的长度是固定的,所以唯一可变的就是从产品待办列表中选择的条目的数量。这些条目就是版本发布目标的所有条目的子集。

在Sprint计划会议中,当团队从产品待办列表中选择条目的时候,他们承诺在当前的Sprint中完成这些条目。“承诺”的定义是:通过许诺或担保的形式进行约束或担负义务;诺言;承担自己的诺言;许诺做某件事。诺言、许诺做某件事,这就符合了我对“承诺”这个词的理解。

然而,很多Scrum团队误把承诺当作成一种“保证”。这其实是从瀑布时代遗留下来的,因为那个时候估计就等于合约。直到现在,这种概念仍然残留于很多PO和开发人员的脑海里。我发现很多团队都觉得他们不惜一切也要完成他们的承诺。而通常这么做的代价会是牺牲质量。

我在想,我们是不是应该把“承诺”说成“预测”会更好一些呢?因为这可能会引导大家认为我们就是在预报天气一样,用现有已知的所有信息尽可能地做好预测。这种实践在气象学和我们所了解事物的中已经被证实可行了。因为这种实践并不保证什么,而是根据我们所了解的信息来做最好的抉择。我们发现在销售行业中,预测同样被运用。也许,这能够帮助我们说明在Scrum中,“承诺”就是利用我们现有的一切尽力做到最好。

原文地址:http://kenschwaber.wordpress.com/2011/05/03/empiricism-the-act-of-making-decisions-based-on-what-is/

 

作者:Ken Schwaber

Sprint进度的测量

我经常发现使用Scrum的团队对如何能够最好地跟踪进度有疑惑。一般来说,有几个方法可以选择。有些团队把每个用户故事拆分成以天为单位的任务。但是...

scrumcn1305615765
我经常发现使用Scrum的团队对如何能够最好地跟踪进度有疑惑。一般来说,有几个方法可以选择。有些团队把每个用户故事拆分成刚好一天能够完成的任务。但是我见到不少团队在尝试过这么做以后,发现过程中遇到很多麻烦,因为有些任务需要不到一天,而有很多需要两天甚至以上,所以很难将所有任务都准确地拆分成正好一天能够完成。

有的团队把用户故事拆分成任务以后,花费大量的时间来计算每个任务所占的故事点数。而这个会在计划会议上完成,因此整个会议要持续4到6个小时。在下文中,我们把这种方法叫做“故事点数分配法”。

第三种方法是我最喜欢的一种,我觉得它是最有用的,因为这种方法不需要花费很多时间,这和Scrum中帮助团队避免花费太多时间在获得准确性的其他方面是一致的,例如,在Scrum中使用斐波那契数列或者2次方数列来进行用户故事的估计。

只要有机会,我都会推荐下面这种方法。这种方法的基本技巧就在于,持续地更新每个用户故事的估计所需剩余时间(ETC)。一般来说你可以在每日站会之后更新数据,如果你已经能够掌握时间盒的运用的话,你甚至可以在每日站会当中来更新。总而言之,这种方法的最基本思想就是让团队每天估计并且更新完成某个用户故事所需要的故事点数。

让我们来看看这个例子。假设我们的Sprint长度是两个星期。在计划会议之后,团队承诺完成A到G一共7个用户故事,放在下面的表格里面(图1)。
scrumcn1305615787
图1

 scrumcn1305615845
图2

在完成了星期一下午的工作以后,团队在星期二的早上聚集到一起举行每日站会,然后估计所有在进行中的用户故事所需要的剩余时间。从图2中可以看出,用户故事A和B正在进行中,于是团队根据当前的进展重新估计了这两个用户故事剩余的故事点数。做出估计的依据应该是整个用户故事所剩余的工作量,而不是被拆分的任务。下面是团队重新估计后得出的燃尽图(图3)。
scrumcn1305615878
图3

团队应该每天重新估计每个进行中的用户故事的剩余工作量。图4展示了从开始到完成的过程,图5则是Sprint结束时的燃尽图。

scrumcn1305615896
图4

 scrumcn1305615917
图5

我经常听到其中一个的争论是“但是ETC并不是百分之百准确的”。这是肯定的,没有任何的估计是百分之百准确的。但是,每天重新估计进行中的用户故事的剩余工作量比把故事点从Sprint开始分配到各个任务中,然后每天把剩余的故事点数加起来更加能够让你了解实际剩余的工作量。这是为什么呢?

我们可以用锥型不确定性理论来解释。在项目管理中,锥型不确定性描述了项目过程中不确定性数量了变化过程。在项目刚开始的时候,相对地我们对项目的了解较少,因此估计也会包含比较大的不确定性。随着我们完成了越来越多的开发工作和研究工作,我们对项目的了解也越来越多,不确定因素也会越来越少。(http://en.wikipedia.org/wiki/Cone_of_Uncertainty)

scrumcn1305615947

正如你所想到的那样,锥型不确定性理论对传统的项目管理模型有很强的依赖。尽管如此,它的原理同时也适用于敏捷的项目管理。

还记得“故事点数分配法”(把每个用户故事的点数分配的各个任务当中)吗?我们可以说我们已经有一个不错的误差了,姑且说是+/-25%(1.25/0.75)吧。当然这种方法不会让我们得到百分之百的准确度。当项目进行的时候,为了能够更好地计算剩余的工作量,团队会标记已经完成的任务,然后把在进行中的任务所占的故事点数相加。这么做的问题是,尽管我们现在能够掌握比我们第一次估计的时候更多的信息,但是由于我们没有对用户故事进行重新估计,于是我们的准确度就会卡在+/-25%这个槛上。

如果我们不在一开始就把故事点数分配到各个任务上会发生什么事呢?自然我们就不会把所有剩余的任务所占的故事点数加起来来获得剩余的工作量。我们只能够重新估计每个进行中的故事的剩余工作量。这样我们就可以保证我们重新估计的时候不会还带着+/-25%的误差,而且可以越来越接近锥型的右侧,也就是误差为0的地方,因为我们每次重新估计的时候就会比上一次更加了解项目掌握的信息也会更多。这样做会比单纯维护在计划会议上作出的估计要准确得多。

我推荐各个团队在下一个Sprint中尝试这种方法。如果使用得当的话,你将会很快地留意到持续估计剩余工作量的好处。

原文地址:http://www.scrumalliance.org/articles/356-measuring-sprint-progress

 

Scrum中的工作量估算

当我们提起工作量估算的时候,我们会碰到同样的问题,我们如何来做估算?有什么方法可以遵循呢?如何估算才更准确?我对某个功能做了估算,但它超出了预计的开发时间,为什么?

Scrum团队已经做了很严肃的承诺去完成开发工作(可以交付的产品),必须要深思熟虑才可能成功。成功的工作里昂估算的几个步骤:

估算每个团队成员有多少时间可以在Sprint中被使用:

估算每一个团队成员在当前的Sprint中有多少时间可以被使用时Sprint计划会议的一个非常非常重要的部分。需要注意的是如果一个开发人员估算一个任务8小时可以完成,这个并不等于他一天可以做完。事实上,没有人会做在座位上一动不动,工作8个小时,参加会议的时间,午饭时间,意外的打断,看email, 接听电话等等都要考虑进去。

刚刚开始实践Scrum的人经常会问“是否需要预留一些时间来做bug修改?”。我当然不会准备两个Sprint,一个用来做产品backlog的开发,一个做bug修改。bug修改的时间应该是每天例行的时间,也就是说这是我们每天例行工作的一部分,扣除这些例行的时间,剩下的才是你可以承诺给Sprint的时间。1. 估算每个成员有多少时间花在和Sprint相关的工作上。

Sprint可用的工作时间= 平均日工作时间 – 其他活动.
平均日工作时间 = e.g. 8 hours
其他活动: = e.g. 4 hours
Emails and Phone : 1 Hrs
午饭: 1 Hrs
读Blogs/bbs : 0.5 Hrs
Bug fixes : 1.5 hrs
Sprint可用的工作时间= 4 hours

为产品Backlog中的每个项目估算工作量: 

有完成过类似工作经验的人来做相关的估算会更好一些,有历史数据可供参考。最好是让相关的有类似工作经验的人参与进来做适当的估算。经过几个Sprint之后,团队成员就会找准自己的位置,知道自己可完成多少工作。这也会使估算更为准确一些。

2. 所有的团队成员都要参与工作量估算的游戏。

3. 从Product Backlog中挑出排列好优先级的项目,要能够完全理解它,知道应该做什么,有哪些依赖、复杂度,风险等。如果需要的话让Product Owner做相关的澄清。
4. 细化理解后的项目为2-16 h/m工作量的小任务。

5. 为每个小的任务估算时间.

关于工作量估算的一些注意点:
1.一旦已经承诺要递交的Sprint的工作任务,团队成员不应该在受到外界的干扰,比如指派新的工作任务,或改变工作任务等。

2. 余下的工作将被移动到下个Sprint中。
3. 为了达到目标,团队必须是自我组织,并且团队成员之间是透明的。

有头大象在屋里

我步入了以下这些毫无意义的情形中。我怀疑是因为房间里出现了一头大象而使他们发生(译者注:在西方,“出现大象”意为发生了人们所不了解的新奇的事物)。不知道哪位能否给点意见看一下这头象长得到底是什么样子的?
Read more

回顾白板墙

常见到人们在回顾会议中觉得无聊,或者仅提出寥寥无几的几个优缺点。我在这儿介绍一个我们团队用起来还不错的方法。这个方法并不是比别的要好或差,只是给那些想在回顾会议中尝试新方法的人提供一点建议。 Read more

如何做好发布计划

当Scrum的团队按照Sprint的方式进行迭代交付的时候,他们更加关注的是发布,而不是项目。那么什么是一个发布呢? 简单的说,它就是一个开发团队交付一个可以工作的软件给团队外部的人使用,以满足他们的某个目的。当你交付一些内容给下游的QA验证团队来做测试时不是一个发布,当你把你的软件功能和其他团队开发的功能进行集成的时候不是一个发布。当你告诉其他人:“来吧,你现在可以使用它了”,这叫做一个发布。 一个发布是多个Sprint集中交付工作的一个成果,这常常是对市场、业务和客户产生影响的标志性的时刻。 Read more

scrumcn602120522

在Sprint中间改变目标

我曾经应聘过一个SCRUM Master的职位,面试官问我这样一个问题:“在一个Sprint进行中,如果用户想改变某个正在这个Sprint中实现的User Story,你觉得应不应该改变它?”SCRUM的规定在我脑海中明明白白的印着:“在Sprint里不许改变任何任务,团队在第一天承诺一系列工作,然后期望它们在整个Sprint保持不变。” Read more

意外终止一个sprint

敏捷开发讲的就是适应变化。敏捷宣言的第二条原则明确指出“欢迎对需求提出变更——即使是在项目开发后期。要善于利用需求变更,帮助客户获得竞争优势。”这就是为什么在scrum中PO负责维护产品backlog。PO对产品backlog条目的排序有最终发言权–包括从产品backlog中挑选一组条目作为一个sprint backlog,这也是PO适应变化的一种手段。 Read more