65.9K
CodeProject 正在变化。 阅读更多。
Home

使用功能点报价软件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.04/5 (29投票s)

2004年9月1日

19分钟阅读

viewsIcon

186440

使用功能点来估算软件。

摘要

软件行业,一个销售逻辑产品的行业。购买软件的优势在于自动化、更好地分析业务,从而使生活更轻松。由于我们销售的是逻辑产品,因此很难精确地进行成本核算。客户只有在使用软件一段时间后,才能看到购买软件的好处,然后说“啊,值得”。当客户看到会计工作效率提高、发票错误减少时,客户就会信服。因此,在初期阶段说服客户确实是一个巨大的挑战。如果报价过高,您将失去项目;如果报价过低,您将最终为客户提供免费服务,甚至可能亏损。在本教程中,我们将主要从实践角度讨论“功能点”。

缩略语和简称

在整个教程中,我使用了许多缩略语。提前了解它们将使您的阅读更加舒适。

  1. FP : 功能点
  2. ILF : 内部逻辑文件。
  3. EIF : 外部接口文件
  4. EI : 外部输入
  5. EO : 外部输出
  6. EQ : 外部查询
  7. RET : 记录元素类型
  8. DET : 数据元素类型
  9. FTR : 文件类型引用
  10. GSC : 通用系统特征
  11. VAF : 价值调整因子
  12. LOC : 代码行数

范围

本文将提供一种使用“功能点”的实用方法。功能点是一个非常广泛的话题,如果说本教程能涵盖所有内容,那就太不公平了。因此,最后我附上了不同网站的链接,供您进一步查阅。本文将重点介绍功能点的计算方法。所以在阅读本教程时,请准备好您的数学头脑。关于如何评估软件的争论已经持续多年。所以,如果我说功能点是完美的方式,我的邮箱就会收到大量反驳。软件成本评估技术(代码行数、功能点等)各有优缺点。因此,本教程将仅讨论功能点计算以及一个小的客户屏幕示例,以帮助您获得功能点的感觉。在阅读我的文章时,您会看到一些数学公式。您可能还会想,软件不可能用公式来评估。

理论

如果让我分析任何实体产品的成本,例如一支简单的钢笔,我可以大致估算出笔帽的成本、墨水的成本等,并得出一个粗略的估计。客户也同样信服,因为他们可以看到这些实体产品。软件行业也有成本评估的实践,以下是两种主要方法:

  1. 代码行数。
  2. 功能点 (FP)。

我个人不相信代码行数。在这个软件领域,复用性很强,1000行代码可能变成200行,从而导致完全的误判。在设计阶段,你怎么知道总代码行数呢?出于某种原因,我觉得代码行数对软件公司比对客户更有利。试想一下,我想用 C 语言做一个简单的基于 Windows 的客户 GUI,用 Visual Basic 做同样的,代码行数会大不相同,因此成本也不同。总之,代码行数依赖于编程语言。“如果世界上只有一种编程语言,代码行数就会是公平的。” 只是我个人的观点。程序员的产出不是数量(代码行数),而是他编写的逻辑。如果我们想评估房屋成本,我们会测量砖块和钉子的数量吗?好吧,我在这里停止谈论代码行数,否则整个教程会显得我反对代码行数。

但有了 FP,我认为报价对客户和软件公司来说都更加公平,并且在很大程度上(并非完全)与语言无关。在我的一位客户那里,我非常信服 FP,客户交给我们一本厚厚的用例书,让我们估算成本。我们有四个人组成一个团队。我们分成两组,说让我们来估算一下,然后比较结果。连续两天计算完每一个元素后,我们发现两组都得到了相同的“功能点”值,这意味着即使是不同的人来做,结果也一致。

功能点的定义和历史

