今天讨论起“激励”(Motivation)对软件项目作用,我想在此分享一下我对激励的认识。
首先,成功的软件项目团队需要激励。软件开发,尤其是敏捷开发一定需要被激励(Motivated)的团队和员工。软件开发都是一种创造性的脑力活动,而这种创造性的活动需要调动人的主观能动性,充分激荡团队中各个成员的智慧,形成“集体智慧”。单纯看软件编程,这并不是一件很难的事情,但是能够把软件写好,做出优雅的设计,写出整洁的代码就很不简单了,这需要人的积极主动性和创造性。通常意义上的“把事情做完”(Get it done)仅仅只能算达到60分,能够“把事情做好”(Get it done WELL),才是我们应该追求的目标。不幸的是这种“好”没有很好的客观评价(一些可能想到的客观评价标准包括:1.“圈复杂度”Cyclomatic Complexity;耦合度;内聚性、覆盖率等等,但是不够全面),而且很多人根本没有听说过更不会关心这些标准。只有充满激情的,富有积极性的工程师和团队才会把这些作为自己工作的要求,不断提高自己的能力,成为真正的软件工匠(Software Craftmanship)。缺乏激励绝大多数人只能做到“完成”(Get it done),没有意识去重构,导致技术负债不断积聚,系统难于维护和扩展。很快导致架构腐烂掉。
说到“激励”,很多人立即就会联系到“钱”,“奖金”等物质形式的激励。很多公司团队会用给员工涨工资,发奖金的方式来激励团队和员工,提高生产率,完成具有挑战性的工作。但事实证明恰恰相反(第一次发奖金,导致第二次要发更多的奖金,而且激励效果反而不如第一次,导致一个恶性循环Negative Feedback)。Dan Pink在2009年6月的Ted Conference上做了一个关于“令人吃惊的关于激励的科学”的演讲。通过他的实验,对于那种创造性的工作(产品研发,软件开发,科学研究),物质刺激会产生很明显的反作用,导致生产率降低,质量下降。其实科学家早在几十年前就已经发现了这个问题,只不过我们很少意识到这一点。当然物质激励对那种不需要创造性的工作(比如在生产线上计件发工资的工人来说)还是有明显的激励作用。
其实除了物质激励之外,还有其他很多种激励形式。Dan指出激励的三个要素:
- 自主性(Autonomous)。也就是一个人,一个团队能够在一定的范围内承担责任,负责自己的过程,为自己的结果负责。所以敏捷开发的所有分支,无论是Scrum,XP, Crystal,以及Lean提倡的都是一个自主的团队。掌控自己的过程,不断根据现在的团队状况做出调整。
- 精通某一件事情(Mastery)。也就是一个人能够通过自己的不断学习,掌握新的技能,从而不断提高自己的能力,把一件事情做得更好的愿望。
- 目的(Purpose)。要有一个比较宏观的目标。对一个建筑工人来说,他看到的不仅仅是自己每天都在垒砖,也不仅仅是在筑墙,他应该看到自己的目标是“建造一座教堂”。能够成为“建造宏伟教堂”的一个团队的一份子其实就是一种激励。
关于“激励”不能不提的是Harvard Business Review1987年11月的一篇经典文章“One More Time: How Do You Motivate Your Employee”。在这篇文章中Frederick Herzberg指出激励员工要关注两个方面
- Hygiene,也就是能够导致员工对不满意的因素,其中包括公司政策、监控、同事关系、工作条件、工资等等。这些往往不能直接给员工带来激励,但是如果做得不好,会对激励员工有很大的副作用
- Motivator,也就是能够真正激发员工创造力的因素,其中包括成就感、被认可、工作自身、责任、成长性等等。这些才是我们激励员工时应该关注的,而这些基本与物质激励无关。