写点什么

关于工作量估算,你知道的和你不知道的一切

  • 2014-09-16
  • 本文字数:4279 字

    阅读完需:约 14 分钟

本文首次发布于 IEEE Software 杂志,由 InfoQ 和 IEEE Computer Society 为您呈现。

越来越多证据表明这样一个趋势:软件项目的成本和工作量超出限度,泛滥成灾。平均来看,这种泛滥大约在 30% 左右【1】。而且,对比 1980 年代和最近的调查中的估算准确程度,可以看出基本上没有改善。(只有 Standish Group 的分析指出估算准确度有显著提升。不过,在他们的 Chaos Reports 中提到的估算准确度显著低声,也许只是由于他们自己分析方法的改变,他们以前选择了太多有问题的项目分析,现在选择的项目更具代表性。【2】)估算方法也没有太多变化。尽管对于正式的估算模型有很多研究,“专家估算”依旧占据主导地位。【3】

估算准确度明显缺乏改善,但我们对工作量估算比以前有了更多了解。本文中,我试图总结获得的一些知识。其中有些知识有可能提高估算准确度,有些能告诉我们什么样的做法不可能带来改善,有些是关于我们对于工作量估算已知和未知的事情。文中用以得出结论的一整套经验证据,可以在其他地方看到。【1】

我们知道的事

研读过关于工作量估算的研究之后,我选出 7 种证据充足的结论。

不存在“最佳”的工作量估算模型或方法

众多研究对比了多种估算模型和方法的准确度,哪一种是最佳选择【4】,众说纷纭。结果不稳定,主要原因似乎在于几种不同的核心关系,比如开发工作量和项目大小之间,这些关系在不同上下文中也不一样【5】。此外,影响开发工作量的最大因素似乎也不一样,这表明估算模型和方法应该根据所处上下文剪裁。

核心关系不够稳定,同样可以用来解释,相比更简单的模型,为什么统计方法先进的估算模型,对于估算准确度没有多大改善,甚至根本没有改善。统计方法先进的估算模型会更贴近历史数据,因此当上下文改变时,相比简单的模型,准确度更渣。这个结论告诉我们,软件公司应该尝试构建自己的估算模型,而不是期望某个通用的估算模型和工具在他们的环境中能够表现准确。

客户着眼于降低价格,是工作量泛滥的主要原因

低估工作量的趋势,在基于价格的竞争情形中最为明显,比如在投标之中。在价格竞争不那么重要的情形下,比如内部软件开发,这样的趋势就不明显。实际上,你甚至会看到相反的结果。由此说明:工作量泛滥了的主要原因之一,就是客户在选择软件开发供应商时,倾向选择价格低的一方。因此,低估工作量的项目投标书更有可能启动。这些观察说明:客户在选择供应商时,少关注价格,多关注能力,就可以避免工作量泛滥。

最大工作量和最小工作量区间过于接近

最大 - 最小工作量之间的差距,比如 90% 置信区间,过于接近,无法反映实际情况中的不确定性。尽管存在有力证据表明,我们无法准确设定最大和最小工作量值域,但目前的估算方法还是假定可以做到这一点。这在 基于 PERT 计划评价与审查技术(Program Evaluation and Review Technique)的估算方法(三点估算)中尤为明显,其中中值工作量常常由最小和最大工作量计算得出。

软件从业人士应该利用历史数据和此前的估算误差,设定比较现实的最小和最大工作量,而不是使用专家的判断。【6】

工作量估算易于走偏,一旦走偏,难以恢复

所有的软件开发工作量估算,即使使用正式的估算模型,都需要专家判断。但即使专家判断可以很准确,也很容易走偏。最严重的走偏很可能发生于如下情形:负责估算的人,在估算前或者估算中,了解到预算、客户期望、可用时间或其他所谓的“估算锚点”因素。在没有意识到的情况下,估算者的估算结果可能很接近这些锚点。比如,知道客户期望低价格,或者较少的工作小时数,就有可能造成低估工作量。如果估算请求中包括某些引导性词语,比如“这个项目这么小,又简单,大概要花多少钱”,这就会误导专家的估算。

有很多研究,针对如何从误导中恢复,或者如何纠正估算的偏差,但没有发现可靠的方法。由此可以推导出:负责工作量估算的人,应该尽量避免看到误导或无关信息,比如,应该将需求文档中的误导和无关信息去除。

相关历史数据和检查列表可以改善估算准确度

充分证据表明:使用历史数据和估算检查列表,可以改善工作量估算准确度。当历史数据与项目相关,检查列表也根据公司情况进行裁剪之后,这就不太可能遗漏某些工作了,而且很可能加入足够的应急措施,应对某些风险,之前的经验也可以重用。因此可以产生更为现实的估算。特别是当类似项目可用于类比或是参考类【7】估算中时,估算准确度可以提升。

虽然历史数据(比如有百分之多少的工作量用于未规划的工作和项目管理上)和估算检查列表(比如针对易于忘记的工作提醒)有其作用,还是有很多公司没有使用任何一个,因此无法提升估算工作量准确度。