它们是软件度量单位,就像距离有公里一样。有一句名言:“你无法控制你无法度量的事物”。将系统分解为更小的系统,分析它们,并为每个单元计算成本。最后,我们将所有的小单元相加,得出总成本。功能点从功能角度衡量系统,并且与技术无关。
这听起来是不是很酷?亲爱的客户,我们将为这些功能开具 1000 功能点的发票。

功能点分析最初由 Allan J. Albrecht 在 20 世纪 70 年代中期开发。这是为了克服与代码行数作为软件规模度量相关的困难,并开发一种机制来预测软件开发的工作量。该方法于 1979 年首次发布,随后于 1983 年发布。1984 年,Albrecht 改进了该方法,自 1986 年成立国际功能点用户组 (IFPUG) 以来,已发布了多个版本的功能点计数实践手册。最佳实践和实际示例

功能点的组成部分

有基本的 4 个组成部分。以下所有四个组成部分都可以位于应用程序内部或外部。

数据部分:数据部分进一步细分为

  1. 内部逻辑文件 (ILF):包含位于应用程序边界内的逻辑相关数据。应用程序必须维护数据。例如,客户表,通过客户数据录入屏幕进行维护。请注意,应用程序内部的数据被更新,而不是任何外部数据。但是,如果您正在更新外部应用程序表,那些表将不会被归类为 ILF。
  2. 外部接口文件 (EIF):包含位于应用程序边界外部的组件,仅用于参考目的。注意:在此部分中不包括更新外部应用程序的功能。

事务部分:事务部分使用数据部分,即它维护 ILF 和 EIF 的信息。请原谅我到处使用的简短缩写,例如 ILF 和 EIF,顶部有所有内容的缩写列表。以下 3 个组件添加、修改、删除、检索或处理 ILF 和 EIF 中包含的信息,因此被称为事务部分。

  1. 外部输入 (EI):EI 主要用于维护 ILF。会计人员肯定应该有一个界面,通过该界面他们可以维护(添加、更新、删除)客户 ILF。得出 EI 的基本判断因素来自用户屏幕。例如,一个客户维护屏幕,让我们知道我们有一个客户的 1 个 EI 和 1 个 ILF。
  2. 外部输出 (EO):在这里,数据从应用程序内部传递到外部。例如,您的应用程序生成 XML 或 CSV(逗号分隔值)文件。这些文件然后被某个外部应用程序用于更新外部应用程序表。所以,在这种情况下,数据从您的应用程序传递到外部应用程序。因此,这类功能将属于此类别。
    当您将数据发送到外部应用程序时,如果您从外部应用程序获得某些输出。之后,如果该输出被更新到内部应用程序的 ILF 中,这种情况也属于 EO。
    因此,识别 EO 的试金石是:
    a) 当数据跨越边界并更新外部应用程序表 (EIF) 时。
    b) 作为您发送数据的响应,您获得了一些派生数据并更新到内部应用程序 (ILF) 时。
  3. 外部查询 (EQ):这些功能主要是报告。它们有输入条件。任何类型的报告和搜索屏幕都是 EQ 的合适组成部分。请注意,与 EI 和 EQ 一样,它们不更新任何 ILF 或 EIF。它们仅用于检索数据以供显示。因此,识别 EQ 的试金石是任何不更新任何表(ILF 或 EIF)中数据的报告或搜索屏幕。例如,会计报告中的资产负债表。

子部分:这些是子部分,可以是事务部分或数据部分的子集。

  1. 记录元素类型 (RET):逻辑文件内数据元素的子组。在我们的客户 ILF 中,我们可能有多个地址或多个电话号码。因此,对于客户,我们可以有两个 RET:地址和电话号码。
  2. 数据元素类型 (DET):DET 是 ILF 中非重复的字段。请注意,我这里说的是字段不应在计数中重复。每个客户 ILF 都可以有客户代码。因此,客户代码成为一个 DET。每张发票都可以有客户代码,表明该发票属于谁。但是一旦客户代码被计算过,就不要将客户代码重复计算两次作为两个不同的 DET。但在实际场景中,在进行大型项目的实际功能点计算时,有可能重复计算 DET,进行第二次迭代只是为了删除重复的 DET。
  3. 文件类型引用 (FTR):FTR 是由事务引用的文件。FTR 也必须是内部逻辑文件或外部接口文件。

