返回 登录
3

Redis之父谈十倍速程序员之谜

原文The mythical 10x programmer
作者:antirez
翻译:雁惊寒

译者注:所谓“十倍速程序员”,顾名思义,就是他们的工作效率是普通工程师的10倍。本文作者antirez,Redis之父,介绍了十倍速程序员的特质,以及如何成为一名十倍速程序员。以下是译文。

传说,在编程界,一位十倍速程序员可以完成其他正常程序员十倍的工作量。对于正常的程序员,我们可以把他想像成是一个能轻松完成本职工作,却没有像十倍速程序员那样神奇能力的人。实际上,描述得更准确一点,“正常的程序员”是在专业程序员中编程输出处于平均水平的人。

编程社区对于这种怪兽级人物是否存在的观点有着极大的分歧:有人说不存在十倍速程序员这样的人,也有人说它实际上并不存在,但是如果你知道在哪里能找到,那么甚至还能遇到一百倍程序员。

如果你将编程看成是一门“线性”学科,那么很明显,十倍速程序员的存在看起来就有点荒谬了。一个赛跑者的速度可能是其他人的十倍吗?或者一个建筑工人建造的东西可能是其他建筑工人在相同时间内建造的十倍吗?然而,编程是一门非常特殊的设计学科。即使程序员不参与程序的架构设计,但是在实现过程中仍然需要进行一些子设计。

因此,程序的设计和实现并不是一种线性能力,编程所需的经验、编码能力、知识、识别无用东西的能力开发程序的过程中能够以乘法的方式结合在一起。当然,如果程序员能够同时处理程序的设计和实现的话,则产生的优势将更大。“以目标为导向”的任务越多,则十倍速程序员可以利用来达成目标的能力也越多。如果任务的要求太死,例如指定要使用什么样工具以及如何实现功能,那么十倍速程序员在较短时间内完成大量工作的能力就会被削弱:他虽然可以利用“部分”设计能力来做好工作,但不能从根本上改变实现目标的方法,例如,即使从项目中删去某些规定,同样也能达到相同的目标,只是不需要付出那么多的精力了。

在二十年的程序员生涯中,我观察了与我一起工作的其他程序员,作为同事,他们在我的指导下达成既定的目标:为Redis和其他项目提供补丁。同时,很多人认为我是一个编程非常快的程序员。考虑到我并不是一个工作狂,我也会拿自己作为编码迅速的人的参照。

以下是我认为最能影响程序员生产力的特质列表。

纯编程能力:不写一行多余代码

程序员最明显的限制或优势之一就是处理程序实现部分的某个子任务的能力:一个函数、一个算法或者其他什么东西。令人惊讶的是,根据我的经验,使用基本命令式编程结构的能力并不像人们想象的那样广泛。在一个团队中,有时我能发现一些非常不称职的程序员,他们甚至都弄不懂一个简单的排序算法,但能比那些刚毕业的理论上很强但实际动手能力很弱的程序员完成更多的工作。

经验:踩在前人的肩膀上

这里指的是一套已经探索过的可用于一些重复任务的解决方案。有经验的程序员知道如何处理各种子任务。这既避免了大量的设计工作,也减少了做出错误设计的可能。反过来,这又是简单化的最大敌人之一。

注意力:实际时间 vs. 假想时间

在不考虑时间重要性的情况下,编写代码所花的时间是无关紧要的。导致注意力不集中的原因有内部的,也有外部的。内部的原因有拖延、对手头的项目缺乏兴趣(对于你不喜欢的事情,你不可能做得好)、缺乏练习、缺乏幸福感、贫穷或缺乏睡眠。而外部的原因有频繁的会议、没有独立办公室的工作环境、同事的经常性的打断等等。尝试提高注意力并减少中断将对编程生产力产生非边际效应。为了集中注意力,有时需要采取一些极端措施。例如,我只是偶尔查看一下电子邮件,并且大部分的邮件都不回复。

设计牺牲:放弃5%以获得90%

通常,复杂性产生的时候,我们并不愿意去承认。一个项目的某个并不重要的目标可能会引入非常大的设计复杂性,或者使得另外一个更加重要的目标难以实现,因为在这两个重要和非重要的功能之间存在着矛盾。对于一个设计师来讲,要识别一个设计中所有不重要的部分是非常重要的,也就是说,努力与优势之间并不是线性关系。为了让项目得到最大化的输出,需要把注意力集中到那些重要的、并且可以在合理的时间内实现的目标上。例如,在设计消息代理Disque的时候,在某个时候,我意识到如果对消息进行排序,项目的其他方面也会得到改进,例如可用性、查询语言和客户端交互、简单化和性能。

简单化

要了解什么是简单化,就要检查一下复杂性通常是如何产生的。我认为复杂性产生的两个主要驱动因素是不愿意牺牲设计,以及设计活动中积累了不少错误。

在设计过程中,如果每次都走错路,我们就会离最优方案越来越远。如果一开始的设计就出错,而后期一般也不会进行重新设计,这样就会导致出现另一个复杂的方案,以应对一开始的设计错误。因此,这个项目会因为每个错误的步骤而变得更加复杂和低效。

实现简单化的方式是从小处开始“概念验证”,这样,程序员的脑中就会涌现出很多的简单设计方案,并从最可行和最直观的方案着手开发。接着,个人经验和设计能力也将有助于改进设计,找到子设计的更合理的方案。

然而,每次出现一个复杂的解决方案时,都需要花很长时间来解释如何避免复杂性,并且在实在没有一个更好的替代方案时才能继续实现这个复杂的方案。

完美主义,会扼杀你的工作效率,并让你的设计产生偏差

完美主义有两种形式:在程序中要达到最佳可衡量的性能的工程师文化,以及个人的性格特征。我认为这是程序员快速交付项目的最大障碍之一。完美主义和对外部事务的恐惧会带来设计上的偏见,仅根据心理或简单的可衡量的参数来改进设计,而诸如鲁棒性、简单性、及时交付的能力往往没有被考虑进来,从而导致在作选择的时候出现错误。

知识:某些理论会对你有所帮助

在处理复杂任务时,如果你懂得数据结构、计算的基本限制,以及一些特殊的算法,那么这会帮助你做出更合适的设计。无需成为一个全能专家,但至少要知道某个问题可能存在的解决方案。例如,要对数据流中的唯一项进行计数,可以将设计牺牲和概率集基数估计组合在一起,以避免出现复杂的和内存效率低的解决方案。

底层:了解机器

即使是使用高级语言,也会因为对计算机运行的原理不了解而使程序出现问题。由于使用的工具或算法存在根本上的问题,甚至可能导致需要从头设计和重新实现。对C语言熟悉、了解CPU的工作原理、了解内核如何运行、知道系统调用如何实现,可以在后期免除很多痛苦。

调试的技巧

解决一个bug可能要耗费大量的精力。准确定位到一个bug,或者说通过一系列的步骤来修复一个bug,并且编写简单的不太容易产生bug的代码,可能会对程序员的工作效率产生很大的影响。

对于拥有上述特质的程序员,如果他的工作效率是其他的人十倍,那我并不会觉得奇怪。再加上优秀的设计和实现可能比其他的方案简单好几倍。还有一个方法可以用来影响简单性,我喜欢称之为“机会主义编程”,那就是在每个开发步骤中,选择最重要的能对用户产生最大影响,但是工作量又是最小的的功能集。

评论