阅读更多



几乎正如10年前 Martin Fowler 发现的,用生产效率来衡量软件开发工作没有任何意义。原因就在于,它们不属于同一范畴。换句话说,生产效率不具有作为衡量软件开发工作的适用性。“今天创造了多少代码/软件?”这是一个没有意义的问题。即使可以这样测量,软件开发工作上的生产效率也不能以任何有意义的方式估计出它的商业价值。

这是因为,软件开发这种工作并不一定非要生产出什么东西。让我来举个例子:比如说,碰巧有两个程序员分别开发两个完全一样的项目,他们在同一天被分配了相同的任务。第一个人,弗兰克,回到电脑前,写出了一个有1000行代码的框架,完美的解决了问题。代码规范书写,全面测试,有详细的文档描述部署和操作的流程。第二个程序员,皮特,转身去了公园,在哪里,他一边喂鸽子一边思考问题。大概在下午4:45分,皮特溜达回办公室,删掉了200行代码,并部署了他的修改。问题就这样解决了。

这两个程序员,今天的“生产效率”谁的更高?答案是:这无关紧要。紧要的是,皮特解决了问题,同时为团队消减了长期维护的成本。弗兰克同时也解决了问题,但他因为生产了代码,提高了维护成本,所以,(在其它方面完全等效的情况下)他的方案差一些。而把皮特称作更有“生产效率”,则完全从实效性上扭曲了这个比喻。

我认为,优秀的程序员,他所做的事情应该是去除问题。而相对的则是生产出什么。所以,技术上的生产产物,例如代码、文档、数据等,对于实现“去除问题”的目标来说,都是必要但有害的。这就是为什么有时候,这最有效的解决方案是5分钟的交流沟通。

对这种思考模式最有力的支持:当你用这种思维去看待软件开发后,很多棘手的、能看得到但无法测量的问题突然间变得很容易理解。例如,为什么当程序员和他们的客户隔离开时会显得缺乏效率。难道让他们避免打搅不会提高工作效率吗?答案是不会,按常理这会使他们更有效率。但也会造成他们更没效率。因为他们的工作是为客户解决问题,与客户的隔绝导致他们无法找到问题,确定问题。相反,跟有问题的人保持沟通能更有效的解决问题,甚至有时候你一天8小时手指根本不需要碰键盘。

这将我们引向了另外一个问题:为什么软件开发中维护成本相比起其它方面的成本显得很难接受?为什么我们永远无法在第一次做出“正确”的东西?一种解释就是,软件是一个对可能变化的问题的固定解决方案。当问题发生变化时(或我们对它的理解发生变化时),问题和解决方案之间就出现了裂痕。这种随着问题的演变而不停的修补产生的缝隙的活动代价高昂。这也解释了为什么相对于其它软件项目,视频游戏通常的维护成本较低。这是因为它们需要解决的问题(让人们去买这个游戏,玩这个游戏)基本上是根据人类心理学,而这是不常变化的。

好的程序员和坏的程序员之间10倍之差的“生产效率”又是从何说起?每个人都说这是事实,但事实上没有人能直接的测评。我们的理论同样能解释这个问题。相比起工作效率来说,“解决问题”是一种更容易“调控”的东西,使得产生一个数量级差别的效果很容易实现。解决问题需要的是信息和洞察力。你要么有,要么没有。不需要原材料,没有生产能力限制。并不是差的程序员打字速度慢。并不是如果他们努力就能做得更好。他们是缺乏这种高效解决问题的眼界和必要的信息。也许无法测量好程序员和差程序员在生产效率上的差别的原因就在于没有东西可测量。

还有很多现象都可以用这个理论来解释。如果你去找,一定能发现一些。最近我一直在搜罗这方面的案例。试一试,看看这个理论是否也体现在你的工作中。每当发现自己在说提高“生产效率/工作效率”时,问问自己是否是在用正确的方式解决问题。铭记在心:如果不通过生产任何东西就能解决问题,那生产出的任何东西都是一种浪费。

英文原文:There's No Such Thing As Software Productivity  / 翻译:外刊IT评论
  • 大小: 95.7 KB
  • 大小: 30.2 KB
