# 什么是 COSMIC 功能点，它与工时估算有何不同？

位于匈牙利布达佩斯的软件开发公司 Mesterséges Intelligencia Központ Kft. 以 COSMIC 功能点度量软件的规模：这样，规模就是软件本身的属性，而不是估算者的感觉，因此可以核查、可以重新度量，也可以用来比较两份报价。

> **要点：**COSMIC（ISO/IEC 19761）度量软件的功能规模：每一次数据移动，即 Entry（输入）、Exit（输出）、Read（读取）、Write（写入），都计为 1 个 COSMIC 功能点（CFP）。工时估算说明的是估算者预期有多少工作量；度量出的规模说明的是任务有多大。因此，规模可以核查、可以重新度量，也可以用来比较两份报价；而工作量则可以根据规模和实践中测得的生产率推算出来。

## 什么是功能规模度量？

软件的规模可以用多种方式表示：代码行数、小时数、点数。功能规模度量（英文为 functional size measurement，FSM）度量的是从用户的角度看软件必须能做什么，而不是它如何实现。其基本概念由 [ISO/IEC 14143-1:2007](https://www.iso.org/standard/38931.html) 标准规定；根据该标准的介绍，其目的正是让度量关注用户所要求的功能，而不是实现方式。

度量的基础是功能性用户需求（functional user requirements，FUR）的范围：即用户需求中描述软件必须执行哪些任务、提供哪些服务的那一部分。性能、安全性或所选技术不属于这一范围，我们会在下文的局限性部分讨论它们。

目前存在多种标准化的功能规模度量方法。最知名的是 COSMIC（[ISO/IEC 19761:2011](https://www.iso.org/standard/54849.html)）和 IFPUG 方法（[ISO/IEC 20926:2009](https://www.iso.org/standard/51717.html)）；ISO 还标准化了其他方法（NESMA、FiSMA、Mk II）。它们都以需求为依据，但规则和计量单位各不相同，因此用不同方法度量出的数值无法直接比较。

## 什么是 COSMIC？

COSMIC 是 Common Software Measurement International Consortium（通用软件度量国际联盟）的缩写：这是一个非营利组织，负责维护该方法并组织度量人员的认证。该方法于 20 世纪 90 年代末在早期功能点方法的基础上发展而来，2003 年成为 ISO 标准，现行版本为 ISO/IEC 19761:2011。该方法的详细说明，即 [COSMIC Measurement Manual](https://cosmic-sizing.org/measurement-manual/)（COSMIC 度量手册）5.0 版，可以免费下载；其第一部分于 2021 年发布，第二部分于 2024 年发布。

根据该标准，该方法适用于度量应用软件（例如业务系统）、实时软件以及两者的混合。也就是说，ERP、CRM 或网店系统可以用它来度量，控制软件也同样可以。

## COSMIC 模型的概念

COSMIC 用一个简单的模型来描述软件：软件跨越其边界与功能用户交换数据，并在边界之内从持久存储中读取数据、向其中写入数据。

| 概念 | 含义 | 示例 |
|---|---|---|
| 功能用户 | 向软件发送数据或期待从软件获得数据的人或物：人、其他软件或设备 | 业务员、开票系统 |
| 边界 | 被度量软件与其功能用户之间的概念性界面 | Web 界面以及向其他系统开放的接口 |
| 触发事件 | 功能用户为响应它而启动一个功能处理的事件 | 新客户前来登记 |
| 功能处理 | 需求中最基本的、可独立执行的单元，由一组相互关联的数据移动组成 | “录入新客户” |
| 数据组 | 一组数据属性，描述软件需要处理其数据的某一个事物 | 客户：姓名、地址、税号、电子邮件 |
| 数据移动 | 单个数据组的移动；共有四种类型 | 见下文 |

四种数据移动：

- **Entry（输入）：**一个数据组从功能用户跨越边界进入功能处理。
- **Exit（输出）：**一个数据组从功能处理跨越边界流向功能用户。
- **Read（读取）：**功能处理从持久存储中读取一个数据组。
- **Write（写入）：**功能处理把一个数据组写入持久存储；删除也算作写入。

以下是决定计数结果的几条度量规则：

- 每次数据移动计为 1 CFP。一个功能处理的规模是其数据移动之和，软件的规模是其各功能处理规模之和。
- 每个功能处理至少包含两次数据移动：一次触发性输入，以及至少一次输出或写入。
- 在一个功能处理中，同一数据组的同一种移动只计算一次，无论其中包含多少个字段。
- 一个功能处理的所有错误消息和确认消息合起来只算一次输出。
- 规模取决于类型，而不是发生次数：每天录入十个客户还是一万个客户，都不会改变规模。
- 该方法不单独度量数据的处理（计算、校验）：它属于相应数据移动的一部分。

结果采用比率标度，也就是说，规模可以相加和比较：两个各为 40 CFP 的部分合起来是 80 CFP，而且可以按功能组分别列出小计。

## 完整示例：“录入新客户”

我们来看一项简单的需求：“业务员录入新客户的数据（姓名、地址、税号、电子邮件）。系统检查该客户是否已经登记在册，保存数据，并反馈成功或错误。”度量步骤如下：

1. **功能用户**是业务员，**触发事件**是新客户前来登记。
2. **数据组**是“客户”；四个数据属性描述的是同一个事物，因此构成一个数据组。
3. **数据移动**根据需求中的句子来识别，并逐一计数。

| 步骤 | 数据移动 | 数据组 | 规模 |
|---|---|---|---|
| 业务员提交表单 | Entry（输入） | 客户 | 1 CFP |
| 系统检查该客户是否已存在 | Read（读取） | 客户 | 1 CFP |
| 系统保存新客户 | Write（写入） | 客户 | 1 CFP |
| 反馈成功或任何错误 | Exit（输出） | 错误消息和确认消息 | 1 CFP |
| 合计 | 四次数据移动 | 一个数据组 | 4 CFP |

COSMIC 网站上发布的指南中的“录入新员工”示例也是以同样的方式构建的。需求的变化会这样体现在规模上：

- 如果系统还必须把新客户传给开票系统，这就是向另一个功能用户的又一次输出：5 CFP。
- 如果邮政编码需要对照城镇表进行检查，这就是又一次读取，因为它涉及另一个数据组：再加 1 CFP。
- 如果表单要求填写的客户字段从四个增加到十二个，规模不会改变，因为数据组是同一个。
- 如果需要修改一个现有的功能处理，变更的规模就是新增、修改和删除的数据移动之和。

这个示例也说明了为什么度量结果可以核查：每个 CFP 背后都有一项具名的需求、一个数据组和一条规则。如果有人提出异议，可以准确地指出所涉及的是哪一行。

## 尽早度量，随后细化

COSMIC 度量从确定度量的目的和范围开始：度量什么，包括哪些内容，结果用于何处。精确的度量需要足够详细的需求，能够从中识别出功能处理及其数据移动。在项目初期，这样的需求往往还不存在；针对这种情况，COSMIC 发布了用于早期规模估算的近似方法，等需求细化之后，再进行精确度量。

该方法的指南还提醒，许多起初看似非功能性的需求（例如响应时间或易用性）会在项目进行过程中转化为软件功能，从而使规模看起来有所增长。这不是度量的缺陷，而是表明需求变得更加精确了。因此在实践中，最好逐项编写规格说明，用同样的方法重新度量变更，并单独列出每项变更的规模。这样，范围的增长就不会悄无声息地发生，而是能以数字的形式清楚呈现。

## 对比：工时、故事点、IFPUG 和 COSMIC

| 要素 | 工时估算 | 故事点（story point） | IFPUG 功能点 | COSMIC 功能点 |
|---|---|---|---|---|
| 表达的内容 | 估算者预期的工作量 | 团队的相对估算；并不总是清楚它表示的是规模、工作量还是时间 | 功能规模 | 功能规模 |
| 是否标准化 | 否 | 否 | 是，ISO/IEC 20926:2009 | 是，ISO/IEC 19761:2011 |
| 取决于什么 | 估算者的经验、谨慎程度和团队 | 具体团队；不同团队含义不同 | 需求 | 需求 |
| 外部能否核查 | 只能依据估算者的解释 | 在团队之外几乎不能 | 能，依据公开的规则 | 能，依据公开且可免费获取的规则 |
| 计量单位 | 小时 | 团队自己的点数 | IFPUG 功能点 | CFP，1 CFP = 1 次数据移动 |
| 最适合的用途 | 规划简短、熟悉的任务 | 团队自己的冲刺（sprint）规划 | 度量规模、进行比较 | 度量规模、进行比较，作为报价和进度安排的依据 |

工时估算并不是一个糟糕的工具，只是它度量的是别的东西：预期的工作量，而这不仅取决于任务的规模，还取决于团队的知识、工具和谨慎程度。故事点对团队内部的规划很有用，但根据 COSMIC 网站上发布的指南，它是主观的，其含义因团队而异。IFPUG 和 COSMIC 都是标准化的功能规模，但规则不同，因此两种方法得出的数值不能相互替换。

## 为什么度量出的规模是更可靠的依据？

准确地回答标题中的问题：COSMIC 并不是把工时估算得更准，而是度量任务有多大，正是这一点让工作量的估算变得更加可靠。原因如下：

- **它度量的是需求，而不是实现。**功能规模只由需求决定，因此与技术、开发流程以及由谁开发软件都无关。
- **可以依据公开规则重新度量。**规则是公开的，度量结果必须记录在案，因此另一位度量人员可以根据同一份规格说明进行核查。
- **规模与生产率相互分离。**工作量估算由规模和实践中测得的生产率得出（工作量 = 规模 / 生产率）。这样就能看出哪个因素发生了变化，以及原因何在。
- **度量能改进需求。**根据 COSMIC 的指南，早期度量有助于发现含糊、矛盾或缺失的需求。
- **可以比较。**针对同一份规格说明的两份报价会得到相同的规模，因此价格针对的是相同的范围。

COSMIC 的指南引用了多项研究，在这些研究中，以 CFP 度量的规模比以故事点表示的估算与实际工作量的关联更为紧密。同一份指南还提醒，只有当开发过程具有足够的可重复性，并且工作量主要由规模决定时，根据规模估算出的工作量才是可靠的。因此，度量出的规模是更好的出发点，但要做出好的估算，还需要了解生产率。

## COSMIC 不度量什么？

COSMIC 规模度量的是功能，该方法的说明也公开指出了这一点。它无法体现的内容包括：

- **复杂算法。**根据该标准，该方法并非为度量以复杂数学算法或特殊复杂规则为特征的软件而设计（例如专家系统、仿真、自学习软件、天气预报）。
- **连续信号处理。**音频和图像处理，以及例如电脑游戏中的此类部分，同样不在该标准的适用范围之内。
- **真正的非功能性需求。**根据该方法，技术、性能和项目方面的约束需要记录下来，但不以 CFP 度量。
- **创作性工作。**根据 COSMIC 的指南，纯粹的创作性任务，例如艺术创作，不是该方法的度量对象；因此，美术和定制视觉设计的工作无法由规模体现。
- **现成软件包的实施。**如果需求在很大程度上是通过配置现成产品来满足的，那么最好采用适合该软件包的方式来估算工作量。

因此，一份好的报价会在度量出的规模之外，单独列出规模无法体现的内容：集成、非功能性需求、定制界面和美术、多平台、数据迁移、复杂计算以及实时运行。我们的报价就是这样列出这些项目的，详情请见[定价方式](https://www.mestersegesintelligenciakozpont.hu/zh/pricing)页面。

## 我们在自己的工作中如何使用它？

我们以 COSMIC 功能点度量开发工作的功能规模。为此，我们构建了自己的、由人工智能辅助的工作流程，度量结果由人在复核环节中进行检查。步骤如下：

1. **逐项的规格说明：**我们把开发工作拆分为若干功能组，并用同一个模板描述每个功能组：目标、参与者、数据、功能、AI 功能，以及不包含的内容（参见[我们的工作方式](https://www.mestersegesintelligenciakozpont.hu/zh/how-we-work)）。
2. **多次独立计数：**每个功能组由多个语言模型分别计数多次；各次计数之间的离散程度反映了不确定性。
3. **核对环节：**确保每个功能处理恰好只计算一次，即使它出现在多份描述中。
4. **复核：**我们审查度量结果，澄清不确定之处，必要时手动推翻自动合并的结果。
5. **锁定：**完成的度量结果可以锁定为不可更改的版本，并以此作为合同的依据。

在对现有系统进行后续开发时，我们会单独描述现有部分，因此只有新增部分计入规模。度量过程还会标出功能规模无法体现的内容。

## 规模如何转化为报价和进度安排？

报价中的价格由度量出的规模得出，并加上规模无法体现的项目。由于我们也能看到每个功能组的规模，进度安排也以此为基础：各阶段的顺序、演示的内容以及期限。如果过程中出现新的需求，我们会用同样的方式进行度量，从而可以看出范围变化了多少，以及这对价格和进度安排意味着什么。因此，我们只在度量之后才给出具体的价格和期限，而不是根据第一次谈话就给出。

## 根据规模比较两份报价

如果您向多家开发商索取报价，规模有助于判断这些报价是否针对同一项任务。建议按以下步骤进行：

1. **同一份规格说明：**每个投标方都拿到同一份逐项描述。
2. **规模和功能处理清单：**请询问对方，价格是针对多大的规模、哪些功能处理给出的。
3. **差异的原因：**如果两份报价不同，请查看差异是在于规模、规模无法体现的项目，还是单位规模的价格。
4. **单列项目：**请询问哪些内容作为单独一行列出（集成、数据迁移、运行），哪些内容不包含在价格中。
5. **变更的处理：**请询问过程中的变更如何度量和定价。

即使某个投标方不度量功能规模，只要它是针对同一份逐项功能处理清单报价的，其报价仍然可以比较。关于选择开发商的其他方面，我们在[如何选择软件开发公司？](https://www.mestersegesintelligenciakozpont.hu/zh/knowledge-base/how-to-choose-a-software-development-company)一文中有介绍；至于是否真的需要定制开发，[定制软件还是现成方案（SaaS）？](https://www.mestersegesintelligenciakozpont.hu/zh/knowledge-base/custom-software-vs-off-the-shelf)一文可以帮助您做出判断。

## 常见问题

### 什么是 COSMIC 功能点？

COSMIC 功能点（CFP）是 ISO/IEC 19761 标准规定的软件功能规模计量单位。一个 CFP 就是一次数据移动：在一个功能处理中对一个数据组的一次输入、输出、读取或写入。软件的规模是其各功能处理的数据移动之和。

### 它与工时估算有何不同？

工时估算说明的是预期的工作量，它取决于估算者和团队。COSMIC 依据公开的规则，从需求出发度量任务的规模，因此其他人根据同一份规格说明也能得出相同的结果。随后，工时可以根据规模和实践中测得的生产率推算出来。

### COSMIC 不度量什么？

根据该标准，它并非为度量复杂数学算法和连续信号（音频、图像）处理而设计，也不以 CFP 体现真正的非功能性需求，例如性能约束或技术约束。一份好的报价会把这些内容作为单独的项目列出。

### 由谁度量，度量结果能否核查？

度量由熟悉该方法的度量人员进行；在我们这里，由人工智能辅助的工作流程负责计数，再由人复核结果。规则是公开的，度量按功能处理逐一记录在案，因此另一位熟悉该方法的专业人士可以根据同一份规格说明进行核查。

### 规模如何转化为报价？

价格由度量出的规模得出，并加上规模无法体现的内容：集成、非功能性需求、定制美术、多平台、数据迁移。进度安排以各功能组的规模为基础，变更也以同样的方式度量。详情请见[定价方式](https://www.mestersegesintelligenciakozpont.hu/zh/pricing)页面。

## 我们如何提供帮助？

如果您正在规划[定制软件](https://www.mestersegesintelligenciakozpont.hu/zh/services/custom-software-development)，我们会和您一起编写逐项的规格说明，以 COSMIC 功能点度量其规模，并据此给出报价和进度安排。可应要求签署保密协议（NDA），交付后我们还承担运行与维护工作。源代码和使用权由合同约定。首次咨询免费：请通过[联系我们](https://www.mestersegesintelligenciakozpont.hu/zh/contact)页面上的联系方式给我们写信。

## 参考来源

- [COSMIC Measurement Manual v5.0, Part 1: Principles, Definitions and Rules (PDF)](https://cosmic-sizing.org/wp-content/uploads/2020/06/Part-1-MM-Principles-Definitions-Rules-v5.0-Aug-2021.pdf)
- [COSMIC Measurement Manual v5.0, Part 2: Guidelines (PDF)](https://cosmic-sizing.org/wp-content/uploads/2024/09/Part-2-MM-Guidelines-v5.0-Sep-2024.pdf)
- [COSMIC: A Guide to Software Size Measurement (PDF)](https://cosmic-sizing.org/wp-content/uploads/2020/08/Measuring-software-size-v1.0-August-2020-1.pdf)
- [COSMIC Measurement Manual: 下载页面](https://cosmic-sizing.org/measurement-manual/)
- [ISO: ISO/IEC 19761:2011, COSMIC: a functional size measurement method](https://www.iso.org/standard/54849.html)
- [ISO: ISO/IEC 14143-1:2007 (Functional size measurement, Part 1: Definition of concepts)](https://www.iso.org/standard/38931.html)
- [ISO: ISO/IEC 20926:2009, IFPUG functional size measurement method](https://www.iso.org/standard/51717.html)
