
# 如何在软件项目需求变更频繁的情况下做好有效的需求管理和规划
#### 概述
围绕项目需求变更频繁，如何做好有效的需求管理和规划，本文将从背景、问题分析、解决措施几个方面进行细致讲解。
#### 背景
不管是项目型软件开发还是产品型软件开发，需求变更频繁都是影响研发效能的首要因素，在2019年中国DevOps现状调查报告中也可以发现，超半数企业认为需求的频繁变更是阻碍软件按时交付的主要原因。解决或缓解需求变更频繁带来的影响，是势在必行的重要工作。
#### 问题分析
由于每家企业的情况不同，包括客户合作方式、人员能力水平、研发流程等各方面的差异，同样是需求变更频繁，所体现出来的具体症状却有所不同，导致问题发生的根因也可能不同，所应采取的措施也需要根据实际情况来选择。根据观察以及与企业交流的经验发现，一般都体现为如下几种场景：
- 需求杂乱、经常变更，难以管理。
- 需求优先级的不断调整，打乱了开发计划。
- 需求遗漏。
接下来结合这些情况的部分示例来分析：
- **场景一：软件项目前期结构清楚，开发到后期，需求变化多而细，如何管理，如何规划。**
  此场景中，困扰项目成员的是前期需求不明确、不完善，导致后期需改动，需求发生变更。
  出现这种情况，往往跟需求规划未能被正确使用有一定关系，比如需求层次划分不清晰、缺少规范机制等问题。例如，某客户规划一个用户登录功能，按照下图所示规划需求。用户会将其中管理员登录的Task放在第一个版本中发布，后期又增加了一个手机号登录的需求，设置成Task放在第二个版本中发布，这样一个Story里面存在多个不同版本（或迭代）发布的Task，不方便管理。由此可以将这个问题的根因定性为**如何进行需求结构化管理**的问题：
  1. 没有区分跟随项目进展而持续产生的碎片化需求和系统/产品持续完善的功能特性。
  
  2. 对CodeArts提供的Epic-Feature-Story的需求结构理解有误，未能正确使用。
     图1需求结构   
     ![](https://support.huaweicloud.com/bestpractice-projectman/zh-cn_image_0000001952209889.png "点击放大") 
   
- **场景二：软件项目进行过程中，领导需要提拉需求，在敏捷研发模式中该如何去操作？**
  提拉需求的意思也就是要将某些需求的优先级提高，要求团队先实现它们，因而可以将此问题定性为**需求优先级管理** 的问题。解决此问题，需要了解：
  - 为什么领导会要提拉需求？如果是合理的，那么团队就应该提升响应能力、优化工作安排流程，使得优先级调整对研发进展带来的影响最小化，且能够尽快地响应领导需要，先交付被提拉的需求。
  
  - 这种情况发生频率有多高？如果是经常发生，那就是一种常态，而且是一种不好的常态，那团队需要去思考是什么导致了这种常态发生，并考虑如何从流程、制度、协作模式或人员能力等方面去做调整，减少过程中提拉需求情况的发生；如果是偶尔发生，那就可以针对具体情况找到解决方案，没有必要为例外情况调整流程、制度，这样反而会加重常态工作的负担。
  
  - 需要提拉的需求有无共性特点？比如是否都跟某个客户有关，或者跟某个功能域（如退款）有关？如果能够找到共性，那就可以针对这些共性去思考针对性的解决方案。
    
- **场景三：由于外界原因经常会临时增加一些紧急需求，并且这是目前常态**
  临时增加需求，首先是一个如何处理突发需求的问题；紧急需求，也就是说需要马上就做，肯定也是重要的需求，所以这还涉及到需求优先级管理的问题。
  当两种情况合在一起，需要将它定性为是**重要需求遗漏** 的问题，反问一句就是------为什么这些紧急重要的需求无法更早预见？同样的，团队需要了解：
  - 具体是哪些外界原因？这些原因是否有共性，有的话，那就针对性处理。
  
  - 增加的需求有无共性特点？有的话，可以针对性处理。
  
  - 临时增加有多临时？团队是否有提高或改善响应能力的空间，如果团队可以更快调整和响应，使得这些临时需求对团队产生不了什么影响，那么这个问题也就不再是问题了。
  
  - 既然是常态，为何团队的流程没有做出调整去应对？是调整过流程或工作方式，还是无法解决问题，还是说不知道该怎么调整流程或工作方式去适应？
    
#### 解决措施
综合前面几种参考情况经分析后得出了根因，基于这些根因，可以将所要解决的问题重新描述如下：
1. [如何进行需求结构化管理？]
2. [如何进行需求优先级管理？]
3. [如何避免重要需求遗漏？]
- **如何进行需求结构化管理？**
  首先，并不是说任何情况下都需要进行需求的结构化管理。只有在需求较多、且需求之间存在关联，而且即便是已经实现的需求也需要进行一定的管理、维护的情况下，才需要去思考需求结构化管理的问题，此时，团队需要使用CodeArts提供的Scrum项目模板，因为里面有Epic-Feature-Story的需求结构，以及需求规划功能可以辅助团队进行需求的结构化管理。那么团队应该以什么为脉络来建立这个结构呢？这就意味着，**团队的需求结构化管理，需要以产品或系统的功能特性的脉络为依据**。而软件项目管理所需要关注的版本、客户、模块等信息，则可以通过需求的不同属性甚至标签等方式来实现。
  简单来说，可以通过如下三个步骤来完成：
  1. 针对产品或系统建立CodeArts项目。
  
  2. 确立Epic-Feature-Story的需求结构。
  
  3. 对不同模块以及版本的管理，可以通过工作项的属性来进行管理。
  
  
  更多详情请参考[如何进行需求结构化管理](https://support.huaweicloud.com/bestpractice-projectman/projectman_practice_1004.html)。
  
 
- **如何进行需求优先级管理？**
  需求优先级的管理，其实是为了帮助团队确定先做哪个需求后做哪个需求，从而可以最大化团队的回报、最小化团队的风险或投入。要做好优先级管理，或者更直接来说是优先级顺序管理，需要做到如下几件事情：
  1. 确定优先级模型：需要考虑的因素以及因素的综合判断原则，比如[Kano模型](https://en.wikipedia.org/wiki/Kano_model)。
  
  2. 排定需求优先级顺序：因素的具体量化和排序标准，例如成本收益法是按照收入还是按利润的多少来排序。
  
  3. 调整需求优先级顺序。
  
  4. 改进优先级模型：根据反馈调整模型或模型的落地实施细节，以提升效果。
  
  
  更多详情请参考[如何进行需求优先级管理](https://support.huaweicloud.com/bestpractice-projectman/projectman_practice_1005.html)。
  

- **如何避免重要需求遗漏？**
  根据重要需求遗漏的事前、事中、事后的不同时间点，可以采取不同的措施。参照八二原则，需要确保常态问题有对应的处理方式，软件项目成员按照既定方案进行处理即可，而特殊情况要有应急机制指导现场处理、事后再复盘总结。
  1. 事中的处理：按照常规做法进行处理，或是特殊情况特殊处理，先解决眼下的问题。
  
  2. 事后的处理：基于模型或思路进行复盘，并落实为新的常规做法或特殊情况处理方式。
  
  3. 事前的处理：明确如何区分常规情况或特殊情况，并制定相应的处理方式或应急机制。
  
  
  更多详情请参考[如何避免重要需求遗漏](https://support.huaweicloud.com/bestpractice-projectman/projectman_practice_1006.html)。
  
 