通用系统特征部分 (GSC)

这一部分是最重要的部分。以上所有 3 个部分都是计数部分。它们仅与应用程序相关。但是,在制作软件时,还需要考虑其他因素,例如您是否要制作 N 层应用程序,用户期望的性能水平是多少等。这些是影响软件及其成本的外部因素。当您向客户提交一个功能点时,他通常会跳过所有内容,直接查看 GSC。GSC 提供了称为 VAF(价值调整因子)的内容。有 14 个点被考虑用于得出 VAF(价值调整因子)。

  1. 数据通信:有多少通信设施可以帮助与应用程序或系统进行信息传输或交换?
  2. 分布式数据处理:如何处理分布式数据和处理功能?
  3. 性能:用户是否要求响应时间或吞吐量?
  4. 重度使用的配置:应用程序将执行的当前硬件平台的使用频率有多高?
  5. 事务率:事务执行的频率如何?每天、每周、每月等?
  6. 在线数据录入:信息中有多少百分比是在线录入的?
  7. 最终用户效率:应用程序是否为最终用户效率而设计?
  8. 在线更新:有多少 ILF 被在线事务更新?
  9. 复杂处理:应用程序是否具有广泛的逻辑或数学处理?
  10. 可重用性:该应用程序是为满足一个或多个用户的需求而开发的吗?
  11. 安装简易性:转换和安装的难度如何?
  12. 操作简易性:启动、备份和恢复程序的有效性和/或自动化程度如何?
  13. 多站点:该应用程序是否专门设计、开发和支持,以便在多个站点为多个组织安装?
  14. 促进变更:该应用程序是否专门设计、开发和支持以促进变更?

所有 GSC 的评分从 0 到 5。因此,VAF 的公式如下:

VAF = 0.65 + ((sum of all GSC factor)/100).

范围文档

功能点评估取决于您的系统提供多少功能。因此,在使用功能点之前,您必须了解其功能。在本教程中,我们将评估客户 GUI。因此,我将简要说明客户 GUI 的范围。

以下是客户屏幕的范围:

  1. 客户屏幕如下所示。
  2. 输入客户代码和客户名称后。将进行信用卡验证。
  3. 信用卡检查是一个外部系统。
  4. 每个客户可以有多个地址。
  5. 客户将具有添加、更新功能。

开始计数

正如之前所说,这是一个 FP 的实践指南,以便快速上手。本节将讨论实际的 FP 计数方法,并得出项目的工时。

得出 FP 的步骤
  • 计算 ILF、EIF、EI、EQ、RET、DET、FTR(这基本上是上面讨论的所有部分):这个完整的 FP 计算将被称为“未调整功能点”。
  • 然后为所有 14 个 GSC 赋予 0 到 5 的评分。将所有 14 个 GSC 的总和加起来,得出总 VAF。VAF 的公式 = 0.65 +(所有 GSC 因子之和/100)。
  • 最后,计算调整后的功能点。公式:总功能点 = VAF * 未调整功能点。
  • 估计每天可以完成多少功能点。这也称为“性能因子”。
  • 根据性能因子,您可以计算工时。

现在我们知道了步骤,可以开始计数了。但是,请稍等,这里是我们计数时将参考的所有图表。这些图表是排名图,用于决定组成部分的复杂性。

EI 评分表

数据元素

FTR

1 到 4

5-15

>15

小于 2

3

3

4

2

3

4

6

>2

4

6

6

