论文摘要:随着信息技术的飞速发展,软件产品的规模也越来越大,各软件企业在开发活动中都为了使软件项目能够按照预定的成本、进度和质量顺利完成而进行有效的分析和管理.但因软件是纯知识产品,其开发进度和质量很难估计和度量,生产效率也难以预测和保证,加之软件系统本身的结构和技术复杂性等原因,造成了开发过程中存在某些“未知量”或“不确定因素”,这必然给项目的开发带来一定程度的风险,可能会使项目计划失败或不能完全达到预期的目标.介绍了软件项目风险管理的重要性,探讨了软件项目风险管理的主要过程和步骤以及常用的工具和方法,详细分析了软件项目中常见的风险类型和风险成因,最后给出了经典的风险管理模型和常用的风险应对措施。本文选自《计算机科学》。《计算机科学》由国家科技部主管,国家科技部西南信息中心主办,系“中文科技核心期刊”、“中国科技论文统计与分析用期刊”、“中国科学引文数据库来源期刊”、“中国期刊方阵双 效期刊”、“中国计算机学会会刊”、“重庆市优秀期刊”。
关键词:项目管理,风险分析,风险管理,风险应对,模型,计算机科学
引言
软件项目都存在着这样那样的风险,软件项目风险管理是指对在软件开发过程中所遇到的预算和进度等方面的问题以及这些问题对软件项目的影响进行分析,积极寻求风险应对方法,做好风险管理计划.
软件项目风险会影响项目计划的实现,如果项目风险变成现实,就有可能影响项目的进度,增加项目的成本,甚至使软件项目不能实现.如果在进行软件项目开发时,注重风险分析,实施风险管理,就可以最大限度的减少风险地发生,从而提高项目成功的机会.
目前,国内的软件企业不太关心软件项目的风险管理,结果造成软件项目经常性的延期、超过预算,甚至失败.成功的项目管理一般都对项目风险进行了良好的管理.因此,任何一个系统开发项目都应将风险管理作为软件项目管理的重要内容.总之,对项目风险进行科学、准确的判别,为项目决策层和管理人员提供科学的评估方法,是十分必要的.
1项目风险管理
项目是一系列独特的、复杂的并相互关联的活动,这些活动具有一个明确的目标并且必须在特定的时间和预算内依据规范完成.项目风险管理是指为了最好的达到项目的目标而去识别、分配以及应对项目生命周期内所产生风险的科学与艺术.项目风险管理的主要目的是系统识别与项目有关的风险,评价、管理和改善项目的执行效果.项目风险管理的目标是使潜在机会或回报最大化,使潜在风险最小化.它有影响项目设计和项目基准计划的潜力.
风险管理涉及的主要过程和步骤包括:风险识别、风险量化、风险应对计划制定和风险监控,如图1所示
(1)风险识别.风险识别在项目的开始时就要进行,并在项目执行中不断进行.也就是说,在项目的整个生命周期内,风险识别是一个连续的过程.软件项目由于其本身的创造性,注定了其风险的复杂性.风险识别包括确定风险的来源,风险产生的条件,描述其风险特征和确定哪些风险事件有可能影响本项目.风险识别不是一次就可以完成的事,应当在项目的自始至终定期进行.
风险识别的过程如图2所示,风险识别的输入可能是项目的WBS、SOW以及项目相关信息等数据;风险识别的常用方法是建立“风险条目检查表”,利用一组提问来帮助项目风险管理者了解在项目和技术方面有哪些风险,风险识别的输出则是风险列表.此外,还有风险识别问询法(座谈法、专家法)、财务报表法、流程图法、现场观察法、相关部门配合法和环境分析法等其他方法.
(2)风险量化.对已识别的风险要进行估计和评价,风险量化的主要任务是确定风险发生的概率与后果,风险评价则是确定该风险的经济意义及处理的费用/效果分析,常用的方法有:概率分布、外推法和多目标分析法等.它涉及对风险及风险的相互作用的评估,是衡量风险概率和风险对项目目标影响程度的过程.风险量化的基本内容是确定哪些事件需要制定应对措施.
(3)风险应对计划制定.针对风险量化的结果,风险应对计划根据风险管理计划、风险排序和风险认知等依据,采取风险控制、风险自留和风险转移等方法,从而为降低项目风险的负面效应制定风险应对策略,得出风险应对计划.
(4)风险监控.风险监控,包括对风险发生的监督和对风险管理的监督,前者是对已识别的风险源进行监视和控制,后者是在项目实施过程中监督人们认真执行风险管理的组织和技术措施.对涉及整个项目管理过程中的风险进行应对.该过程的输出包括应对风险的纠正措施以及风险管理计划的更新.
总之,风险管理的每个步骤所使用的工具和方法详见表l:
2软件项目中的风险管理
2.1软件项目中的风险分类及成因分析
软件项目的风险主要体现在以下四个方面:需求、技术、成本和进度.软件项目开发中常见的风险有:
(1)需求风险.需求风险的形成,可以从三方面进行分析:首先是由于应用部门的介人与参与程度不够,考虑需求往往从部门或局部的角度出发;其次是项目组对需求的调研目标不明晰,分析不透彻,缺乏有效的需求变化管理所造成的.这大都是因为从事软件开发的都是“高科技人员”,都具有“从专业或学术角度出发”的特点,而往往忽视了对业务知识的深入了解,不能很好地理解甚至是误解客户的需求;第三,是由于缺乏与决策层进行深层次的交流,难以掌握企业的发展趋势,对需求的延伸性不明确.这些需求不确定性的风险,都可能会造成大量工作“跑题”浪费,甚至是到项目都快要完成时,依然出现应用部门对系统提出一些基本的业务需求,或是软件功能实现了,却发现实际业务已发生了变化,导致软件失去了应有的价值等,使时间和成本的投入成倍增长,甚至是系统无法正常投入使用.
(2)计划编制风险.计划编制风险主要体现在:计划是优化的“最佳状态”,但计划不现实,处于“期望状态”;计划、资源和产品定义全凭客户或上层领导口头指令,并且不完全一致,缺乏翔实的书面计划;计划基于使用特定的小组成员,而那个特定的小组成员其实指望不上;完成目标日期提前,但没有相应地调整产品范围或可用资源;产品规模(如代码行数、功能点以及与前一产品规模的百分比等)比估计的要大等.
(3)组织和管理风险.组织和管理风险大都是由于项目经理或管理人员缺乏项目管理知识,对项目的工作范围不明确,对总体计划、阶段计划的作用认识不足,对项目的风险估计不足,而造成计划与控制脱节,无法进行有效的项目进度管理;而且,由于项目管理人员的协调管理能力不足,执行力度不够,使得项目协调成本和时间成本大大增加,从而造成工作延误等.
(4)人员与开发环境风险.人员风险主要体现在缺乏激励措施,士气低下,开发人员和管理层之间关系不佳,导致决策缓慢,影响全局,从而降低了生产能力;项目后期加入新的开发人员,需进行培训并逐渐与现有成员沟通,从而使现有成员的工作效率降低;不适应工作的成员没有调离项目组,影响了项目组其他成员的积极性;由于项目组成员之间发生冲突,导致沟通不畅、设计欠佳、接口出现错误和额外的重复工作等.开发环境风险主要有:开发工具未及时到位或不如期望的那样有效,开发人员需要时间创建工作环境或者切换新的工具;新的开发工具的学习期比预期的长,内容繁多;设施拥挤、杂乱破损、未及时到位或者虽到位,但不配套(如没有电话、网线、办公用品等).
(5)设计技术和实现过程风险.设计技术风险可以直接导致项目失败.选择没有成功的案例或不熟悉行业业务的开发商;项目的目标、范围超过了项目组的实现能力;采用不熟悉或是欠成熟先进的开发工具、不符合行业特点的数据分析模型;设计质量低下,分别开发的模块无法有效集成,需要重新设计或制作;一些必要的功能无法使用现有的代码和库实现,开发人员必须使用新的库或者自行开发新的功能;代码和库质量低下,导致需要进行额外的测试,修正错误,或重新制作等,这都无疑会使项目处于毁灭性的风险之中.过程风险主要有前期的质量保证行为不真实,导致后期的重复工作;太不正规(如缺乏对软件开发策略和标准的遵循),导致沟通不足,质量欠佳,甚至需要重新开发;过于正规(如教条地坚持软件开发策略和标准),导致过多耗时于无用的工作等.
(6)客户与产品风险.客户风险主要表现在:客户的意见未被采纳,造成产品最终无法满足客户要求,要求重新设计或重做;客户没有或不能参与规划、原型和规格阶段的审核,导致需求不稳定和产品生产周期的变更;客户答复的时间(如回答或澄清与需求相关问题的时间)’以及决策周期比预期长;客户提供的组件质量欠佳,导致额外的测试、设计和集成工作,以及额外的客户关系管理工作.产品的风险主要表现在:开发额外的不需要的功能或依赖正在开发中的技术,从而延长了计划进度;严格要求与现有系统兼容或与其他系统(不受本项目组控制的系统)相连以及矫正质量低下的不可接受的产品,从而导致比预期更多的无法预料的设计、实现和测试工作等.
2.2常见的软件项目风险管理模型
针对软件项目中的风险管理问题,不少专家、组织提出了自己的风险管理模型.常见的主要风险管理模型有:连续风险管理模型(CRM)、Boehm模型和软件工程风险模型(SERIM).
(1)SEI的连续风险管理模型(CRM).SEICRM模型的风险管理原则是不断地评估可能造成恶劣后果的因素;决定最迫切需要处理的风险;实现控制风险的策略;评测并确保风险策略实施的有效性.CRM模型要求在项目生命期的所有阶段都关注风险识别和管理,它将风险管理划分为五个步骤:风险识别、分析、计划、跟踪、控制.
(2)BarryBoehm模型.Boehm模型的思想核心是:10大风险因素列表.针对每个风险因素,都给出了一系列的风险管理策略.在实际操作时,Boehm以lO大风险列表为依据,总结当前项目具体的风险因素,评估后进行计划和实施,在下一次定期召开的会议上再对这lO大风险因素的解决情况进行总结,产生新的lO大风险因素表,依此类推.
Boehm模型的基本形式可描述为:RE=P(UO),IcL(UO),其中RE表示风险或者风险所造成的影响;P(uo)表示令人不满意的结果所发生的概率;L(uo)表示糟糕的结果会产生的破坏性的程度.
(3)软件工程风险模型(SERIM).SERIM模型要求从技术和商业两个角度对软件风险管理进行剖析,考虑的问题涉及开销、进度、技术性能等.它还提供了一些指标和模型来估量和预测风险,由于这些数据来源于大量的实际经验,因此具有很强的说服力.
2.3常见的风险应对措施
风险分析活动分析的目的在于建立处理风险的策略.而风险规避的最好方式是把风险控制在项目启动阶段,把损失减小到最小程度.常见的风险应对措施有:
(1)建立畅通的沟通渠道和沟通策略.需求的不确定性风险很大程度上是由沟通不畅引起的.因此,在需求调研阶段,要多和应用部门沟通,了解他们真正的需求,最好能将目标系统的模型向应用部门演示,并得到反馈意见,直到双方都达成共识,形成双方认可的验收方案和验收标准,并做好变更控制和配置管理,尽量降低需求不确定性风险.
(2)配备高素质的项目管理人员.最好是具有丰富的项目管理经验,或是经过系统的项目管理知识训练的人员来担任项目经理,通过制定有效的项目管理计划,并认真执行落实,提高项目的可控性.同时,风险不是静止的、一成不变的,它会随着项目状况的变化而变化,因此,风险管理必须被作为一个日常的正式活动列入项目工作计划,成为项目管理人员的一个重要工作.
(3)建立一支协作高效的项目团队.技术部门有技术,业务部门有需求,因此,项目组中不仅要有开发商和技术部门的参与,更要有应用部门的参与,从而形成一个合作的项目工作团队,共同理解企业的战略规划和业务发展,从整体全局的角度,提出有效的信息化需求,共同研讨项目进展中出现的问题,共同控制项目进度,共同为项目质量把关.
(4)制定科学的风险管理计划.从风险管理的角度对项目规划或计划进行审核,建立“风险清单”,对每个可能存在风险的表现、范围、时间做出尽量准确的判断并对风险进行监控,提前做好应对准备.如针对需求风险,要制定相应的需求变更控制;针对技术风险,要安排核心技术人员全程参与开发等.
(5)选择合适的开发技术.虽然在系统设计时需要考虑新技术的发展和技术的先进性问题,但“最好的不一定是最合适的,最合适的才是最好的”,如果项目组的人员对所需开发的技术不熟,在满足业务需求的前提下,尽可能采用熟悉的技术来减轻项目在成本或进度方面的影响,也可以事先进行培训来减轻对项目的影响,以避免因技术瓶颈导致的项目失败.
3结束语
软件项目管理从某种意义上讲,就是风险管理.在项目风险管理中,存在多种风险管理方法与工具,软件项目管理只有找出最适合自己的方法与工具并应用到风险管理中,才能更好地适应快速而又无序变化的商业环境,才能尽量减少软件项目的风险,以确保在规定的预算和期限内更好地完成软件项目,从而促进项目的成功.