Redis 之父:10x 程序员应该具备哪些素质?

本贴最后更新于 2977 天前,其中的信息可能已经时移世易

转自:36kr

编程并非一门“线性”学科,各种素质的结合能产生倍增效应。

编者按:在开发界有一个长期引起争议的说法,那就是所谓的 10x 程序员是否存在?这个说法是 Brooks, F. P 在《没有银弹》中首次提出的,他认为在普通设计师(程序员)和优秀设计师(程序员)之间,有着 10 倍多的差异。对于 10x 程序员是否存在这个问题,开源键值存储数据库系统 Redis 的开发者 antirez(Salvatore Sanfilippo)认为,如果把编程工作看作是一门“非线性”学科的话,那么不仅存在 10x 程序员,甚至连 100x 程序员这种异兽都有,同时他还列出了自己认为的 10x 程序员必备的一些素质,可供各位开发者对照一下。

10x 程序员,是指在编程方法论中,所做的工作 10 倍于普通程序员的程序员。而所谓的普通程序员是指擅长所做工作,但却没有 10x 程序员魔力的程序员。实际上“普通程序员”这么归纳也许更好:普通程序员是指在专业的程序员当中有着平均编程产出的人。

对于这样一种异兽是否存在,编程社区有着两级分化的观点:有人说所谓的 10x 程序员并不存在,而有人则说 10x 程序员不仅存在,而且甚至 100x 程序员都有,如果你知道去哪里找的话。

如果你把编程看作是“线性”的学科,那么显然 10x 程序员存在的可能性是不合逻辑的。一名跑步运动员怎么可能比另一名快 10 倍?或者一名建筑工人在相同时间内建造的东西怎么可能比另一名多 10 倍?然而,编程是一门设计学科,属于一种特殊的设计。即便程序员并未参与到程序实际的架构设计当中,但实现本身仍然需要对实现策略的子设计。

那么,在我看来,如果程序的设计和实现不是一种线性能力的话,像经验、编码能力、知识、对无用部分的识别等这些就不仅仅是线性优势,而且凑到一起会对程序的编制产生倍增效应。当然,如果程序员能够同时处理程序的设计和实现时,这种现象会出现得多很多。任务越是“目标导向”,10x 程序员以事半功倍的方式发挥能力的潜能就越大。如果手头的任务比较僵化,对于应该使用什么工具以及应该如何实现东西等方面有着具体指南的话,10x 程序员以更少时间完成更多事情的能力就会变弱:虽然仍然可以通过挖掘“本地”设计的可能性来把工作做得更好,但却不能以更加深远的方式(这种方式包括甚至连项目的部分规范都彻底去掉,从而仍然能够以几乎相同的效果实现目标,同时实现所需的付出却要少了一大截)去改变目标的实现路径了。

在 20 年程序员的生涯当中,我观察了跟我一起工作的程序员同事,他们在我的指导下实现给定目标,为 Redis 等项目打补丁等。与此同时,许多人告诉我说他们认为我是一个非常快的程序员。考虑到我远不是个工作狂,我也把我自己作为是编码非常快(效率高)的人的参考。

以下所列我认为是最能拉开程序员生产力差异的一些素质。

*** 裸编程能力:完成子任务**

程序员最大的限制或者说优势之一,就是处理程序实际实现部分的子任务,也就是实现函数或者算法之类的能力。令人吃惊的是,就我的经验来看,非常有效地利用必要的基本编程结构去实现东西并不是一种普遍具备的能力。在一个团队中我有时候观察到有的程序员看似非常的不胜任,因为他们甚至连一个简单的排序算法都没有意识到,但是所完成的工作却要比那些理论上极其胜任、但在实现解决方案的实践方面却非常糟糕的已经毕业的程序员还要多。

*** 经验:模式匹配**

所谓经验是指一组已经过探索的、针对若干周期性任务的解决方案。有经验的程序员最终会知道如何处理各种子任务。这既避免了大量的设计工作,但尤其重要的是它还是一项针对设计错误的强大武器,而后者是简洁性的最大敌人之一。

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

如果不看时间质量的话编写代码花费的小时数无关紧要。缺乏专注往往有来自于内外部因素的影响。内部因素是拖延症,对手头项目缺乏兴趣(不热爱的事情是做不好的),缺乏练习/快乐,睡眠不足或很少等。外部因素包括频繁开会,工作环境没有真正的办公室,同事经常打断自己等等。试图改善专注和减少中断会对编程生产力产生非边际效应,这是很自然的。有时候为了获得专注,需要极端的手段。比方说我只会时不时读读邮件,但是大部分都不会去回复。