此表表明,在任何 EI(外部输入)中,如果您的 DET(数据元素)计数和 FTR(文件类型引用)超过这些限制,那么它应该是 FP(功能点)。例如,如果您的 DET(数据元素)超过 15 且 FTR(文件类型引用)大于 2,则功能点计数为 6。下面的其余表格也显示了相同的内容。在我们进行功能点计数时,这些表格将可用。最好的方法是将这些值放入 Excel 中,并使用公式,这样您只需在相应部分输入数量即可获得最终值。

EO 评分表

数据元素

FTR

1 到 5

6-19

>19

< 2

4

4

5

2 或 3

4

5

7

>3

5

7

7

EQ 评分表

数据元素

FTR

1 到 5

6-19

>19

< 2

3

3

4

2 或 3

3

4

6

>3

4

6

6

ILF 评分表

数据元素

RET

1 到 19

20-50

51 或更多

1 RET

7

7

10

2 到 5

7

10

15

>6

10

15

15

EIF 评分表

数据元素

RET

1 到 19

20-50

51 或更多

1 RET

5

5

7

2 到 5

5

7

10

>6

7

10

10

下表说明了我们需要查看的内容:每个事务允许的子部分。如果您查看下面的表格,EI 将包含 FTR 和 DET。因此,在计数时,我们需要按此方式计数。

RETs

FTRs

DETs

EI 1

1

EO 1 1
EQ 1 1
EIF 1 1
ILF 1 1


简单的客户项目

这是一个简单的项目需求,我们只需要处理客户表单及其地址详情。以下是屏幕。

以上屏幕中有 2 个 ILF。
  1. 客户 ILF。
  2. 客户地址 ILF。
  • 以上表单没有 EIF。

ILF 客户

描述 DET 数量 RET 数量
总共有 10 个 DET,所有添加和更新按钮,甚至信用卡检查按钮,地址列表框,复选框活动,所有文本框。

只有一个 RET,即客户地址。请注意,我没有将信用卡检查包含在 RET 中,因为它们不是客户 ILF 的子元素(子元素)。

10 1
所以根据上面的 ILF 排名表 总功能 7

ILF 客户地址

描述 DET 数量 RET 数量
总共有 3 个 DET,列表框中的所有列名、城市名称、街道名称和邮政编码。

对于客户地址 ILF,没有 RET。请注意,如果客户地址屏幕在其他地方并且有 RET,请相应地进行更改。
3 0
总 FP 7

EIF 信用卡信息

描述 DET 数量 RET 数量
引用的信用卡信息是 EIF。请注意,此文件仅用于信用卡检查。

只有一个文本框信用卡号码,因此在侧边栏中输入了一个 DET,RET 为 0。根据上面的排名表,总 FP 为 5。

1 0
总 FP 5

EI 客户

描述 DET 数量 FTR 数量
总共有 10 个 DET,所有添加和更新按钮,甚至信用卡检查按钮,地址列表框,复选框活动,所有文本框。

有两个 FTR,一个是地址,第二个是信用卡信息。

10 2
参考上面的排名表 总功能 4

在计算 EI 时,我看到很多人将其乘以 3。这意味着我们将执行所有 CRUD 功能(添加、更新、删除)。这不公平,因为它只显示了成本估算团队的懒惰。这里客户屏幕有添加和更新。我可以说 2 * 4 = 8 FP 用于此 EI 客户。但我会在我的缓冲中调整此因素。如果您对每个主屏幕都开始乘以这个数,对客户来说就不公平了。所以,在这里我将其计为 1 个 EI,而不乘以任何系数。

EO 客户

此屏幕没有 EO。因为客户系统没有向外部系统发送任何信息来添加或更新外部系统。

EQ 客户

此屏幕没有 EQ。目前这里没有报告部分。请注意,客户地址的显示不计为 EQ。

因此,现在让我们将上面表格中计算出的总功能点加起来。

部分名称 计数的函数点
ILF 客户 7
ILF 客户地址 7
EIF 信用卡信息 5
EI 客户 5
未调整总功能点 24

所以所有功能点加起来是 24。请注意,我说这是未调整的功能点,因为我们还没有考虑项目的其他变化因素(程序员离职、我们将使用的语言、什么架构等)。


