连载:面向对象葵花宝典:思想、技巧与实践(15) - 需求详解

很多人像老黄牛一样辛辛苦苦做了很多年软件开发,但却连“需求”到底是什么都不清楚。当然,没有人自己会承认这点!

【需求到底是什么】

凡事都有一个开头,软件项目也不例外,对于软件项目来说,需求就是项目最开始的一个输入。

 

参考维基百科,需求定义如下:

In systems engineering, a requirement can be a description of what a system must do, referred to as a Functional Requirement.

简单翻译一下就是:需求即系统需要做什么。

 

但正是这个简单的定义,让很多人陷入了陷阱:需求即功能。

单纯从字面意思来理解这样也是没有问题的:系统需要做什么,当然就是系统要提供什么功能了!

 

我们来看一个简单的例子:ATM自动取款机。

有的人说,ATM的功能是取款、存款、查询余额,所以针对ATM的需求应该是:取款、存款、查询余额;

有的人说,ATM的功能有很多:识别卡、密码认证、点钞、验钞、查询余额、跨行取款等,所以针对ATM的需求应该是:识别卡、密码认证、点钞、验钞、查询余额、跨行取款。

 

如果你是ATM购买商,你认为哪种才是你的需求?

如果你是ATM制造者,你认为哪种才是你的需求?

如果你是ATM使用者,你认为哪种才是你的需求?

 

可能大部分人都会支持第二种,原因很简单:取款也要密码认证、存款也要密码认证,所以密码认证是一个需求,而不是分到两个需求里面。

而且第二种方式划分需求有一个好处:系统最后提供的功能和需求基本上是一一对应的。

 

看起来很美妙,但其实我们忽略了一个问题:采用第二种方式的主要原因是我们对ATM机很熟悉了!

 

但如果换一个身份,比如说你是一个只识字的农民工,你对ATM机的要求会是“识别卡、密码认证。。。。。。”这样专业的需求么?

肯定不会,你的需求应该是“取款”、“存款”、“查询余额”。

 

我们继续打破砂锅问到底:为什么农民工兄弟的需求肯定是“取款”、“存款”、“查询余额”,而不是“识别卡”、“密码认证”、“点钞”。。。。。。?

 

我们假设一下,假如农民工兄弟对ATM的需求是“点钞”,那么就会出现这样滑稽的场景:他经常拿着卡去ATM机,让ATM机点一下钞;又或者他的需求是“密码认证”,那么他经常拿着卡去ATM机验证一下密码。

 

你当然不会看到这样的场景,农民工兄弟也不会有这样的需求,他只管能取到钱即可,因为取到钱他就可以拿钱去花了,至于取钱的过程中管你是密码认证、点钞还是验钞,说的搞笑一点:他更希望把卡插进去,钱就自动吐出来而且不受限额。

 

相信到这里,你已经能够明白需求和功能的差别了,我们总结一下:

需求:对客户来说有价值的事情;

功能:系统为了实现客户价值而提供的能力;

 

因此,区别是需求还是功能的方法很简单了:只要判断是否对客户有价值。

我们可以举更多例子来证明这个方法:

POS机:“买单”是需求,“商品扫描”、“金额汇总”、“收银”等是功能,因为买完单后顾客就能将产品拿走;

汽车:“驾驶”是需求,“发动机”、“刹车”、“加速”等是功能;

打印机:“打印”是需求,“进纸”、“设定”、“与电脑连接”等是功能;

。。。。。。

(有兴趣的朋友可以自己多想想)

【需求非常重要】

俗话说,万事开头难,需求是软件项目的最开始输入,肯定是非常重要的,按道理来说也应该是需要重点关注的。

 

然而现实情况却恰恰相反:很多项目都不怎么重视需求!

 

你可以经常看到这样的场景:

需求分析人员和客户沟通了一下,然后把客户的要求简单整理了一下就交给研发了。。。。。。

项目计划比较紧,那么就把需求分析阶段加快一些吧(实际上就是减少投入时间)。。。。。。

产品给了一个简单的需求,为了能够快速交付,没有怎么分析就开始设计编码了。。。。。。

 

虽然看起来时间是节省了,项目是加快了,然而最终的结果却令人失望:据统计,有将近1/3的项目失败或者陷入困境时因为需求原因导致的!

 

这个就是所谓的“垃圾进垃圾出(Garbage in, garbage out)”的效果,即:

如果最开始的输入是错误的,后面的过程再怎么优秀,最终都会输出垃圾产品。而且可能是后面越优秀,最终输出越垃圾,就像你朝一个错误的方向跑步,跑得越快离正确的终点越远一样。

 

举一个虽然恶心但很形象的例子:给你一坨屎,你放到饼干生产线上,最后生产出来的不是饼干,而是像饼干的一坨屎!:)

 

你可能会说,错了我改还不行么?

当然是可以的,但你要做好心理准备,还有一个更加令人抓狂的事实:修复需求错误的问题的成本非常高昂!

 

我们假设编码阶段发现和修复一个错误所耗费的人力是1个单位,那么在测试阶段修复需求错误的成本是5~10倍,在维护阶段(产品正式应用后),修复需求错误的成本是20倍,而如果在需求阶段修复需求错误,成本只需要0.1~0.2即可。

 

也就是说,需求错误的成本存在这样的比例关系:维护阶段修复 = 需求阶段修复 * 200 !

原因显而易见:如果你的需求错了,那么你几乎是要把软件项目重做一遍!

 

