前两年在网上看到一个笑话集锦, 列举电视剧中的穿帮情节。 其中一个是在某缠绵冗长的言情剧中, 一个叫 “书桓” 的角色沉痛地说 - “长达八年的抗日战争就要开始了…”  书桓同学当时是怎么估计到抗日战争要打八年的?  这一技术让软件工程师和项目经理望尘莫及。

软件项目计划的一个重要环节就是估计项目各类工作(特别是各种功能)所需的时间。 如果你没有书桓同学的能力, 你得好好练习这一技术。 “估计” 这一技术看似容易, 其实大有学问。 Steve McConnell 还专门写了 《Software Estimation: Demystifying the Black Art》 一书, 希望能把软件估计这一神秘技术 “去神秘化”。

在开始估计之前, 我们先分清楚几个概念 - 目标,  估计和决心, 。

目标: 表明一个希望达到的状态.  例如:  软件五一之前要投放市场!  在建校一百周年之时把我校建成世界一流大学!  不论这类目标如何重要, 它们未必能够实现。

估计: 以当前了解的情况和掌握的资源, 要花费多少人力物力时间才能实现某事。

决心: 保证在某个时间之前完成预先规定的功能和质量。 例如: 我们跑步前进, 全民炼钢, 两年超英赶美!

如果我们混淆了目标, 估计和决心, 那就会犯错误, 我们历史上就有这样的例子:

- 1958年5月中共八大二次会议肯定了当时中国出现的“大跃进”形势,认为中国正经历着 “一天等于二十年” 的伟大时期。调整了“二五”计划指标,钢产量由1200万吨提高到3000万吨,粮食从5000亿斤上升到7000亿斤。提出要使中国在15年或更短的时间内,在主要工业产品产量方面在十年内超过英国、十五年内赶美国(所谓“超英赶美”)。 这是一个估计。

- 伟大领袖在他的批语中写道:“赶超英国,不是十五年,也不是七年,只需要两年到三年,两年是可能的。”  这是一个目标。

- 大跃进开展只过了半年的时间,中央在伟大领袖的影响力之下,  把赶超英国的时间由十五年改为两年。下面各级组织纷纷动员, 停止其他正常工作, 全民大炼钢铁.  这是一个决心。

后来全国各地出现了大量的卫星, 和不能用的钢铁,  钢产量, 粮食产量在后面两年不升反降。再后来…

到了1976-77 年, 中国钢产量终于超过英国。 用了18 - 19 年时间。 扣除当年瞎折腾的几年, 这和当初估计的时间差不多!

这样痛心的例子在软件项目也可以看到,  软件项目的延迟更是比比皆是 - 为什么我们估计得不准呢?  因为难么?   为什么软件估计这么难呢?  其实所有的估计都难.  不信的话, 我们做一些估计的练习,  不查搜索引擎, 你估计一下下面的数目 (数量级正确就行):

中国陆地边界长度 (参考答案)

非洲人口密度  (参考答案)

长江一年的流量  (参考答案)

2009年中国货币流通的总量 (参考答案)

一个80岁的人一生说过多少句话 (参考答案)

怎么样? 你的估计和实际情况差几个数量级?

一些硬件项目的估计相对容易 - 例如: 这边有一堆砖头, 估计有 X 块, 我们 N 个人要把这些砖头搬到那边, 每人每小时可以搬 M 块, 那么我们估计大概要 X / N / M 小时。 这个估计还是比较靠谱的。

软件项目的难度还体现在另一个方面, 写软件的人的能力也是要估计出来的数值, 而且没有合适的衡量单位,  例如:  如果王屋村的移山公司程序员果冻一天能写1000 行C++ 代码。 那他 10 天就能写好10,000 行代码?!  而且什么叫 写好 10,000 行代码?  如果你估计一个项目的代码量是10万行, 难道 10个像果冻这样的人 10 天就能做完?

所以我们做软件的估计, 事实上是 (估计的工作量 / 估计的人员能力), 如果两个估计都差一两个数量级, 那么我们最终估计的结果就会偏离十万八千里.

我在上课的时候给学生布置这样的课堂练习:

一个小组的同学 (6-8 人) 决定要徒步遍历中国陆地边界,  假设硬件装备齐全, 估计需要多长时间?

很多软件项目就是这样雄心勃勃地开始的, 大家觉得当年某某牛人/公司也这样做出来世界级的软件,  我们现在还有互联网, 我们小组里还有人精通设计模式, 这有什么可怕?   他们甚至连硬件装备都不齐全, 就开始行军了.

你觉得他们会花多长时间?  用什么样的办法能让同学们方便地交流各自的估计, 最后到达大致理性和统一的共识?

答案明天揭晓。

