硝烟中的Scrum和XP-我们如何实施Scrum 4 (Part 1/2)
4 制定Sprint计划
计划是Scrum中重要的一环; 是为了让团队获得足够信息, 不受打扰地工作, 增加团队的信心;
Planning的成果: 1) Sprint目标 2) 团队成员名单(时间百分比, part time) 3) Sprint Backlog(US列表) 4) Demo日期 5) DailyMeeting时间地点
产品负责人必须参加
因为每个故事都有3个互相之间有着强烈依赖的变量: Scope-Estimate-Impantance
范围和重要性由产品负责人设置, 估算由团队设定, 在Planning上讨论理解使得这三者调整优化;
会议开始后PO需要概括一下这个sprint希望达到的目标; 团队按照优先级逐一讨论Story, 估算时间; 团队和PO的估算想法可能不一致, 讨论之后会有更多的问题, 根据情况需要调整Story的优先级, 修改范围, 并且重新估算, 直接的协作方式是Scrum的基础.
PO没时间参加的情况下
1) 和PO沟通, PO的直接参与事关项目成败; 2) 在Team中找到某人代替PO作为代表参加会议, 并且需要PO和代表沟通到位, 同意让代表参加会议, 行使权利改变Story的优先级和范围; 3) 说服管理团队分配新的PO; 4) 推迟Sprint启动日期, 直到PO有时间参会, 同时拒绝承诺任何交付, 团队自行安排每日任务;
不能在质量上让步
第四个变量-质量;
外部质量是系统用户可感知的, Ex. 运行缓慢, 让人混淆的UI;
内部质量一般指用户看不到的要素, 系统的可维护性, Ex. 系统设计一致性, 测试覆盖率, 代码可读性和重构, etc.
内部质量优秀, 外部质量仍旧可能很差, 但是内部质量差, 外部质量基本也不会好到哪里;
外部质量可看作Scope的部分, 出于业务考虑有时会先发布一个系统版本, UI比较简陋; 之后会发布一个干净版本, 外部质量的程度由PO权衡.
内部质量则是必须保证的, 影响到整个项目的发展, Defect的数量, 程序的扩展性以及架构的稳定性;
内部质量是不可以讨价还价的, 牺牲内部质量节省下来的时间, 在将来会付出代价, 代码中隐藏的问题越往后越难以恢复;
可以先减小Scope或者简化功能, 把高级功能作为新的Story来整合工作时间, 或者降低其他Story的优先级来集中处理优先级高的;
无休止的Sprint Plan
原则-Scrum中的一切事情都有时间盒;
需要尽量控制时间, planning拖太久时间会降低会议效率, 也损失Sprint时间;
Sprint计划会议日程
在sprint计划会议之前制定好时间表, 减少破坏时间盒的风险;
e.g. 日程不是强制的, Scrum master可以根据会议进程进行调整;
Sprint计划会议 13:00 - 17:00 (每小时有10分钟休息):
1300-1330 PO介绍sprint总体目标, 概括产品backlog, 确定demo的时间地点;
1330-1500 团队估算时间, 必要时拆分backlog条目, PO在需要时修改重要性; 理清每个US的含义, 重要性高的backlog要填写"如何演示"
1500-1600 团队选择US放入Sprint, 计算生产率, 用来检查工作安排的基础;
1600-1700 安排daily meeting地点; 将故事拆分成任务;
确定Sprint长度
短的Sprint = 短的反馈周期 = 更频繁的交付 = 更频繁的客户反馈 = 减少在错误的方向上可能花费的时间[这个事先应该确定个大概时间] = 学习个改进的更快;
长的Sprint: 团队有充分的准备时间, 解决问题的时间, 减少压力;
PO喜欢短Sprint, DEV反之, 因此Sprint的长度是妥协后的产物; 一般使用三周; 符合敏捷性和开发惯性, 容易让团队进入状态(flow);
刚开始的时候可以试验Sprint长度, 并且在实践中调整到合适的时间长度; 选择了感觉合适的Sprint长度之后需要坚持, 直到让每个成员都有相似的节奏;
确定Sprint目标
为什么进行这个Spint? 需要制定一个从业务角度可理解的目标; e.g. 完成优先级最高的三个任务; 优化系统, 发布btea版本给用户; 添加后台系统支持...
如果有多个Scrum团队, 可以在wiki页面(或其他共享点)上列出所有团队的Sprint目标, 保证所有人知道工作的目的;
决定Sprint要包含的故事
Sprint会议要决定哪些故事需要在这个Sprint完成, 将这些US从Product backlog拷贝到Sprint backlog中;
Product backlog中的故事是按照重要性排序的; 应该按照团队的估算生产率(团队能在一个Sprint内完成的US点数)来选择优先级高的US;
Sprint backlog是Product backlog中部分US的一个映射, 表示团队在这个Sprint中承诺要完成的UserStory.
Note Sprint要包含多少US由团队决定, 不是PO或其他某个人;
PO如何对sprint放那些故事产生影响
如果PO希望故事D放到sprint里面
1) 可以重新设置优先级, 赋予故事D最高的级别, 团队就不得不将D放入sprint, 将C移出;
2) 或者, 更改范围, 缩小故事A的范围, 直到团队确信故事D能在这个sprint中完成; [缩小范围后需要新建US来跟踪被缩减的功能]
3) 最后, 还可以拆分故事; PO判断故事A中某些方面实际不重要, 将A分成A1和A2, 给予不同的优先级;
虽然PO在正常情况下[sprint进度, 客户要求, 上级压力...]不能控制团队的估算生产率, 他仍然有很多方式对sprint选择那些US施加影响;
团队怎样决定把哪些US放到sprint里面
用本能反应估算
如果sprint时间不长, 小团队可以根据直觉进行估算 (提问, 讨论, 统一范围)
用生产率计算来估算
1) 得出估算生产率;
2) 计算在不超出估算生产率的情况下可以加入多少US;
生产率是"已完成工作总量"的一个衡量方式;
Note 这里的实际生产率是建立在每个US的原始估算基础上, 在sprint过程中对US时间进行的修改都被忽略了;
这个数字并不精确, 但是有了它就可以有一个参照系数;
查看团队的历史, 根据过去几个sprint的生产率, 假定下一个sprint有差不多的生产率;
这项技术也被叫做昨日天气yesterday's weather; 使用该技术必须满足两个条件: 团队已经完成了几个sprint(得到统计数据), 团队以几乎完全相同的方式(团队人数, sprint长度, 工作状态不变)进行下一个sprint;
复杂一点, 可以进行简单的资源计算: 假设一个4人团队3周的sprint(15workday), Lisa休假2天, Dave只有50%的时间, 把这些计算到一起...[可以使用excel模板统计数据]...这个sprint一共有X个人/天;
估算的单位是故事点, 差不多是理想化的人/天, 理想化的人/天高效, 不受打扰的一天, 但我们必须考虑各种因素, e.g. 把未计划到的工作添加到sprint, 生病请假等;
投入程度focus factor的概念:
投入程度用来估算团队在sprint中投入的百分比, 投入程度低就表明团队收到的干扰大, 估算的太理想化; e.g. 50 man-days * 50% = 25
得到合理的投入程度的方法是查看之前的sprint的值(取平均值), e.g. factor = 18 US points/36 man-days = 50%
把上一个sprint中完成的所有US的原始估算相加, 得到的就是实际生产率; [FocusFactor和Velocity(70%)]
昨日天气使用很方便, 但是要考虑到一些常识, 如果上一个sprint很糟糕的原因是大部分成员都生病, 那你可以假设这次运气不会那么坏, 给这个sprint提高一点投入程度; 如果团队最近安装了新的快速的持续集成系统[CI], 也可以提高; 如果有新成员加入, 需要把培训占用的精力计算进来, 反而可能降低投入程度...
如果是个全新的团队, 没有数据, 可以参考在类似条件下工作的团队的投入程度;
如果没有其他可参考, 需要猜测一个投入程度百分比, 在第一个sprint使用, 之后按照历史数据进行分析, 对投入程度和估算生产率作出改进;
新团队中默认投入程度通常是70%;
使用哪种估算技术
直觉反应, 昨日天气, 基于可用人-天估算和估算投入程度的生产率; 这些都可以结合使用, 讨论以及调整;
最后得出哪些US要放入sprint, 才是目标, 投入程度, 资源可用性和估算生产率只是用来达成目标的手段;
硝烟中的Scrum和XP-我们如何实施Scrum 4 (Part 1/2)的更多相关文章
- 硝烟中的Scrum和XP-我们如何实施Scrum 12)发布计划 13)组合XP
12 怎样制定发布计划, 处理固定价格的合同 一次只计划一个sprint的事情会显得提前量不足, 提前做计划是个好习惯; 尤其是签了固定价格的合同之后, 不得不预先计划好, 防止无法按期交付的危险情况 ...
- 硝烟中的Scrum和XP-我们如何实施Scrum 15)多团队 Part 2/2 16)地理分散 17)检查列表 18)其他
引入"团队领导"角色 假设有3个团队开发同一个产品 红色的P是PO, 黑色的S是SM, 蓝色是其他团队成员; 如何决定哪些人属于哪个团队? 怎么分配成员? 有人觉得让PO来做人员分 ...
- 硝烟中的Scrum和XP
硝烟中的Scrum和XP 初次接触Scrum和XP(更加准确的说是"看到"),心里不免有些疑问,软件开发为什么会有如此多的方式,难道软件开发.软件工程不就是写写代码的事儿吗?直到后 ...
- 《硝烟中的Scrum和XP》:作者主导Scrum过程的实战经验,四星推荐
本书作者是开发团队Leader,本书记录了他带领团队实施Scurm过程中的经验教训.全书短小精悍,言简意赅. 以下是书中一些观点信息的摘抄: 1:Nokia总结出的迭代开发的基本要求:1.1:迭代要有 ...
- SCRUM与XP的区别和联系
相同点:SCRUM和XP都是敏捷开发的方法论,都体现了快速反馈,强调交流,强调人的主观能动性等基本原则,而且多数“最佳实践活动”都互相适用. 不同点:Scrum非常突出Self-Orgnization ...
- 为什么你学习了scrum之后还不会实施敏捷? (敏捷学习之旅一)
标题党, 其实这个主题改为"如何能快速的学习与实施敏捷"更贴切. 我在一家大型的外资金融企业,公司最近在大面积的实施敏捷转型,我的团队首先被选为试点团队,并实施得很好,最近我也和不 ...
- Scrum转型(一) 为什么敏捷和Scrum
1.1 为什么敏捷 由于传统的瀑布模型管理方法无法满足现代某些软件产品开发过程的特点,我们需要使用敏捷的方法(例如,Scrum是一个让我们关注于在短时间里交付高质量商业价值的敏捷框架). 需求频繁变动 ...
- 如何理解IPD+CMMI+Scrum一体化研发管理解决方案之Scrum篇
如何快速响应市场的变化,如何推出更有竞争力的产品,如何在竞争中脱颖而出,是国内研发企业普遍面临的核心问题,为了解决这些问题,越来越多的企业开始重视创新与研发管理,加强研发过程的规范化,集成产品开发(I ...
- 【Scrum】-NO.40.EBook.1.Scrum.1.001-【敏捷软件开发:原则、模式与实践】- Scrum
1.0.0 Summary Tittle:[Scrum]-NO.40.EBook.1.Scrum.1.001-[敏捷软件开发:原则.模式与实践]- Scrum Style:DesignPattern ...
随机推荐
- Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承
条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...
- 告诉你LTE-FDD与LTE-TDD的区别
[PConline 技术分析]移动早在去年已经拿下了TD-LTE的4G牌照,而中国联通与中国电信的FDD-LTE的牌照在近日正式拿下,而对于4G网络,有多少真正了解呢?接下来笔者就为大家解释一下4G的 ...
- [Redux] Avoiding Object Mutations with Object.assign() and ...spread
Learn how to use Object.assign() and the spread operator proposed for ES7 to avoid mutating objects. ...
- SlidingMenu导入编译用法--Eclipse和IDEA
非常多側滑的应用都用的是开源库SlidingMenu, 效果不错,下面是我用上的效果图,因为近期换成了IDEA(IntelliJ)编辑器,昨天上网找了全部的教程都是关于在Eclipse导入的方法,摸索 ...
- unity3d 版本问题
version: 4.2.1f4 1. 安装以后,不要启动,把exe拷贝覆盖. 2. 断网(重点,不断的话你试试就知道了) 3. 打开unity3d, 点击load License 4. 把ulf导入 ...
- UML解惑:图说UML中的六大关系--转
UML定义的关系主要有六种:依赖.类属.关联.实现.聚合和组合.这些类间关系的理解和使用是掌握和应用UML的关键,而也就是这几种关系,往往会让初学者迷惑.这里给出这六种主要UML关系的说明和类图描述, ...
- Java多线程——ThreadLocal类
一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...
- 《fullPage.js》创建全屏滚动的网站
插件介绍 fullPage.js是一个简单易用的插件,创建全屏滚动的网站(也被称为单页网站).它允许全屏滚动创建网站,以及添加内部滑块. 浏览器兼容性 主要功能 支持鼠标滚动 支持前进后退和键盘控制 ...
- 封装函数--->切换,添加,删除class
var obj={}; obj.className='a b c d active'; //切换class function toggle(obj,className) { var str=obj.c ...
- (转)js arguments对象
在javascript中,不需要明确指出参数名,就能访问它们.如: function hi(){if(arguments[0]=="andy"){ return;}aler ...