管理观察ManagementObserver总第603期第4期2016年2月上旬出版·105·需求变化管理是软件项目管理的重要内容,是度量软件过程成熟度的重要指标。实施需求变化如同给病人动手术一样,要花费时间、成本,影响开发进度和预算,而且有可能不能完全医治、留下后遗症,影响软件质量。需求变化是一件很微妙的事情,用户希望把一个需要两次点击的功能,改成只一次点击,就会导致需求变化,并影响编码和测试、增加成本、延误进度。因此,要提交用户满意的软件,预防和控制需求变化是上策。为了有针对性地实施需求变化控制策略,首先要了解什么原因可能导致需求变化,以及这些原因之间的相互作用关系。需求变化是对需求进行某种修改或转换,并产生新需求的过程。需求变化是不可避免的,也不完全是一件坏事情,因为需求变化是完善和优化需求的必经之路。但频繁的需求变化会导致开发灾难:增加成本、延误时间,甚至导致项目失败[1]。需求变化的产生来自许多原因,例如[2,3]:项目复杂、规模大;开发人员缺乏对项目背景的充分理解;用户参与不足或缺乏与用户的交流;开发人员看问题的视角及表达需求的方式不同;表达术语缺乏统一性等。需求变化是开发中矛盾出现及转化的过程。矛盾的产生有内因和外因。尽管项目的复杂性和规模不是人能控制的,但人仍然是导致需求变化的重要因素。需求变化的外部原因[4]包括:人、技术与环境[5~8]。这三大外因相互联系、相互影响,但以人为主导因素。技术是由人创造和选择的,是否恰当或成熟既与项目的特征有关,也与技术的有效性有关。环境是由人来布置的,·106·工商管理与案例研究环境是否恰当既与开发人员的经验和知识有关,也与客户提供的经费和要求有关。但人的能力是有限的,技术和环境有可能超越预想的效果而显示出其固有的、不可预知的一面。(1)人的因素需求开发与管理是一种人类行为,是个人行为的组合,是涉众——软件开发工程师、项目管理人员、客户等与项目相关的人共同协作的结果。一方面,客户最初提出来的需求不清晰、不完整,需要需求工程师帮助他们理清思路、明确自己要达到的目标。另一方面,通过与客户的交流与沟通,能够使工程师更好地理解项目背景、业务规则,深入挖掘需求。在需求获取和分析的过程中,存在着许多诱发需求变化的因素,它来自开发与管理人员或者客户。开发与管理人员存在的常见问题是:缺乏开发、管理经验与常识,缺乏软件工程理论的指导,对开发、管理工具和技术不熟练或缺乏对新工具、新技术的了解;缺乏与客户沟通的技巧;不认真细致了解项目背景和领域知识,项目范围或业务目标不明确;擅自修改或随意添加需求,导致需求不符合用户需要或蔓延;开发人员与管理人员之间缺乏交流与互动;没有制定有效的管理和风险预警策略;不同的需求工程师对业务规则的理解出现偏差;没有优化需求,没有对需求进行正确性、完整性、一致性测试。客户存在的常见问题是:不清楚自己想要什么,但随着开发过程的深入,对所期望的目标有了更加清晰的认识,这时可能会改变原来的主意或对模块的界面、功能和性能方面提出更高更多的要求;不积极配合开发人员,对开发人员提出的问题敷衍其事,甚至一切放手让开发人员自行决定;客户对开发人员和开发效果的期望值太大;客户管理方行政审批层次太多,官僚之风盛行。(2)技术的因素需求开发与管理离不开技术和工具的使用,如果使用得当,则能够提高效率,减少需求变化的可能性。从开发技术角度,影响需求开发效率有三种因素:软件开发模型;需求分析方法;技术的变化。软件开发过程是需求演化的过程,是基于现有的知识和经验对未来的软件系统进行预想和创造的过程。良好的预想效果要基于合适的软件工程开发模型,有方法、按步骤地对需求进行不断完善和修正。软件开发过程各个阶段之间的关系不是顺序和线性的,而是带有客户和开发人员意见反馈的迭代过程。软件开发模型是对软件开发过程的抽象,它定义了软件开发活动各阶段之间的联系,为开发提供方法和原则指导。常见的软件开发模型有:瀑布模型、原型模型、螺旋模型、变换模型等。每种模型的开发指导思想都是正确的,但它们的适用性是有倾向性的。随着项目的特点、规模、复杂性的不同,它们所产生的效果也不同。例如:瀑布模型要求在软件开发的初始阶段指明软件系统的全部需求,缺乏演化观点来处理需求的获取,会使开发陷入困境;原型开发适合规模小的项目,能够尽快向客户提供原型,使用户容易明确自己的真正所需,能加强客户和软件开发人员对软件项目需求的理解,有助于需求的定义和确认;螺旋模型能够强化客户和开发人员的风险意识,尽早避免开发进入僵局;变换模型能够提供形式化的开发方法,有效检测需求,避免需求错误。在实践中通常会将几种模型组合使用,以便充分利用各种模型的优点。常见的需求分析方法为:面向数据流、面向对象、面向数据、面向问题域和面向方面的方法。这些方法同时也是需求建模方法,并且都具备语言机制,供需求分析人员表达用户需求和构造软件模型。显然,这些方法的效率也是各不相同的。需求分析方法的效率要体现在:能够准确理解、正确表达、充分反映客户需求,能够采用尽可能先进、快捷的需求分析技术和工具(如需求复用技术、CASE工具、需求管理工具)以保证在一定的进度限制下尽可能减少需求的变化。效率的体现还与需求分析人员的经验丰富程度、个性差异、理解能力、对需求分析方法的掌握及熟练程度等有关,即与人的因素有关,也与项目规模和复杂度有关[9]。在软件开发过程中,如果约束中规定必须使用某种技术,但可选用的技术可能发生了变化,从而会带来需求过时或不可实现的风险。从管理技术角度,影响开发效率、导致潜在需求变化的主要因素是:缺乏管理意识和经验;没有制定或制定不合理的管理流程。美国著名的IT咨询公司StandishGroup近20年来的调查和研究表明[9],良好的项目管理可以显著提高软件开发效率。需求管理主要是需求变化管理,它的流程包括[8]:定义需求基线(某一时刻,对特定版本中已达成一致的需求内容的描述);审查需求变化请求,评估其可能产生的影响以决定是否批准;以可控的方式将批准的需求·107·工商管理与案例研究变化融入项目中;保持项目计划与需求同步;估计需求变化的影响,在此基础上协商新的需求约定;跟踪每项需求,找到与其对应的设计、源代码和测试用例;在项目开发中,始终跟踪需求的状态和变化。综合来讲,从技术角度,诱发需求变化的因素是:没有有效综合多种软件工程范型进行需求与软件开发;没有制定科学合理的需求分析进度计划表;没有明确需求分析的目的;没有确定合理的项目范围;没有或不注重使用需求分析工具及其他软件开发和管理工具;不注重需求复用技术的使用和推广;没有建立正确的数据字典和术语表以便保证数据的一致性和术语的一致性;没有采用有效且适用的需求表达方法;不注重收集、整理开发经验;缺乏质量文化,不重视质量计划,对质量、资源、任务、成本等的平衡性把握不好。这些因素会导致需求不完备、不正确(如语法错误、拼写错误)、需求遗漏、需求冲突及不一致等问题,从而诱发需求变化。(3)环境的因素环境可分为机器环境和社会环境。机器环境是指运行软件的机器及相关的硬件设施。如果硬件配置与软件的要求不相符,这样会导致软件不可用或很难用,导致软件使用效率不高,并诱发对软件的修改从而对需求的修改。另外,在软件开发期间或结束之后,企业可能引进一些新设备,它们可能与原来的软件系统有直接的关系,需要开发人员加入这一新设备对应的需求而导致需求变化。社会环境可分为人文环境和组织环境,它与项目赞助商、政策、法律法规、市场、开发组织等联系起来。环境的不稳定性会诱发需求的变化。例如频频出现的新技术,迅速变化的市场需求,或者开发资金不足,客户对开发风险的规避能力不足,软件开发人员的开发能力及处理风险的能力不够,缺乏周详的质量计划。在软件开发过程中,有些导致需求变化的因素是人无法控制的,是客观存在的,这些是需求变化的内因[7]。其中,最关键的内因是项目的复杂度和规模[9]。(1)作为背景知识的业务规则是软件功能性需求的主要来源[8],但不同的需求工程师对规则的理解不可避免会产生矛盾,表现为需求的矛盾,使需求之间存在差异性。复杂的项目其业务规则也相应复杂,如果没有好的解决方案去降低这种复杂度,则不可避免出现需求错误,引起需求变化。(2)需求通常用自然语言表达,不可避免出现表达和理解上的差异、歧义、含糊、不完整和抽象层次混乱等问题。目前,没有任何一种语言可以完全、透彻表达需求,自然语言需要借助图形化语言(例如UML)或形式化语言(例如有穷状态机、Petri网、Z语言)。(3)需求之间是存在联系的,是需求的一种固有性质和客观存在。这种联系性使得当某需求发生变化时,其他与之相关的需求也可能会发生变化。(4)需求及其关系是复杂的,这种复杂性随着项目规模的增大而增大,是进度延误、项目失败的主要原因[9]。辩证法认为:内因是事物发展的根本原因,外因是事物发展的必要条件。外因通过内因而起作用。内因和外因是辩证统一、互相联系的。项目的规模和复杂性作为需求变化内因的主要因素,是相对的,与主要的外因——涉众对软件开发理论的认识和开发经验密切相关。软件开发作为一个系统工程,不是一件简单的事情。工程师必须经过专门的学习和训练,逐步积累理论知识和实践经验,否则再简单的项目也会变得复杂。相反,如果开发工程师训练有素,有丰富的知识和经验,并善于学习、善于与客户沟通,那不论任何复杂的项目,也能够把其化难为易、化繁为简。需求变化的外因和内因存在密切的联系,彼此之间存在“能量信息”的交换,存在此起彼伏的波浪式运动。当一个诱因发动时,另外一些诱因也可能发动。需求变化发生与否是许多导致变化的因素相互作用、相互叠加共同形成的结果。如图1所示[4]。图中的箭头表示影响的方向。例如:项目复杂度对人和需求变化有直接影响;技术、环境对需求变化都有直接影响;管理技术不仅对需求变化有影响,而且对其他三方面的管理也有直接影响。图中的号表示影响加强,号表示影响减弱或降低。例如:项目复杂度增加(+),人的能力会受到挑战(-),如果需求工程师不利用良好的软件开发实践(例如通过分而治之的方法把项目复杂度降低)以及努力去了解项目背景,则势必导致人的能力降低(-),从而诱发需求的变化。反之,如果人的能力增强·108·工商管理与案例研究(+),开发过程处于良好的状态,则势必能够降低开发风险,容易解决需求变化问题(-)。再如,当开发环境处于良好状态(+),就会对技术有加强作用(+),从而减少需求变化(-)的可能必性。项目复杂度及规模这一主要内因是否会导致事实的需求变化与涉众这一主要外因的作用密切相关。这符合辩证法的思想:外因在事物的发展变化过程中不可缺少,甚至起到非常重要的作用,外因可加速或延缓事物发展的进程。需求变化的内因对以涉众为主的外因有制约作用,但涉众是能动的,具有变革的能力,可以降低和控制内因及其他外因对需求变化的影响。具体说来,由涉众的能动性为主导,综合考虑各种需求变化外因和内因,有以下预防需求变化的策略。软件过程是集专业性和智力性的作业过程。如果开发人员不熟悉项目背景而盲目进行开发,如果开发人员缺乏有素训练,就难以提交符合客户需求的软件产品,势必导致需求变化。因此,开发人员在开发期间要接受培训。一是与领域相关知识的培训。一开始,开发人员对待开发系统不一定了解,为了能够做好需求开发,要对项目背景知识进行了解;二是与开发方法学相关知识的培训。不同的项目,不同的系统环境要求,不同的客户群体,可能使用不同的开发平台和方法学。为了能够按预算、按进度顺利完成开发任务,开发人员需要接受专业培训,也包括学习与客户协作、交流的方法和技巧。许多IT信息服务公司可以提供这样的服务。例如美国的StandishGroup公司允许个人或组织注册CHAOS大学会员制(UniversityMembership)而获得相应的服务。作为StandishGroup的CHAOS会员,可获得三方面的信息[9]:一是CHASO年度总结报告,风险投资最新研究进展;二是与赞助商及客户相关的指导;三是开发和维护成功项目管理环境的最佳实践指导。这些信息旨在给