第2章 可行性研究

软件工程实践

本讲依据传统软件工程的生命周期划分,详细介绍软件项目在开发过程中的主要环节和各种主要描述方法。涉及在软件计划与开发过程中必须考虑的一些最广泛的概念、原理、方法和工具。主要涉及一些软件过程深层次的技术细节和过程。

软件工程的知识体系

软件工程实践的各个环节的本质

  1. 理解问题(通讯和分析);

  2. 计划一个解决方案(建模和软件设计);

  3. 执行计划(编写代码);

  4. 检查结果的精度(测试和品质保证)

可行性研究

  1. 并非任何问题都有简单明显的解决办法,事实上,许多问题不可能在预定的系统规模或时间期限之内解决。

  2. 如果问题没有可行的解,那么花费在这项工程上的任何时间、人力、软硬件资源和经费,都是无谓的浪费。

  3. 可行性研究 的目的,就是用 最小的代价尽可能短的时间 内确定问题是否能够解决。

2.1 可行性研究的任务

可行性研究的目的

对需求内容进行初步的分析,确定解决问题的可能性,分析不同解决方案的优劣,并提出建议。

其本质实际上就是一个粗略的系统分析和设计过程,通常由客户完成。

可行性研究的类型

  1. 研究型项目的可行性研究分析

  2. 委托型可行性研究分析;

  3. 自主开发性可行性研究分析;

可行性研究的任务

可行性研究的目的不是解决问题,而是确定问题是否值得去解决。

可行性研究分析过程:

首先,进一步分析和澄清 问题定义 然后,分析员应该导出系统的 逻辑模型 最后,探索若干种可供选择的 主要解法

可行性研究解决问题过程的本质

至少应该从下述3个方面研究每种解法的可行性

  • 技术可行性使用现有的技术能实现这个系统吗?

  • 经济可行性这个系统的经济效益能超过它的开发成本吗?

  • 操作可行性系统的操作方式在这个用户组织内行得通吗?

问题定义

  • 了解系统应解决的问题,这些问题是如何提出的

  • 设想这些问题如何解决才能满足要求

  • 了解问题的结构

设计方案选择

  1. 市场分析;

  2. 软件环境分析;

  3. 硬件环境分析;

  4. 功能分析;

  5. 动态分析;

  6. 压力分析;

方案评估

  1. 项目效益评估;

  2. 社会效益评估;

  3. 项目成本核算;

  4. 工作计划评估;

  5. 项目风险评估;

2.2 可行性研究过程

典型的可行性研究过程有下述8个步骤:

  1. 复查系统规模和目标

  2. 研究目前正在使用的系统

  3. 导出新系统的高层逻辑模型

  4. 进一步定义问题

  5. 导出和评价供选择的解法

  6. 推荐行动方针

  7. 草拟开发计划书

  8. 写文档提交审查

2.2.1 复查系统规模和目标

分析员访问关键人员,仔细阅读和分析有关的材料,以便对问题定义阶段书写的关于规模和目标的报告书进一步复查确认,改正含糊或不确切的叙述,清晰地描述对目标系统的一切限制和约束。这个步骤的工作,实质上是为了确保分析员正在解决的问题确实是要求他解决的问题。

2.2.2 研究目前正在使用的系统

现有的系统是信息的重要来源。显然,如果目前有一个系统正被人使用,那么这个系统必定能完成某些有用的工作,因此,新的目标系统必须也能完成它的基本功能;另一方面,如果现有的系统是完美无缺的,用户自然不会提出开发新系统的要求,因此,现有的系统必然有某些缺点,新系统必须能解决旧系统中存在的问题。

应该仔细阅读分析现有系统的 文档资料使用手册,也要实地考察现有的系统。 常见的错误做法是花费过多时间去分析现有的系统。

没有一个系统是在“真空”中运行的,绝大多数系统都和其他系统有联系。

2.2.3 导出新系统的高层逻辑模型

优秀的设计过程通常是从现有的 物理系统 出发,导出现有系统的 逻辑模型,再参考现有系统的 逻辑模型,设想目标系统的逻辑模型,最后根据目标系统的逻辑模型建造新的 物理系统

2.2.4 进一步定义问题

