日志文章

2007年08月27日 08:14:11

需求与设计的界线

需求与设计的区别究竟是什么? 教科书上的经典答案是:需求关注系统“做什么”,设计关注“如何做”,其实这是一个很模糊的说法。


无论是在结构化方法中还是在面向对象的方法中,需求分析的结果既包括了“做什么”也部分包括了“如何做”,只不过描述“如何做”时抽象的层次比较高或者描述了某个局部需求的“如何做”。客户在提出系统需求时,可能对“如何做”提出一些约束条件,比如客户要求必须采用三层结构,必须采用某个中间件等等。在需求描述文档中,一般称为“设计约束”。开发人员进行需求分析后的结果包括了系统构成元素(无论是称为模块还是称为包)的分解,包括了数据流程图或类图等,这实际上也是在定义系统“如何做”,只不过这里描述的“如何做”应是从客户的角度比较容易理解的。


在需求中包括了:
Ø       系统的目标、范围以及与外部的接口;
Ø       系统的功能、操作流程、处理规则;
Ø       系统处理的数据,数据有属性,数据之间有关系,这些数据可以解释为实体或者类;
Ø       对于系统可以划分为子系统,子系统中再分为模块,子系统、模块只是对系统功能进行分类的一种方法;
Ø       系统的设计约束;
Ø       系统的运行环境等。
另外在需求中还包括了:
Ø       子系统或模块之间的接口关系;


这一部分往往是和设计有交叉的,系统分解为子系统、模块,以及他们之间的接口关系在概要设计中往往也是涉及到的。在需求中对系统的分解是从功能的角度,是从逻辑分类的角度进行系统的拆分,而在设计时对系统的拆分是从实现的角度,比如在设计时将系统分为界面层、中间层、数据层。


在需求中尽量不描述“如何做”实际上是避免对设计进行太多的约束与假设,这样会限制设计方案的选择。设计可以认为是一种决策行为,是一种选择行为。需求确定以后,解决的方案可能有多种,如果在需求里描述了“如何做”,实际上就限制了设计只能选择某一种方案,而这种解决方案却很可能不是最优的。所谓的解决方案可针对整个系统,也可能针对某个具体的功能。


原则上“做什么”是由客户提出来,由系统分析人员进行文档化,“如何做”是由开发人员来确定的并进行文档化。


“做什么”与“如何做”在现实中是实际上是迭代进行,交织在一起的。在项目立项之前进行的可行性分析,包括了系统目标与范围的确定,包括了技术路线的论证,包括了成本、风险、进度的估算等等,在上述的行为中,包括了简单的需求与设计。在项目立项之后,采集了客户需求,进行需求分析,然后考虑系统的解决方案,此时还可能需要修改或增加需求。二者交叉或并行执行。


在需求和设计之间划一条明确的界线其实很难,理解了二者的根本区别,企业可以自己硬性地规定一条界线:即哪些内容在需求中描述,哪些内容在设计中描述。

类别: 软件技术 |  评论(15) |  浏览(3449) |  收藏
一共有 15 条评论
15楼 [楼主]任甲林 2007年10月11日 23:31:18 Says:
空灵:你说的业务角色与系统角色什么含义啊。给你我的MSN:dylan_ren@msn.com,线上讨论吧 。
14楼 空灵 2007年10月11日 22:21:04 Says:
请问:如果要使用UML工具将业务角色和系统角色的对应关系描述出来,应该使用什么图?能不能举个例子?谢谢!!!!
13楼 空灵 2007年09月25日 23:47:25 Says:
谢谢楼主的回答!
12楼 [楼主]任甲林 2007年09月24日 23:27:14 Says:
回答空灵的第2个问题:
    IPO是在需求规格说明中描述。采用USE CASE描述时可以包括了IPO。
    原型一般是在需求获取阶段用来捕获需求,采用界面原型,便于和最终用户进行沟通,快速建立原型,实际开发时抛弃掉。
    可执行的原型也有,少。
