阅读更多

4顶
0踩

研发管理

转载新闻 无法衡量的软件开发生产效率

2013-09-09 14:01 by 副主编 WnouM 评论(6) 有7603人浏览
2003年8月29日,软件行业大牛Martin Fowler写过《无法衡量生产效率》。10年后,Martin 在其网站首页以《十年后仍无法衡量生产效率》标题再次推荐了这篇文章,并附言:

引用
软件行业的巨大挫败之一,是我们没有合理建立研究,去思考诸如面向对象编程和测试驱动开发之类的开发工具和技术、还有其他更高级的语言是否对我们有益。我们经常看到不当的研究,并且常常很糟糕,是因为它们是基于一个错误的衡量方法(比如员工每天所编写代码的行数)。十年前的今天,我的挫败感促使我写了《无法衡量生产效率》一文。我认为该文在今天看起来,和十年前没什么不同。


原文内容如下:

我们见到过太多关于软件开发过程、设计实践以及类似内容充满激情的讨论。它们当中有很多是无法验证的,因为软件行业没有能去衡量代表开发效率的一些基本元素。特别是我们无法合理地衡量生产效率。

当然,生产效率可以通过观察生产过程的输入与产出来衡量。所以,要衡量软件开发的生产效率,你就必须去衡量软件开发的产出。我们无法衡量生产效率的根源就在于我们无法衡量产出。

并不是说人们没有尝试过。最令我气愤的就是那些用代码行数来衡量生产效率的研究。首先,总是存在不同的语言、不同的计数方式、不同的格式化风格造成的问题。即使采用一致的计数标准,衡量相同语言代码,且代码被自动格式化为统一的风格,代码行数仍然无法正确反映产出。

任何优秀的开发者都知道,让他们去实现一个特定功能所需的代码行数可能相差巨大。除此之外,精心设计以及重构过的代码都会更短小,因为它消除了冗余。复制粘贴风格的程序会有更多的行数以及更差的设计,因为它充满冗余。这很好证明,只要你使用一个支持inline method的重构工具去修改一个程序。只需用这个工具去重构那些普通函数,你就可以轻易让代码行数翻倍。

你可能觉得已经没人再用代码行数了,实际上每个月我都能看到基于代码行数的生产效率研究论文,甚至是在类似IEEE Software这样令人尊敬的期刊上。

也不是说代码行数是个完全没用的衡量,它能很好代表系统规模。我可以很确定一个100 KLOC(KLOC=千代码行)的系统比一个10KLOC的系统要大。但是如果我用了一年时间写了那个100KLOC的系统,而Joe在一年内用10KLOC实现了同样的系统,这无法说明我更高产。实际上我得到的结论是:我们的生产效率差不多,但我的系统设计得更差。

另一个经常被用来衡量产出的方法是使用功能点(Function Points)。虽然我更同情这种做法,但它并不能令我信服。我听过很多这样的故事:同一个系统,不同人统计的功能点数目相差有3倍之多。

即使我们能够找到一种方式用功能点精确衡量功能,我认为这仍然无助于解决生产效率的衡量问题。可以这么说,衡量功能点是观察软件开发直接产出的方式,但真实产出确是另一回事。假设有一个精确的功能点计算系统,如果我花一年发布了一个有100个FP(功能点)的系统,同时Joe也用一年发布了一个50FP的系统,是不是就能说我更高产?我觉得不是。很可能我做的100FP中只有30个对我的客户来说是真正有用的功能,而Joe开发的功能则全部都是有用的。我会这么说:虽然我的直接生产效率更高,但Joe的真实生产效率更高。

Jeff Grigg向我指出,还存在影响功能点交付的内因。我的100个功能点可能提供的都是很相似的功能,我之所以花了一年时间,是因为我没有很好的重用代码。Joe的50个功能都是差别相当大的(对他来说可不是个好消息),所以几乎没有重用的可能。尽管需要实现50个相当不同的功能,并且几乎无法重用代码,但Joe真的很棒,他在一年之内就全部完成了。

