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

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

转自: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 回帖
  • 程序员

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

    591 引用 • 3528 回帖

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 42 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 353 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 52 关注
  • Access
    1 引用 • 3 回帖 • 3 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • PHP

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

    167 引用 • 408 回帖 • 484 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • flomo

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

    6 引用 • 143 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 506 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • sts
    2 引用 • 2 回帖 • 243 关注
  • 以太坊

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

    34 引用 • 367 回帖 • 1 关注
  • OneDrive
    2 引用 • 2 关注
  • V2EX

    V2EX 是创意工作者们的社区。这里目前汇聚了超过 400,000 名主要来自互联网行业、游戏行业和媒体行业的创意工作者。V2EX 希望能够成为创意工作者们的生活和事业的一部分。

    16 引用 • 236 回帖 • 241 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 522 关注
  • PostgreSQL

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

    22 引用 • 22 回帖 • 2 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    29 引用 • 230 回帖 • 125 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 365 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 2 关注
  • 印象笔记
    3 引用 • 16 回帖 • 3 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖 • 2 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    246 引用 • 1338 回帖
  • 运维

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

    151 引用 • 257 回帖