11楼 空灵 2007年09月24日 21:24:07 Says:
楼主你好,我想再请教一个问题。
在面向对象的需求分析方法中,IPO在什么时候进行描述?
是需求规格说明中进行描述,还是直接使用原型,不需要文档描述?
10楼 空灵 2007年09月10日 22:53:00 Says:
谢谢你的回答!!
9楼 [楼主]任甲林 2007年09月10日 21:58:32 Says:
空灵你好,你的方法是可以的,但不够敏捷。
一种更简单的方式是:业务流程描述----》系统用例---》对象。
系统用例就包含了功能的描述。
8楼 空灵 2007年09月10日 17:03:18 Says:
谢谢你对我问题的解答。
1.业务需求说明书中没有抽取业务用例,采用的是业务流程描述的方式。在软件需求规格中,根据业务流程,抽取业务用例;
2.系统用例由若干个功能组成。例如,系统用例“申请单查询”由查询、预览、打印三个功能组成;
3.非功能需求直接采用文字描述,不涉及用例或者图表,所以之前并没有对它提问。

我主要是想知道,业务用例-系统用例-功能清单-对象,这样的一种分析方法对不对。
7楼 [匿名]dylan ren 2007年09月07日 20:22:47 Says:
回答空灵的问题:
1 业务系统需求书中没有描述业务用例吗?还需要在需求规格说明书中重新抽取业务用例吗?不可以直接抽取系统用例吗?
2 系统用例不就是功能需求吗?你说的提取功能是什么含义呢?
3 非功能性的需求你是如何描述的?

如果不存在保密问题,可以将你写的这2份文档MAIL给我仔细看看:renjialin@163.com
6楼 空灵 2007年09月07日 13:37:27 Says:
  我在做项目需求的过程中,遇到了下面一个问题,特向你请教。
  在编写需求规格说明书时,采用面向对象的需求分析方法,具体的分析过程是:
  (1)在制作需求规格说明书之前,已有的文档是“业务需求说明书”;
  (2)根据业务需求说明书,提取业务用例。业务用例的体现形式是活动图;
  (3)从业务用例中,提取系统角色;
  (4)根据业务用例,按照系统边界,提取系统用例;(系统用例是用系统实现一个完整的业务交互过程)
  (5)从系统用例中,提取功能;
  (6)从系统用例中,提取对象。
  以上是我在做需求规格说明书的过程中主要思路,请问这样的思路存在哪些问题?
5楼 [匿名]杜鹏霄 2007年09月05日 01:06:09 Says:
需求分析时是不是应该主要在于在用例分析,确定做什么。如果将注意力集中在确定一个一个用例上的时候,可能就不会去关注存在哪些模块或者子系统,而是在概要设计或者进一步对用例进行分析时将一些功能上存在对同样的数据进行的操作封装成为一个模块或者子系统,而这里的模块和子系统应该与需求中提到的相似,但并不一一对应,我的理解是对系统横向的描述。概要设计时划分系统层次是一种纵向的描述。
那在需求中划分子系统的必要性体现在什么地方?我认为是:对功能进行分类,便于描述系统。
需求中,模块间的接口的描述是不是只是在描述模块间交互关系(包括数据与操作),而不对接口做出明确的定义?
4楼 [匿名]soya 2007年08月30日 12:51:40 Says:
6.描述数据
3楼 [匿名]soya 2007年08月30日 12:36:10 Says:
参考资源:
http://www.dir.state.tx.us/pubs/framework/extensions/sdlc/index.htm
http://www.ddj.com/cpp/184403494
http://www.ddj.com/showArticle.jhtml?articleID=184403506
2楼 [楼主]任甲林 2007年08月28日 07:53:03 Says:
谢谢!我会整理出来我对概要设计与详细设计的描述方法的建议。
1楼 苗爸 2007年08月27日 20:45:45 Says:
需求和设计通过分析联系到一起。
教科书上把基本的开发过程分成:需求、分析、设计、编码、测试。
分析有时和需求联系在一起叫“需求分析”;有时和设计联系在一起叫分析设计。
分析实际上是需求的延续和细化。分析的结果写到SRS中就形成了产品需求。
通常应该根据项目的限制条件,来决定SRS的详细程度。

以前写SRS还考虑what和How的问题,现在不刻意去区分。

目前在研究设计的写法,未果。
初步的想法(源于c++之旅上的OOAD的文章和统一软件开发过程):
1.描述结构 用class diagram
2.描述行为 用交互图(协作图、顺序图)
3.描述状态 用状态转换图
4.描述处理逻辑 决策树 或 流程图
5.描述提供的服务
0.描述设计背景和动机

怎么操作才简单高效,让一般的程序员也运用自如?
发表评论
看不清楚,换一张