但这些都忽视了一点:即使是有用的功能也无法真正用来做衡量。假设我有了进步,完成了30个有用的功能点,同时Joe只完成了15个。但有人会发现Joe的15个功能点为我们的客户增加了1千万的盈利,但我的工作成果带来的盈利只有500万。我仍然认为Joe的真实生产效率要比我高,因为他产出了更多的商业价值。并且我坚信任何真正的软件生产效率衡量必须基于其所带来的商业价值。

这种思想也适用于成功率。通常关于软件项目成功的判断都是虚假的,因为人们并不理解什么是失败。我可以说一个成功的项目就是产生的商业价值大于研发成本的项目。假如Joe和我各参与了5个项目,我的4个项目是成功的,而Joe只有一个项目成功。这是不是就意味着我干的比Joe好呢?这可不一定。如果我的4个项目每个盈利1百万,而Joe那个成功项目的收入比他所有的5个项目成本的总和还要多出1千万,那么他才是那个应当获得提拔的人。

有些人会说“如果无法衡量,就无法管理”,这是站不住脚的。商业领域中,人们一直在管理着那些他们无法衡量价值的东西。你如何衡量一个公司里律师的生产效率?如何衡量市场部门、教育机构?你无法衡量,但你任然需要去管理它们(更多信息参考Robert Austin)。

如果团队的生产效率都很难衡量,那么个人对团队的贡献就更难衡量了。通过观察每个迭代产出特性的多少,你可以对团队的产出有个大致的概念。这是个很粗糙的感受,但是你可以感觉出团队的速率是否有所提高,或者大致感觉出两个团队的生产效率哪个更高一些。但是个人的贡献值就很难计算了。可能有的成员职责是实现特性,而有些成员的角色可能是协助者——他们负责帮助他人实现特性。他们的作用是提升整个团队的生产效率——除非你是这个团队中的一个开发者,你将很难搞清楚这些人的产出到底是什么。

如果你觉得这些情况还不够复杂,在《经济学人》(sep 13-19,2003)上有一篇关于生产效率趋势的文章。经济学家们似乎发现,由于90年代中对计算机产业的投资导致了如今商业领域中生产效率的提升。

这其中的重点是——增长是落后于投资的:“对计算机方面的投资并不会自动地推动生产效率提升,公司同时也需要重组他们的商业实践”。同样的滞后效应也出现在电力发明之后。

所以商业价值不仅难于衡量,还存在时延。很可能直到团队构建的软件发布多年之后,你才能够衡量团队的生产效率。

我可以理解为什么衡量生产效率如此具有诱惑性。如果可以做到,我们就可以更容易、更客观地评估软件。然而错误的衡量方式只会使问题恶化。我觉得必须承认:在这一领域,我们任然很无知。

英文原文:Martin Fowler  / 译文:伯乐在线
来自: 伯乐在线
4
0
评论 共 6 条 请登录后发表评论
6 楼 lixin3811 2013-09-16 11:17
@dohkoos,完全同意“前提条件很重要”--这个太重要
5 楼 dohkoos 2013-09-14 11:31
@lixin3811 做对比的是否都有能力实现同样的功能?做对比的是团队还是个人?如果是个人的话(我想应该是个人,因为这里没有说团队的效率),实现同样功能的代码量很难会达到数量级的差距。

最好能提供原始的调查报告。因为这类调查报告通常是采用抽样对比统计方法得出的,某些前提条件就很重要。
4 楼 lixin3811 2013-09-12 15:49
to dohkoos:程序员的生产效率差距可以达到100倍,是通过实现相同的功能研究的;比值中有知识积累的效能;所以这里的生产效率是狭义的。
to edhn:我感觉Martin之所以列出商业盈利或者商业价值作为衡量指标,是受到了精益开发(Lean)的影响,把生产效率的考量定位到团队的基于精益思想进行的项目,通过最终结果来衡量广义的生产效率或者生产力。这种方法跟管理者们所需的(衡量工期的)指标相去甚远。个人认为:能够细化到工作量评估在2-3人天以内的FP粒度是可以作为工期衡量指标的。
to crazyafei:目的不同,标准不同。Martin是衡量价值,而领导是衡量工期。
3 楼 crazyafei 2013-09-10 09:21
唉,就如同测量距离没有“米”这个单位一样,没有一个统一的、获得大家认可的衡量标准,是软件开发生产效率管理永远之疼。
2 楼 edhn 2013-09-09 21:30
代码行数衡量生产率确实很恶心,你写少而优的代码却可能被认为生产率低下。
FP也不够好,但胜于代码量。

