我最近发表了一篇很受欢迎的文章,叫做“如何留住最好的开发人员”。我在文章中提到了最能干的开发人员在工作中想要什么,以及为什么他们无法满足的时候,他们就会选择离开。今天,我想写一篇文章,重点关注软件开发团队,而不是单个开发人员在组织内部或组织之间的个人旅程。
在我的前一篇文章中,我提到了布鲁斯·韦伯斯特的“死海效应”这篇文章,它描述了一种趋势,即最有才华的开发人员往往是最有可能获得其他机会的人,因此当他们稍不如意时,就最有可能选择离开。另一方面,最没有才华的开发人员更可能留下来,因为他们很难说服其他公司雇用他们。这提供了一个视角让我们能够理解为什么在公司里常常有些人拥有唬人的头衔,拿着高昂的薪水,甚至有些大权在握,但他们并不胜任他们的工作。但这个视角还是把注意力关注在个体层面,这不是“死海效应”的关键,只有当一个团队不断制造出这样的“渣子”成员(或者更糟,所有有才华的成员都被赶走,最后只留下这些“渣子”成员),这才是“死海效应”的真正含义。
我相信任何一个软件团队的腐坏并导致有才华的人员流失都有一些独特的群体动力,不能完全归结为糟糕的外部决策。毫无疑问,布鲁斯·韦伯斯特的“死海效应”既是这种群体动力的催化剂,也是这种群体动力的必然结果。我相信,外部的愚蠢决策要想搞坏一个软件团队让“渣子”成员充斥,必须要有团队内部的“巫术”相配合。这篇文章中,我将描述团队中的个体如何通过选择终身平庸为自己获得回报铺平道路。
学打保龄球
在开始之前,我想请你一起回顾我打保龄球的历史。是的,我是认真的。
我是一个相当有运动天赋的人。从小到大,无论玩什么运动或者参加什么比赛,我总是至少能比2/3以上的人出色。但是我总是博而不精,没有哪一项能拔尖。这给了我一种错觉,就是我能不费吹灰之力地掌握任何一项技能,当我开始练习保龄球时就有这种错觉。
大多数打保龄球的人都会把拇指和两个手指放进球里,并小心地训练投掷方式让球先从边上开始滚动再转向中间。我没有耐心去练习这个动作,我发现我可以不把手指和拇指放进球里,但是我假装这样做,然后稍微扭动我的肘部,把球投掷到球道上。这种投掷方式虽不漂亮,但很管用。
事实上,我打保龄球的次数越多,效果就越好。当我为了玩得更开心,参加了一个业余联盟后,我的平均得分开始上升。我并不是这个联盟中最好的球员,有几个保龄球手,包括我的前经理,他们的平均得分在170到200之间,而我在联盟中玩了几个月后,我的平均得分从130到140之间迅速提高到160分左右——这个分数不算太寒酸。
但自那之后就奇怪了,我的得分不再提高了,最高分就停在了160分左右。我问我的老经理我需要做些什么才能继续提高,他对我说了一些非常有趣的话。大意如下:
如果你一直这样打保龄球,你就没有可能提高了,你已经达到了你的极限。如果你想做得更好,你就得学会正确地打保龄球。你需要一个不同的球,一种不同的投掷方式,你需要像个大男孩一样把手指放进去。最糟糕的是,在你获得改进之前,你的得分会比现在更差,而你想恢复并超过目前的平均水平,需要不少的时间。
我抵触了一段时间,不想改变,但我又对自己止步不前感到厌烦(这是我个人的一个特点:我必须要成为最顶尖的,否则我会发疯),所以我还是开始了艰难练习。我买了一个保龄球,把它按照我的手指定制钻了孔,并开始按照正确的方式练习投掷。具有讽刺意味的是,我在做了那件事之后,几乎马上就离开了那份工作,而且在那之后的几年里,我大概只打了8次保龄球,生活就是这样。但是我想,下次我去的时候,我就不再需要租保龄球鞋,也不需要在球馆里挑选适合我手指的球了。
德莱弗斯模型:快速回报,发展受阻
20世纪80年代,一对姓德莱弗斯的兄弟提出了一个技能获取模型,对学习、过程和实践的讨论产生了相当大的影响。后来,他们出版了一本基于这个模型的书,在那本书中,他们将把模型改进成现在维基百科中看到的形式。
该模型列出了技能获取的五个阶段:新手、高级新手、胜任者、精通者和专家。显然,这本书有很多内容,因为它需要一整本书来描述,但其要点是技能获取者从“生搬硬套和缺乏大局”向“直观超越规则和全面理解大局”的方向转变。
通常情况下,人们会假设在各个阶段所取得的进步都是自然的和线性的,就像空手道腰带的获取或者企业界金钱的赚取。但在实际情况下,它会因为人的悟性和态度而不同。当一个人开始学习一项技能的时候,他是完全不胜任的,这会导致最初的一段挫折期,这时候他会陷入困境,只能等待有人(比如指导老师)来向他填鸭式地灌输需要的知识(或者,像德莱弗斯们所说,他们“像个婴儿,通过模仿和挣扎捡起东西”)。然而,在一个相对较短的完全的启动阶段之后,这个人就到达了这样的阶段,通过一些练习就能掌握技能。并且如果选择“低挂果实”的话,一个充满活力的学习者就能获得相当快地提高。然而,一旦所有“低挂果实”被摘下,这种不可持续的快速进步的速度会有所下降。从那以后,进一步的熟练就变得相对困难了。
我画了一个图表来描述这个过程(实际上花了我很长时间,因为我乱七八糟地画了带一个自变量的logistic 1/(1 + e^-x)回归函数,而不是像普通人一样在Paint中画一条线)。
事实上,我的保龄球技能的获取正是遵循这样的路线,从完全不会,到具备某种程度的技能,再到迅速地提高到胜任的程度,然后就停滞不前了。在我的例子中,技能的提高达到了局部的最高点,然后就不再提高了,因为太忙,所以我无法继续按既定路线提高,也无法将我的调整进行到底。在这篇文章中,我把这种情况称之为“发展受阻”。这个词是一个心理学术语,但是为了本文的目的,请忘记这个心理学的定义。
从技能获取的观点来看,一个人到达“发展受阻”阶段,技能水平就不再提高,是因为以下两个原因之一:一是天资受限,二是没有意愿去作有意义的改进。
在本篇文章中,我们不讨论第一种原因(因为大多数专业的程序员都不会天资低下到不能获取最基本的技能的程度),我们讨论第二个原因的一个有趣的具体实例:即自愿停止改进,因为相信自己的技能已经达到了专家水平,所以进一步改进不太可能了 。这种不确定的平庸状态是进入技能获取的快速阶段的入口,我将它称之为“专家新手”。
当你考虑德莱弗斯模型时,你会注意到随着时间的推移,技能获取者有一种从“严格的规则导向和对大局不甚了解“到“非常直观和完全把握大局”转化的趋势。高级新手阶段是技能获取者对大局不甚了解的最后一个阶段,因此,这是技能获取者可能把自己误以为是专家的最后一个阶段。一个称职的人把握大局的能力很强,所以不会把自己与专家混淆:他知道自己缺失什么技能。而这是高级新手不具备的,因为高级新手正处于邓宁-克鲁格效应的“非熟练”阶段,并且倾向于认为“如果我不理解一件事,那它一定很容易。”
因此,高级新手可以用下面两种方式之一获得进步:第一种是了解自己的位置,学会把握大局,并向称职者转化;第二种是通过假设他们已经毕业成为专家而“毕业”成为专家新手。这并不像听起来那么荒谬。
让我们回到我以前的保龄球生涯,想象一下如果我是球场上唯一的或最好的保龄球手,会发生什么。我应该会一开始打得很不好,然后很快就摘下技能获取的“低挂果实”,迅速提高我的保龄球技术。根据邓宁·克鲁格效应,我可以合理地认为:我对打保龄球很有天赋,因为我的技术水平提高得很快。我也可以得出一些理性的(而不是傲慢的)结论,我的保龄球技术不能再提高了,因为我已经达到了技术顶峰。毕竟周围已经没有比我技术更好的人,而且一定有人掌握了某种程度的技术,所以我想我应该就到了专家新手这个阶段。
真正让人尴尬的是,一些不完全理性的推理使我产生了一种错误的成就感,导致我放弃进一步的改进。随着我保龄球生涯的继续,我从乐观的自我评估变成了逻辑上的谬论:“我知道我的打法很对。因为我是专家,所以我做的每件事都正确。”(对于逻辑谬论爱好者来说,这是循环论证,即用未经证明的假定来论证)。查看上面的图形会注意到它描述了德雷福斯模型的状态机,正如你所期望的那样。在每一个阶段,你要么前进到下一个阶段,要么停留在当前阶段(除了新手或高级新手,我觉得他们不能真正停留在那个阶段而继续从事某个工作)。不同的是,我已经将专家新手添加到了图表中。
专家新手知道他们想继续进步的话,需要付出很多努力,而且没有现成的路径可走。你会注意到,专家新手介于高级新手和胜任者之间。这是因为他没有足够的能力去把握大局,认识到自己处境的尴尬,但他比高级新手略胜一筹,主要是因为他作为一个新手进行了大量的练习。如果你听过“十年的经验不等于一年的经验用十年”这句格言,那么“专家新手”就是后者的缩影。专家新手通过一周又一周地重复练习来完善保龄球技术,而不会偏离常规打法或尝试新的打法,以确保获得总分300分中的160分。依据他们所获得的得分,他们相信160分是他们的最好分数。
软件开发中的专家新手
毫无疑问,软件开发不像打保龄球。保龄球运动的反馈周期是以分钟为单位的,而软件开发的反馈周期则往往是以月或年为单位的。这里所指的软件开发不是指编译、运行或单元测试这些环节,它们的反馈周期是以分钟或秒来计的。这里我所说的软件开发是指整个项目周期。在项目的整个生命周期中,开发人员经历了编写代码、源代码控制、修改代码、测试代码以及在维护阶段遵循以前的架构和设计这些过程,并从中获取了相应的经验。
开发人员如果运气好的话,可以在6个月的时间内将我上面所说的过程都尝试一遍。这就意味着,当他在从事软件开发工作5年后,他可能经历10次这样的过程。(这是平均值——有些人会一直停留在某一个单一的过程上,而另一些人可能会经历几十次这样的过程。)
这意味着软件开发人员的快速获取技能阶段(高级新手阶段)将持续数年而不是数周。在这数年里,软件开发人员会跳槽并获得晋升,尤其是在现在这样的市场环境里。当他们轻而易举地获取技能后,他们也就轻而易举地获得诸如“一级软件工程师”和“二级软件工程师”这样的头衔,然后可能升级到“助理工程师”和“高级工程师”,最后可能是“主管工程师”,“架构师”和“首席工程师”。因此,处在邓宁·克鲁格效应困境中的高级新手们,会被授予专家头衔,并被招聘人员恭维为“摇滚明星”或“忍者”等等。这种情形在当今的经济形势下尤其严重。唯一让高级新手们认识到他们没有进入专家新手阶段的是同行评审和与整个开发社区的交流。
但是,当高级新手不太关心与更广泛的社区进行互动,并且无论出于何种原因与同行没有太多互动时,会发生什么?The Daily WTF网站上这样的例子随处可见。他们会失败,但是他们相信他们的失败是其他人的错。因为游戏的本质是这样的:责备他人很容易,也很容易缓解任何认知失调。他们认为他们很快就成为专家并且没有提升的空间了。他们已经正式成为专业新手,而且已经准备好在公司里巩固自己的地位并享受高昂的薪水。他们周围的所有人,包括他们自己,都没有意识到他们可以做得更好。
译者注:邓宁-克鲁格效应(Dunning-Kruger effect)。它是一种认知偏差现象,指的是能力欠缺的人在自己欠考虑的决定的基础上得出错误结论,但是无法正确认识到自身的不足,辨别错误行为。这些能力欠缺者们沉浸在自我营造的虚幻的优势之中,常常高估自己的能力水平,却无法客观评价他人的能力。