可行性研究的前4个步骤实质上构成一个循环。分析员定义问题,分析这个问题,导出一个 试探性的解;在此基础上再次定义问题,再一次分析这个问题,修改这个解;继续这个循环过程,直到提出的逻辑模型完全符合系统目标。

2.2.5 导出和评价供选择的解法

分析员应该从他建议的 系统逻辑模型 出发,导出若干个较高层次的 物理解法 供比较和选择。

其次可以考虑 操作方面 的可行性。分析员应该根据使用部门处理事务的原则和习惯检查技术上可行的那些方案,去掉其中从操作方式或操作过程的角度看用户不能接受的方案。

接下来应该考虑 经济方面 的可行性。分析员应该估计余下的每个可能的系统的开发成本和运行费用,并且估计相对于现有的系统而言这个系统可以节省的开支或可以增加的收入。

最后为每个在技术、操作和经济等方面都可行的系统 制定实现进度表,这个进度表不需要制定得很详细,通常只需要估计生命周期每个阶段的工作量。

2.2.6 推荐行动方针

根据可行性研究结果应该决定的一个关键性问题是:是否继续进行这项开发工程?分析员必须清楚地表明他对这个关键性决定的建议。如果分析员认为值得继续进行这项开发工程,那么他应该选择一种 最好的解法,并且说明选择这个解决方案的理由。通常客户主要根据经济上是否划算决定是否投资于一项开发工程,因此分析员对于所推荐的系统必须进行比较仔细的 成本/效益 分析。

2.2.7 草拟开发计划

分析员应该为所推荐的方案草拟一份开发计划,除了制定工程进度表之外还应该估计对各类开发人员和各种资源的需要情况,应该指明什么时候使用以及使用多长时间。此外还应该估计系统生命周期每个阶段的成本。最后应该给出下一个阶段(需求分析)的 详细进度表成本估计

2.2.8 书写文档提交审查

应该把上述可行性研究各个步骤的工作结果写成清晰的 文档,请用户、客户组织的负责人及评审组审查,以决定是否继续这项工程及是否接受分析员推荐的方案。

2.3 系统流程图

思考题

加油站基础信息管理系统,是一个定位于加油站基本信息、油机信息、油罐信息、加油站督查情况、督查图片、加油站电子地图等信息查询、维护的管理系统。该管理系统放在安徽省石油公司内网上,采用网站的形式使用该管理系统,有助于各分公司随时查看加油站基础信息,便于对加油站信息的统计、查询等。全系统共分为加油站信息管理、人的管理、费用管理三个大块。

系统流程图实例

系统流程图 是概括地描绘 物理系统 的传统工具。

基本思想: 用图形符号以 黑盒子 形式描绘组成系统的 每个部件(程序、文档、数据库、人工过程等)。

系统流程图表达的是数据在系统各部件之间流动的情况,而不是对数据进行加工处理的控制过程,因此尽管系统流程图的某些符号和程序流程图的符号形式相同,但是它却是 物理数据流图 而不是程序流程图。

2.3.1 符号

利用符号可以把一个广义的输入输出操作具体化为读写存储在特殊设备上的文件(或数据库),把抽象处理具体化为特定的程序或手工操作等。

以概括的方式抽象地描绘一个实际系统时,仅仅使用下图中列出的基本符号就足够了

需要更具体地描绘一个物理系统时还需要使用右图中列出的系统符号

2.3.2 例子

某装配厂有一座存放 零件仓库,仓库中现有的各种 零件的数量 以及每种零件的 库存量临界值 等数据记录在 库存清单主文件 中。当仓库中零件数量有变化时,应该及时修改库存清单主文件,如果哪种零件的库存量少于它的库存量临界值,则应该报告给 采购部门 以便订货,规定每天向采购部门送一次 订货报告

该装配厂使用一台小型计算机处理更新库存清单主文件和产生订货报告的任务。零件库存量的每一次变化称为一个 事务,由放在 仓库中的CRT终端 输入到计算机中;系统中的库存清单程序对事务进行处理,更新存储在磁盘上的库存清单主文件,并且把必要的订货信息写在 磁带 上。最后,每天由报告生成程序读一次磁带,并且打印出订货报告。

如下图所示。

2.3.3 分层

面对复杂的系统时,一个比较好的方法是 分层次 地描绘这个系统。首先用一张高层次的系统流程图描绘系统总体概貌,表明系统的关键功能。然后分别把每个关键功能扩展到适当的详细程度,画在单独的一页纸上。这种分层次的描绘方法便于阅读者按从抽象到具体的过程逐步深入地了解一个复杂的系统。

