在本文中,我们详细探讨了设定需求优先级的重要性,以及如何依据价值、成本和风险制定优先级方案。通过这一方法,开发团队能够更有效地管理有限的时间和资源,确保最终产品能够切实满足各类用户的实际需求和期待。

需求优先级

在搜集并整理了“物流管理系统”大部分用户需求并形成文档后,项目经理 与需求分析师 共同召集了两名产品联络员进行会谈:物流作业人员,仓储管理人员。本文将探讨设定需求优先级 1的必要性,并提出一套基于价值、成本与风险的优先级设定策略。

受限于时间和资源的局限,项目经理 必须决定在下一季度末的首版上线中,哪些功能是必须包含在内的。她希望与产品联络员协同确定各项需求的优先级,确保开发团队能聚焦于最关键的需求实现 2。仓储管理人员 指出,货物条形码标签生成与扫码功能对于完成物流流转统计和库存盘点报表至关重要。然而,物流作业人员 认为,实时的库存查询功能对提升物流作业效率非常重要,因此这项功能应从项目初始阶段就被纳入考虑。与需求分析师 建议全面审视所有使用场景,识别出短期内不太紧急的需求,以便将它们的优先级决策适当延后。

在当前情境下,开发团队需要权衡多方面的因素,包括用户需求、时间限制、成本估算 3以及潜在风险等。为了帮助团队作出明智决策,我们提出了一个基于价值、成本和风险的评估框架。该框架将依据每个需求对用户业务的价值贡献、实施成本和潜在风险进行评估,并据此为每个需求设定优先级。这样一来,开发团队能更清晰地认识到哪些需求最为关键,并将精力集中在这些核心需求的实现上。

在本文中,我们详细探讨了设定需求优先级的重要性,以及如何依据价值、成本和风险制定优先级方案。通过这一方法,开发团队能够更有效地管理有限的时间和资源,确保最终产品能够切实满足各类用户的实际需求和期待。

1 为什么要设定需求的优先级

在客户期望高、开发时间紧且资源有限的情况下,确定产品的关键功能至关重要。建立每个功能的相对重要性有助于规划软件构造,实现最大功能而花费最少的成本。对于时间盒图或渐增式开发,设定优先级尤为重要,因为这些开发中的时间表和进度是紧迫的,不能更改日期,必须排除或推迟不重要的功能。

项目经理必须权衡合理的项目范围、进度安排、预算、人力资源和质量目标等因素。一种实现这种权衡的方法是在接受新的高优先级需求或项目环境变化时删除低优先级的需求,或者将它们推迟到下一版本实现。如果客户无法区分需求的重要性 4和紧迫性,项目经理需要自行作出决策。由于客户可能不同意项目经理所设定的优先级,客户必须明确哪些需求必须在首发版中包含,哪些可以延期实现。在面临许多选择时,应尽早在项目中设定优先级。

让每个客户都确定他们需求中哪些最重要是很困难的;要在具有不同期望的众多客户之间达成一致意见就更加困难了。人们总是有自己的利益,并不总能与其他群体的利益相妥协。然而,在客户-开发者的合作关系中,设定需求优先级是客户的责任之一。

客户和开发者都需要为设定需求的优先级提供信息。客户总是让他们能带来最大利益的需求享有最高优先级。然而,一旦开发者提出费用、难度、技术风险或其他与特定需求相关的权衡,客户可能会觉得他们最初的想法似乎不再必要了。开发者也可能认为必须先实现优先级较低的功能,因为它们会影响系统的体系结构。设定优先级意味着权衡每个需求的业务利益和成本,以及它所涉及的结构基础和产品的未来评价。

2 不同角色的人处理优先级

对于客户提出的“膝跳”式响应,我们应该设定优先级。如果用户知道低优先级的需求可能无法实现,那么他们就很难说服自己设定需求的优先级。尽管有人认为优先级不必要,因为只要将需求写入软件规格说明书中,开发者就会尽力实现这些需求,但这忽略了每个功能何时实现的问题。开发者倾向于避免设定优先级,因为这与他们向客户和经理展示的“我们可以完成所有功能”的态度相冲突。

