1个顶11个?程序员效率差距的量化分析


在软件工程的经典《人月神话》中作者提出好的程序员和差的可以达到100倍的效率差别,我还没搞清怎么做到的,但是现实中,好的程序员与差的程序员完全可以达到1:5到1:10的效率比。这就让我们来看一个例子吧。

基于同一个需求文档,印度合作公司与我各写了一套主要功能类似实现,都是基于Java,各包含一个Server和一个客户端。现在UAT通过,我也接收了印度方面的代码。同时心里默算了下,这两套实现消耗的Man Day竟有10倍的差距,于是有些好奇,便通过比较两个实现的代码量,使用的框架与消耗的Man day来分析影响程序员效率的因素。

基本情况

一个需求最先由Boss完成需求和设计并在7月份发给印度合作公司以项目外包形式发包,约定在9月底完工,我没有参与。印度方面投入了两个工程师和一个兼职的PM。但是在9月份的时候我们发现我们还需要兼容一个Android客户端,而原先设计的架构无法兼容。Boss要求我从新开发一套来针对Android的实现,而功能性需求是一模一样的,时间上越快越好。本人从9月7号到9月25号三周15个工作日(加周末约20Manday),完成从设计,环境搭建,文档,代码,测试的各个环节。在进入UAT阶段后,Server只修改了一行代码。Android客户端由要由以色列同事构建整个Image才能发布,所以使用了Hybrid的形式将尽可能多的功能放到(HTML/WebView上),从测试开始到UAT只修改了三行代码,而且是用来增强健壮性。值得一提的是印度公司解决方案在9月底提交后UAT阶段不停出现严重Bug无法使用,经过不断Fix,到11月初才完成UAT,项目总共历时4个月。

项目实现比较

  1. 印度公司使用Strus 1, Hibernate
  2. 印度公司到UAT结束,两名程序员一共用了4个月
  3. 我使用Spring Boot / MVC / Data JPA
  4. 一人用了15个工作日,加上周末加班有20个Man Day

代码行数统计与分析 (仅比较Java代码,JS与HTML双方都有一点,但为了方便统计没有包在里面。)

印度版本总代码行数: 7385

其中分项统计如下

azan: 3208
     DAO: 782
azanApplication: 4177 
     DAO:991
     Form:306

统计方法

pic工程一,总数

pic工程一,DAO + DTO

pic工程二,总数

pic工程二,DAO + FORM Bean

由于没有使用Spring Data JPA,他们的代码多出了很多DAO,Form相关的代码,这些在我的实现里是没有的。

去除DAO和Form Bean后的代码量: 7385-782-991-306= 5306

我的代码总行数: 3968

PrayerAndroid: 1014
PrayerWeb:2954

统计方法

pic工程一

pic工程二

分析

(结论的计算全部使用等于号,有些是为了打字方便,实为约等于)

两个项目的总代码行对比,实现完全相同的功能,印度公司多写了86%的代码

7385/3968*100%= 186%

去除DAO、Form后,印度公司还是多出33%的代码,但是这以经可以归在代码风格,每行长度的误差里了。

5306/3968*100%=133%

各种因素之和可以导致程序员的效率差距达到11倍之多

考虑到加班因素,此项目中不同程序员的的生产力可以有11倍的差别。 印度方面消耗的总ManDay高达176。我所消耗的月历天数为20天工作日为15天。

2*22*4 = 176
ManDay Rate = 15 : 176=1:11

由于本人在那几个周里每周工作了差不多120个小时,相当于3倍的正常工作量。

去掉加班因素(15 ManDay * 3 = 45)后生产力的差别约为1:4

ManDay 45 : 176 = 1 : 4

使用更新的框架带来的收益

去除了上述的代码行误差后,使用Strus1+Hibernate框架相比Spring Boot(MVC/Data JPA)还要多写40%的代码 (186%/133%)。Form Bean多为生成,所以推算使用新的框架可以减少30%左右的工作量(编码和Bug Fix)。

去除框架不同所至的代码量差别因素后,生产力的差别约为1:3

45 × 1.30 :176 = 1 : 3

个人觉得这1:3的差距基本上可以归结为

  1. 没有双人协作的沟通成本
  2. 压力下对时间与注意力更高效的管理
  3. 设计与编码经验的差别
  4. 责任心

态度决定了25%的效率差

这里特别分析下前文提到的责任心因素。如前所述,印度公司的提交物在UAT阶段消耗了一个月,一直有严重的Bug,我觉得这完全是态度的问题。本人的服务器和客户端部署后只改了一行代码,而且只是健壮性改进。如果印度方面也把Bug消灭在UAT之前则可节约25%的时间。

每日代码产量

虽然总的效率差别达到了11倍之多,但是我们之间的每日代码产量差别不到3倍,去掉加班因素,我们的日代码产量几乎是一样的

7385/(2×22×4)176 = 83Line/ManDay
3968/20Man Day = 200Line/ManDay

总结

  1. 此项目中不同程序员的的生产力有11倍的差别。
  2. 有效的加班最多可将效率提升三倍
  3. 使用合理的框架可以减少30%左右的工作量。
  4. 态度决定了25%的效率差。
  5. 设计,经验,责任心等因素决定了三倍的效率差别。
  6. 去掉加班因素,不同效率的程序员每日代码产量几乎是一样的。

注意加班因素可产生最高三倍提升,第5项也可以!

加班因素

每周120小时的工作时间差不多是我最高的效率了,再高就会严重损失效率,得不偿失,当时实行的是5-10-7制度。家里建了开发环境,代码两边同步,每天早上4点到6点起床,平均5点,别问我怎么做到的,压力大时,到点就会醒来想项目上的事情,还不如干脆就爬起来干活。晚上6点从单位准时下班,因为实在效率下降,干不动了。回家吃完饭,又有精力可以干到10点。如此重复。加班是自觉的,为报Boss的知遇之恩而已。以前也怕Taobao的的9-9-6,但现在回过来看9-9-6也是小儿科了。(并非在这里提倡加班,本人十分反对无效加班。有机会专门写一些IT圈里形形色色加班。)


Jim - 程序员,近10年工作经验集中在Java, Android, C++,现就职于上海。
Published under (CC) BY-NC-SA in categories Common Tec  tagged with Java