2.4 数据流图

数据流图(DFD)是一种图形化技术,它描绘 信息流和数据 从输入移动到输出的过程中所经受的 变换

2.4.1 符号

数据流四中基本符号

  • 正方形表示数据的源点或终点

  • 圆角矩形代表变换数据的处理

  • 开口矩形代表数据存储

  • 箭头表示数据流,即特定数据的流动方向

注: a 为基本符号, b 为附加符号.

数据流的分层描述

为了表达数据处理过程的数据加工情况,需要采用 层次结构 的数据流图。按照系统的层次结构进行 逐步分解,并以分层的数据流图反映这种结构关系,能清楚地表达和容易理解整个系统

编写数据流图的步骤 - 最高抽象层

抽取数据的源点和终点信息

分析问题描述,重点提取问题描述中源点和终点信息,同时分析与源点和终点有关的各类高抽象度的加工和数据流以及数据存储信息。

处理顺序是:

  1. 首先抽取数据的源点和终点信息

  2. 抽取加工点的信息

  3. 最后考虑数据流和数据存储信息

    (数据流图与程序流不同,程序流图表示的是控制,而数据流图描述的是数据的流向。)

编写数据流图的步骤 - 细化处理

进一步分解数据流图的加工,数据流和储存信息 分析问题描述,重点细化加工点,处理顺序是:

  1. 分析上层加工点的信息,细化加工点信息

  2. 分析数据流和数据存储信息,细化数据流和数据存储信息

  3. 对加工点、数据流和数据存储进行多层次的优化

数据流图绘制的准则

  • 细化结束的准则:是当涉及到如何具体实现一个功能时就不应该再细化了。

  • 细化一致性准则:当把一个处理细化为一些子处理时,细化前和细化后的数据流必须相同。

  • 层次编号准则:对数据流图中的元素进行编号处理时应该能够反映出元素的层次和分解关系。

  • 数据分解简化性准则:数据流图中的元素不能太多,如果太多就需要进行分层描述处理。

创建数据流图方法 - 语法分析方法

所谓语法分析方法是通过对软件需求的文本描述的分析,选取出其中的动词和名词。其中动词通常表示为应用中的加工过程描述;而名词通常被描述为外部实体(方框)、数据或控制对象(箭头)、或数据存储(双线表示)。这些名词和动词之间是相互关联的。

语法分析方法实例

加油站电子帐表系统 是根据 加油站 日常工作流程开发,适用于加油站 进、销、付、存 管理的服务模块。系统可以根据 加油站 录入 的日常 顾客 消费 数据,结合 油库进货 数据,自动 生成 各种 报表帐表

数据流图实例

加油站电子帐表系统 这个数据流图只是一个高层的系统逻辑模型,它反映了目标系统要实现的功能

0层:

1层描述

2层描述

3层销售细化描述

2.4.2 例子

以简单例子说明怎样画数据流图

假设一家工厂的采购部每天需要 一张订货报表,报表按 零件编号 排序,表中列出所有需要再次订货的零件。对于每个需要再次订货的零件应该列出下述数据:零件编号,零件名称,订货数量,目前价格,主要供应者,次要供应者。零件入库或出库称为 事务,通过放在仓库中的 CRT终端事务报告订货系统。当某种零件的库存数量少于库存量临界值时就应该再次订货。

  • 第一步:可以从问题描述中提取数据流图的4种成分

首先考虑数据的 源点和终点,从上面对系统的描述可以知道“采购部每天需要一张订货报表”,“通过放在仓库中的CRT终端把事务报告给订货系统”,所以 采购员数据终点,而 仓库管理员数据源点

  • 第二步:再一次阅读问题描述,“采购部需要报表”

因此必须有一个用于 产生报表 的处理。事务的后果是改变零件库存量,然而任何改变数据的操作都是处理,因此对 事务进行的加工 是另一个处理。注意,在问题描述中并没有明显地提到需要对事务进行处理,但是通过分析可以看出这种需要。

  • 第三步:考虑数据流和数据存储

