原文链接:http://antirez.com/news/112
infoQ翻译:http://www.infoq.com/cn/news/2017/04/Redis-father-10x?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage
传说中的10x程序员是指那些工作效率超过普通程序员10倍的人。我们所说的普通程序员可以胜任一个他的本职工作,但是却没有10x程序员的神奇能力。更准确一些,我们所说的“普通程序员”是指那些可以达到业内平均水平的编程人员。
编程社区中对于这样的“怪物”是否存在,有着很大的争议:部分人认为10x程序员根本就不存在,而其他的人认为不仅仅他是存在的,甚至还能找到100x程序员。
如果你认为编程是一种“线性”的工作,那毫无疑问10x程序员是不可能存在的,就像不可能有人能比其他人跑得快10倍一样,也不可能有建筑工人在同一时间内比别人多干10倍的活。然而编程是一种特殊的设计工作。即使一个程序员从来没有刻意训练过编程方面的架构设计,在实现功能的过程中也需要一些简单的设计。
在我看来,设计和实现程序都不是“线性”能力,它是由经验,编码能力,知识,对无用部分的甄别能力等这一系列非线性优势组合而成的,尤其是当一个程序员同时负责设计和实现时,这个现象就更加明显。任务越是目标明确,10x程序员就月能释放他的潜力来尽快达成目标。如果手上的工作非常死板,比如规定了必须要用什么工具来用什么方式完成任务,那么10x程序员的高效能力则会被削弱。他们始终可以在“局部地区”通过设计完成更好的工作,然而却不能用更直接的方法来完成目标(甚至是抛弃现有工程的某些部分)。看上去最终达成的目标是相同的,但是效率却大打折扣。
在二十年的职业生涯中,我关注着其他和我一起协作的程序员。他们在我制定的目标下一起完成一些任务,例如给Redis打补丁等等。同时许多人告诉我,他们认为我是一名十分高效的程序员。虽然我并不是一名工作狂,但我也经常会那自己来作为快速编码的例子来介绍给别人听。
下面列举的品质是我认为的高产程序员的独特品质。
分解编程任务的能力:完成各个子任务
将程序的分解为各种子任务(函数,算法或者其他),是程序员最显著的能力之一。然而令人震惊的是,并没有那么多人使用最基本的变成结构来有效地实现一些功能。我观察到一些连最简单的排序算法都不会的“低能”程序员,却比那些受过良好理论教育(但缺乏实践)的程序员完成更多的工作。
经验:模式匹配
这里我说的经验是指对于那些经常出现的任务的一系列解决方案。一名有经验的程序员事实上知道如何去将问题分解。这样就避免了很多的设计工作并且可以避免出现简化问题时出现的最大问题——设计错误。
专注:实际时间VS假想时间
抛开时间的利用质量,只关注写代码所话费的时间,都是耍流氓。注意力无法集中可能由外因和内因两方面导致。内因包括拖延症,或者对手头的项目不感兴趣(你无法好好的做自己不喜欢的事情),缺乏锻炼或者身体状况不佳,以及缺乏睡眠。外因则是频繁的会议,工作环境不佳,协作者的频繁打断。所以人们会很自然地想要提高注意力的集中程度,以及去减少打断的次数来创造一个没有边界效应的编程环境。有时候为了可以更好地集中注意力,一些极端的方法也是必要的。比如我只在固定的时间点去阅读邮件并且不会进行回复。
设计方面的牺牲:舍弃5%来赢得90%
项目的非基本功能会大大增加设计的复杂度,或者导致另外一个重要的目标难以达成,这是因为由于不重要的目标和基本功能之间总是存在着牵连,所以这么做会使任务变得非常复杂。所以设计者必须要意识到,项目中哪些部分是投入和产出不成正比的。如果一个工程是为了将输出最大化,那我们只需要将精力集中在与之相关的方面,这样就可以在合理的时间内完成它。举个例子,当我们设计消息队列 Disque时,我意识到最值得付出的功能是将消息组织排序,从而其他的各个方面就会有实质上的进步,包括可用性,请求语言和客户端交互,简洁性和性能。
简洁性
这显然是成败的分界点。为了理解简洁性是什么,我们有必要去找到复杂性产生的原因。我认为两个导致复杂性的主要原因是不愿意牺牲部分设计,以及设计上的错误积累。
试想一下,在设计的过程中每一次我们都误入歧途,最终会使我们离最优解越来越远。最初的设计错误并不会让这整个系统被重新设计,而是会导致下一次使用另一个复杂的解决方案来掩盖它。从而整个工程会变得越来越复杂,并且在每一次错误的设计之后变得更加低效。
在脑海中进行许多细碎的“概念验证”后,大量的简介设计会在程序员的心里浮现,从而开始构建灵活而又有效的解决方案并最终达到简洁性。之后,经验和个人设计能力将会进一步提升设计和找到合理的子任务解决方案。
然而每当需要用到复杂的解决方案时,就需要花大量的时间来构思如何避免它,直到实在没有其他可以代替的方案之后才能继续前行。
完美主义, 为了偏袒设计而削弱生产力
完美主义有两种:追求工程师文化中理论上的最强性能,或者追求个人特色。我认为这两种都将阻碍程序员的生产力。完美主义和害怕外部的评价导致了设计上的偏袒,从而导致最终只是根据个人意愿和性能指标来作出设计方案,健壮性、简洁性和按时交付都不会被考虑在内。
学识:某些理论知识是很有用的
如果了解数据结构,知道计算的极限性能,以及对于某些模型非差给你适用的算法,那么在面对复杂问题时就能给出非常合适的设计。你并不需要在各个方面都十分精通,但是知道问题的多种解决方案确实很有必要的。例如我们在设计上做出部分妥协(接受一定比例的错误)和并且预估了总体的基数,那么两者结合就可以避免在一个数据流中进行统计特定目标这个问题上,给出一个复杂低速和内存使用率低的方案。
了解底层原理
即使在使用高级语言的时候,我们仍然会因为不理解计算机的运行原理而导致编写出来的程序有些问题。这会导致我们必须推翻之前的设计,因为在某些工具或者算法上存在根本性的错误。深入理解C语言,并清楚的知道CPU和内核的工作原理,可以避免在工程后期发现一些根本上的问题。
调试技巧
寻找bug总是会花掉很多时间。所以如果你善于发现bug出现的原因,知道如何将它修复,并且更倾向与写那些简短的无误代码,将会大大提高你的编程效率。
对我而言,拥有上述品质的人能到达10倍的产出一点也不奇怪。这些品质让程序员可以给出一个拥有灵活的模型的好设计,并且比其他的方案更加的简洁。我认为简洁性就是一种“投机取巧的编程”。简而言之,就是在开发的每个阶段选择性地实现一些功能,以最小化的付出为用户带来最大化的影响。