来自: 外刊IT评论
7
0
评论 共 6 条 请登录后发表评论
6 楼 行天下VS浮云 2013-07-29 17:34
中国的IT业有点悲凉的感觉。
5 楼 hardPass 2013-07-27 03:38
程序员少纠结这些,太虚
4 楼 coconut_zhang 2013-07-25 08:55
不生产代码就是不干活,解决的再完美也没用,不但要多写,而且要把逻辑写的绕来绕去的,让别人看不懂
3 楼 神之小丑 2013-07-24 16:12
我们的QA一直有这么几个标准,包括我们的绩效任务承诺书:

1.代码行数以及生产率
2.千行bug率
3.backlog生产率
4.现网重大问题不超过。。。

2 楼 rox 2013-07-23 19:13
Martin Fowler的书,一定要多看!
1 楼 kanme818 2013-07-23 17:06
领导不上ITEYE,领导只看股票和基金

发表评论

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

相关推荐

  • ASP中的面向对象类

    代码如下: <% class MyClass Dim var ‘公共变量必须使用Dim Private var2’私有变量不需要 Sub sub1 response.write var2 End Sub Private Sub sub2 response.write var End Sub Sub SetVar(v) var2=v End Sub end class Set cls = new MyClass’产生对象用set cls.SetVar(“asd”) cls.var = 1 cls.sub1’封装性比较强,不会提示没有权限,直接说不支持属性或方法 %>

  • 面向对象的ASP技术:思考与实践

    面向对象的ASP技术:思考与实践作者:mechiland (http://www.jzchen.net)动笔时间:2003年4月21日完成时间:2003年4月29日目录:概述历史先进的技术与好用的技术:ASP到了尽头吗?组件化的Web程序      一个实例      小技巧      结束语概述本文简要描述了Web开发的历史,并主要对JSP, ASP, 以

  • ASP面向对象编程探讨及比较

    ASP面向对象编程探讨及比较ASP是Microsoft于较早期推出的动态网页编程技术,但其结合ADO对数据库方便快捷的访问、结合XML、COM/ActiveX等其它技术 实现服务器多层结构的功能使它在今天还有着顽强的生命力,并且依然有着一定的发展。ASP.Net虽然在架构上完全不同于ASP,但它很多内建对象也是基 于ASP进行扩展的。网上有无数的介绍ASP的文章,却鲜有介绍ASP面向对象以及与其它

  • asp已被淘汰,而产品维护该何去何从

    历史遗留问题: 中小型企业老板建站往往选择价格便宜的,所以一部分网络公司为了价格竞争优势,选择了asp开发网站(因为空间成本最低,php需要购买数据库,成本相对高一些)。 多年积累,积累了大量客户,产品全是asp开发的。 而如今asp被淘汰,新一代技术人员根本不知道asp为何物,招人困难,而大量的客户又需要维护, 转型把又不可能,因为客户实在是太多,不可能都推翻换其他语言开发。

  • ASP面向对象,实例(代码)

    创建数据库连接对象并打开set Conn=server.createobject("adodb.connection")GetConnectString="Provider=Microsoft.jet.oledb.4.0;data source=" & server.mappath("GuestBook.mdb")Conn.open GetConnectString建立面向对象Clas

  • 面向对象的asp编程之一开篇

       我使用delphi近4年了,虽然不怎么喜欢delphi,但是一值在用.我也经常使用asp编写一些程序,我发现在delphi中的对象模型还是比较好的,虽然delphi的开发模式有这样或那样的毛病.所以也想利用vbscript中的类写一些在asp中经常使用的东西,以提高asp的开发速度,由于这些脚本语言都比较简单,所以在程序中仅有一些必要的注释.   在asp中可以使用两种脚本vbs

  • 在ASP.NET中面向对象的编程思想

    在ASP.NET中面向对象的编程思想

  • ASP与面向对象类

    文章关键字:|ASP|面向对象类|类|对象|权限|优化| 某人给公司做的报表系统现在我打算重新修改优化一下,用的是ASP,用面向对象就得有类,还好VBS 支持。 以下为引用的内容: 原文地址:http://www.evget.com/zh-CN/Info/ReadInfo.aspx?id=9228...

  • 面向对象的asp编程之三--一些常用的函数

    // ************************************************************************ // Script Compont Object Model// Design for Active Server Pages//// Copyright 2003  Version 1.0// Made by yinshuguang// ****

  • ASP中的面向对象,类

     大二给公司做的报表系统现在我打算重新修改优化一下,用的是ASP,用面向对象就得有类,还好VBS 支持class MyClass    Dim var 公共变量必须使用Dim     Private var2私有变量不需要     Sub sub1        response.write var2    End Sub    Private 

Global site tag (gtag.js) - Google Analytics