系统把订货报表送给采购部,因此订货报表是一个数据流;事务需要从仓库送到系统中,显然事务是另一个数据流。产生报表和处理事务这两个处理在时间上明显不匹配——每当有一个事务发生时立即处理它,然而每天只产生一次订货报表。因此,用来产生订货报表的数据必须存放一段时间,也就是应该有一个 数据存储

实例

步骤一:

分析结果

步骤二:

把数据流图的4种成分都分离出来以后(上图所示),就可以着手画数据流图了

步骤三:

把基本系统模型细化,描绘系统的主要功能

步骤四:

对功能级数据流图中描绘的系统主要功能进一步细化

2.4.3 命名

数据流图中每个成分的命名是否恰当,直接影响数据流图的可理解性。因此,给这些成分起名字时应该仔细推敲。

为处理命名时应注意的问题

  1. 通常先为数据流命名,然后再为与之相关联的处理命名。

  2. 名字应该反映整个处理的功能,而不是它的一部分功能。

  3. 名字最好由一个具体的及物动词加上一个具体的宾语组成。

  4. 通常名字中仅包括一个动词,如果必须用两个动词才能描述整个处理的功能,则把这个处理再分解成两个处理可能更恰当些。

  5. 如果在为某个处理命名时遇到困难,则很可能是发现了分解不当的迹象,应考虑重新分解。

2.4.4 用途

  1. 画数据流图的基本目的是利用它作为交流信息的工具。

  2. 数据流图的另一个主要用途是作为分析和设计的工具。

  3. 数据流图辅助物理系统的设计时,以图中不同处理的定时要求为指南,能够在数据流图上画出许多组自动化边界,每组自动化边界可能意味着一个不同的物理系统。

2.5 数据字典

数据字典是关于数据的信息的集合,也就是对数据流图中包含的 所有元素 的定义的集合。

2.5.1 内容

一般说来,数据字典应该由对下列 4 类元素的定义组成。

  • 数据流

  • 数据流分量

  • 数据存储

  • 处理

数据元素的别名就是该元素的其他等价的名字,出现别名主要有下述3个原因:

  • 对于同样的数据,不同的用户使用了不同的名字。

  • 一个分析员在不同时期对同一个数据使用了不同的名字。

  • 两个分析员分别分析同一个数据流时,使用了不同的名字。

2.5.2 定义数据的方法

由数据元素组成数据的方式只有下述 3 种基本类型:

  • 顺序即以确定次序连接两个或多个分量。

  • 选择即从两个或多个可能的元素中选取一个。

  • 重复即把指定的分量重复零次或多次。

第4种:关系算符

  • =意思是等价于(或定义为);

  • +意思是和(即连接两个分量);

  • [ ]意思是或(即从方括弧内列出的若干个分量中选择一个),通常用“|”号隔开供选择的分量;

  • { }意思是重复(即重复花括弧内的分量);

  • ( )意思是可选(即圆括弧里的分量可有可无)。

2.5.3 数据字典的用途

数据字典最重要的用途是作为分析阶段的工具。

数据字典中包含的每个数据元素的控制信息是很有价值的。

数据字典是开发数据库的第一步,而且是很有价值的一步。

2.5.4 数据字典的实现

目前,数据字典几乎总是作为CASE “结构化分析与设计工具” 的一部分实现的。在开发大型软件系统的过程中,数据字典的规模和复杂程度迅速增加,人工维护数据字典几乎是不可能的。

在开发 小型软件系统 时暂时没有数据字典处理程序,建议采用 卡片形式 书写数据字典,每张卡片上保存描述一个数据的信息。

下面给出几个数据元素的数据字典卡片,以具体说明数据字典卡片中上述几项内容的含义。

数据词典实例

银行存折

存折格式

  • 存折=户名+所号+帐号+开户日+性质+(印密)+1{存取行}50

  • 户名=2{字母}24

  • 所号=“001”..“999”

  • 帐号=“00000001”..“99999999”

  • 开户日=年+月+日

  • 性质=“1”..“6” 注:“1”表示普通户,“5”表示工资户等

  • 印密=“0” 注:印密在存折上不显示

  • 存取行=日期+(摘要)+支出+存入+余额+操作+复核

加油站员工信息表

成本估算的三种技术

  1. 代码行技术:代码行技术的优缺点,估算代码行比较困难.如果有类似的经历也许可以比较简单但成本有高估的可能;

  2. 任务分解技术:这是目前应用比较多的一种方法;

  3. 自动估计成本技术;