实际上,某些特性比其他特性更重要。在项目接近尾声时,尤其是在简单的“快速开发阶段”,当开发者去掉一些不必要的功能以确保按时完工时,这一点表现得尤为明显。在项目的早期阶段设定优先级有助于逐步做出相互协调的决策,而不是在最后阶段匆忙决定。在判断需求的优先级之前,如果已经实现了近一半的特性,那么这将是一种浪费。

如果让客户自己设定优先级,他们可能会将85%的需求设定为高优先级,10%的需求设定为中等优先级,5%的需求设定为低优先级。这并不给项目经理太多灵活性。通过删除不必要的需求并简化不必要的复杂部分,这被认为是快速软件开发的最佳实践(McConnell 1996)。

在一个大型项目中,以管理为主导的开发团队对系统分析员设定需求优先级的意见表现出极大的不满。经理指出,他们可能不需要某些特殊功能,但其他功能需要弥补遗漏的需求。如果他们拖延实现太多的需求,那么目标系统将无法达到业务计划中反映的情况。在评估优先级时,应考虑不同需求之间的内在联系以及它们与项目业务需求 5的一致性。

3 设定优先级的规模

一般设定需求优先级的方法是将需求分为三个层次:高、中、低。其中,高层次的需求是一个关键任务的需求,对于下一版本是必须的;中层次的需求是支持必要的系统操作,但可以延迟到下一个版本;低层次的需求是功能或质量上的增强,可以在资源允许的情况下实现。此外,还有一些特定的术语和标准来定义不同层次需求的优先级,如基本的、条件的、可选的、3(必须完美地实现)、2(需要付出努力,但不必做得太完美)和1(可以包含缺陷)。在实际应用中,不同的团队和个人可能会有不同的理解和约定,因此需要在每个层次上达成一致意见。

在软件需求规格说明或使用实例的说明中,对于每个需求的优先级都必须进行明确的说明。为了确保读者能够理解分配给一个高层需求的优先级是否被其所有下层需求所继承,或者每个用户需求是否应该有它自己的优先级属性,建议建立一个规则来规范这一点。

即使是一个中等大小的项目,也可能会有成千上万个功能需求,难以从分析和一致性的角度对这些需求进行分类。因此,需要为设定优先级选择一个合适的抽象层次,例如使用实例、特性或详细功能需求。在一个单一的使用实例中,某些特定的可选过程可能比其他过程具有更高的优先级。可以在特性层上进行最初的优先级设定,然后在特定的特性中分别设定功能需求的优先级。这有助于识别出核心功能,并将可以延期实现的精化需求剔除出去。同时,在文档中同等对待所有低优先级的需求,因为它们的优先级可能会在后续的开发过程中发生变化,而且了解关于这些需求的信息也有助于开发者提前规划将来软件的升级版本。

4 基于价值、费用和风险的优先级设定

对于优先级评估,可以采用以下结构化方法:

  1. 确定所有需求的成本和收益。这可以通过开展项目预算和成本效益分析来实现。
  2. 制定一个明确的项目目标和成功标准。这将有助于确保所有需求都与项目目标一致,并为评估提供一个共同的基准。
  3. 采用定量或定性的方法对每个需求进行评估。可以使用一些指标,如重要性、影响程度、风险等来衡量每个需求的价值。
  4. 将所有需求按照其价值和重要性进行排序。这可以通过使用一些评估工具和技术 6来实现,如加权评分法、层次分析法等。
  5. 最终确定每个需求的优先级,以便在项目实施过程中能够合理安排资源和时间。

需要注意的是,尽管上述方法可以提供一种相对客观的评估方式,但在实际应用中还需要考虑团队成员的经验和专业知识等因素,以确保评估结果的准确性和可靠性。

数据表有助于估计使用实例、产品特性或个人功能需求集合的相对优先级。客户价值取决于两个方面:一方面,如果实现了特定的产品特性,那么将为客户提供利益;另一方面,如果不能实现产品特性,就要受到损失。特性的诱人之处是与它所提供的价值成正比,而与实现该特性时的费用和技术风险成反比。一切都是平等的,只有那些具有最高的价值/费用比率的特性才应当具有最高的优先级。这个方法在连续的区间上分配估计的优先级,而不只是把它们分成几个不同的优先级层次上。

