推荐文章 | Article
Redis之父:10x程序员应该具备哪些素质
Fred Brooks(《人月神话》的作者)最早在他的论文“没有银弹——软件工程的本质和偶然性(No Silver Bullet - Essence and Accidents of Software Engineering)”中提出了“10x程序员”的概念。技术社区对于这个概念呈现出两级分化的观点。Redis之父Salvatore Sanfilippo(antirez)列出了9种特质,他认为,如果一个程序员同时具备了这9种特质,那么就可以说他是一个10x程序员。以下内容已获得antirez的翻译授权,查看英文原文The mythical 10x programmer。
一个10x程序员,在相同条件下,可以完成十倍于普通程序员的工作。这里所说的“普通程序员”,是指那些能够胜任自己工作的程序员,只是他们不具备10x程序员的神奇能力。普通程序员代表了这个领域所有专业程序员的平均水准。
对于是否存在10x程序员这种“神兽”,编程社区的观点呈现出两级分化:有人认为根本不存在所谓的10x程序员,有人则认为不仅存在10x程序员,如果找对了门路,甚至能找到100x的程序员。
如果说编程是一项“线性”的工作,那么很明显,10x程序员是不可能存在的。一个跑步运动员怎么可能跑得比另一个快上十倍?在相同时间内,一个建筑工人建造的东西怎么可能是其他人的十倍?不过,编程是一项很特别的设计工作。虽然程序员可能不会参与程序的架构设计,但程序的实现仍然涉及到一些设计工作,而这部分需要程序员去完成。
如果说程序的设计和实现不是线性的,那么在我看来,经验、编码能力、知识和去伪存真的能力就不仅仅是线性的优势,它们在编程过程中相互交织,成倍地发挥效能。当然,如果程序员能够同时胜任设计和实现工作,那么这种现象就尤为明显。任务越是具有目标导向性,程序员就越是能够以更少的付出达成相同的目标,从而体现10x程序员的潜在能力。如果手头的工作很死板,而且限定了可使用的工具和实现方式,那么10x程序员事半功倍的能力就会大打折扣。不过,在不改变大前提的情况下,程序员仍然可能通过局部的设计优化来改进工作,包括在项目的某些部分不按常理出牌。所以,他们可以少付出很多却能达成几乎相同的目标。
在我的二十年程序员生涯中,我与其他程序员一起工作,作为同事,或者由我指导他们达成目标,为Redis和其他项目贡献代码补丁。在工作过程中,我仔细观察他们。与此同时,有很多人说我是一个高能的程序员。不过我不认为自己是一个工作狂,我只是编码速度比较快而已。
下面列出了我认为可以用于区分程序员生产力高低的重要特质。
编程裸技能:完成子任务
从处理编程子任务可以看出一个程序员的短板和长处,比如实现一个函数或者一个算法。但从我的经验来看,擅于应用基本的编程技能来高效完成任务的程序员并非如人们所想得那样普遍存在。有时候,团队里有些不是很称职的程序员,他们甚至不知道该怎么写一个简单的排序算法,但比起那些看似称职却缺乏实战经验的程序员,这些不称职的程序员却能完成更多的工作。