2.6 成本/效益分析

2.6.1 成本估计

软件开发成本主要表现为人力消耗(乘以平均工资则得到开发费用)。成本估计不是精确的科学,因此应该使用几种不同的估计技术以便相互校验。 下面简单介绍3种估算技术。

  1. 代码行技术

  2. 任务分解技术

  3. 自动估计成本技术

任务分解技术最常用的办法是按开发阶段划分任务。典型环境下各个开发阶段需要使用的人力的百分比大致如下表:

2.6.2 成本/效益分析的方法

成本/效益分析方法主要从四个方面考虑

  • 货币的时间价值

  • 投资回收期

  • 纯收入

  • 投资回收率

货币的时间价值

通常用利率的形式表示货币的时间价值。假设年利率为i,如果现在存入P元,则n年后可以得到的钱数为:

F=P(1+i)^n

这也就是P元钱在n年后的价值。反之,如果n年后能收入F元钱,那么这些钱的现在价值是:

P=F/(1+i)^n

例如,修改一个已有的库存清单系统,使它能在每天送给采购员一份订货报表。修改已有的库存清单程序并且编写产生报表的程序,估计共需5000元;系统修改后能及时订货,这将消除零件短缺问题,估计因此每年可以节省2500元,5年共可节省12500元。但是,不能简单地把5000元和12500元相比较,因为前者是现在投资的钱,后者是若干年以后节省的钱。

假定年利率为12%,利用上面计算货币现在价值的公式可以算出修改库存清单系统后每年预计节省的钱的现在价值,如下表所示。

本章小结

  1. 了解可行性研究的必要性,以及如何进行可行性研究

  2. 学习 系统流程图数据流图

  3. 学习 数据字典 的概念、用途及实现

  4. 成本/效益 分析方法

习题

习题 2.2

  • 为方便储户,某银行拟开发 计算机储蓄系统储户 填写的 存款单或取款单业务员 输入系统,

  • 如果是 存款,系统记录 存款人姓名、住址、存款类型、存款日期、利率 等信息,并印出存款单给储户;

  • 如果是取款,系统计算 利息并印出利息清单 给储户。

0层:源点/终点

1层,数据流

2层,数据流

习题 2.3

为方便旅客,某航空公司拟开发一个 机票预订系统

旅行社把预订机票的 旅客信息(姓名、性别、工作单位、身份证号码、旅行时间、旅行目的地等) 输入 该系统,系统为 旅客 安排 航班,印出 取票通知和账单,旅客在飞机起飞的前一天凭取票通知和账单 交款 取票,系统校对无误即 取出 机票 给旅客。

0层,源点,终点

1层,数据流

2层,数据流

习题 2.4

目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的患者监护系统,试写出问题定义,并且分析开发该系统的可行性。

医院对 患者 监护系统的基本要求是随时 接收,每个病人的 生理信号(脉搏、体温、血压、心电图等)定时记录 病人情况以形成 患者日志,当某个病人的生理信号超出医生规定的 安全范围 时,向值班护士发出 警告信息,此外,护士在需要时,还可以要求系统印出某个指定病人的病情报告

0层,源点,终点

1层,数据流

2层,数据流

习题 2.5

数据字典

  • 北京某高校可用的电话号码由以下几类:校内电话号码由4位数字组成,第一位数字不是零;

  • 校外电话又分为本市电话和外地电话两类,拨校外电话先拨0,

  • 若是本地电话再接着拨8位数字(固话第一位不是0)或11位数字(移动电话第一位为1);

  • 若是外地电话,则拨3位区码再拨8位电话号码(固话第一位不是0),或拨0再拨11位数字(移动电话第一位为1)。

数据定义

  • 电话号码=[校内号码|校外号码]

    • 校内号码=非0数字+3{数字}3

    • 校外号码=0+[本地号码|外地号码]

      • 本地号码=[固话号码|手机号码]

        • 固话号码=非0数字+7{数字}7

        • 手机号码=1+10{数字}10

      • 外地号码= [外地固话号码|外地手机号码]

        • 外地固话号码=3{数字}3+固话号码

        • 外地手机号码=0+手机号码

  • 非0数字=[1|2|3|4|5|6|7|8|9]

Last updated