软件工程第22章风险管理主要内容被动风险策略和主动风险策略软件风险风险识别风险预测风险求精风险缓解、监测和管理RMMM计划小结风险管理很多问题都会困扰软件项目,风险分析和风险管理就是一系列步骤,用来帮助软件团队管理和管理不确定的事物。风险是潜在的——它可能发生也可能不发生。但是,不管发生还是不发生,我们都应该去识别它,评估它发生的概率,估算它的影响,并制定它实际发生时的应急计划。风险管理软件项目所涉及的每一个人——管理者、软件工程师和共利益者——都要参与风险分析和风险管理。软件项目是一项困难重重的任务,大量的事情可能出错。为此,时刻准备着——理解风险、采取主动的措施去回避或管理风险——是一个好的软件项目管理者应具备的基本条件。风险管理第一步称为“风险识别”,即辨别出什么情况下可能会出现问题。第二步,分析每个风险,确定其可能发生的概率以及发生时将带来的危害。了解这些信息之后,就可以按照可能发生的概率和危害程度对风险进行排序。第三步,制定一个计划来管理那些出现概率高和危害程度大的风险。风险管理工作产品是风险缓解、监测和管理计划或一且风险信息表单。所要分析和管理的风险,应该通过彻底研究人员、产品、过程和项目来确定。RMMM计划应该随着项目的进展而修订,以保证所考虑的风险是近期可能发生的。风险管理的应急计划应该是符合实际的。风险管理首先,风险涉及的是未来将要发生的事情。今天和昨天的事情已不再关心。问题是:我们是否能够通过改变今天的行为,而为一个不同的、充满希望的、更美好的明天创造机会。其次,风险涉及改变。如思想、观念、行为、地点的改变……第三,风险涉及选择,而选择本身就具有不确定性。[CHA89]风险管理对于软件工程领域中的风险,以上三条概念定义是显而易见的。未来是我们所关心的——什么样的风险会导致软件项目彻底失败?改变也是我们所关心的——客户需求、开发技术、目标环境以及所有其他与项目相关因素的改变将会对进度安排和总体成功产生什么影响?最后,我们必须抓住选择机会——应该采用什么方法及工具?需要多少人员参与?对质量的要求要达到什么程度才是“足够的”?当没有办法消除风险,甚至连试图降低该风险也存在疑问时,这个风险就是真正的风险了。“在弄清楚软件项目中的”真正风险“之前,识别出所有对管理者及开发者而言显而易见的风险是很重要的。被动风险策略和主动风险策略大多数软件项目团队还是仅仅依赖于被动的风险策略。被动策略最多不过是针对可能发生的风险来监测项目,直到风险发生时,才会拨出资源来处理它们。大多数情况下,软件项目团队对风险不闻不问,直到出现了问题。这时,项目团队才赶紧采取行动,试图迅速纠正错误,这通常叫做”救火模式“。当这样的努力失败后,”危机管理“接管一切,这时项目已经处于真正的危机中了。被动风险策略和主动风险策略对于风险管理,更好的是主动风险策略。主动风险策略早在技术工作开始之前就已经启动了。识别出潜在的风险,评估它们发生的概率及产生的影响,并按其重要性进行排序。然后,软件项目团队就可以制定一个计划来管理风险。计划的主要目标是回避风险,但不是所有的风险都能够回避,所以项目团队必须制定一个应急计划,使其在必要时能够以可控和有效的方式做出反应。软件风险一般认为软件风险包含两个特性:不确定性——风险可能发生也可能不发生;损失——如果风险发生,就会产生恶性后果或损失。进行风险分析时,重要的是量化每个风险的不确定程度和损失程度。为了实现这点,必须考虑不同类型的风险。项目风险威胁到项目计划。如果项目风险发生,就有可能会拖延项目的进度和增加项目的成本。项目风险是指预算、进度、人员、资源、利益相关方、需求等方面的潜在问题以及它们对软件项目的影响。软件风险技术风险威胁到要开发软件的质量及交付时间。如果技术风险发生,开发工作就可能变得很困难或根本不可能。技术风险是指设计、实现、接口、验证和维护等方面的潜在问题。此外,规格说明的歧义性、技术的不确定性、技术陈旧以及”前沿“技术也是技术风险因素。技术风险的发生是因为问题比我们所设想的更加难以解决。软件风险商业风险威胁到要开发软件的生存能力。商业风险常常会危害到项目或产品。五个主要的商业风险是:(1)开发了一个没有人真正需要的优良产品或系统;(2)开发的产品不再符合公司的整体商业策略;(3)开发了一个销售部门不知道如何去销售的产品;(4)由于重点的转移或人员的变动而失去了高级管理层的支持;(5)没有得到预算或人员上的保证。软件风险另一种常用的分类方式是由[CHA89]提出的。已知风险是通过仔细评估项目计划、开发项目的商业及技术环境以及其他可靠的信息来源之后可以发现的那些风险。可预测风险能够从过去项目的经验中推断出来。不可预测风险可能会真的出现,但很难事先加以识别。风险管理的七个原则风险识别风险识别试图系统化地指出对项目计划的威胁。通过识别已知的和可预测的风险,项目管理者首先要做的是在可能时回避这些风险,在必要时控制这些风险。识别风险的一种方法是建立风险条目检查表。该检查表可用于风险识别,并且主要用来识别下列几种类型中的一些已知的和可预测的风险。风险识别产品规模商业影响客户特性过程定义开发环境开发技术人员才干及经验评估整体项目风险下面的提问来源于对世界各地的有经验的软件项目管理人员的调查而得到的风险资料,根据各个问题对项目成功的相对重要性将问题进行了排序。1.高层的软件管理者和客户管理者已经正式承诺支持该项目了吗?2.最终用户对项目和待开发的系统/产品热心支持吗?3.软件工程团队及其客户充分理解需求了吗?4.客户已经完全地参与到需求定义中了吗?5.最终用户的期望现实吗?6.项目范围稳定吗?7.软件工程团队的技能搭配合理吗?8.项目需求稳定吗?9.项目团队对将实现的技术有经验吗?10.项目团队的人员数满足项目需要吗?11.所有的客户/用户对项目的重要性和待开发的系统/产品的需求有共识吗?如果对这些问题的任何一个回答是否定的,则应务必启动缓解、监测和管理风险的步骤。风险因素和驱动因子美国空军有一本小册子,其中包含了如何很好地识别和消除软件风险的指南。他们所用的方法是要求项目管理者识别影响软件风险因素的风险驱动因子——性能、成本、支持和进度。风险因素是以如下的方式定义的:性能风险:产品能够满足需求且符合其使用目的的不确定程度。成本风险:能够维持项目预算的不确定程度。支持风险:开发出的软件易于纠错、修改及升级的不确定程度。进度风险:能够维持项目进度且按时交付产品的不确定程度。风险因素和驱动因子每一个风险驱动因子对风险因素的影响均可分为四个影响类别——可忽略的、轻微的、严重的或灾难的。图22-1指出了由于未识别出的软件失误而产生的潜在影响,或没有达到预期的结果所产生的潜在影响。影响类别的选择是以最符合表中描述的特征为基础的。风险因素和驱动因子图22-1影响评估风险预测风险预测,又称风险估计,试图从两个方面评估每一个风险:(1)风险发生的可能性或概率;(2)风险相关问题产生的后果。风险预测项目计划人员、其他管理人员及技术人员都要进行以下4步风险预测活动:1、建立一个尺度,以反映风险发生的可能性。2、描述风险产生的后果。3、估计风险对项目及产品的影响。4、标明风险预测的整体精确度,以免产生误解。风险求精在项目计划的早期,风险很可能只是一个大概的描述。随着时间的推移,对项目和风险的了解加深,可以将风险精化为一组更详细,在某种程度上,这些风险更易于缓解、监测和管理。实现方法之一是按条件-变迁-结果格式来表示风险,即采用如下方法来描述风险:给定条件,则有结论:(可能)结果风险缓解、监测和管理一个有效的风险处理策略必须考虑三个问题:风险回避。风险监测。风险管理及应急计划。如果软件团队采取主动的方法,最好的策略就是风险回避。这可以通过建立一个风险缓解计划来实现。RMMM计划风险管理策略可以包含在软件项目计划中,也可以将风险管理步骤组织成一个独立的风险缓解、监测和管理计划(RMMM计划)。RMMM计划将所有风险分析工作文档化,项目管理者也将其作为整个项目计划的一部分。某些软件团队并不建立正式的RMMM文档,而是将每个风险分别使用风险信息表单(RIS)进行文档化。在大多数情况下,RIS采用数据库系统进行维护,这样容易完成创建、信息输入、优先级排序、查找以及其他分析。小结作业