结合多个独立估算可以提升估算准确度

比起单独的工作量估算,来自多方的估算准确度平均值可能更准确。这样做有一个关键前提,就是估算都是独立完成的,也就是说估算者的专业知识、背景和估算过程都不一样。类似德尔菲的估算过程,比如“规划扑克”,软件开发者在其中会同时展示各自独立做出的估算(他们的扑克卡片),这在软件工作量估算上下文中尤其有用。

基于小组的、结构化的估算过程,能够让估算的机械组合更有价值,因为知识的分享能够增加知识的总量,比如完成一个项目需要的工作总和。小组估算判断的负面影响,比如“集体思考”和在小组中承担更多风险,还没有在软件工作量估算的相关文档中看到。

一般来说,估算模型要比专家估算准确度更低。不过,如果能结合起来,模型和专家之间的差异反而可能提升估算准确度。

估算有其害处

估算不仅预测未来,而且会频繁影响未来。过低的估算会导致过低的质量,以后可能要返工;过高的估算可能降低工作效率,遵从“帕金森定律”——工作会自动占满所有可用的时间。

因此,必须考虑是否的确需要工作量估算。如果可有可无,或是以后才有必要,可能不做更好,或是推迟估算,直到可以得到更多信息。敏捷软件开发——只估算下一个 sprint 或者发布版本的工作量,而且必须使用此前 sprint 或者版本发布的反馈信息——可能是避免过早估算带来的潜在危害的良好方法。

我们不知道的事

估算活动中存在一些问题,我们就是找不到好的解决办法,就算进行再多研究也不行。有三方面的挑战,说明我们的知识远远不能令我们满意。

如何准确估算超大型——即大型复杂项目的工作量

超大型项目对工作量估算提出了更高要求。不仅是更多价值面临风险,而且相关经验或历史数据也相对较少。很多超大型项目中的典型活动,比如组织层面的问题——太多项目干系人参与,本来就很难估算,因为其中常常涉及流程变更,以及项目干系人之间、与现有软件应用之间的复杂互动。

如何准确估算软件大小和复杂度

虽然对软件规模和复杂度的度量研究经年,但说到估算软件开发工作量,没有哪种方法特别有效。有些软件规模和复杂度的上下文有可能产生准确估算,但这种情况很少见。

如何度量、预测工作效率

即使可以出色估算软件的规模和复杂度,你还是需要可靠地预测个人或团队完成工作的工作效率。这种预测很复杂,因为不同软件开发者和团队之间的工作效率差距很大。同时也没有什么好的预测方法,除了某些比较实际的编程测试(比如:trialsourcing)之外。

目前,我们甚至不知道软件项目中是否存在“规模经济”效应,或是“规模不经济”效应。很多基于经验的研究表明:一般软件项目都有规模经济效应,但是软件实践者们基本上都相信“规模不经济”。然而,对于规模经济的研究结果,似乎要视乎分析的实施方法而定,而且也没有揭示多少规模和工作效率之间的关系。

就我们现在对软件工作量和成本估算的了解,基本上不能让我们解决软件行业中的估算挑战。不过,它的确指出多种措施,可以提升估算准确率。特别要指出,如果软件公司能执行如下举措,就可以提升估算效率:

  • 制定并使用简单的估算模型,并要根据实际情况剪裁,同时和专家估算一起使用。
  • 使用历史估算的误差,设定最大—最小工作量区间。
  • 避免曝露易于误导和无关的估算信息。
  • 使用针对本组织调整过的检查列表。
  • 使用结构化的、基于小组的估算过程,要保证估算的独立性。
  • 避免基于高度不完整信息的早期估算。

在竞争激烈的投标轮次中,客户很容易重点关注低价格,这很容易导致投标人过于乐观,最终导致成本泛滥,软件质量低下。这在其他领域称为“赢家的诅咒”。长远来看,很多软件客户会开始了解,他们对于软件项目应该固定成本和低价格的看法,会对项目成功造成负面影响。在那之前,软件公司应该意识到:处于这种情况时,他们被选中,是因为他们自己对成本过于乐观;此时要有策略准备,以管理或者避免赢家的诅咒。

参考资料

  1. T. Halkjelsvik and M. Jørgensen, “From Origami to Software Development: A Review of Studies on Judgment-Based Predictions of Performance Time,” Psychological Bulletin, vol. 138, no. 2, 2012, pp. 238–271.
  2. M. Jørgensen and K. Moløkken-Østvold, “How Large Are Software Cost Overruns? A Review of the 1994 CHAOS Report,” Information and Software Technology, vol. 48, no. 4, 2006, pp. 297–301.
  3. M. Jørgensen, “A Review of Studies on Expert Estimation of Software Development Effort,” J. Systems and Software, vol. 70, no. 1, 2004, pp. 37–60.
  4. T. Menzies and M. Shepperd, “Special Issue on Repeatable Results in Software Engineering Prediction,” Empirical Software Eng., vol. 17, no. 1, 2012, pp. 1–17.
  5. J.J. Dolado, “On the Problem of the Software Cost Function,” Information and Software Technology, vol. 43, no. 1, 2001, pp. 61–72.
  6. M. Jørgensen and D.I.K. Sjøberg, “An Effort Prediction Interval Approach Based on the Empirical Distribution of Previous Estimation Accuracy,” Information and Software Technology, vol. 45, no. 3, 2003, pp. 123–136.
  7. B. Flyvbjerg, “Curbing Optimism Bias and Strategic Misrepresentation in Planning: Reference Class Forecasting in Practice,” European Planning Studies, vol. 16, no. 1, 2008, pp. 3–21.

