Jenkins 2.x实践指南
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1 关于软件工程生产力

1.1 从另一个角度看“提高软件工程生产力”

所谓另一个角度,是指从社会学的理论中找到提高软件工程生产力的理论基础。

如果将软件工程看成软件的生产过程,软件工程师是这个生产过程中的一种劳动者,知识是这个生产过程中的劳动对象,我们就会发现,这就是马克思的生产力理论三要素。

生产力三要素是劳动力、劳动资料、劳动对象,其中劳动资料和劳动对象构成生产资料。

我们根据这三要素来思考如何提高软件工程生产力。

生产力三要素分别指的是什么呢?

劳动力:一般意义,指工作人群,通常指在一家公司、各个产业乃至某个社会工作的人,多指体力劳动者,但通常不包括雇佣者(老板)和管理层。

劳动资料:也称劳动手段,是在劳动过程中所运用的物质资料或物质条件。

劳动对象:是指劳动本身所作用的客体,比如耕作的土地、纺织的棉花等。

在软件工程领域,生产力三要素又分别指的是什么呢?

劳动力:通常将软件开发工程师、测试工程师认为是劳动力。然而,当他们不在工作状态时,就不能称其为劳动力,只能称为劳动者。

劳动资料:严格意义来说,办公场所、座椅、生产工具等都被称为劳动资料。本书主要讨论的是生产工具。笔者从硬件、软件的角度对生产工具进行了分类。

· 硬件:开发时使用的电脑、机械键盘、灵敏的鼠标、网络速度等。

· 软件:IDE(如Eclipse、IntelliJ IDEA)、构建工具(如Webpack、Maven)、协作工具(如Jira)、部署工具(如Ansible、Puppet)等。

劳动对象:不像制造汽车,在开发软件时,劳动对象则是看不见、摸不着的知识。笔者将软件工程中的知识分为业务知识和技术知识。

在理解了生产力三要素后,如何根据此理论来提高软件工程生产力呢?我们分别讨论。

1.1.1 从劳动力要素考虑提高软件工程生产力

如果能招到比一般程序员生产力高10倍的程序员,并好好利用,就可以提高生产力。如果这个程序员的生产力比一般程序员高10倍,那么通常意味着其工资也高10倍。

另外,不论招到什么样的程序员,管理者都要关心的是,如何帮助劳动者达到最佳工作状态,以产出更多的劳动力。不在工作状态,就不能称之为劳动力,只能称为劳动者。也许,那些经常随意打断程序员的管理者需要反思一下了。

另外,注重培养员工的公司,不仅可以提升员工生产力,还可以提升公司的整体生产力。

1.1.2 从劳动对象要素考虑提高软件工程生产力

如果将软件生产过程看成是无形的知识具化成有形软件的过程,那么产品经理需要将想法(一种知识)具化成原型,美工和交互设计师理解产品经理的想法后,将自己的想法具化成设计稿,然后再将自己的理解及想法(又是一种知识)传达给前端开发人员。接着,前端开发人员和后端开发人员又沟通接口的设计(还是一种知识)……可以看出,要提高软件工程生产力,知识的流通效率起着很关键的作用。所谓知识的流通效率,指的是让知识从一个人的大脑流动到另一个(群)人的大脑的准确性和速度。

所以说,沟通能力在软件工程领域十分重要。

我们甚至可以将一些需要重复操作的知识,具化成一个个工具或者模块。这无疑也是提高生产力的方法。这也就等于告诉我们,在管理软件生产过程时,要主动去识别那些需要重复操作的知识。

如果更深入地思考,你会发现,对于工厂里的生产流水线,如果工人辞职了并不会带走什么。而知识存在于人的大脑里,人辞职了,就意味着把公司的劳动对象带走了。这对团队、公司是一大损失。想想公司通过发放工资生产出来的劳动成果,就这样被轻而易举地带走了。

那怎么解决这个问题呢?根据劳动力要素,应该尽可能留住这些带有“关键”知识的人;根据劳动对象要素,应该尽可能提高同一知识在团队中的携带人数。

那怎么做呢?敏捷实践中的站会、结对编程以及看板的应用,都是增加知识流通效率的手段,从劳动对象要素考虑提高软件工程生产力。

1.1.3 从生产工具要素考虑提高软件工程生产力

程序员笑话一则:程序员在椅子上打斗,经理叫他们回去,其中一位说:正在编译呢!

经理回答:哦,那你们继续。

从生产工具要素考虑提高软件工程生产力。这似乎不需要多谈。大家都知道挖土机比铁铲更具有生产力。然而,很多管理者还给程序员使用低配置的电脑。

低配置的电脑会导致程序员无用的等待,比如打开IntelliJ IDEA需要等2分钟、多打开两个窗口就卡顿等。

我们算算账。假如一个20 000元/月工资的程序员,工作22天,每天8小时,那么每小时就是113.6元。假如程序员每天因为打开程序慢、网络慢、编译慢等而等待的时间总和为0.5小时,那么这0.5小时就属于浪费的,总共约57元。这意味着一个月会浪费1254元。

这只是一个程序员一个月的浪费,还没有算其他人的。虽然计算有些粗糙,但是能反映问题。相对程序员的工资成本,电脑的成本真的不算什么。

说句题外话,这样计算并不是在压榨员工,而是在8小时范围内计算着如何提高公司整体生产力。

从另一个角度来看,作为软件开发团队的负责人,需要深入“开发现场”去了解,当前的生产工具是否变成提高生产力的阻力。生产工具除了电脑,还包括网络、构建工具、IDE等。

1.1.4 生产力三要素的意义

总而言之,比起管理成功学的“心灵鸡汤”,从生产力三要素的角度来看软件工程的意义,在于为我们提供了更多的可操作性。管理者可以将生产力三要素作为理论基础,有据可依地来提高生产力。

话说回来,如果你是那位看到“程序员在椅子上打斗”的经理,你会怎么办?

从生产力三要素的角度看,你要问平均编译时间是多久、为什么这么久,进而从三个要素发问:

• 生产工具:是电脑太慢了?是编译工具本身太慢了?

• 劳动力(程序员的能力):是构建逻辑写得不合理?是编译过程中的某个阶段的问题影响了整体编译速度?

• 劳动对象:是不是缺少对当前构建工具(技术知识)的了解?