Scrum Guide Book
💡 想得好是聪明,计划得好更聪明,做得好是最聪明又是最好。 —— 拿破仑
一、什么是敏捷软件开发?
敏捷软件开发是软件项目的一个概念框架
有许多建立在敏捷概念上的方法,如 Scrum 和 Extreme Programming (XP)
与僵化的、重量级的、官僚式的方法形成对照,比如瀑布模型(指纯粹形式的)
最大限度地降低短期固定时间的迭代式软件的开发风险
二、使用敏捷方法的项目计划
三、敏捷项目管理和传统项目管理
传统项目管理 | 敏捷项目管理 |
事先对整个项目进行估计、计划、分析 | 对整个项目做一个粗略的估计,每一次迭代都有详细的计划 |
反对变更,变更需要重新估计,重新规划 | 鼓励变化, 客户价值驱动开发 |
严密的合同来减少风险,如果改变需求要走变更流程 | 信任和赋予权力,合约使变更变得简单,增加价值 |
项目作为一个“黑盒子” ,对客户与供应商的可视性差 | 客户和开发人员之间是紧密的连续的合作关系 |
产品化和测试阶段是分离的 | 每次迭代都产生可交付的软件 |
文档和计划驱动的方法 | 专注于交付软件 |
软件交付时间晚,意识到风险的时间晚 | 第一次迭代就可交付能工作的版本,风险发现的早 |
四、为什么采用敏捷? –预期的收益
采用敏捷方法得当的话,可以:
更加透明,随时跟踪项目的状态和进展情况,及早发现问题和风险
快速交付,每次迭代都能交付可运行的软件
最高风险和最高优先级的需求,最优先进行开发
改善应对变更能力,减少大量的重计划
改善项目沟通
更好的客户参与,避免错误的假设
总之:
提高了生产率,减少“浪费” (不需要的文档,重复工作等),项目的每次迭代都有明确的目标
提高客户满意度,短期内产生成效,按预期交付软件,每次迭代结束产生可以运行的软件
改善员工的满意度,团队精神,减少官僚,能够规划和管理自己的工作,减少“恐慌” ,稳定的工作量(可持续的步伐)
五、敏捷方法何时有效?
公司和客户一致认为应当使用敏捷方法,双方都能理解敏捷方法(价值导向,而非任务导向,团队拥有高自主权)
敏捷方法对需求不完整以及经常变换的项目比较有效
项目可以划分成固定时间间隔的迭代,并且可以冻结正在进行的迭代的范围
公司和客户都有能力担当角色尤其是Product Owner 和 Scrum Master
项目的人员结构能够分成6到10人的团队,最好每个工作地点一个小组
团队成员能够以自组织的方式工作
项目的合同允许变更
固定价格的项目可以使用敏捷,但应当尽量避免
最好在按时间和材料付费或者按月付费的项目中进行使用
变更项目的范围不需要高级管理层的批准
六、Scrum概述
Scrum是管理软件项目的一个轻量级的敏捷方法, 名字来源于橄榄球运动中的scrum过程
简单,但高度的纪律性
依赖迭代和增量的敏捷方法
Scrum 是一种工作管理的方法,不仅仅限于软件开发,可以用来管理其它活动
Scrum 不包含技术方法或实践
项目分成增量的迭代过程,在Scrum中称为迭代任务清单,通常持续2-4周的时间
Sprint 的时间是限定好的,不能从外部改变正在进行中的sprint持续时间和范围
每个sprint都可以产生可交付的迭代, 即测试过并具备文档的的功能点
原则上,当产品开发到一定程度时,如实现了足够的客户价值,项目可以在任何一个sprint后结束
如同任何项目,敏捷的项目有三个主要阶段 :
产品定义 (规划):运行Sprints 所需要的准备、规划、技术分析
执行Sprints (执行):在增量时间段内实现需求(产品需求清单)
结束:准备最终发布,结束项目
七、Scrum角色、实践和工作产品
Scrum中的三种角色
Product Owner- 产品所有者,个人代表所有的干系人
Scrum Master - 敏捷教练,个人负责指导过程的执行
Scrum Team – Scrum团队(开发团队),承诺完成工作,向干系人交付产品价值
Scrum角色 - Scrum团队
Scrum团队是Scrum的中心角色, 产品交付要依靠团队
Scrum团队自我组织、自我管理
Scrum团队是职能交叉的, 包含产品交付的所有角色:开发人员、测试人员、build managers、文档编写、界面设计人员
Scrum团队中的角色是不分等级的,不应当出现“我是开发人员我不做测试”
团队按照最有利于项目的原则来分担责任 (如组件的所有权等 )
敏捷是建立在信任和授权的基础上,因此团队是自发组织的,组员选择自己的任务,而不是别人强制加以分配的
另一方面,Scrum团队有交付的责任,他们需要能够自我激励和对工作目标进行承诺
团队最佳规模: 6-10人
主要职责:
参与迭代任务清单的创建
执行为干系人创造价值的工作
根据团队的承诺完成所需的各项任务
将工作中的各项障碍迅速与Scrum Master 进行沟通
全面参与所有的各项会议
更新任务状态
自发选择任务
标识任务的完成
标识发现的新的任务
与其它团队共同进行工作
Scrum角色 - Scrum Master
Scrum Master不是一个管理者,而是一个教练和推动者 - Scrum团队是一种自发的组织,是自我管理的
Scrum Master的角色通常由项目组的成员担当,组长或者项目经理。Scrum Master 应当是项目中的成员
主要职责:
评价过程的健康状况
加强过程
消除障碍
促进过程改进
支持团队开发
Scrum Master 的主要工作是做决策、消除障碍,保证团队能顺利交付产品
Scrum Master 还有如下责任
与其它角色配合
训练团队,提高生产率
培训产品所有者和干系人,确保Scrum流程的执行
确保一切工作按照既定的规范来运行
规划并进行必要的改进
推动会议的召开
维护障碍列表
维护Scrum过程改进列表
优秀的 Scrum Master 应当是专注的、有决心的、有领导才能
Scrum角色 - Product Owner
产品所有者代表投资方的利益,确保交付的产品与期望的一致 (提供更好的投资回报)
Product Owner决定产品具有哪些功能
Product Owner’s的主要责任是创建和维护产品需求清单, 即管理项目的范围
Product Owner不断的把产品需求清单按优先级进行排序 ,使得最重要的功能能优先实现.
对于团队来说,只有一个需求集,所有的需求申请都归口到Product Owner
管理商业价值(投资回报)
Product Owner 还有如下责任:
计划项目的发布,什么时间、向什么人等
对每次Sprint的结果进行评审和批准
参与Scrum会议
迭代计划会议
团队进展跟踪会议
迭代评审和回顾会议
能够随时回答团队工作中产生的各项和产品/业务相关的问题
Product Owner 的角色一般由己方产品经理担当,作为服务提供商的公司无法设定优先级
Scrum角色 - 客户与管理层(可选)
客户和管理的角色是可选的,需要时才设立
客户:
是产品的最终用户
通过 Product Owner来设定对产品的期望
把当前的业务传达给项目
管理层:
公司高级管理层,代表公司在项目中的利益
通过Product Owner来传达公司的利益和优先级
八、敏捷开发
产品需求清单 Product Backlog
产品需求清单 - 概论
基本上,产品需求清单是为了实现产品的功能所需要的工作的列表,包括:
功能方面的需求、功能点
非功能方面的需求, 如性能改进
要修改的Bug、上一版本的已知错误
新技术, 如支持新的操作系统或者平台
问题、日后的不确定项, 如新的功能
产品需求清单是不断完善的,Product Owner 在项目进行过程中可以随时更新:增加、删除、修改功能,变更优先级等
下一次迭代中要包含较高优先级的需求
产品需求清单也可称为User Stories (用例) ,因为它们能够给产品的用户带来价值
在一次迭代中要能够实现产品需求清单,如果不能全部实现要进行分解
产品需求清单 - 构成
Product Owner负责创建最初的产品需求清单,一开始是不完整的,最初的清单应当包含足够的需求
产品需求清单来源于:
客户、标书、需求规格说明等
Scrum团队的想法、增强型新功能等
现有产品的迭代增量、已知错误、技术问题等
比较好的做法是Product Owner 、Scrum团队、客户/管理以及其它相关方(如相关的Scrum团队)举行一次或者多次研讨会
Scrum Master 或者 Product Owner 来促成会议的召开,必须要有人来做;要有效率,要围绕主题,沟通良好,避免不同的假设,承诺并且共通合作,确定优先级
产品需求清单 - 估计
Scrum团队对产品需求清单的每一项的规模提供初步的估计,通常采用事件点作为单位Story Points (模糊的),也可采用人天或者人小时作为单位,但容易混淆: a) 实际的规模 b) 时间的单位
精确的估计值可以在Sprint 规划时给出, 当前阶段没有足够的信息,规模的相对值才有意义,这个估计值有助于确定优先级
产品需求清单 - 优先级
优先级是产品需求清单中的主要问题,优先级不但反映了客户的价值也反映了风险
产品所有者 - PO设定优先级
清单中的每一项的优先级是唯一的, 但可以对它们进行分类
优先级可以在项目的任何时候进行更改,如新的重要的功能可以直接给较高的优先级
确定优先级考虑:
价值
风险
依赖关系
产品需求清单 - 示例
版本发布计划
在Scrum中,不是每个Sprints都要发布一个版本
迭代的结果主要是要实现功能的演示, 不一定就是发布的版本
版本发布计划决定了每次迭代应当包含产品需求清单的哪些功能
根据现有的信息制定的项目总体的长期的计划
根据产品需求清单和团队的进度来决定 (实施的范围/迭代)
Scrum团队参与版本发布计划的制定、架构、风险、依赖性决定了可行的实现顺序
版本发布计划很大程度上依赖于客户的时间表和发布周期,即什么时候客户的产品需要包含我们的模块(交付物)
版本发布计划不是一成不变的,每个迭代结束后都可以更改
完成的定义
当迭代任务清单上的任务都完成时,变为“已完成”状态,定义“已完成”的含义是非常重要的,例如:
如何记录软件的变化
使用什么样的代码分析工具 ,发现的问题应当如何处理
进行了什么样的测试, 结果是如何记录的, 通过标准(如覆盖率、修正的错误)是什么
定义“已完成”意味着定义质量上的需求
“已完成”是0/1变量:完成或者未完成,所有的任务(task)都完成了迭代任务才算完成.
在第一个迭代开始之前应该定义好,因为它会影响工作量, 而且必须文档化,这样团队和产品所有者的理解是一致的.
完成的范围随着团队的成熟程度会逐渐发生变化
迭代
迭代任务清单规划 - 总论
迭代任务清单规划 的主要目的是从产品任务清单中挑选高优先级的任务包含在下一次迭代中,即确定迭代的范围
至于能够包含多少产品任务清单中的任务取决于Scum团队能够承诺完成多少,承诺总是来自于内部,不能从外部强加
迭代不应当有空闲时间,因此规划迭代范围时要保证工作量是稳定的 (进度是持续的速度),依赖多个因素,团队的能力、技术的成熟度、当前迭代增量的情况等
迭代的范围在迭代任务清单中描述,团队设定优先级
产品所有者 PO 定义每个迭代的任务说明、目标(sprint goal),使迭代更具有针对性,如“实现一个可扩展的列表控件,其项目是可以选择的”
Sprint 迭代计划 - 输入和输出
迭代任务清单规划 - 规划会议
召开迭代任务清单规划会议的目的是确定迭代的边界
由Scrum Master推动会议
由于会议时间有限,Product Owner和Scrum团队都应该事前进行准备
前提:产品需求清单是有效的、最新的,标注了优先级并且表述清楚
规划会议要解决两个问题:
下次迭代要做什么
确定迭代的目标,包含产品需求清单上高优先级的功能
给Bug修改留一定的余地
怎么样实现下次增量所需要的功能
改进设计以实现产品需求清单上的功能
迭代任务清单规划 - 工作流程
产品所有者向团队介绍起草的产品需求清单和迭代目标
产品所有者传达迭代的起止日期
Scrum团队从产品需求清单中选取高优先级的功能作为迭代的任务,如果有必要,更新其规模估计
Scrum团队改进架构和设计以便能够实现提出的产品需求
Scrum团队把产品需求清单的每一项划分成小的任务,并估算每个任务要花费的小时数
Scrum团队决定一个迭代中能够实现产品需求清单的多少功能
Sprint Backlog 示例
执行迭代任务清单
执行迭代任务清单意味着团队在迭代期间自行开发
团队清楚要达到什么的目标以及怎样达到目标
团队是自发组织的,成员自己挑选任务,Scrum Master提供指导并清除障碍
不能从外部改变迭代的范围或者迭代的周期
为了达到迭代的目标,团队可以增加、删除任务或者改变其优先次序
如果要重新设定迭代的范围时需要产品所有者的配合
迭代周期短,意味着工期紧,应该把重点放在剩余的工作和风险的消除,要区分任务的优先级,重要的事情应当先做
迭代应当达到项目的质量要求
没有独立的测试阶段
迭代进度图- Burndown Chart(燃尽图)
Scrum注重成果,它关心的是要花多少时间达到目标,而不是已经花费的时间,团队能否在既定的时间达到迭代的目标,可以查看要完成产品需求清单的功能所剩余的工作,描述剩余工作量和时间关系的图表称为Sprint Burndown图, 是Scrum中非常重要的控制方法,给Scrum团队和产品所有者提供直观的信息,术语burndown表明Scrum团队在迭代过程中消耗剩余工作的能力,迭代结束时其值为0,每个任务的工作量由Scrum团队来估计,每天都要进行估计,以便进行跟踪
Scrum每日例会
Scrum每日例会 - 概述
例会最长15分钟,在整个迭代过程中每天的同一时间召开
团队成员之间交流信息
了解项目的真实的进展情况
交流风险和存在的问题
面对面的会议加强了承诺
Scrum Master负责整个会议 (会议地点,邀请等)
其他人可以参与, 但只允许Scrum Master 和 Scrum 团队成员讲话
例会之前团队要更新工作量估计,使进度表保持最新
Scrum每日例会 - 形式
为使会议简短而富有成效,要遵循严格的规程,每个成员向其他人汇报以下内容:
上次会议以后所做的工作?
下次会议之前要做的工作?
工作中是否有什么障碍?
如果出现其它的问题(如设计的问题),应当在会议后处理
纪录会议纪要
障碍
基本上,任何阻止团队正常工作的,都可称之为障碍,例如:
无法访问信息系统
所需要的信息不能及时提供或者提供的不正确,如界面规格或者其它软件模块不到位或不正确
开发环境或者原型系统出现问题
其他的任务分配:培训、售前支持
缺乏必要的信息或者相应的知识
对于团队提出的各项障碍,Scrum Master要以列表形式进行记录
谁来清除障碍?
每个人
自我管理、自我组织的团队
Scrum Master
产品所有者
管理层
其他相关的干系人
Scrum Master负责确定障碍已经清除,不一定亲自自己清除
清除障碍
某些障碍是浪费
部分地完成工作
额外的过程
额外的功能
任务转换
等待
缺陷
清除障碍的过程是团队和组织学习的过程
迭代中的同步工作
迭代的非正常终止
在Scrum中,结束正在进行的迭代是一种极端的行为,只有在万不得以的情况下才能这么做,有时候确实需要停下来重新规划,而不是一味的蛮干,迭代终止可能由下面的人发起:
Scrum团队,如果他们认为达不到目标或者目标不清楚
Scrum Master, 如果迭代没有进展, 或者无法克服某个困难
客户/管理层, 如果目标已经陈旧/过时(目标产品被取消,平台过时),或者其它的原因 (资源问题等)
迭代终止以后, 启动新迭代的计划,导致迭代终止的原因不应该在新的迭代中再次出现,要考虑到合同方面的问题,如时间表的变更等
迭代评审
迭代评审 - 概述
迭代评审,在迭代结束后进行,展示迭代的成果 (功能运行)
确保成果与预期的一致,收集反馈
为项目提供一个参考点,根据目前的位置计划下一期的旅程
为下次迭代提供输入(改正、修改、新的想法à可以由产品所有者添加到产品需求清单
与其它 Scrum 会议一样, Scrum Master 主持迭代评审会议, Scrum 团队负责演示
参加会议的其他人包括: 产品所有者Product Owner (必须参加) 、客户、 管理人员, 以及其它感兴趣的人, 例如其他Scrum团队 (注意保密协议的要求)
评审会议的时间是固定的: 最长4个小时
评审会议应当是非正式的、创造性的,不用幻灯片等正式的东西
迭代评审 - 流程
在评审会议召开之前,团队要做好准备,有组织、有效地进行演示,不要超过2个小时,谁来演示,演示什么,怎样演示?
迭代评审流程的一个例子:
Scrum Master介绍本次迭代的总体情况
目标和清单 vs. 实际的结果,如果存在差距,原因是什么
Scrum团队简要介绍所涉及的技术问题,如架构及其变更
Scrum团队演示已经实现的功能
演示并进行功能说明
在场的人能够亲自尝试使用不同的功能
Scrum Master推动自由讨论,集思广益
迭代评审应当是互动的,有问题提出,问题解答,并欢迎提出想法和建议
迭代评审 - 可能的措施
产品所有者根据评审的结果可能采取如下行动:
更新产品需求清单,重新设定优先级
包含没有按计划实现的功能 (进度比预期的要慢, 任务未完成)
不在计划中当却已经实现的功能 (进度比预期的快)
迭代评审中出现的新的想法
与Scrum Master一起解决团队的变动问题
要求把演示的功能,或者把上次迭代的功能,作为一个版本发布给客户
决定项目不再持续下去,不再进行迭代,认为产品已完备
要求把产品需求清单授权给另外的团队来一起工作
迭代回顾会议 Sprint Retrospective
回顾的目的是评价本次迭代并酝酿改进,使得下一个迭代进行的更好,类似于项目的最终评审,但经常举行,Scrum Master主持召开,持续半天,Scrum团队参加 (产品所有者也可参加)
简单流程:
Scrum Master总结本次迭代,迭代任务清单,重要的事情和决策,预期的/实际进度
每个组员陈述迭代中那些方法进行的较好、哪些需要改进,Scrum Master进行记录
对重要的问题计划相应的措施,团队自己解决,或者提交给公司的管理层
九、Scrum应用(待补充)
十、敏捷开发各阶段的主要活动
项目生命周期
主要包含三个阶段:
产品定义(计划):进行迭代所需要的项目准备、项目计划和技术分析
迭代开发(执行):在固定时间的迭代中实现需求(产品需求清单中的项目)
结束:准备最终的发布,结束项目(ramp down)
产品定义阶段
通常称为“Sprint Zero” ,也使用Scrum的实践,例如每日会议
目标:进行项目准备,在计划阶段进行的计划和技术分析是为了使迭代以一种受控的方式进行
所需的活动和详细程度取决于软件的复杂程度、质量要求、项目规模、项目设置和重用的要求等
如果没有适当的计划就进入首次迭代会有很大的风险
通常情况下由核心团队完成,由专家进行项目的计划
项目在正式迭代开始之前全力进行准备
产品定义阶段的主要活动
定义产品需求清单
项目需求及其验收准则,初始的规模估计及其优先级
迭代的长度,每个产品需求清单项目所处的迭代,发布计划
由产品负责人负责进行起草,并和Scrum团队共同进行讨论
将要在本项目中重用的内容:第三方软件等
计划在本项目中开发,可以为其他项目所重用的内容
所需的可行性分析
对于工作量/规模估算的影响分析(需要包含研究、测试用例的编写、测试和文档化的工作)
架构设计
根据实际需要的充分程度,进行产品的架构设计
计划的需求如何实现
通过技术研究和技术分析,更好地进行项目计划
根据要求的指南和模版进行架构设计
其他需要考虑的问题,包括:
重要的架构需求
系统分解(模块/界面)
各个部分的特性及其之间的相互关联关系
非功能特性(性能、本地化的要求等)
设计指南
进行UI概念设计,即产品UI设计的基本方法
UI风格
主画面
交互风格
UI 设计指南
验证架构
如果有时间,已经计划的架构应该通过基本的运行框架验证
验证架构是否满足已计划的特征、性能测试的要求和扩展需求等
迭代开发阶段的主要活动
计划方法
制订完成的定义,即质量需求
考虑来自客户需求,如果没有来自客户的需求,要首先制定可行性建议
完成标准(DoD)对于迭代计划有重大的影响
根据完成的定义,计划所需的工具和方法,例如:评审,静态/动态代码分析,测试等
计划需要交付的工作产品和文档
建立需要的工具和系统
SCM,测试管理工具,BUG管理工具和文档管理工具等
根据定义的Scrum方法进行迭代计划
迭代目标:本地迭代的任务说明
迭代任务清单,以及每个任务的工作量
迭代执行:按照优先级的顺序执行迭代任务清单中的任务
根据完成的定义,软件的每一变更都是已设计的,已实现的、已验证的和已文档化的,没有单独的测试阶段
根据实际需要执行测试驱动的开发,自动测试和持续集成
同一部分代码也许会持续发生变更-再工程
随着项目的扩展,测试的工作量也越来越大
根据计划进行测试和bug报告
结束阶段的主要活动
验收测试:
通常情况下,在项目/产品交付后,客户需要进行30天的验收测试
根据实际的项目计划进行验收测试
回归测试
与客户进行项目/产品交接
支持和培训:根据计划进行支持和培训的相关工作
软件产品化:产品最终发布,帮助文件,本地化的相关工作,以及最终的技术文档等相关工作
项目归档和结束:
项目文档归档(最终版本)
项目总结报告
其他经验教训总结