软件工程 软件的估计为什么这么难相关推荐

  1. 软件工程-软件开发的工程思维

    软件工程-软件开发的工程思维 目录 软件工程-软件开发的工程思维 前言 什么是软件工程? 定义 出现的背景 软件工程核心知识 与项目管理的区别 软件工程的目标 为什么需要软件工程 如何做好软件工程:原 ...

  2. 软件工程 软件工程师的誓言

    有人说 程序 = 算法 + 数据结构 有人说 软件 = 程序 + 软件工程,  软件企业 = 软件 + 商业模式. 程序本身没有伦理和职业道德, 但是程序员和软件企业要有. 我们听说过很多例子: 一个 ...

  3. [软件工程]软件生存周期过程与管理————(2020.6.29学习笔记)

    目录 第一节 软件生存周期过程概述 第二节 过程描述 第三节 应用说明 第四节 软件生存周期模型 第五节 过程规划与管理 第一节 软件生存周期过程概述 软件生存周期(SDLC,软件生命周期) 是软件的 ...

  4. 软件工程--软件计划

    1.问题定义: 定义为软件需求分析功能与性能的依据定义为软件需求分析功能与性能的依据. 1.1定义内容: 问题背景,开发系统的现状,开发的条件与理由,总结要求,问题的性质,类型转换,什么目标,开发条件 ...

  5. 软件工程软件开发成本度量规范_软件开发成本度量方法

    软件成本度量一直都是软件行业的一个痛点问题.软件度量一度乱象丛生.拍脑袋的定价方式曾大行其道.软件成本度量的乱象直接导致了软件价格的诸多问题.比如预算费用存在浪费或不足的现象,招标存在投标额过低过高等 ...

  6. 软件工程 软件设计 步骤_好的软件设计特点 软件工程

    软件工程 软件设计 步骤 For good quality software to be produced, the software design must also be of good qual ...

  7. 自学app难不难 有c语言,软件编程入门自学到底难不难 零基础自学软件编程的方法...

    很多人想知道软件编程入门自学到底难不难,零基础怎么自学软件编程呢?下面小编为大家介绍一下! 软件编程入门自学到底难不难 对编程有一定了解的人一定知道--编程是简单劳动,好学与不好学在于你是否能吃得了这 ...

  8. 软件工程-软件生存周期模型

    软件工程-软件生存周期模型 软件工程-软件测试 软件工程-软件测试-测试方法 概念 同任何事物一样,一个软件产品或软件系统也要经过孕育.诞生.成长.成熟.衰亡的许多阶段,一般称为软件生存周期. 软件的 ...

  9. 软件工程—软件工程学概述

    软件工程 第一章-软件工程学概述 文章目录 软件工程 第一章 软件工程学概述 1.1 软件危机 1.2 软件工程 1.2.1 软件工程方法学 1.3 软件生命周期 1.4 软件过程 1.4.1 瀑布模 ...

最新文章

  1. 兼容及DOM解释差异笔记——待续
  2. python无法使用pip_解决无法使用pip命令加载Python的扩展库问题
  3. Spring MVC 完整示例
  4. Electron中 提示:Uncaught ReferenceError: process is not defined
  5. codeforces div3 D Circular Dance (链式向前星)
  6. 博士学位论文 | 机器阅读理解与文本问答技术研究
  7. 乔恩与加菲猫引发的思考
  8. r.java是什么_R.java文件介绍
  9. 计算机考试中英文打字题,五笔及中英文打字试题(2套)含答案.docx
  10. 华软java_广州大学华软软件学院《Java程序设计》期末复习
  11. Spring Boot中自动注入没有生效,报NullPointer的问题
  12. 参考文献空格怎么空_参考文献中的标点符号后要不要加空格
  13. 鸿蒙系统电脑模拟运行,安卓游戏在鸿蒙运行被识别为PC端模拟器,鸿蒙生态依然欠缺!...
  14. ffmpeg Amr转mp3命令
  15. 华为鸿蒙智慧屏和手机,【荣耀智慧屏评测】鸿蒙初体验:荣耀智慧屏跨系统交互构建新生态(全文)_荣耀 智慧屏_手机评测-中关村在线...
  16. 360度全景VR摄像机初探
  17. 来吧 请收藏,测试工程师工作中需要的各种免费工具
  18. MATLAB数字水印设计
  19. 在Idea解决找不到sun.misc.BASE64Encoder及sun.misc.BASE64Decoder找不到包
  20. 典型相关分析(Canonical Correlation Analysis, CCA)

热门文章

  1. oracle分区交换速度,oracle交换分区对数据的加载提速案例
  2. Verilog初级教程(12)Verilog中的generate块
  3. Amazon Corretto技术细节探秘
  4. Java基础-锁机制
  5. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL,spring获取context...
  6. C++STL源代码学习(之slist篇)
  7. oracle查询保留2位小数
  8. Suse es 11sp2 双网卡冗余
  9. php柱形图上显示数字怎么改回来,sigmaplot可以在柱状图上显示数值
  10. Vivado Hardware Manager的使用