不过文中后来把商业盈利扯上了,这相关的因素就太多了,产品定位,产品规划,细节体验,销售推广,运营维护等等,这包含开发周期以外的事情
1 楼 dohkoos 2013-09-09 18:59
不是早就有调查表明程序员的生产效率差距可以达到10-100倍吗!这里又说没法衡量生产效率。发现软件行业里到处都充满着类似的矛盾言论。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • wireshark基本用法及过虑规则

    wireshark基本用法及过虑规则 标签:wireshark基本语法wireshark使用方法wireshark包过虑规则 2015-02-03 18:4410711人阅读评论(0)收藏举报 分类: 网络通信编程(19) 版权声明:本文为博主原创文章,欢迎转载。 来自:http://blog.csdn.net/hzhsan/articl...

  • 〔转〕shark接口

    Shark流程启动过程 1)      定位工作流服务器      Shark.configure("Shark.conf");      SharkInterface si= Shark.getInstance();2) 连接工作流服务器   SharkConnection sc= si. getSharkConnection();   sc. connect(use

  • 鲨鱼 抓包 oracle,抓包工具wireshark的操作使用

    关键字有:eq,== 等于、ne,!= 不等于、gt,> 比…大、lt,< 比…小 ge,>= 大于等于、le,<= 小于等于 and,|| 且 or,&& 或 not,! 取反非: ! or “not” (去掉双引号)且: && or “and”或: || or “or”另外还有contains和matches两个不常用的关键字,过滤效果不...

  • 鲨鱼抓包(Wireshark)简易操作说明

    最近用鲨鱼(Wireshark)抓包,然后同事表示不会用,想了想,干脆动手弄个小说明吧,如是就有了下面的两张图片。 贴在这里用于备忘,也许能帮助到其他小伙伴。

  • wireshark 端口号过滤_kali新版本wireshark使用

    下载 kali 新版本 19.4WireShark 主要分为这几个界面 1. Display Filter(显示过滤器),用于过滤 2. Packet List Pane(封包列表),显示捕获到的封包,有源地址和目标地址,端口号。 3. Packet Details Pane(封包详细信息), 显示封包中的字段 4. Dissector Pane(16进制数...

  • [**开同**看] 企业级开源软件大盘点

    由于开源软件特殊的开发方式,使得这个领域真可谓百花齐放,以至于究竟有多少种开源软件,恐怕没有多少人能说清楚。*Linux 操作系统 ***Red Hat** Red Hat Enterprise Linux(RHEL)作为红帽家族的服务器成员,提供了...

  • 这八十一道java高级框架面试题你能答出多少题?

    话不多少直接上干货 1.什么是Maven? Maven使用项目对象模型(POM)的概念,可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。...

  • 前端2020面试题195道

    一、 Doctype的作用? 严格模式和混杂模式的区分,...DOCTYPE不存在或格式不正确会导致文档以混杂模式呈现。 严格模式就是浏览器根据web标准去解析页面,是一种要求严格的DTD,不允许使用任何表现层的语法, 混杂模式...

  • hibernate必须知道的知识

    1. 答:hibernate,通过对jdbc进行封装,对 java类和关系数据库进行mapping,实现了对关系数据库的面向对象方式的操作. 1.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 hibernate的...

  • Web安全前言

    社工技术社会工程学(Social Engineering,又被翻译为:社交工程学)在上世纪60年代左右作为正式的学科出现,广义社会工程学的定义是...简单来说社会工程学就是对目标的信息搜集,当然不仅仅是搜集目标主动泄漏的信...

  • http报文格式分析_wireshark抓包分析——TCP/IP协议

    当我们需要跟踪网络有关的信息时,经常会说“抓包”。这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通过wireshark抓包分析。Wireshark 是最著名的网络通讯抓包分析工具。功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。Wireshark下载安装,略。注意,若在Windows系统安装Wireshark,安装成功后可能...

  • Wireshark 设置显示端口号

    在Wireshark中,打开编辑->首选项设置->列->按“添加”按钮->在字段类型中选择“Dest port(unresolved)”即可。 转载于:https://www.cnblogs.com/antigao/p/10929699.html...

  • Nmap端口探测技巧

    对一个端口进行探测 对几个端口进行探测 nmap -p80, 135 scanme.nmap.org 对某个端口范围进行探测 nmap -p1-100 scanme.nmap.org 对所有端口进行探测 nmap -p- scanme.nmap.org 指定协议探测端口 nmap -p T:25 U:53 scanme.nmap.org 通过协议名来扫描端口 nmap -p smtp scanme.nmap.org 通过名称范围扫描 nmap -p s* scanme.nmap.org 扫描注册在nmap

  • wireshark 端口号过滤_WireShark对QQ抓包

    打开WireShark,登录:QQ使用过滤器筛选oicq的数据包可以看出这个包有5等结构源地址是111.30.159.76;目标地址是192.168.0.107Frame 46这个是链路层,前面的46表示第46个包数据链路层详解:可以看出该路由器的厂商在TendaTec;该数据包的目标地址是64:5d:86:2c:37:d8,这个数据包中以太网头的源地址c8:3a:35:60:3e:30 ,我们的...

  • Nmap扫描机器开放的端口

    Zenmap为Nmap的可视化操作界面 也可在命令行窗口下操作:在Nmap目录下 在指定的DNS下扫描 命令行下指定的DNS下扫描 对于已经知道主机存活或者防火墙开启的机器,可以使用-Pn参数停止探测之前的icmp请求 ,达到不触发防火墙安全机制 使用-p m-n扫描指定范围的的端口 在命令行中,输入nmap -h查看帮助信息 ...

  • 不可不知:企业级开源软件大盘点

    不可不知:企业级开源软件大盘点 由于开源软件特殊的开发方式,使得这个领域真可谓百花齐放,以至于究竟有多少种开源软件,恐怕没有多少人能说清楚。本报评析实验室在开源专家的意见的基础上对其中颇有影响力的企业...

  • 传智博客(JavaWeb方面的所有知识)听课记录(经典)

    (1).Bad versionnumber in .class file:编译器版本和运行(JRE)版本不符合。高的JRE版本兼容低版本的编译器版本。 (2).当程序有错误的时候,使用Debug as 运行程序。双击语句设置断点。程序运行到此处停止。点击...

  • 渗透测试之安全手册(干货)

    身份标志风险等级:中漏洞描述:用户帐号(包括管理员及普通用户)应具有唯一性,保证应用系统中不存在重复用户帐号。测试步骤:修复方案:在注册时不仅对ID进行生成,也要对用户名做判断,防止相同用户名的账户重复...

  • CTF常见用法小总结

    >没有被代替可以用其来代替分号,因为php中最后一条语句可以没有分号 关键字(全字匹配) \ linux下将关键字用\分隔,可以起到换行连接输入的作用,但是关键字全字匹配不到 通配符 是通配符代替敏感词中的某一部分,...

  • 二、 Spring框架核心之代理模式+spring与Struts框架整合学习--实训 2019/10 / 12

    它们是基于像JSP、ASP、PHP之类模板系统的脚本,较易与AJAX技术进行整合。 控制器 控制器负责响应用户输入并执行数据模型对象的交互。控制器在接收、确认输入后执行修改数据模型状态的业务操作。 Struts2 ...

Global site tag (gtag.js) - Google Analytics