软件项目风险管理
根据风险内容,我们可以将风险分为:
(1)产品规模风险:与软件的总体规模相关的风险。
(2)商业影响风险:商业风险影响到软件开发的生存能力。商业风险包含的五个主要的风险是:
l 市场风险:开发了一个没有人真正需要的优秀产品或系统;
l 策略风险:开发的产品不符合公司的整体商业策略;
l 销售风险:开发了一个销售部门不知道如何去卖的产品;
l 管理风险:由于重点的转移或人员的变动而失去了高级管理层的支持的风险;
l 预算风险:没有得到预算或人力上的保证。
(3)客户特性风险:与客户的素质以及开发者和客户沟通能力相关的风险。
(4)过程定义风险:与软件过程定义相关的风险。
(5)开发环境风险:与开发工具的可用性及质量相关的风险。
(6)技术风险:技术风险是指在设计、实现、接口、验证、维护、规约的二义性、技术的不确定性、陈旧的技术等方面存在的风险。技术风险威胁到软件开发的质量及交付的时间,如果技术风险变成现实,则开发工作可能变得很困难或根本不可能。
(7)人员数目及经验带来的风险:与参与工作的软件工程师的总体技术水平及项目经验相关的风险。
在进行具体的软件项目风险识别时,可以根据实际情况对风险分类。但简单的分类并不是总行的通的,某些风险根本无法预测。在这里,我们介绍一下美国空军软件项目风险管理手册中指出的如何识别软件风险。这种识别方法要求项目管理者根据项目实际情况标识影响软件风险因素的风险驱动因子,这些因素包括以下几个方面。
(1)性能风险:产品能够满足需求和符合使用目的的不确定程度。
(2)成本风险:项目预算能够被维持的不确定的程度。
(3)支持风险:软件易于纠错、适应及增强的不确定的程度。
(4)进度风险:项目进度能够被维持且产品能按时交付的不确定的程度。
每一个风险驱动因子对风险因素的影响均可分为四个影响类别--可忽略的、轻微的、严重的及灾难性的。
五、风险分析
在进行了风险辨识后,我们就要进行风险估算,风险估算从以下几个方面评估风险清单中的每一个风险:
(1)建立一个尺度,以反映风险发生的可能性;
(2)描述风险的后果;
(3)估算风险对项目及产品的影响;
(4)标注风险预测的整体精确度,以免产生误解。
对辨识出的风险进行进一步的确认后分析风险,即假设某一风险出现后,分析是否有其他风险出现,或是假设这一风险不出现,分析它将会产生什么情况,然后确定主要风险出现最坏情况后,如何将此风险的影响降低到最小,同时确定主要风险出现的个数及时间。进行风险分析时,最重要的是量化不确定性的程度和每个风险可能造成损失的程度。为了实现这点,必须考虑风险的不同类型。识别风险的一个方法是建立风险清单,清单上列举出在任何时候可能碰到的风险最重要的是要对清单的内容随时进行维护,更新风险清单,并向所有的成员公开,应鼓励项目团队的每个成员勇于发现问题并提出警告。建立风险清单的一个办法是将风险输入缺陷追踪系统中,建立风险追踪工具,缺失追踪系统一般能将风险项目标示为已解决或尚待处理状态,也能指定解决问题的项目团队成员,并安排处理顺序。风险清单给项目管理提供了一种简单的风险预测技术,下表事一个风险清单的例子:
风险 类别 概率 影响
资金将会流失 商业风险 40% 1
技术达不到预期效果 技术风险 30% 1
人员流动频繁 人员风险 60% 3
在风险清单中,风险的概率值可以由项目组成员个别估算,然后加权平均,得到一个有代表性的值。也可以通过先做个别估算而后求出一个有代表性的值来完成。对风险产生的影响可以对影响评估的因素进行分析。
一旦完成了风险清单的内容,就要根据概率进行排序,高发生率、高影响的风险放在上方,依次类推。项目管理者对排序进行研究,并划分重要和次重要的风险,对次重要的风险再进行一次评估并排序。对重要的风险要进行管理。从管理的角度来考虑,风险的影响及概率是起着不同作用的,一个具有高影响且发生概率很低的风险因素不应该花太多的管理时间,而高影响且发生率从中到高的风险以及低影响且高概率的风险,应该首先列入管理考虑之中。
在这里,我们需要强调的是如何评估风险的影响,如果风险真的发生了,它所产生的后果会对三个因素产生影响:风险的性质、范围及时间。风险的性质是指当风险发生时可能产生的问题。风险的范围是指风险的严重性及其整体分布情况。风险的时间是指主要考虑何时能够感到风险及持续多长时间。可以利用风险清单进行分析,并在项目进展过程中迭代使用。项目组应该定期复查风险清单,评估每一个风险,以确定新的情况是否引起风险的概率及影响发生改变。这个活动可能会添加新的风险,删除一些不再有影响的风险,并改变风险的相对位置。
在风险评估过程中,我们可以采取以下的步骤:
(1)定义项目的风险参考水平值。要使风险评估发生作用,就要定义一个风险参考水平值,对于大多数项目而言,通过对性能、成本、支持及进度等因素的分析,可以找出风险的参考水平值,对于性能下降、成本超支、支持困难或进度延迟(或者这四种的组合)等情况,超过这一参考水平值项目就会被终止。
(2)建立每一组(风险、风险发生的概率、风险产生的影响)与每一个参考水平值的关系。
(3)预测一组临界点以定义项目终止区域,该区域由一条曲线或不确定区域界定。
(4)预测什么样的风险组合会影响参考水平值。
六、风险驾驭
风险驾驭包括对策指定、风险缓解、风险监控、风险跟踪等内容。
所有风险分析活动都只有一个目的--辅助项目组建立处理风险的策略。如果软件项目组对于风险采取主动的方法,则避免永远是最好的策略。这可以通过建立一个风险缓解计划来达到即制定对策。
对不同的风险项要建立不同的风险驾驭和监控的策略比。如对于开发人员离职的风险项目开始时应作好人员流动的准备采取一些措施确保人员一旦离开时项目仍能继续;制定文档标准并建立一种机制保证文档及时产生;对每个关键性技术岗位要培养后备人员。对于技术风险,可以采用的策略有,对采用的关键技术进行分析,避免软件在生命周期中很快落后;在项目开发过程中保持对风险因素相关信息的收集工作,减少对合作公司的依赖尤其是对延续性强的项目应该尽可能地吸收合作公司的技术并变为自己的技术,避免因为可能发生的与合作公司合作的终止带来的影响和风险降低投入成本。
一个有效的策略必须考虑风险避免、风险监控和风险管理及意外事件计划这样三个问题。风险的策略管理可以包含在软件项目计划中,或者风险管理步骤也可以组成一个独立的风险缓解、监控和管理计划(RMMM计划)。RMMM计划将所有风险分析工作文档化,并且由项目管理者作为整个项目计划的一部分来使用,RMMM计划的大纲主要包括:主要风险,风险管理者,项目风险清单,风险缓解的一般策略、特定步骤,监控的因素和方法,意外事件和特殊考虑的风险管理等。一旦建立了RMMM计划,我们就开始了风险缓解及监控,风险缓解是一种避免问题的活动,风险监控则是跟踪项目的活动。它有三个主要目的:评估一个被预测的风险是否真的发生了;保证为风险而定义的缓解步骤被正确地实施;收集能够用于未来的风险分析信息。
软件开发是高风险的活动。如果项目采取积极风险管理的方式,就可以避免或降低许多风险,而这些风险如果没有处理好,就可能使项目陷入瘫痪中。因此在软件项目管理中还要进行风险跟踪。对辨识后的风险在系统开发过程中进行跟踪管理,确定还会有哪些变化,以便及时修正计划。具体内容包括:
(1)实施对重要风险的跟踪;
(2)每月对风险进行一次跟踪;
(3)风险跟踪应与项目管理中的整体跟踪管理相一致;
(4)风险项目应随着时间的不同而相应地变化。
通过风险跟踪,进一步对风险进行管理,从而保证项目计划的如期完成。
七、经典风险管理理论
6.1 Boehm模型
Boehm用公式RE=P(UO)*L(UO)对风险进行定义,其中RE表示风险或者风险所造成的影响,P(UO)表示令人不满意的结果所发生的概率,L(UO)表示糟糕的结果会产生的破坏性的程度。在风险管理步骤上,Boehm基本沿袭了传统的项目风险管理理论,指出风险管理由风险评估和风险控制两大部分组成,风险评估又可分为识别、分析、设置优先级3个子步骤,风险控制则包括制定管理计划、解决和监督风险3步。
Boehm思想的核心是10大风险因素列表,其中包括人员短缺、不合理的进度安排和预算、不断的需求变动等。针对每个风险因素,Boehm都给出了一系列的风险管理策略。在实际操作时,以10大风险列表为依据,总结当前项目具体的风险因素,评估后进行计划和实施,在下一次定期召开的会议上再对这10大风险因素的解决情况进行总结,产生新的10大风险因素表,依此类推。
10大风险列表的思想可以将管理层的注意力有效地集中在高风险、高权重、严重影响项目成功的关键因素上,而不需要考虑众多的低优先级的细节问题。而且,这个列表是通过对美国几个大型航空或国防系统软件项目的深入调查,编辑整理而成的,因此有一定的普遍性和实际性。但是它只是基于对风险因素集合的归纳,尚未有文章论述其具体的理论基础、原始数据及其归纳方法。另外,Boehm也没有清晰明确地说明风险管理模型到底要捕获哪些软件风险的特殊方面,因为列举的风险因素会随着多个风险管理方法而变动,同时也互相影响。这就意味着风险列表需要改进和扩充,管理步骤也需要优化。
虽然其理论存在一些不足,但Boehm毕竟可以说是软件项目风险管理的开山鼻祖。在其之后,更多的组织和个人开始了对风险管理的研究,软件项目风险管理的重要性日益得到认同。
6.2 CRM模型
SEI(Software Engineering Institution)作为世界上著名的旨在改善软件工程管理实践的组织,也对风险管理投入了大量的热情。SEI提出了持续风险管理管理模型CRM(Continuous Risk Management)。
SEI的风险管理原则是:不断地评估可能造成恶劣后果的因素;决定最迫切需要处理的风险;实现控制风险的策略;评测并确保风险策略实施的有效性。
CRM模型要求在项目生命期的所有阶段都关注风险识别和管理,它将风险管理划分为5个步骤:风险识别、分析、计划、跟踪、控制。框架显示了应用CRM的基础活动及其之间的交互关系,强调了这是一个在项目开发过程中反复持续进行的活动序列。每个风险因素一般都需要按顺序经过这些活动,但是对不同风险因素开展的不同活动可以是并发的或者交替的。
6.3 Leavitt模型
SEI和Boehm的模型都以风险管理的过程为主体,研究每个步骤所需的参考信息及其操作。而Aalborg大学提出的思路则是以Leavitt模型为基础,着重从导致软件开发风险的不同角度出发探讨风险管理。
1964年提出的Leavitt模型将形成各种系统的组织划分为4个有趣的组成部分:任务、结构、角色和技术。这4个组成部分和软件开发的各因素很好地对应起来:角色覆盖了所有的项目参与者,例如软件用户、项目经理和设计人员等;结构表示项目组织和其他制度上的安排;技术则包括开发工具、方法、硬件软件平台;任务描述了项目的目标和预期结果。Leavitt模型的关键思路是:模型的各个组成部分是密切相关的,一个组成部分的变化会影响其他的组成部分,如果一个组成部分的状态和其他的状态不一致,就会造成比较严重的后果,并可能降低整个系统的性能。