我们知道在瀑布模型中,第二个阶段就是需求分析阶段,同时需求分析的结果也决定了后续的系统设计、开发、测试等阶段能否顺利如期进行。需求是整个产品的源头,所以需求分析的结果往往决定了产品的成败。软件项目中很多问题都和需求相关,比如说需求不明确,需求变更。这些问题轻则导致返工造成浪费,重则导致项目失败带来巨大损失。对于我们程序员来说,就是没日没夜的加班,同时也很少得到成就感,所以在软件工程中,搞明白需求是一件至关重要的事。
我们日常在项目中,经常会听到“需求”这个词,比如说:
很明显,这两个需求的意思不一样,前面这个需求是用户需求,后面这个需求是产品需求,那么什么用户需求和产品需求,还有我们程序员关注的设计需求是个怎么样的关系呢?各自的约束条件是什么?
规格和需求的区别
我们经常讲:软件需求规格书,说明需求和规格书本来就是一体化的,规格就是需求的具体说明,例如:OA要支持IE浏览器是需求,那么如果具体定义,需要具体支持ie6、ie7、ie8,那么就叫做规格;声音要达到120分贝~190分贝,这本身就是需求+规格。
功能需求
功能需求其实是设计需求的一个类别,软件行业基本都是功能需求,就是第一步干什么,下一步做什么,然后再做什么的场景描述,所以功能需求就这么产生了。功能需求与其他的需求定义时,核心不同点是,功能需求需要详细定义场景描述,其中包含正常场景、异常场景,业界通用定义方法是Usecase法。
测试需求
很多人认为测试需求是基于对产品需求的分析,测试人员提炼出来的需要重点测试的点,正确的定义时需求定义人员详细定义产品需求和设计需求,而同时测试设计人员直接针对此需求分析该需求如何测试,重点测试哪些内容,所以测试需求,本身应该叫:需求的可测试性分析
每一个需求分析方法基本相似,本章以用户需求为例,其实对用户需求的分析,不是一个动作,而是一个过程。需求分析,就是对用户需求进行提炼分析,最终形成产品需求的过程。而针对每个用户需求的需求分析过程,需要经过三个步骤。
大部分用户提的需求,都不见得是其真实的需求,需要透过现象看本质,去挖掘其背后真实的需求。要分析用户的真实需求,可以从三个角度入手。
福特汽车创始人亨利福特说过的:
如果我最初是问消费者他们想要什么,他们应该是会告诉我,“要一辆更快的马车!
这里“要一辆更快的马车”就是一个典型的用户需求,但这并非是用户的真实需求,用户的真实需求,需要通过分析才能得到。我们假设目标用户是普通乘客,使用场景是日常出行,那么用户想要解决的问题其实并不简单是“要一辆更快的马车”,想要更快的马车只是用户自己能想到的解决方案,而他想解决的问题是“更快更舒适的出行方式”。
我们知道了目标用户,其使用场景和想要解决的问题,就可以结合产品定位,提出相应的解决方案。比如针对想要“更快更舒适的出行方式”日常出行的乘客,我们就可以提出汽车的解决方案,而不一定要局限于马车,汽车能更好的满足用户需求。
在选好方案后,还需要对方案进行验证,以确保方案能解决用户需求。在传统瀑布模型中,选定方案后,会写成产品设计文档,走相应的评审流程,评审完成后再进行设计、开发和测试,测试完成后会让客户再进行验收。而敏捷开发,在整个开发过程中,每个迭代或者关键的里程碑,也一样需要客户进行验收。
通过以上三步,就可以对用户需求进行提炼分析,最终形成产品需求。所以在需求分析过程中,分析的就是一个个用户的需求,找出背后的真实诉求,再有针对性的提出解决方案。
而对于软件项目的用户需求,从来就不是单一的,而是一系列需求,所以对于软件项目的需求分析,还需要增加收集整理的步骤。整个过程是迭代进行的,如下所示:
在软件开发过程中,需求变更是一种常态,开发到一半,很多原始的需求慢慢的发生变化,这时候当初的设计也已经无法满足要求,很多代码需要修改,有时候框架设计都需要重新设计。为了赶项目进度,导致代码臃肿,代码质量降低,加班越来越多。目前也已经有很多管理需求变更的解决方案
但是这种方法真的能解决问题吗?拿软件工程和建筑工程进行对比,你可以思考一下,同样是工程,建筑项目也是有需求变更的,但却不会像软件项目这么频繁和失控。为什么呢?主要有两个原因:
那么对于我们程序员,如何解决需求变更的问题呢?首先,心态最重要,在软件项目开发中,需求变更其实是不可避免的,一味抵制需求变更也是不可取的。你能做的就是利用软件工程的知识,理解需求变更背后深层次的原因,找到合适的方案来改善,积极拥抱合理的需求变化,减少不必要的需求变更。这是大的前提条件,也是共识的基础。
既然需求变更的原因是需求不确定和需求变更成本太低,那么我们就针对性地提出相应的解决方案:
总之,对于需求变更,项目上对于变更需求要制定合适的变更流程,项目组要选择适合项目开发的模式,管理好需求变更,提升整个项目的开发效率,避免重复返工导致浪费。而对于开发或者测试,我们在遇到需求变更的时候,不要置身事外,抱怨需求变更,而是应该在对于需求分析或者变更的关键阶段,主动的参与其中,从开发和测试的角度提供一些专业化的建议,去思考细化需求和思考需求变更产生的背景。
需求是项目的源头,需求分析做的好坏,严重的影响了软件项目的成功与否。在项目开发过程中,我遇到了很多需求没有梳理清楚,导致项目返工的真实情况存在,导致项目组的成员压力很大,无休止的加班,情绪很是低落。对于需求分析,就是找出来隐藏在用户需求背后的真实需求,还要针对用户的真实需求提出解决方案的过程。而对于需求变更,需要要追本溯源,研究问题背后的原因,研究理论背后的来龙去脉。