软件建设是高等教育信息化中的一个重要部分。由于每个办学实体的办学理念和办学目标差异较大,直接导致高等教育中存在大量的软件定制开发需求。在实际的软件项目建设初期,绕不开一个重要且复杂的任务,即评估定制开发软件的成本,制定合理的预算。
在软件项目调研和立项的阶段,对于甲方来说,最核心的问题是怎么判断乙方的估价客观利润合理;对于乙方来说,怎么说服甲方报价是有依据的,在保证合理利润的同时不把甲方吓跑,双方都需要预估软件开发的成本。
对于高校而言,如果不能制定合理的成本预算,一方面可能造成浪费,另一方面也极有可能因为预算不足造成软件质量达不到要求。成本估算事关紧要,却往往被忽视。高校用户通常缺少这方面的知识储备,基本上是跟着感觉走。计算机专业的软件工程课程一般只有很少的篇幅,以至于很多科班出身的专业人士也一知半解,指导用户更是无从下手。本文介绍软件建设中的成本估算方法,希望以很短的篇幅,撬开这个复杂问题的冰山一角,给用户一点帮助和信心。
估算方法
软件开发成本的科学估算在国外发展了很多年,已经摸索出了很多行之有效的方法和标准,国内近些年来也有不少国家标准和地方标准出台,比如国家标准GB/T 36964-2018《软件工程软件开发成本度量规范》、北京市地方标准DB11/T 1010-2019《信息化项目软件开发费用测算规范》。这些方法总结起来主要分为两类,一种是依赖专家的经验和主观感觉的评估方法,例如类比法、Delphi法、三点估算法等;另一种是依赖对用户需求的深入了解和软件实际规模的客观分析方法,如功能点法、代码行数法等。
第一种方法优点是不需要对业务需求进行很深入的了解,缺点是过于依赖专家经验,偏差较大;第二种方法的优点是相对客观,但是需要对用户需求进行比较细致和深入的了解。
鉴于本文的读者对象多为高校的业务部门用户,对实际需求相对清楚,因此本文重点介绍第二种方法中的功能点法。
所谓功能点估算方法,其实就是“三步走”。
第一步估算出需要开发的软件有多少个功能点。
第二步用整个功能点数乘以开发每个功能点需要的人月数,就可以得到整个软件开发需要投入的人力和时间,即开发工作量,一般用“人月”或者“人时”来表示(“人月”是成本估算的一个常用的计量单位,是项目所有参与者累计工作时长。因为软件开发的成本大部分是人力成本,只要知道一个软件开发需要投入多少“人月”,就基本上知道了总体的开发成本)。
最后一步,把上一步得到的工作量乘以所在城市开发人员的平均工资,就可以得到开发成本。
估算功能点
估算功能点有IFPUG和NESMA两种主流的方法,对于一般用户来说,不需要了解具体细节,只需要知道这两种方法分别代表精细估算和粗略估算。
IFPUG方法相对比较精细,需要通过六步来计算功能点:
Step1 识别功能点及类型
Step2 确定功能点的复杂度
Step3 确定功能点的权重
Step4 计算未调整的功能点
Step5 计算调整因子
Step6 计算已调整的功能点
最重要的是step1和step2。step1中需要确定系统的5个指标数据,分别是:
内部逻辑文件(ILF):在应用程序内部,用户可识别的、可维护的内部逻辑数据和控制信息。通常包括数据库表、临时文件、顺序文件等。
外部接口文件(EIF):在应用程序边界内被查询,但在其他应用程序中被维护的、用户可识别的、逻辑上相关的数据。例如两个应用程序为交换数据而使用的接口文件。
外部输入(EI):对用户的输入进行处理的过程。用户通过增/删/改等典型外部输入操作来更改和维护ILF。
外部输出(EO):向外部发送数据的过程。对数据进行处理,会更改ILF,会改变应用程序。
外部查询(EQ):输入和输出的组合过程。根据用户提出的查询请求,从EIF或ILF取出数据输出到程序外部。不对数据进行处理,不更改ILF,不会对应用程序做出改变。
在step2中,需要对以上5个指标分别计算复杂度,以ILF为例,可以根据表1来计算它的复杂度。其中数据元素类型(DET)数量,是用户可识别的、没有重复的、有业务逻辑意义的信息单元,可以简单理解为需要保存的字段数。记录元素类型(RET)数量,是在ILF或EIF中,用户可识别的DET的集合,可以简单地认为是用户需要编辑和修改的字段数。
表1 对ILF复杂度的评估
分别计算这5个指标的复杂度之后,step3再根据表2,来估算模块功能的整体复杂度。将对应的数据相加,就可以得到这个模块的功能点了。因为这个功能点数还需要根据一些实际情况调整,所以此数据叫作未调整的功能点数。
表2 对模块功能点的估算
Step5在计算出未调整的功能点数之后,还需要根据实际开发系统的具体情况来调整功能点数,具体需要对14个指标进行考量:
数据通讯
分布式数据处理
性能
大业务量配置
事务处理率
在线数据输入
最终用户效率(用户界面友好程度)
在线更新
复杂处理(算法)
可复用性
易安装性
易操作性
多场地(多点运行)
支持变更(客户化程度)
通过评估,得出每一项的影响程度值并通过公式计算调整因子的大小。假设计算得出调整因子大小为0.9,那么用0.9乘以未调整的功能点数就可以得到调整后的功能点数,因此我们往往会看到功能点数不是整数,不要惊讶。
以上IFPUG计算方法的缺点是有点复杂。如果用NESMA方法,则方便很多,只需要考虑IFPUG方法6个步骤中的step1即可。
按照以下公式计算功能点数,得出的功能点数是整数:
功能点数=(35*ILF数量)+(15*EIF数量)。
在实际项目中,如果时间较为紧张,建议用户采用后一种NESMA方法。
工作量计算
经过以上步骤我们得到了最重要的数据——功能点数。在此基础上,结合生产率基准数据,就可以得到未调整的工作量,生产率基准数据如表3所示。表3的p90可以理解为,如果每个功能点投入17.42个人时来安排开发,那么有90%的公司可以完成开发。
表3 软件开发生产率基础数据
(数据来自《2023 年中国软件行业基准数据(CSBMK-202310)》)
在实际的估算中,一般会选用p25、p50和p75三个生产率数据来给出工作量的下限值、最有可能值和上限值,当然,也可以根据实际情况滑动调整。
计算公式:未调整的工作量(人时)=功能点数*生产率。
考虑到应用类型、开发语言等差异,以及用户需求变化等一些不可见情况,在实际操作中,要得到调整后的工作量,还需要再将未调整的工作量乘以调整因子。
开发成本估算
最后一步的成本估算就很容易了,把调整后的工作量(人月)乘以开发团队所在城市的开发人员平均工资就可以得到大概成本。表4是2023年度国内部分城市的软件开发人月费率基准数据,以笔者所在的城市合肥为例,每个月24956元人民币,属于中等偏下。
表4 国内部分城市的软件开发人月费率基准数据
(数据来自《2023年中国软件行业基准数据 (CSBMK-202310)》)
估算示例
前面介绍了功能点估算方法的步骤,下面我们结合实际高校的场景练习一下。假设我们要定制开发学校的教务管理软件,软件可以初步分为20个模块(菜单),例如学生基本信息、教师基本信息、教室基本信息、教学计划安排……
按照NESMA方法,确定各个模块的功能点数及类型。以学生基本信息模块为例,可能涉及到直接维护的表是学生基本信息表和学生详细信息表,所以有2个ILF,因为学生的学籍信息需要从招生系统导入,EIF有1个。假设我们统计整个系统有ILF 50个,ELF 20个。通过公式“功能点数=(35*ILF数量)+(15*EIF数量)”计算得到功能点数为1750+300=2050个。再根据基础生产率数据得到3个工作量的人时数(下限、最有可能和上限)分别为8036、14268和25502。为简便起见,我们把调整因子的权重都设置为1。将工作量的人时数除以人月折算系数176,可以得到3个以人月来表示的工作量估算,分别为45.66、81.07和144.90个人月。假设开发团队是合肥的本地团队,那么乘以24956就可以得到开发成本,分别对应为1139491元、2023183元和3616124元,其中202万元就是开发最有可能成本,如果乙方报价超过上限或者低于下限,就要警惕了。
上面的估算是按照最简单的方式进行,如果大家有兴趣,可以用IFPUG方法再估算一次,并和NESMA方法的结果作对比,这样更有参考价值。虽然有的项目可能已经结束了,但是我们也不妨通过这个方法来核算成本,了解乙方的投入。当然我们这样算出的是直接开发成本,在实际乙方估算的时候,还需要加入间接成本和毛利润等相关费用。
总结和展望
根据以上说明和举例,我相信大多数非专业人士可以初步估算出软件开发的成本和费用。在现实操作中,采用功能点法进行软件开发的成本估算,需要用户结合实际情况灵活运用评估方法。比如有些模块是部分复用的;软件开发期间需求的增减;一些新的低代码开发工具以及AIGC技术的开发工具,可以大大降低开发成本;还有源代码安全开发要求等,这些具体情况都需要在估算时考虑进去。
还有最重要的一点,以上的估算方法主要针对瀑布开发模型,目前对采用敏捷开发模式的定制软件进行成本估算,还没有好的参考依据。
软件行业发展飞速,国家标准和行业标准并没有覆盖所有评估情况,业界还需要共同努力,不断地总结和创新软件成本评估新方法新技术,适应新形势下的新要求。
来源:《中国教育网络》2024年4月刊
作者:王辉(合肥工业大学信息化建设与发展中心)
声明:本文来自中国教育网络,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。