乐者为王

Do one thing, and do it well.

神秘的10x程序员

英文原文:http://antirez.com/news/112

在编程神话中,10x程序员就是,一位程序员可以完成另一位普通程序员的10倍工作量,我们可以想象普通程序员擅长完成他们的工作,但没有10x程序员的神奇能力。实际上,为了更好地刻画“普通程序员”,更合理的说法是,在本学科的专业人员中,具有平均编程输出的程序员。

编程社区对这种怪物的存在与否处于两极分化:有人说不存在10x程序员这样的东西,有人说他实际上不仅存在,而且如果你知道去哪里寻找,甚至有100x程序员。

如果将编程视为一门“线性”学科,很明显10x程序员看起来像是非理性的可能。一个跑步者怎么可能比另一个跑步者快10倍?或者一位建筑工人在同一时间内的建造速度是另一位工人的10倍?然而,编程是一门非常特殊的设计学科。即使程序员不参与程序的实际架构设计,实施的行为仍然需要实现策略的子设计。

因此,如果程序的设计和实现不是线性能力,在我看来,就像经验、编码能力、知识、无用部分的识别不仅仅是线性优势,它们在创建程序的行为中以一种倍增的方式工作。当程序员既可以处理程序的设计又可以处理程序的实现时,这种现象当然也会发生的更多。“目标导向”的任务越多,潜在的10x程序员就越能利用他/她的能力,以便用更少的努力达成目标。当手头的任务更死板,具体指导使用什么工具以及如何实现这些任务时,10x程序员在较短时间内执行大量工作的能力就会被削弱:他仍然可以利用“局部的”设计可能性做些更好的工作,但是不再能够以更深刻的方式改变实现目标的途径,这可能包括甚至可能完全从项目中删除部分规范,以便达成几乎是同样的目标,但达成这一目标的努力因为某个大的因素而被减少。

作为程序员的20年里,我观察过与我一起工作的其他程序员,作为同事,由我指导以达成给定的目标,向Redis和其它项目提供补丁。同时,很多人告诉我,他们相信我是一个非常快的程序员。考虑到我远不是工作狂,我也将自己作为快速编码的参考。

以下是我认为在程序员生产力上最大差异的品质列表。

纯粹的编程能力:完成子任务

程序员最显著的限制或优势之一是处理实际实现程序部分的子任务:一个函数、一个算法或者其它任务。令人惊讶的是,根据我的经验,非常有效地使用基本的命令式编程结构来实现某些功能的能力并不像人们想象的那么普遍。在一个团队中,有时我观察到非常无能的程序员,甚至不知道一个简单的排序算法,和那些在理论上非常有能力,但实现解决方案的实践非常差的刚毕业的程序员相比,他们不能完成更多的工作。

经验:模式匹配

根据经验,我的意思是一系列已经探索过的用于某些重复任务的解决方案。有经验的程序员最终知道如何处理各种子任务。这样既避免了很多的设计工作,而且反过来也是针对简洁性的最大敌人之一——设计错误的非常强大的武器。

专注:实际时间 vs 假设时间

如果不考虑时间质量的话,编写代码的时间是无关紧要的。内部和外部因素都可能导致缺乏专注。内部因素是拖延,对手边的项目缺乏兴趣(你不能做好你不喜欢的事情),缺乏锻炼/健康,睡眠质量差或者睡觉不足。外部因素是频繁的会议,没有独立办公室的工作环境,同事经常打扰等等。自然,尝试改善专注和减少中断对编程生产力将产生非边际影响。有时为了获得专注,需要采取极端措施。例如,我只会不时地阅读电子邮件,并且不回复它们中的大多数。

设计的牺牲:删减5%而获得90%

当不愿意承认项目的非基本目标造成很大的设计复杂性,或者正在使另一个更重要的目标难以达成时,往往会产生复杂性,因为在基本功能和非基本功能之间存在着设计矛盾。设计师认识到设计中不容易实现的所有部分是非常重要的,因为努力和优势之间没有比例。为了最大限度地实现产出而执行的项目将精确地集中在可以在合理的时间内实现的方面。例如,当设计消息代理Disque时,某些时候我意识到,通过为消息提供力所能及的排序,项目的所有其它方面可以大大改善:可用性、查询语言和客户端交互、简洁性以及性能。

简洁性

这是显而易见的观点,意味着全有或全无。为了明白什么是简洁性,检查复杂性是如何产生的是值得的。我认为复杂性的两个主要驱动因素是,不愿意进行设计的牺牲,也不愿意在设计活动中累积错误。

如果你在设计过程中思考,每次追求错误的路径,我们将越来越远离最佳解决方案。在错误的手中产生的初始设计错误,不会产生同一系统的重新设计,而是会导致另一个复杂解决方案的设计,以便应对初始错误。因此,这个项目在每个错误的步骤变得更多复杂和更少效率。

实现简洁性的方式是从小块“概念证明”的方面思考,从看起来最可行和直接的解决方案开始工作,以便在程序员脑中探索大量简单的设计。随后,经验和个人设计能力将有助于改进设计,并为需要解决的子设计找到合理的解决方案。

不管怎样,每次需要复杂的解决方案时,只有在没有更好的可能性,甚至考虑过完全不同的替代方案后,才能继续这一方向,重要的是要长时间地思考如何避免复杂性。

完美主义:如何扼杀你的生产力和影响你的设计

完美主义有两种变体:在程序中达到最佳可衡量性能的工程文化,以及一种人格特质。这两种情况我认为是程序员快速交付的最大障碍之一。完美主义和对外部判断的恐惧带入的设计偏见会导致选择不佳,即仅仅根据心理或简单可衡量的参数就改进设计,其中诸如鲁棒性、简洁性、及时交付的能力常常不被考虑。

知识:某些理论会有帮助

在处理复杂任务时,关于数据结构的知识,计算的基本限制,非常适合于某些任务模式的非凡算法将对找到合适设计的能力产生影响。成为每件事的超级专家不是必需的,但是肯定至少要知道一个问题的众多潜在解决方案。例如,运用设计的牺牲(接受某些错误百分比)并且意识到概率集基数估计器可以组合在一起,以避免复杂、缓慢和记忆效率低的用于计算流中唯一条目的解决方案。

底层:了解机器

即使是使用高级语言的时候,程序中的很多问题也是由于对计算机如何执行给定任务的误解而产生的。这甚至可能导致需要从头开始重新设计和重新实现项目,因为被使用的工具或算法存在根本问题。良好的C语言能力,了解CPU如何工作,以及关于内核如何运转和系统调用如何实现的清晰思路,可以避免糟糕的后期意外。

调试技巧

寻找缺陷很容易花费大量的工作时间。善于获取缺陷的状态,以便用一组合理的步骤修复缺陷,以及编写不可能包含太多缺陷的简单代码的态度,这三者对程序员的效率有很大的影响。

看到程序员的上述品质如何能够对输出产生10倍的影响,我并不奇怪。结合起来,他们允许的从可行模式开始的良好设计实现,可以比替代方案简单几倍。有一种方式被用来强调简洁性,我喜欢称之为“机会主义编程”。基本上在每个开发步骤中,要选择一系列要实现的功能,以便用最少的努力,最大程度地影响程序的用户基础。

Comments