你只能把这个设定优先级的图解应用于非最高优先级的可变动的特性上。例如,不能把实现产品核心业务功能的特性和被视为产品的独特之处或者那些为符合政府规定所要求的特性作为该优先级图解的分析项。无论如何,必须首先实现这些特性。一旦分清对于产品交付必不可少的特性,就可以对其它的特性采用模型来确定其相对优先级。

在设定优先级的过程中典型的参与者有:

  • 项目经理,他指导全过程,解决冲突,并且在必要的时候调整其它参与者的方案。
  • 重要的客户代表,例如产品的代表者,他可以提供受益和损失程度。
  • 开发者代表,例如开发组的技术指导者,他提供了费用和风险程度。

你必须遵循如下步骤来使用这个优先级设定工具:

  1. 在一个平面中列出你要设定优先级的所有需求、特性或使用实例;所有项都必须在同一抽象级别上;不要把个人需求与产品特性混合在一起。如果某些特性有逻辑上的联系—例如,只有包括特性 A 的情况下才能实现特性 B—那么在分析中只要列出驱动特性就可以了。这种模型在其有效范围内可以容纳几十种特性。如果你有更多的项,那么就把相关的特性归成一类,并建立一个可管理的初始化列表。如果你需要的话,可以在更详细的级别上进行第二轮分析。
  2. 估计每一个特性提供给客户或业务的相关利益,并用 1~9 划分等级,1 代表可忽略的利益,9 代表最大的价值。这些利益等级表明了与产品的业务需求的一致性。客户代表是判断这些利益的最佳人选。
  3. 估计出如果没有把应该实现的特性包括到产品中,将会给客户或业务上带来的损失。使用 1~9 划分等级,这里 1 代表基本无损失,9 代表严重损失。虽然不服从工业标准与客户关系不大,但可能蒙受巨大损失,这将会遗漏客户提出的一些合理的特性。对于具有低利润低损失的需求只会增加费用,而不会增加价值;它们可能只是作为修饰的实例。
  4. 总价值栏是相对利润和相对损失的总和。在缺省情况下,利润和损失的权值是相等的。作为一种精化,你可以更改这两个因素的相对权值。平面图算出了特性价值的总和并计算出每个特性价值占总价值的百分比(价值百分比栏)。
  5. 估计实现每个特性的相对费用,使用 1(低)~9(高)划分等级。平面图将计算出由每一个特性所构成的总费用的百分比。根据需求的复杂度,所需求的用户界面的实现情况、重用当前代码的潜在能力、所需要的测试量和文档等等,开发者可以估算出费用。
  6. 类似地,开发者应该要估计出与每个特性相关的技术或风险相对程度,并利用 1~9 划分等级。1 级表示你可以轻而易举地实现编程,而 9 级表示需要极大地关注其可行性、缺乏具有专门知识的人员,或者使用不成熟或不熟悉的工具和技术。平面图将计算出每个特性所产生的风险百分比。在缺省情况下,利润损失,费用和风险的权值是相等的,但是你可以在平面图中调整其权值。
  7. 一旦把所有的估算写入平面图,你就可以利用如下公式计算出每一特性的优先级: 优先级=价值% / ( (费用%×费用权值)+(风险%×风险权值) )
  8. 按计算出的优先级的降序排列表中的特性。处于列表最顶端的特性是价值、费用和风险之间的最佳平衡,因此必须具有最高优先级。

这种半定量方法从数学上讲并不严密,并且其准确程度受到对每个项目的利润、损失、费用的影响,但有助于你做出合理的决策。帮助选择一个合理的实现序列。在项目中你所采取的措施将可以提高以最合理的序列实现最重要功能的能力。

5 小结:

  1. 将设定优先级模型应用于当前项目中的特性或使用实例上,并计算出优先级。
  2. 将计算出来的优先级与其它方法所设定的优先级进行比较,分析其结果差异。
  3. 将计算出来的优先级与直觉判断的优先级进行比较,分析其结果差异。
  4. 如果模型所描述的优先级与设想的不一致,分析模型中哪一部分的结果不合理。
  5. 尝试对利润、损失、费用和风险应用不同的优先级,调整模型,直到与期望结果一致为止。
  6. 将校准后的设定需求优先级的模型应用于新项目中,将计算出的优先级结合到决策过程中,并与其它设定需求优先级的方法相比较,看是否所得到的结果更能使风险承担者满意。