在软件项目的开发过程中,需求管理贯穿了软件项目的整个生命周期,在软件项目管理中需求工程是软件开发的第一步,是关键的一步,也是最难把握的一步。需求管理做得好坏直接影响到软件的质量,甚至软件项目的成败。从软件的项目立项、研发、维护,用户的经验在增加,对使用软件的感受有变化,以及整个行业的新动态,都为软件带来不断完善功能、优化性能、提高用户友好性的要求。
在项目管理过程中,项目经理经常面对用户的需求变更,如果不能有效处理这些需求变更,项目计划会一再调整,软件交付日期一再拖延,项目研发人员的士气将越来越低落,将直接导致项目成本增加、质量下降及项目交付日期推后。这就决定了项目组必须拥有需求管理策略和有效的落地。
让我们一起来回顾一下实际研发过程中,通常会面临到的需求管理挑战:
1、缺乏需求的集中管理
按照需求工程的说法,在进入开发环节之前,开发团队和客户之间需要形成一份完整的需求规格说明书,详细地说明目标软件的各种需求,这其中包括功能性需求、非功能性需求和其他各种约束。在典型的瀑布模型中,需求规格说明书是在需求分析阶段完成的。然而,由于软件外部环境的变化,很少有哪个项目在需求分析阶段就能将所有可能的需求准确无误地包含进来,并且在开发阶段不需要修改,一句话,需求的变更是不可避免的。需求的变更也需要及时地反应到需求管理中。
除此之外,在实际的敏捷软件开发中,对开发而言,需求的来源不一定像瀑布模型那样完善的需求规格说明书,而通常有以下几种:
1)客户初始的业务需求:很多客户可能只会告诉我们,它想做一个系统或者工具平台,大致是什么样子,应该具备哪些功能,但这种需求往往比较抽象,缺乏细致的分析。这种需求可能源自于一次交谈,或者一封Email,形式上并不正式。
2)客户对项目快速原型的反馈意见:对于需求,在实际项目开发中,客户关注的业务功能,项目经理关注的是抽象设计,而开发人员关注的却是具体实现。在项目初期,客户往往也不是很清楚他们要什么,或者理想中的产品到底最后会是什么样的,界面布局,操作流程等等。这一点,在新产品的开发中尤为明显。
这时候,就需要开发团队能够按照现有的理解快速地开发一个原型,作为开发团队和客户讨论和分析需求的共同基础,原型能够帮助用户更好地发掘和定义需求。客户对于原型的论证作为反馈意见也可以使开发团队更加直观和感性地认识客户的需求。
3)客户对每个迭代周期发布的版本的修改建议
如果该企业采用的是敏捷开发,每个迭代周期都要发布一个可用的版本给客户,该版本尽可能多地实现了当前迭代周期内的需求以及之前迭代周期内遗留下来的需求。客户要验证需求的实现是否符合他们的要求,并提出修改意见和建议。
4)客户在研发周期中的需求变更
需求来源的特殊性决定了软件开发过程中需求管理的特殊性,尤其是对于一个同时承担数个小项目的开发团队而言,不同的项目需求是由不同的开发人员或QA分别进行管理和跟踪的,缺乏集中的管理,对于需求的跟踪也比较原始。往往是手工整理需求邮件和需求列表,然后形成简单的需求文档,在需求查询和状态维护方面存在明显不足。
2、需求变更频繁
软件开发的显著特点之一就是灵活性、机动性、对变化的快速响应能力。尤其是敏捷开发过程,需求变更更为频繁。敏捷开发的口号是拥抱需求变化,也就是说,开发团队对于客户提出的需求变更通常是抱以欢迎的态度,尽管这些变更可能会给项目计划和项目进度带来麻烦,但这种观念上的转变更能体现开发团队和客户之间合作的诚意。
客户在迭代周期中的变更大致可以分为五种类型:添加新需求、删除本次迭代周期内的需求、删除之前迭代周期内的需求、更改本次迭代周期内的需求、更改之前迭代周期内的需求。这就是说,开发团队需要实时高效地管理这些变更,并且将需求变更涉及到的迭代周期内项目计划和人员安排变更的影响最小化。
3、缺乏有针对性的需求管理流程
传统的需求管理过程,尤其是其中的变更控制过程是针对那些组织机构清晰,只能定义明确的传统软件项目,其流程相对比较严谨和死板。同时,为了弥补需求变更对项目进程带来的影响,开发人员常常需要快速的进行功能修改和增加,而没有遵循统一的流程控制,从而常常使得软件开发的有序性被破坏,人为地增加了工作量。这就需要有更为高效和精简的需求管理过程以及相应的工具支持。
4、需求、测试用例、Bug管理脱节
软件开发中,需求和测试用例是紧密联系的,通常来说,一条需求只有通过了所有针对该需求的测试之后才能说这条需求的实现真正实现了。而测试的结果是产生Bug报告,如果针对某条需求的一个测试用例没有通过测试,换句话说,也就是产生了一个Bug,这就说明该需求根本没有完成。同时,需求的变更直接影响到与该需求相关的测试用例的更新,继而影响到现有Bug的状态的更新。然而现实情况却是,大多数敏捷开发团队都没有实现需求、测试用例和Bug的一体化管理。
我们希望在需求、测试用例和Bug之间建立一种动态的联系,能够实时地更新三者的状态,并且实现三者之间状态的动态联动,从而减少开发团队在管理和维护需求、测试用例和Bug时的工作量。
5、缺乏量化的项目管理反馈
企业在项目管理中,需求的频繁变更对项目管理者评估需求、制定迭代周期内的项目计划都是个巨大的挑战。管理者在需求评估经验和能力上的不足,以及管理者对团队成员开发能力认识不足容易造成需求评估出现大的误差,虽然这种误差是不可避免的、但是我们希望可以通过历史评估数据的反馈来帮助项目管理者积累经验,逐步修正和调整自己的判断和评价体系,从而尽可能减小由于评估误差引起的项目风险。而没有工具的支持,历史的准确数据则很难获取。
总结以上问题,显而易见,需求管理是软件项目中一项十分重要的工作,据调查显示在众多失败的软件项目中,由于需求原因导致的约占到45%,因此有效的需求管理是企业软件开发项目顺利达成目标的重要支撑条件。如何理解项目开发的目的和用途,梳理用户需求,监控需求变化,进行需求确认,对需求风险进行防范,并利用工具进行有效的实施需求管理工具,方能推进软件项目良性发展,达到用户与软件开发企业的双赢。
有效的需求管理方法与工具
方法一:量化需求管理
如前所述,企业研发项目通常规模巨大,涉及部门众多,需求功能描述文件中包含众多内容,若仅仅只用整篇的文档来指导开发和测试工作,很容易引起任务分配的混乱;当发生需求变更时,也很难追溯历史版本。
TechExcel公司推出的DevSuite产品研发管理软件,从实践中提炼出一个行之有效的解决方法——用规范点(Specification,以下简称Spec)量化需求,正规表达每一个功能单元。只需打开《需求功能描述书》的WORD文档,就可以利用插件,将其中的功能单元逐条地复制出来,在需求管理系统 DevSpec中直接生成Spec。相对于需求,Spec是更面向技术人员的语言。
客户业务需求可以在平台中进行集中管理,并以需求结构化和条目化的形式管理需求,为需求的评估、追踪与变更管理提供了基础。同时,通过系统强大的页面自定义能力,我们可以管理需求的来源、难度、实现时间、实现成本等,这些信息为需求优先级的评估,提供了量化的指标,帮助项目经理准确的排布需求优先级,让团队优先实现最重要、最紧急、客户价值最高的需求。
此外,需求说明书、分析设计文档、评审记录等,均可以以附件形式保存,且能对文档的版本进行有效的管理。
方法二:有序管理需求变更
在实际项目中,实现需求变更的成本随着开发进度呈指数级增长。需求变更的流程化管理能保障正常的开发进度,将变更及时反应到开发和测试等部门。
以下描述的是一个典型过程(如图1)。一项变更请求在需求管理系统中被提交后,与之关联的各个部门,如市场、项目管理、产品研发、QA、测试等,都会有相关人员接到系统通知而介入。他们将组成评估团队,根据实施难度、周期、费用、对其他机制的影响等指标,对该变更进行全面考察和评估。
DevSpec提供了专门的变更管理视图,在这里,我们可以管理各个项目中的需求变更任务,不论是需求增加、减少或是改变,我们都会为之建立一条变更记录,在这条变更记录中,记录了变更的来源、原因、具体描述和变更成本、收益估算,这些信息可以成为变更评估的标准与依据。
每个变更任务均可以和在变更中受影响的需求相关联,包括增加的、减少的和变更的需求。通过需求变更列表,我们可以清晰的看到项目中当前有多少变更任务,影响了哪些需求,也能够察看到整个项目周期中总计发生了多少变更,总计影响了多少需求条目。
方法三:标准的需求管理流程
需求管理的整个过程都可以用标准、有效的工作流控制起来,如需求变更流程的设定,通常包括请求、复查、讨论、调整、批准和拒绝等状态,只有具备权限的项目成员才能改变状态。按照预设的流程,各方审批全部通过后,该变更才能被接受。
DevSuite提供了灵活的工作流程定制和管理能力,图形化工作流引擎将工作流图形转变为工作流脚本,因此项目管理员可以在图形化界面中,轻松快速的定制项目组项目管理流程。
如上图中红色框内为需求的工作流程,用户可以根据公司的实际业务流程,定制符合需要的需求流程图,系统可以同时定义多条项目工作流程,以适应不同规模、不同类型的项目。
方法四:需求有效驱动开发与测试
在理想的研发管理平台中,需求管理与所有规划、开发、测试管理过程相集成。因此,需求的正规表达Spec,以及围绕Spec正在或将要进行的开发任务和测试任务,都能被纳入综合考虑的范畴,便于评估团队估算该变更造成的“牵一发而动全身”的潜在影响。有时,还要结合商业需求进行考量,为了赶上产品的最佳发布时机,有些变更将被拒绝。
变更请求被批准后,与之相关联的开发、测试任务都会在系统中被一一标记出来,以提醒程序和测试部门的相关负责人,引发这些任务的需求已经变更,请他们做出相应的调整处理。在系统中跟踪这些任务的进展,可以实时掌握该变更的落实情况。变更完成后,也可以核算它对开发周期和费用的实际影响,与评估时的预测相对比,找出差异的原因,为将来更准确地评估提供参考。
DevSuite提供了变更标识功能,通过变更标识子任务,我们可以选择受影响的开发、测试任务,建立变更标识子任务,该子任务将以旗帜形式反映到开发、测试任务中。变更标识子任务不但能够标识变更,还能够帮助团队进行变更反馈,通过文字记录和状态改变,任务负责人员可以将需求变更对于任务的影响及时回馈给需求管理人员。另外,对于需求实际改变的内容,需求负责人员可以创建变更推送子任务,通过邮件系统,可以将变更信息发送给该需求的干系人。
方法五:需求指导项目规划与执行
纵使项目最初都有比较全面的计划,延期仍然会时常发生,即便是在管理机制比较成熟的大型研发企业中,跳票也不可避免。通常情况下,导致跳票主要有以下几点原因:功能设计规划过多,很多又无法删除,如不增加开发时间,产品几乎不能完成;缺乏有经验的管理或开发人员,不能准确估计工作量;任务执行缺乏规范,开发人员随意更改功能设计,影响整体进度;过高的人员流动率,导致知识的流失,任务不能及时跟进。
针对以上问题,只要从量化需求入手, 有序管理需求变更,用正规表达、可量化的Spec来指导项目规划、编程和测试,就能把风险降到最低。
基于结构化的Spec集合,可以将项目分解为多个子项目,将Spec直接分配到各自对应的子项目中,以此来规划和估算子项目的工作量。项目管理人员为每个子项目分配资源,安排优先顺序,确定项目里程碑。
在项目执行时,可以为每一个Spec产生出一系列开发任务。自定义的工作流机制确保每一个任务从提交到最终解决的生命周期都严格符合业务流程,保证任何时刻都有唯一的负责人、状态和截止日期。这样,不仅能规范产品研发过程,还能降低人员流动带来的风险。任务的流转及相关知识文档,如源代码、设计资源等,都得到系统完整的记录,还能与任务关联,便于追溯。一旦有人离开项目,接替的人员能够查看任务和文档信息,迅速弥补人员空缺。
DevSuite需求管理视图提供产品版本树管理,产品经理可以创建新产品和版本,每个需求和功能点可以在多个产品和版本实现。通常一个产品的各个功能可能会分布在不同的项目中实现,项目经理如何在产品发布的时候知道每次发布实现了那些功能,各个功能点的负责人是谁,通过DevSpec视图提供的产品版本树功能,项目经理可以轻松的过滤出每个发布版本实现了那些客户需求。
支持产品的版本规划,当收集到的需求经过评审等规定流程决策后,将需求与规划好的产品版本关联起来,通过产品版本视图可以直接追踪到需求与产品版本的关系,未决定开发的需求可以不设定版本,等决定后再关联相应产品版本。
以上所述的需求管理经验和系统工具的支持,希望与大家共同分享与探讨,探索出一条以有效的需求管理推动项目执行、产品研发整个生命周期的最佳途径!