为了使其成为调整后的功能点,我们需要计算和汇总 GSC 并得出 VAF。

GSC 值(0-5)
数据通信 1
分布式数据处理 1
性能 4
重度使用的配置 0
事务率 1
在线数据录入 0
最终用户效率 4
在线更新 0
复杂处理 0
可重用性 3
安装简易性 4
操作简易性 4
多站点 0
促进变更 0
总计 22

所以,使用公式

VAF = 0.65 + ((sum of all GSC factor)/100). = 0.65 + (22/100) = 0.87.

这个因素会极大地影响整个 FP,请务必注意此因素。现在,计算
调整后 FP = VAF * 未调整总数
FP = 0.87 * 24 = 20.88 = 四舍五入到 21 FP。
现在我们知道客户 GUI 的完整 FP 是 21 FP。现在计算效率因子,我们说我们每天完成 3 FP,也就是 7 个工作日。因此,整个客户 GUI 需要 7 个工作日(请注意,这里不包括周六和周日)。我知道上面的经理会说每天完成 7 FP,让程序员超负荷工作。这就是为什么程序员要熬夜工作。

其他实际因素

我希望上面的例子能清楚地说明如何使用功能点。但如果软件行业很简单,FP 就足够了。无论我如何强调,软件成本核算仍然是一个模糊的领域。功能点只能帮助您整理事物,并使其接近最终数字。在实现和计算功能点时,很多事情都需要常识(这并不那么常见)。经验是唯一能帮助您进行软件成本核算和评估的事物。

但也要考虑以下实际情况:

  1. 在总 FP 中,添加一个缓冲 FP,以防客户要求任何更改或额外功能。因为,在谈判期间,客户肯定会压低价格,所以您在谈判时会处于安全位置。
  2. 这个方法对我很有帮助。看看客户能花多少钱,这将使事情变得清晰。然后自己判断,这个成本是否合适,还是会被拒绝。
  3. 其次,软件对他有多重要,如果关键性很高,他离不开它,就根据这一点来报价。这是我一位朋友的经历,他是一名自由职业者。他曾经被请去做一个小的现金维护程序。只有一个表单和一个报告,说明当天收到了多少钱,还有一个维护表单。嗯,一个表单,一个报告,他报了一个相当低的价格。他花了一天时间完成项目,一周后收到了钱。但随后,客户两天后打电话给他,告诉他:“你这个小程序为我节省了大量的金钱和时间。你报的价格根本不算什么,我愿意支付更高的价格。”他说,永远不要按数量或大小来报价,而是要看我们使用软件的频率。”我见过价值数十亿美元的项目无人使用,而由一个人制作的小项目却能支撑整个公司的自动化。
  4. 客户是否考虑维护方面,这意味着客户可能是永久的收入来源,那么就按这个方式报价,以便在维护期间获得您的份额。FP 不考虑维护。得出维护成本的最佳方法是考虑产品发布后您在现场需要多少程序员,加上您的利润份额。
  5. 评估了他的业务后,与他签署一份范围文档,说明我们将做什么。任何超出范围的内容都将收费。这样客户就清楚地了解了正在发生的事情。
  6. 定期为更改和修改开具发票。这样客户就知道他所说的任何更改都会产生成本。

以上几点有助于对计算出的 FP 进行增减。

参考文献

教程链接

  1. 国际功能点用户组 http://www.ifpug.org
  2. http://www.qpmg.com/fp-intro.htm。
  3. 本网站上的一个很好的 PDF 教程 http://www.ifpug.com/freemanual.htm

免费功能点软件

  1. 在谷歌搜索 FPrecorder。

最后的话

“不要报价太低,让程序员熬夜工作,你就会失去项目或最终提供社会服务,或者亏损。不要报价太高,以免失去项目。对自己和客户都要公平。”

Shivprasad Koirala.

© . All rights reserved.