• 硝烟中的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, 才是目标, 投入程度, 资源可用性和估算生产率只是用来达成目标的手段;

  • 相关阅读:
    一手遮天 Android kotlin 协程: 通过 ticker 信道实现类似计时器的效果,协程的异常处理,解决协程的并发问题
    一手遮天 Android jetpack: LiveData 指定的对象的某个属性发生了变化时通知给观察者
    一手遮天 Android jetpack: DataBinding(MVVM)
    一手遮天 Android kotlin 协程: Channel(信道,用于在不同协程之间传输数据)
    一手遮天 Android jetpack: LiveData 基础,以及 LiveData 和 ViewModel 结合使用
    一手遮天 Android kotlin 协程: 协程基础(CoroutineScope, 为 CoroutineScope 扩展方法, runBlocking, launch, async, await, suspend, withContext, 设置/获取 CoroutineScope 的名称)
    一手遮天 Android UI: 监听配置变化(比如横竖屏切换等)
    一手遮天 Android jetpack: ViewModel 基础以及 viewModelScope
    一手遮天 Android Resource: 布局 xml 基础
    一手遮天 Android kotlin 协程: Flow(异步流,各种操作符的使用 buffer, conflate, collectLatest, drop, take, filter, map, transform, onEach, first, last, single, reduce, zip, combine, flatMapConcat, flatMapMerge 等)
  • 原文地址:https://www.cnblogs.com/james1207/p/3333784.html
Copyright © 2020-2023  润新知