*** 设计牺牲:干掉 5% 得到 90%**

当不愿意认识到项目的一个非根本性的目标要对设计的很大一部分复杂性负责时,或者由于某基本功能与次要功能之间存在设计冲突而导致另一个更加重要的目标难以实现时,复杂性就产生了。设计的所有部分都不会轻而易举实现,也就是说,付出的努力与得到的好处之间是不成比例的,设计师意识这一点非常重要。旨在取得最大化产出的项目只会专注于重要且可以在合理时间内实现的事情上。比方说,在设计消息代理 Disque 的时候,在某一刻我突然意识到只需要为消息提供尽力而为的排序,项目的其他方面就都可以获得实质性的改进:比如可用性、查询语言以及客户端交互、简洁性和性能等。

*** 简洁性**

这一点的重要性很显然,意味着成王败寇。为了理解什么是简洁性,看看复杂性往往是如何产生是值得的。我认为复杂性的两个主要的驱动力是不愿意做出设计上的牺牲,以及设计活动中错误的累积。

只要思考一下设计流程,每一次追求到一条错误的路径时,我们就会距离最优方案越来越远。一项初步设计错误,如果落到错误的人手中的话,他不会对同一系统进行重新设计,而是会为了处理当初的错误而设计出另一套复杂的解决方案。因此每迈出错误的一步该项目都会变得更加复杂、效率更低。

简洁性可以通过在脑子里进行“概念验证”方面的推理来实现,这样可以让程序员对大量的简单设计进行探索,然后从看起来最可行和直接的解决方案开始。随后利用经验和个人设计能力可以改进设计,为有待解决的子设计找到合理的解决方案。

无论每次需要多复杂的解决方案,对于如何避免这种复杂性进行长时间的推敲都是很重要的,只有在考虑过完全不同的替代方案也没有发现更好的可能性之后才可以继续原方案。

*** 完美主义,或者如何干掉你的生产力,偏袒你的设计**

完美主义有两种派生:一种是痴迷在程序中实现可能达到的、可衡量的最佳性能的工程文化,另一种是作为个人特质。我把这两种情况均视为程序员快速交付的最大障碍之一。完美主义以及对外部评判的恐惧会植入一种设计偏见,导致会根据心理或者无关紧要的可衡量参数而做出糟糕的重新设计选择,而像健壮性、简洁性、及时交付的能力往往却从未考虑。

*** 知识:一些理论会有所帮助**

在处理复杂性任务时,有关数据结构、计算的根本性限制、非常适合对特定任务建模的算法方面的知识对于找到合适设计的能力会产生影响。你没有必要成为一切事情的超级专家,但是至少能意识到某问题存在大批潜在解决方案是必要的。

*** 底层:理解机器**

程序里面的出现一些问题,即便是使用高级语言的时候,往往都是因为误解了计算机执行特定任务的方式。就因为使用的工具或者算法存在根本问题,甚至会导致需要进行从头开始对项目进行重新设计和重新实现。非常擅长 C 语言,理解 CPU 的工作方式,对于内核如何运作、系统调用如何实现有着清晰了解的话,可以避免到了后面遇到糟糕的“惊喜”。

*** 调试技能**

为了找到 bug 往往很容易就会花费掉大量的精力。擅长逐步地获取 bug 相关状态,以便在合理的步骤内修补好问题,知道编写简单代码不大可能会导致太多 bug,这些对于提高程序员的效率都会产生很大的影响。

在我看来,如果一位程序员具备上述特质的话,能够取得 10 倍于平均水平的产出并不奇怪。这些特质联合起来可以先从可行模型开始,慢慢做出好的设计实现,而且做出来的东西往往要比替代方案简单好几倍。为了强调简洁性,我愿意称之为“机会主义编程”。意思是说在开发的每一步都要对实现的功能集进行挑选,目的是为了以最小的代价对程序的客户群产生最大的影响。

  • 全栈
    5 引用 • 50 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    588 引用 • 3538 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    411 引用 • 3588 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 635 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    133 引用 • 796 回帖
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 142 回帖 • 1 关注
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 1 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    162 引用 • 1079 回帖
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖
  • Excel
    31 引用 • 28 回帖
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    180 引用 • 408 回帖 • 484 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 93 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    150 引用 • 257 回帖 • 1 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 609 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 1 关注
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    495 引用 • 931 回帖
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 503 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 436 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 4 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