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个月。
项目实现比较
- 印度公司使用Strus 1, Hibernate
- 印度公司到UAT结束,两名程序员一共用了4个月
- 我使用Spring Boot / MVC / Data JPA
- 一人用了15个工作日,加上周末加班有20个Man Day
代码行数统计与分析 (仅比较Java代码,JS与HTML双方都有一点,但为了方便统计没有包在里面。)
印度版本总代码行数: 7385
其中分项统计如下
azan: 3208
DAO: 782
azanApplication: 4177
DAO:991
Form:306
统计方法
由于没有使用Spring Data JPA,他们的代码多出了很多DAO,Form相关的代码,这些在我的实现里是没有的。
去除DAO和Form Bean后的代码量: 7385-782-991-306= 5306
我的代码总行数: 3968
PrayerAndroid: 1014
PrayerWeb:2954
统计方法
分析
(结论的计算全部使用等于号,有些是为了打字方便,实为约等于)
两个项目的总代码行对比,实现完全相同的功能,印度公司多写了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的差距基本上可以归结为
- 没有双人协作的沟通成本
- 压力下对时间与注意力更高效的管理
- 设计与编码经验的差别
- 责任心
态度决定了25%的效率差
这里特别分析下前文提到的责任心因素。如前所述,印度公司的提交物在UAT阶段消耗了一个月,一直有严重的Bug,我觉得这完全是态度的问题。本人的服务器和客户端部署后只改了一行代码,而且只是健壮性改进。如果印度方面也把Bug消灭在UAT之前则可节约25%的时间。
每日代码产量
虽然总的效率差别达到了11倍之多,但是我们之间的每日代码产量差别不到3倍,去掉加班因素,我们的日代码产量几乎是一样的。
7385/(2×22×4)176 = 83Line/ManDay
3968/20Man Day = 200Line/ManDay
总结
- 此项目中不同程序员的的生产力有
11
倍的差别。 有效
的加班最多可将效率提升三倍
。- 使用合理的框架可以减少
30%
左右的工作量。 - 态度决定了
25%
的效率差。 - 设计,经验,责任心等因素决定了
三倍
的效率差别。 - 去掉加班因素,不同效率的程序员每日代码产量几乎是
一样
的。
注意加班因素可产生最高三倍提升,第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
2015-11-17