相信经过前面的分析,你对于需求的重要性已经有了充分的认识了。

请时刻牢记:需求很重要!

================================================ 
转载请注明出处:http://blog.csdn.net/yunhua_lee/article/details/20472985
================================================ 

时间: 2024-12-10 01:18:11

连载:面向对象葵花宝典:思想、技巧与实践(15) - 需求详解的相关文章

Java面向对象编程中final关键字的使用方法详解_java

在Java中通过final关键字来声明对象具有不变性(immutable),这里的对象包括变量,方法,类,与C++中的const关键字效果类似. immutable指对象在创建之后,状态无法被改变 可以从三个角度考虑使用final关键字: 代码本身:不希望final描述的对象所表现的含义被改变 安全:final对象具有只读属性,是线程安全的 效率:无法修改final对象本身,对其引用的操作更为高效 final 变量定义final Object a,则a只能被初始化一次,一旦初始化,a的数据无法修

PHP带节点操作的无限分类实现方法详解_php技巧

本文实例讲述了PHP带节点操作的无限分类实现方法.分享给大家供大家参考,具体如下: 包含(移动多个节点:移动单个节点:删除多个节点:删除单个节点:新增节点),另附数据库表结构 一.db sql语句 //db used for php无限分类 create table tree( id int(10) not null primary key auto_increment, name varchar(255) not null, lft int(10) not null default 0, rg

PHP编程中的__clone()方法使用详解_php技巧

可以在对象类中定义一个__clone()方法来调整对象的克隆行为.此方法的代码将在克隆操作期间执行.除了将所有现有对象成员复制到目标对象之外,还会执行__clone()方法指定的操作.下面修改Corporate_Drone类,增加以下方法: function __clone() { $this->tiecolor = "blue"; } 之后,创建一个新的Corporate_Drone对象,增加employeeid成员的值,克隆这个对象,然后输出一些数据,从而显示克隆对象的tie

详解PHP对数组的定义以及数组的创建方法_php技巧

传统上把数组(array)定义为一组有某种共同特性的元素,这里的共同特性包括相似性(车模.棒球队.水果类型等)和类型(例如所有元素都是字符串或整数)等,每个元素由一个特殊的标识符来区分,这称为健(key).请注意,上面这句话中的传统上一词,因为现在可以摒弃这种定义,数组结构中可以包括完全无关的元素.PHP则更进一步,数组中的元素甚至可以不属于同一种类型.例如,一个数组可能包含州名.邮政编码.考试成绩或扑克牌等元素. 每个实体包含两个项:前面提到的健(key)和值(value).可以通过查询键来获

面向对象编程依赖注入详解_java

说说依赖注入 在面向对象编程中,我们经常处理处理的问题就是解耦,程序的耦合性越低表明这个程序的可读性以及可维护性越高.控制反转(Inversion of Control或IoC)就是常用的面向对象编程的设计原则,使用这个原则我们可以降低耦合性.其中依赖注入是控制反转最常用的实现. 什么是依赖 依赖是程序中常见的现象,比如类Car中用到了GasEnergy类的实例energy,通常的做法就是在Car类中显式地创建GasEnergy类的实例,并赋值给energy.如下面的代码 interface E

连载:面向对象葵花宝典:思想、技巧与实践(28) - 设计原则:内聚&耦合

前面通过实例讲解了一个一环扣一环的面向对象的开发流程:用例模型 -> 领域模型 -> 设计模型(类模型 + 动态模型),解答了面向对象如何做的问题.接下来我们就要讲"如何做好面向对象设计"的技巧了 =================================================================== [内聚] 参考维基百科的解释,内聚的含义如下: cohesion refers to the degree to which the eleme

连载:面向对象葵花宝典:思想、技巧与实践(1) - 程序设计思想的发展

史前时代:面向机器 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行的指令和数据.简单来说,就是直接编写0和1的序列来代表程序语言.例如:使用0000 代表 加载(LOAD),0001 代表 存储(STORE)等.  机器语言由机器直接执行,速度快,但一个很明显的缺点就是:写起来实在是太困难了,一旦你发现自己写错了,改起来更蛋疼!这样直接导致程序编写效率十分低下,编写程序花费的时间往往是实际运行时间的几十倍或几百倍.  有一个关于机器语言和比尔盖茨的笑话,是说比尔

连载:面向对象葵花宝典:思想、技巧与实践(22) - 领域模型

领域模型是面向对象分析和设计的第一步!! 完成了需求分析之后,我们已经有了一个良好的开端,但我们的主角"面向对象"还不见踪影. 前面我们提到,需求分析和面向对象是没有直接关系的,需求分析阶段是不区分是面向对象还是面向过程,那么什么时候才真正开始面向对象的工作呢?   答案就在本章:领域建模. 从领域模型开始,我们就开始了面向对象的分析和设计过程,可以说,领域模型是完成从需求分析到面向对象设计的一座桥梁.   领域模型,顾名思义,就是需求所涉及的领域的一个建模,更通俗的讲法是业务模型.

连载:面向对象葵花宝典:思想、技巧与实践(30) - SRP原则

前面详细阐述了"高内聚低耦合"的总体设计原则,但如何让设计满足这个原则,并不是一件简单的事情,幸好各位前辈和大牛已经帮我们归纳总结出来了,这就是"设计原则"和"设计模式".毫不夸张的说,只要你吃透这些原则和模式并熟练应用,就能够做出很好的设计. ================================================================== [SRP原则详解] SRP,single responsibility