2013年9月16日下午14:30-17:00,思步网邀请思步科技资深咨询顾问james做了题为“怎样估算更加精准”的微讲坛,微讲坛地址:http://www.step365.com/wb/wjt 。现将现场讲座及互动部分的内容总结如下。
****************************************************************************** ******************************************************************************
第一节 为什么要做估算
首先谈一下为什么要估计?为什么要更加准确的估计?大家想到没有,我们投标,我们签订一个项目,肯定是有前提的,就是项目能赚钱,能盈利。所以,一般都会计算盈利的空间有多少。
怎么计算盈利的空间?就是合同额减去成本。成本怎么能得到,就要通过估算的方法,事先进行测定。我们说一个项目如果毛利有 60%,甚至更多,这时候,估算可以粗一些,偏差大一些。
可是目前,软件行业的毛利率在逐年下降,利润空间越来越窄。所以,如果能更加准确的估计,就能提高项目的成功率。
因此,估算的准确性和估算的精度就显得越发重要了。
比如,一个项目,预估的毛利率空间是30%,如果你估算的误差在+/- 50%,那么这个项目是否要投标,是否要做,就出现疑问了。因为,不赚钱的概率出现了
那么怎么能更加准确的估计?用什么样的估算方法能提高估算的精度?有没有快速的方法和有效的方法进行估算?
今天讲的几个方法,是最常用的一些估算的方法。方法没有最好的,最好的形式是用一种方法,坚持不断的进行估算,并结合历史数据,坚持下来,即使最简单的方法,其精度也可以逐步提高。
有一些企业,有一些公司,今天用这个方法,明天用另外的估算方法,方法使用了不少,但都是浅尝辄止,然后说估算不行。导致精度一直不能提高。所以,方法一旦确定下来,就要坚持下去,持续改进,而不是更换方法。
第二节 如何进行估计
良好估算的前提,是确定项目的范围。项目范围明确了,估算就更加便利一些。项目范围可以以顶层WBS形式进行描述
估算前,要明确假设和约束,比如客户可能的变更,比如我们自己的开发能力
在估算中,容易出现的问题是,直接给出工作量。比如某个功能,有经验的工程师往往会给出,这个功能大概几天能做完。这个就是直接估算工作量。这种形式在企业里很常见。这类估算,是否可以呢?结论是肯定的,当然可以。
但是,它还有一个问题需要注意。问题是,这些数据没办法作为历史数据为以后采用。因为,估算的依据没有,没办法横向比较。所以,以后要用这些数据就比较麻烦。因此,不建议直接估算工期、工作量,建议先引入一些中间的量作为替代。
中间的量可以是代码行,可以是功能点。中间量在CMMI中称之为规模。PP.sp1.2 有详细的描述。
有了规模,可以做不同项目之间的横向比较,历史数据就要价值了。当然规模的种类可以是代码行KLOC,也可以是功能点,用例点,故事点。总之,要找到研发软件的规律,然后制定规模识别的标准
所以,直接估算工期、工作量,不是不可以,而是不好。历史数据会不好用。原因就在这里。
第三节 各种估计方法之一:Pert Sizing
好了,有了上面的一些原则,就可以开始估计了。估计的方法很多,简单的估计方法,精度比较差,但估算快速;复杂的估算方法,精度高,但需要学习,需要训练。简单的估算方法:有Pert sizing,Delphi,类比法
复杂一些的有IFPUG(标准功能点),NESMA(快速估计),COCOMO II
Pert Sizing是一种加权平均法,可以用于估计软件项目的规模、工作量和成本等。这个是最简单的估算方法。
Pert Sizing是一种加权平均法,可以用于估计软件项目的规模、工作量和成本等。在估计每一项任务时,首先按最佳的、可能的、悲观的三种情况给出估计值,记作:a、m、b。6
然后用以下公式计算期望值,期望值就是最终的估计值:期望值 =(a + 4 * m + b)/ 6
这种方法运用了一些心理学和统计学的观点,主要利用的是人们的心理。一些人为了表现自己的能力,往往会少报一些规模,而另外一些人为了争取某些利益,想多报一些
这种方法,就是减少估算人员这些波动的心理。
没有经过训练的估计,一般其精度在 -50%(少估计)~150(多估计)%之间,使用Pert sizing方法,可以把精度提高到 +/- 50%之间。
应该说精度提高了,但相对于项目的毛利,这样的精度是远远不够的。需要靠历史数据的帮助,靠其他方法的配合,比如类比的方法,也可以继续提高精度。
第四节 各种估计方法之二:Wideband Delphi
接下来讲Delphi ,Delphi 也被称为专家法。Delphi 的工作原理是这样的:首先选择一些对系统比较熟悉的专家(比如系统的需求分析员,开发人员,上下游接口人员,做过类似系统的人员)
一般专家选择3~7 名。让这些专家对系统的各个模块进行估计。估计完成后,由主持人匿名找到每个模块的最大值,最小值,让他们把估算的理由写下来。写完后,有主持人向大家宣布,为什么每个模块的最大最小的原因。
大家了解到模块的最大最小值后,如果最大最小偏差大于20%,再进行第二轮估计。如此类推,最多进行三轮。
当到第三轮时,有两种情况,1.最大最小偏差小于20%,这时候可以结束估算;2.最大最小值仍大于20%,这时候为了节约估算成本,也停止进行估算。最后的估计结果,可以取所有估算数据的算数平均,也可以去掉最大值,最小值,再进行算术平均
这种方法就是专家法。这种方法,经过长期的积累和训练,可以提升到比较高的精度,特别是做产品的项目。一个版本一个版本提升和发布的,精度会提升的很高。
比如华为,就是用的这种方法,没有使用更加复杂的方法,用了7,8年,精度最终可以达到+/-10%
所以说不是越复杂的方法,约难理解的方法越有效,而是用一种方法,积累的越多,经验越丰富,准确度就越高。
建议大家做估计到时候,用自己最熟悉的方法,找项目的规律,定义项目的各种估算属性,这样积累的越多,估算就月精确。而不是去找各种千奇百怪的方法,把自己绕晕了。重要的还是积累,也就是经验。
这种方法对于项目型的企业就不太适合了,因为项目型的企业,项目类型,种类,客户情况偏差大,不容易做积累。因此精度提高的速度就相对比较慢。
这里没办法做练习,能做个练习就好了。之前给客户做咨询的时候,让他们做个估算,大家都不熟悉的例子,结果三轮过后,他们的估算精度是-8%
第五节 各种估计方法之三:类比法
接下来谈一下类比法。类比法就更是利用历史数据和经验了。比如估算一个页面要花多少工作量,这时候用类比或者叫代理估算,就更加容易和准确一些。
页面有复杂的有简单的,怎么进行类比或者做代理呢?我们那页面的构造做类比,一个复杂的页面,可能有几个输入框,几个选择框,几个按钮,数这些控件,就业估算一个页面的复杂度。
简单的界面,只有一个输入框,一个确定,一个取消,如登陆框,复杂的页面,有多个按钮,多个输入,多个选择,因此,可以用多个页面与简单的页面进行比较,简单的页面用一天时间,复杂的页面,按照线性的估算,也可以估算大致复杂需要做几天。
类比法或者代理法,是用一个大家都知道的规模,推算一个不太了解的规模。找到可以对比或者可以代理的,就比较容易推算新功能的规模了。
这个方法的难点在于怎么样更好的对比。常见的有刚才说的用数界面的控件的方法。也有数表的方法,比如某公司做BI的项目,就是用数每个检索需要调用多少个表结构,多少个存储过程。找到了能比较的要素,类比的意义就更大了。
pert sizing(三点法),wide bandDelphi(专家法),类比法,这三种方法是可以交叉起来使用的。不局限一种方法,可以互相穿插在一起。以进一步提高精度。 我个人的建议是,如果大家觉得其他估算方法麻烦,只要用这三种方法,也可以达到很高的精度。因此,不想用特别复杂方法的公司,就要在这三种方法上下功夫,积累数据,我相信5年之后,你们也能达到华为的高度,至少偏差控制在15%之内是可能的。
第六节 各种估计方法之四:Function Point (IFPUG)
接下来讲功能点法,这个有点抽象。功能点法在国际标准上叫做 IFPUG,或者funciton point,现在ifpug已经是国际标准了,最新的标准是5.2版本的,大家感兴趣可以下载来看看。里面介绍的是识别功能点的各种规则。
IFPUG 是IBM 的一个项目经理发明的。他在上世纪80 年代做项目经理的时候,也经常遇到估算不准确的情况,越是,他开始找规律,找项目、需求、实现的规律,于是发明了这种估算法。后来他离开IBM ,专门成立了一个咨询公司,讲如何进行估算
再后来,这个就被ISO纳入了国际标准。所以估算就是实践出来的。
国际标准号是ISO/IEC 20926:2003 ,大家感兴趣可以检索一下。我这里也有电子档的,如果大家需要,可以留下您的邮箱地址,我发给你。
现在讲IFPUG,就是FUNCTION POIT怎么做。只能简单的讲一些,很多规则建议大家翻看手册和标准。要了解IFPUG,先讲几个术语,这些术语记不住的话,容易听晕了。
1.ILF (Internal Logic File)内部逻辑文件,类似于系统里面的各种表,各种记录(如数据文件,或配置文件);2.EIF(External interface file),外部接口文件,可以是数据接口,可以是消息接口,可以是逻辑接口,可以是文件接口。
内部逻辑文件(ILF)是一组用户能够识别、存在内在逻辑关联、在系统边界之内被控制的数据或控制信息。可理解为一个实体联系模型或一组关联的数据表。外部接口文件(EIF)是另外一个系统的ILF。在本系统中被引用、在系统边界之外被控制。
这两个称之为静态的,因为都是数据,不牵扯逻辑,只不过一个在系统内部,一个在系统外部。
举个例子:比如做一个 京东的交易系统,ILF ,就是京东里面各种商品的数据。EIF ,就是支付时,需要支付数据接口。
各种商品数据保存在一个表里,所以ILF 是一个。支付时,有多个接口,比如有支付宝,有腾讯的支付,这样,EIF 就是2.
刚才的ILF,EIF叫做数据功能元素,光有数据功能元素,系统是不完整的,还需要统计事务功能元素。
数据功能元素包括三类:EI(外部输入),EO(外部输出),EQ(外部查询)。外部输入(EI),一个接受来自系统边界之外的数据或控制信息的基本处理。其目的是维护一个内部逻辑文件,或改变系统的行为。
外部输出(EO) -个向系统边界之外发送数据或控制信息的基本处理。其目的是向用户展示一组经过了(除提取之外的)逻辑处理的数据或控制信息,也可能包括对内部逻辑文件的维护或改变系统的行为。
外部查询(EQ) -个向系统边界之外发送数据或控制信息的基本处理。其目的足向用户展示一组经过提取处理的数据或控制信息,不会引起对内部逻辑文件的维护或系统行为的改变。
ILF,EIF,EI,EO,EQ要熟记,不然理解起来就会搞乱了。
理解了ILF,EIF,EI,EO,EQ,就可以开始计数了。首先,按照刚才京东的例子,数ILF,EIF。例如,刚才数的是一个货品的数据 1个ILF,2个支付接口,2个EIF,这样够不够?这样还不够。原因是没有考虑到这些数据的复杂度。
那么ILF,EIF的复杂度怎么算?这里又出现了两个术语:数据元素类型(DET),记录类型元素(RET)
千万别搞混了,这块有点绕。没图形,不容易理解。
例如京东的货物表,是一个内部逻辑文件 1ILF,怎么算这个逻辑文件的复杂度?通过DET和RET来计算。 DET相当于表有几个字段,RET相当于货物表有几个关联表。
比如货物表有10个字段,那么DET=10;又比如货物表还要关联:仓库表,厂家、,那么这个货物表的RET = 2 这时候就可以计算货物表(1ILF)的复杂度了。计算的方法是通过查表得到的,表的内容是标准里规定的。
通过查表,我们发现 10个字段,2个关联表的ILF复杂度是LOW,LOW对应的功能点是7,因此我们现在可以知道,做一个京东货物的1个ILF =7个功能点。
7个功能点是什么含义?
国际上有个组织叫ISBSG ,在澳大利亚,专门收集全世界跟功能点相关的项目数据,到目前已经收集了几十万个项目的数据,根据他们的数据统计,一个CMMI 5 级的公司,每个功能点,要花1.5 人天来完成。所以1 天的生产率大概是0.7 个功能点
于是,我们知道 7个功能点需要10.5人天做完。这样估算有含义了。
EIF跟ILF类似,如法炮制,但查询的表格是另外的,也可得到类似的结论。 以上是ILF和EIF的估计,也就是数据的估计;
下面开始事务的估计
我们知道事务类型有三种:EI,EO,EQ,这个怎么估计呢。这里要用到事务的复杂度(不要搞混,刚才是数据的复杂度)
事务的复杂度怎么统计?又用到两个复杂度计算的术语:DET (数据处理类型)FTR(引用文件类型)
DET (相当于表格中的字段)如,进入或者输出该应用的边界的不重复的数据项数.(通常为字段数,只计算被事务处理参照和维护的字段,包括用户从GUI输入的字段、命令键、提示信息)。输入的字段:命令键,提示信息
引用文件类型( File Type Referenced )为关联文件数(即某项功能处理过程中涉及到的引用和维护的文件数)
比如在京东网站购物,我首先输入一个查询条件,找到购买的商品,输入银行账号,然后购买,这个怎么识别
首先一个查询是一个 EQ(多个查询条件,也是一个EQ),输入银行账号,是一个EI,购买完成后,系统提示我一个购买成功,那么是一个EO
这时候怎么计算EI,EO,EQ的复杂度呢。就通过RET和FTR进行计算。
类似于ILF和EIF,通过数对应的数据字段,关联的外部文件,检索到EI,EO,EQ的复杂度对应的功能点数。
好了,现在 ILF,EIF,EI,EO,EQ都数完了,现在可以统计功能点。
低平均 高 合计 外部输入 __×3 __×4 __×6 外部输出 __×4__×5 __×7 外部查询 __×3 __×4 __×6 内部逻辑文件 __×7 __×10 __×15 外部接口文件 __×5 __×7 __×10
用这个公式计算功能点即可。这个功能点叫未调整的功能点UAFP。
有了未调整的功能点,还要考虑系统的复杂度,所以还需要调整。系统的复杂度有14类,分别按照1~5来打分。这个叫调整因子
数据通信联机更新 分布式处理 复杂处理 性能 可重用性 配置负载 易安装 事务率 易操作 联机数据登录 多个场所 最终用户效率 设施变更
这些是常见的调整因子。
调整后的功能点(AFP)由以下公式计算: AFP = UAFP * [0.65 + 0.01 * VAF]
最后得到了最终的功能点。
这个就是IFPUG,最简单的介绍。因为如何数ILF,EIF,EI,EO,EQ还有一系列的规则和要求,不能随意数。具体的要求可以参加我推荐的IFPUG5.2标准
IFPUG可以实现很高的估算精度。因此,印度,韩国,澳大利亚,已经把这种方法形成了国家标准,为国家做项目,必须要按照这种方法估计,才能有投标的机会。
第七节 各种估计方法之五:NASMA(快速功能点估计)
可是,这个方法太麻烦了,我相信我讲的大多数不知道这个方法的人还是云里雾里的。不知道怎么操作。是的,这个方法确实比较复杂,而且只适用于交易,数据库等这类型的系统,对于电信的系统不适用。
于是,有人对这个方法做了简化,为了快速估计,简化估计,于是有了,快速功能点估算,叫NASMA。
NASMA怎么估计?NASMA对IFPUG做了简化,保留ILF,EIF,去掉EI,EO,EQ。ILF和EIF的计数方法跟IFPUG一样。最后得到功能点是FP=ILF×35+EIF×15。至于为什么这样,留个小尾巴,以后再讲。
****************************************************************************** ******************************************************************************
1. @清清水草2012: 公司目前在组织的估算,感觉是做样子的,拍脑袋定的。怎么样委婉一点给领导提建议呢?答: 可以把我一开始的例子举给他,就说项目如果估算不准确,项目是不是应该做就成问题了,可能不盈利。
答: 专家法和类比法,可以把类比的内容和专家估计进行整合,形成一张估算表。如何选择专家是个问题。最好不要选择领导,因为领导会左右估算的结果,类似于同行评审,选择同行将进行估算,包括上下游接口,包括熟悉系统的工程师
3. @西北偏北I:个人觉得估算这个事情呢,需要循序渐进,而且需要高层的支持。慢慢累积才能做的好,估算才能越来越准确,否则到了后期,大家又都是在拍脑袋决定了。答: 是的一定要高层支持,因为估算不是一个人的事情。
4. @大懒虫子丫头:代码行估算现在是不是应该被淘汰了,适用度不大啊。答: 怎么能淘汰呢,代码行是一个很客观的方法。当然最好用功能点。华为用的就是代码行。微软、IBM,MOTO都是用的代码行
5. @有个性的个性:我们一直在用功能点,一开始用代码行,实在太累,后面就用专家估算,结果沟通协调起来太麻烦。现在用功能点,项目组自己就弄出来了,这样合理吗?答: 功能点有一些是不标准的,类似于类比法的功能点,这样也可以,但这个不是标准的功能点 再问:我们跟考核结合起来就乱了,现在头疼呢。 再答:怎么个结合法?估算精度跟考核结合?一开始不要这么做。
6. @淡淡淡淡蓝色:我们一直用代码行,估算比较准确,就是费时。有什么简易的方法不?答: 坚持下去,想办法简化,通过 工具进行简化。不知道你们用代码行估算使用的是什么方法。 再问:纯人肉。  再答:可以进行分类,如配置,如通信
上一篇:如何有效进行度量【总结】 下一篇:我们想在上海办一些CMMI免费沙龙 |