关于作者

MAGNE JØRGENSEN是 Simula 研究实验室的研究院,也是奥斯陆大学的教授。他目前的研究兴趣包括:工作量估算、投标过程、外包、软件开发技能评估等。可以通过 magnej@simula.no 联系他。

关于 IEEE

本文首先出现于 IEEE 软件杂志。IEEE 软件杂志提供扎实的、经过同行审阅的信息,设计当今技术战略层面的话题。要想应对运营可靠、灵活的企业面对的挑战,IT 经理和技术主管们依靠 IT 高级人员,寻找最先进的解决方案。

查看英文原文: What We Do and Don’t Know about Software Development Effort Estimation

2014-09-16 06:398388
用户头像

发布了 479 篇内容, 共 157.3 次阅读, 收获喜欢 49 次。

关注

评论

发布
暂无评论
发现更多内容

9期视频告诉你如何更正确更高效的使用Git

阿里云云效

git 阿里云 云原生 代码 研发

边缘计算加速视频直播场景:更清晰、流畅、实时

火山引擎边缘云

边缘计算 视频直播 异构算力

11种绕过CDN查找真实IP方法

喀拉峻

网络安全

Web Components 系列(八)—— 自定义组件的样式设置

编程三昧

前端 组件化 2月月更 WebComponent

跨平台应用开发进阶(一) :走近 uni-app

No Silver Bullet

uni-app 跨平台 实战 2月月更

网络安全kali渗透学习 web渗透入门 DDOS的原理和防护

学神来啦

《新程序员》杂志|李鹏辉谈开源云原生消息流系统

Apache Pulsar

开源 架构 云原生 中间件 Apache Pulsar

服务网格在联通的落地实践

百度开发者中心

恒源云(GpuShare)_AIphaCode是否能取代程序员?

恒源云

深度学习 AI transformers

车联网平台搭建从入门到精通 01|车联网场景中的 MQTT 协议

EMQ映云科技

车联网 物联网 通信 mqtt 平台搭建

金融行业研发管理平台选型

帅气IT小哥

当 TiDB 遇上 Flink:TiDB 高效入湖“新玩法” | TiLaker 团队访谈

PingCAP

Ti-Click:通过浏览器快速搭建 TiDB 在线实验室 | Ti-可立刻团队访谈

PingCAP

平安科技从 Oracle 迁移到 UbiSQL 的实践

PingCAP

CTF题目中遇到的PHP考点总结(一)

H

php CTF WEB安全

EdgeDB 架构简析

CRMEB

FinClip 的 2021 与 2022

FinClip

产品设计与思考

[建造者模式实战]如何用JAVA实现一个基于POI的复杂表格导出工具类?

山河已无恙

Java 2月月更

焱融科技加入中国通信工业协会人工智能专业委员会,共创数智新未来

焱融科技

人工智能 云计算 分布式 高性能 文件存储

GPU在Kubernetes中的使用与管理 | 社区征文

大菠萝

新春征文

解构流存储 — Pravega,与 Flink 构建端到端的大数据流水处理线

Apache Flink

大数据 flink 开源 编程 实时计算

云效Flow如何实现阿里云ECS多环境发布

阿里云云效

阿里云 运维 云原生 软件开发 研发

敏捷开发流程的8个步骤

爱吃小舅的鱼

一行代码:开启 eBPF,代替 iptables,加速 Istio

Daocloud 道客

istio 开源项目 网络加速 服务网格 ebpf

详解CNN实现中文文本分类过程

华为云开发者联盟

机器学习 CNN 深度神经网络 文本分类 Word2Vec

数智时代,谁都做平台,谁都做生态!这行吗?

海比研究院

技术人聊开源:这并不只是用爱发电

SOFAStack

开源

会声会影剪辑视频教程讲解

懒得勤快

JAVA 那些事 - 聊聊那些易混淆的概念:JVM/JRE/JDK,openJDK/oracleJDK,JAVA SE/JAVA EE/Jakarta EE

明哥的IT随笔

jdk Openjdk Java EE

数据分析实际案例之:pandas在泰坦尼特号乘客数据中的使用

程序那些事

Python 数据分析 pandas 程序那些事 2月月更

火山引擎 MARS-APMPlus X 美篇 | 形成应用性能全面监控,大幅提升APP稳定性

字节跳动终端技术

字节跳动 APM 性能监控 应用性能监控产品 火山引擎MARS

关于工作量估算,你知道的和你不知道的一切_语言 & 开发_Magne Jorgensen_InfoQ精选文章