作者 Vikas Hazrati译者 麦天志 发布于 2009年2月1日 下午7时22分
风险管理包括风险评估、舒缓风险影响以及监控风险。很多敏捷用家相信敏捷开发项目风险管理过程跟传统项目差不多,虽然这过程在敏捷的内容中较为轻盈,但是在找寻、过滤、优先化以及制造解决方案上的步骤跟传统项目中很接近。
Mike Cottmeyer提出以敏捷开发去识别和舒缓风险影响更为有效,他指出:
敏捷开发方式之所以能有效管理风险因为风险管理过程建立在我们执行项目的结构上,这隐含的意思就是风险在项目中无处不在,风险清单不能包括所有风险,也不 能透过团队会议和定期的风险评估来减轻风险,风险处理必须是不能抽离的思想,我们减轻风险的策略不是处于项目以外,而是影响着如何规划和安排工作的本质。
他把风险分成三类:
- 业务风险 – 涉及项目付运能否带来它所预期的价值
- 技术风险 – 涉及技术方案在若干时间及资金下的可行性
- 后勤风险 – 涉及人与其他基建之间的假设
根据Mike所说,敏捷开发的本质就是要求频密的付运、定时的检察和调整,这本身已经是风险管理。
但是也有人认为敏捷开发不是固有地处理风险。
Jurgen Appelo认为敏捷项目经常缺乏风险的关注。
他认为,
Prince2、PMBOK、CMMI都有包含风险管理的部份,但敏捷方法的书本上就很少明确地看到风险管理的内容,对此我感到莫名其妙。
他同時指出,项目经理经常埋头在项目里,而忽略了整体宏观形势,这导致严重缺乏对风险管理的关注。
另外,James Shore认为有效的风险管理能帮助团队作出更实在的承诺,他建议使用风险倍数(risk multiplier)和Burn-up图来管理项目有关的风险。
风险倍数包括常见的风险,例如人事变动、要求改变、工作上的障碍之类,这些风险倍数让你更准确地于设定日期和估计需要多少故事点数(story potints)。
James建议在团队使用较为精确的开发过程(相对于风险较高的开发过程,可参考James网站上这例子),而且速度(velocity)固定、每个故事都在迭代完结时做到"Done Done"(不仅完成客户需要的功能,而且没留下支持团队的工作,原文出至于James的网站,亦可参考"The Power of Done"一文)的情况下使用以下的风险倍数。
风险倍数
机会率 | 精确的开发过程所使用的倍数 | 內容 |
10% | 1 | 几乎没可能 |
50% | 1.4 | 伸延目标--只得一半机会,有机会再去完成 |
90% | 1.8 | 几乎可以成事的承诺 |
(这些倍数来至DeMarco和Tim Lister的RISKOLOGY模拟器(详文可参考「与熊共舞」一书)以及Todd Little的分析数据)
这风险倍数使用方式如下:
(假设团队的速度为14,十个迭代后发布的话,那么当前可运用的故事点数有140点)
机会率 | 能完成的故事点数 | 內容 |
10% | 140 (140 ÷ 1) | 几乎没可能 |
50% | 100 (140 ÷ 1.4) | 伸延目标--只得一半机会,有机会再去完成 |
90% | 78 (140 ÷ 1.8) | 几乎可以成事的承诺 |
从以上例子中:
让你可以跟项目有关人士和管理人员说:「我们几乎肯定会在发布前完成当中的78点,所以我们先承诺完成功能A、B和C,我们有一半机会能完成总共100点,所以我们安排功能X、Y和Z作为伸延目标,完成好A、B和C之后再去完成他们的。」
所以风险管理在敏捷项目中就如传统项目一样,都是核心部份,重点在于适当的重视、有效地处理而基于这里作出承诺。
查看英文原文:Agile Risk Management
译者附注:
James的网站有更多关于其风险倍数的内容,亦可参考他所写的"The Art of Agile Development"一书,特别是此文没有包括的Burn-up图。此外,风险倍数的使用还有其他注意的地方:
- 「承诺」背后的意义,值得思考的就是「承诺」到底是什么、管理人员如何理解和使用这里作出的「承诺」。要知道,这些还是机会率,如果最后变成合约,又或者客户拿来争议的「论点」,那么也是没有意思的。
- 风险倍数的由来,这里的1、1.4和1.8是如何得出呢?到底又有多适合您的项目情况呢?就连James自己的网页上 也有这样一句 "I'm guessing somewhat at how accurately they apply to XP. The most accurate approach is to calculate your own risk multipliers from past project history, but most companies don't track that data" (我在猜这些数字对极限编程的情况有多准确,最准确的方式还是根据过往项目纪录来计算您的风险倍数,但很多公司根本不会记下这些数据),所以千万不要把这 些数字看成什么魔幻数字。
- 延续上面这点,如果公司为了提供「承诺」而去收集项目相关数据,这是否对容户有所得益呢?容户为什么要投资金钱给开发公司去收集数据?客户又如何可以知道投资金钱让公司收集这些数据可以有所回报呢?
其他方法如Prince2、PMBOK或CMMI等对风险管理都有值得参考之处,而跟敏捷有关的独特观点则是减少开发上浪费而没必要的过程和活动,之前在「Scrum的风险管理」也有相关的讨论。
还有,要好好管理风险,评估形势的能力很重要,甚至比其方法更重要,例如如何猜量我们是否在"风险较高进行开发"呢?这里其实可以套用Stacey模型和Cynefin模型来辅助。
PS:
《Rapid Development》一书中对Risk Management作出了详细讲解
进度计划风险的完整列表:
计划编制风险:
1,计划、资源和产品定义全凭客户或上层领导口头指令,并且不完全一致
2,计划是优化的,是“最佳状态”(但不现实,只能算是“期望状态”)
3,计划忽略了必要的任务
4,计划基于使用特定的小组成员,而那个小组成员其实指望不上
5,在限定的时间内无法建成已定规模大小的产品
6,产品规模比估计的要大
7,工作量大于估算数
8,进度已经延迟的项目在重新评估时过于优化或忽视项目历史
9,过度的进度压力造成生产率下降
10,目标日期提前,但没有相应地调整产品范围或可用资源
11,一个任务的延迟导致相关任务的连锁反应
12,涉足不熟悉的产品领域,花费在设计和实现上的时间比预期的要多
组织和管理:
1,项目缺乏一个有凝聚力的高层领导人
2,由于前期乏力,项目长时间被搁置
3,解雇和消减开支导致项目小组能力下降
4,仅由管理层或市场人员进行技术决策,导致计划进度延长
5,低效的项目组结构降低生产率
6,管理层审查/决策的周期比预期时间长
7,预算消减打乱项目计划
8,管理层做出了打击项目组积极性的决定
9,非技术的第三方的工作比预期长
10,计划性太差,无法适应预期的开发速度
11,项目计划由于压力而放弃,导致开发混乱、低效
12,管理层强调英雄主义,而忽视客观确切的状态报告,这会降低发现和改正问题的能力
开发环境:
1,设施没有及时到位
2,设施到位,但不配套
3,设施拥挤、杂乱或者破损
4,开发工具未能及时到位
5,开发工具不如期望地那样有效,开发人员需要时间创建工作环境或者切换新的工具
6,开发工具的选择不是基于技术需求,不能提供计划要求的性能
7,新开发工具的学习期比预期的长,内容繁多
最终用户
1,最终用户坚持新的需求
2,最终用户对于最后交付的产品不满意,要求重新设计和重做
3,最终用户不买进项目产品,无法提供后续支持
4,最终用户的意见未被采纳,造成产品最终无法满足用户期望,而必须重做
客户
1,客户坚持新的需求
2,客户对规划、原型和规格的审核/决策周期比预期的要长
3,客户没有或不能参与规划、原型和规格的审核,导致需求不稳定和耗时的变更
4,客户答复的时间比预期长
5,客户坚持技术决策而导致进度计划延长
6,客户对开发进度管理过细,导致实际进展缓慢
7,客户提供的组件无法与开发的产品匹配,导致额外的设计和集成工作
8,客户提供的组件质量欠佳,导致额外的测试、设计和集成工作,以及额外的客户关系管理工作
9,客户要求的支持工具和环境不兼容、性能差或者功能不完善,导致生产率降低
10,客户不接受交付的软件,尽管它满足了所有的规格
11,客户期望的开发速度是开发人员无法达到的
承包商
1,承包商没有按承诺交付组件
2,承包商递交的组件质量低下无法接收,必须花时间改进质量
3,承包商没有买进项目开发需要的工具,进而无法提供需要的性能水平
需求
1,需求已经成为项目基准,但变化还在继续
2,需求定义欠佳,而进一步的定义会扩展项目范畴
3,添加额外的需求
4,产品定义含混的部分比期望需要更多的时间
产品
1,错误发生率高的模块需要比预期更多的测试、设计和实现工作
2,校正质量低下不可接受的产品,需要比预期更多的测试、设计和实现工作
3,在一个或多个新兴领域推广计算机技术使得计划进度的延长不可预期
4,由于软件功能的错误,需要重新设计和实现
5,开发额外不需要的功能(镀金)延长了计划进度
6,要满足产品规模与速度要求,需要比预期更多的时间,包括重新设计和实现的时间
7,严格要求与现有系统兼容,需要进行比预期更多的测试、设计和实现工作
8,要求与其他系统、其他复杂系统或不受本项目组控制的系统相连,导致无法预料的设计、实现和测试工作
9,要求在不同操作系统下运行将花费比预期更长的时间
10,在不熟悉或未经检验的软件环境中运行产生未预料到的问题
11,在不熟悉或未经检验的硬件环境中运行产生未预料到的问题
12,开发一种对组织全新的模块将比预期花费更长时间
13,依赖正在开发中的技术将延长计划进度
外部环境
1,产品依赖政府规章,而规章的改变将是不可预期的
2,产品依赖草拟中的技术标准,而最后的标准将是不可预期的
人员
1,招聘人员所花时间比预期的长
2,作为先决条件的任务不能按时完成
3,开发人员和管理层之间关系不佳导致决策缓慢,影响全局
4,项目组成员没有全身心投入项目,进而无法达到需要的产品性能水平
5,缺乏激励措施,士气低下,降低了生产能力
6,缺乏必要的规范,增加了工作失误与重复工作
7,某些人需要更多时间适应不熟悉的软件工具和环境
8,某些人需要更多时间适应不熟悉的硬件环境
9,某些人需要更多时间适应不熟悉的编程语言
10,项目结束前,合同制人员离开团队
11,项目结束前,雇员辞职
12,项目后期加入新的开发人员,额外的培训和沟通降低现有成员的效率
13,项目组成员不能有效地一起工作
14,由于项目组成员间的冲突,导致沟通不畅、设计欠佳、接口错误和额外的重复工作
15,有问题的成员没有调离项目组,损害了项目组其他成员的积极性
16,项目的最佳人选未能加入项目组
17,项目的最佳人选已加入项目组,但因政治或其他原因未能合理使用
18,没有找到项目急需的具有特定技能的人
19,关键人物只能兼职参与
20,项目人员不足
21,任务的分配与人员技能不匹配
22,人员工作的进展比预期的慢
23,项目管理人员怠工导致计划和进度失效
24,技术人员怠工导致工作遗漏或质量低下,工作需要重做
设计和实现
1,设计过于简单,无法确定主要事件,并导致重新设计和实现
2,设计过于复杂,导致一些不必要的工作,影响实现效率
3,设计质量低下,导致重复设计和实现
4,使用不熟悉的方法,导致额外的培训时间,并重犯前期使用这种方法时导致的错误
5,产品采用低级语言来实施,导致生产率比预期的低
6,一些必要的功能无法使用现有的代码和库实现,开发人员必须使用新的库或者自行开发必要的功能
7,代码和库质量低下,导致需要额外的测试、错误修正或重做
8,过高妒忌了增强型工具对计划进度的节省量
9,分别开发的模块无法有效集成,需要重新设计或重做
过程
1,大量的纸面工作导致进程比预期的慢
2,进程跟踪不准确,导致无法预知项目是否已落后于计划进度
3,前期的质量保证行为不真实,导致后期的重复工作
4,质量跟踪不准确,导致无法得知影响进度的质量问题
5,太不正规,导致沟通不足、质量问题和工作重做
6,过于正规,导致过多耗时无用的工作
7,向管理层撰写进程报告占用的开发人员的时间比预期的多
8,风险管理粗心,导致没有发现重大的项目风险
9,软件项目风险管理花费的时间比预期的多