优秀程序员的共识
原文:The Best Programmers I Know[1]
我此生有幸结识了众多开发者。近来,我常扪心自问:“怎样才能跻身顶尖之列?那些卓越的程序员们究竟有哪些共通之处?”
我将观察到的、我们这一行中最杰出人才所共有的特质记录下来,希望能给某位同行带来一些启发。我多么希望自己在刚入行时就能拥有这样一份指南。若能遵循此道,本可以为我节省下大量宝贵的时间。
一、 阅读官方文档 (Read the Reference)
如果说我年轻时作为程序员本该做却没做的一件事,那就是阅读我所使用工具的官方文档。比如,去读 Apache Web 服务器的文档、Python 标准库,或是 TOML 规范。
不要直奔 Stack Overflow,不要去问大语言模型 (LLM),更不要凭空猜测,直接去看第一手资料。很多时候,你会惊讶地发现,这些文档其实非常易懂且写得相当出色。
二、 精通你的工具 (Know Your Tools Really Well)
优秀的开发者在根本层面上理解他们所使用的技术。
能够使用一个工具是一回事,而真正吃透(理解)它则完全是另一回事。一个普通用户可能会手忙脚乱、轻易感到困惑、用错方法,并且不会去优化配置。
而专家则会(在阅读了官方文档之后!)坐下来,为工具编写配置,他们理解其中的每一行代码,并能向同事解释清楚其含义。这样就杜绝了任何疑问!
要精通一个工具,你需要了解:
它的历史: 谁创造了它?为什么?为了解决什么问题?
它的现状: 谁在维护它?他们在哪里工作?负责哪些方面?
它的局限: 什么情况下这个工具不适用?它在何时会出问题?
它的生态: 有哪些相关的库?谁在使用它?有哪些插件?
例如,如果你是一名重度使用 Kafka 的后端工程师,我期望你对 Kafka 有着深入的了解——而不仅仅是从 Reddit 上看到的只言片语。至少,如果你想成为最优秀的工程师之一,这是我的期望。
三、 仔细研读错误信息 (Read The Error Message)
就是要真正地去阅读错误信息,并尝试理解其中的具体含义。事实证明,如果你静下心来仔细琢磨错误信息,它就会开始向你“倾诉”。最优秀的工程师能从极少的上下文中推断出大量信息。仅仅通过阅读错误信息,你就能独立解决大部分问题。
当你帮助那些不具备这项技能的人时,这感觉就像一种超能力,好比“从咖啡杯里占卜”一样神奇。
四、 分解复杂问题 (Break Down Problems)
每个人都有卡壳的时候。顶尖高手懂得如何摆脱困境。他们会将复杂问题不断简化,直至其变得易于处理。这是一项难以掌握的技能,需要大量的经验积累。或者,你天生就拥有超强的解决问题的能力,例如你非常聪明。如果不是,那你可以通过训练来提升,但无论如何,分解难题是必经之路。这世上有些问题对于任何人来说都太难一次性解决。
如果你是一名职业开发者,你薪酬所对应的大部分工作就是:分解问题。如果你做得好,那过程会感觉像“开挂”一样:你只需不断解决被拆分后的简单问题,直至大功告成。
五、 勇于动手实践 (Don’t Be Afraid To Get Your Hands Dirty)
我认识的顶尖开发者会阅读大量代码,并且从不畏惧动手修改。他们从不会说“这不归我管”或“这方面我帮不了你”。相反,他们会直接上手去学习。代码终究只是代码。只要投入时间和精力,他们就能掌握任何所需的技能。不知不觉中,他们就成了团队里处理相关事务的**核心人物 (go-to person)**,而这往往只是因为,当初他们是唯一不害怕接触这些东西的人。
六、 乐于助人 (Always Help Others)
这是与上一点相关的特质。优秀的工程师总是非常抢手,日程繁忙,但他们总会尽力提供帮助。这是因为他们天生好奇,而且正是这种乐于助人的心态,才使得他们成为伟大的工程师。有他们在团队里是一种纯粹的快乐,因为他们是天生的问题解决者。
七、 坚持写作 (Write)
最出色的工程师大多能言善辩,并且乐于分享知识。
顶尖人物通常都有自己的思想输出渠道:博客、技术演讲、开源贡献,或是这些方式的结合。
我认为写作能力和编程能力之间存在很强的关联。我所认识的所有顶尖工程师,都至少能熟练掌握一门人类语言——很多时候还不止一门。锤炼写作就是锤炼思维,反之亦然。一个人的写作风格极大地反映了他的思维方式。如果行文混乱、缺乏结构,那么他的代码风格很可能也是如此。如果文字简洁、富有启发、结构清晰、时而风趣,那么他的代码多半也是这样。
优秀的程序员能在驾驭文字中找到乐趣。
八、 永不止步地学习 (Never Stop Learning)
我认识的一些顶尖开发者已经年过六旬,但他们的技术能力依然能轻松“碾压”我。部分原因在于他们持续学习。如果出现了一个他们没尝试过的新工具,或是一门他们感兴趣的语言,他们就会去学习。通过这种方式,他们总能毫不费力地保持与时俱进。
这并非理所当然:很多人在大学毕业或开始第一份工作后,很快就停止了学习。他们固守着在学校学到的就是“正确”方法的观念。所有新事物在他们看来都是不好的,不值得浪费时间。因此,你会看到 25 岁就“心态退休”的人,也会看到 68 岁思维依然敏捷活跃的人。我努力让自己将来能成为后者中的一员。
与此相关的是,最优秀的工程师从不盲目追随潮流,但他们总会审慎地评估新技术的价值。如果他们决定不采用某项技术,他们能准确地告诉你为什么,这项技术在什么场景下是好的选择,以及有哪些替代方案。
九、 地位并不重要 (Status Doesn’t Matter)
顶尖开发者与首席工程师和初级开发者都能平等交流。在他们眼中没有等级之分。他们试图向每一个人学习,无论老少。新人往往还未深陷办公室政治的泥潭,思维依然活跃。他们不知道事情为何“困难重重”,因此常能提出创造性的解决方案。也许过去的那些障碍早已不复存在,这使得新人成为了极好的灵感来源。
十、 建立声誉 (Build a Reputation)
如果你能做好工作,你可以成为一名可靠的工程师,但只有当你的出色工作广为人知时,你才能成为顶尖之一;至少在一个(较大的)组织内部是这样。
建立个人声誉的方式有很多:
你为(大型)组织构建并交付了关键服务。
你编写了一个知名工具。
你为一个流行的开源工具做出了贡献。
你写了一本经常被提及的书。
为什么我认为因工作成果而闻名很重要?以上所有方式都能扩大你在社区中的影响力半径。知名开发者比默默无闻的开发者能影响更多的人。你能写的代码量是有限的。如果你想“规模化”你的影响力,你就必须成为一名思想领袖。
建立声誉是一个长期目标。它不会一蹴而就,也不必急于求成。而且它绝不会凭空发生。你需要日复一日地坚持和付出。久而久之,你的成果自会证明一切。更多的人会信任你和你的工作,并希望与你合作。你将参与到更有声望的项目中,你的影响力圈子也会随之扩大。
我曾听过一个说法:你最新的成果应该超越你之前的所有成就。这是一个好迹象,表明你正走在正确的道路上。
十一、 保持耐心 (Have Patience)
你需要对计算机和人都有耐心,尤其要对自己有耐心。不是所有事情都能立刻成功,人们学习也需要时间。这并非你周围的人愚蠢;他们只是掌握的信息不完整。缺乏耐心,你会感觉整个世界都在与你为敌,周围的人似乎都无能。那样的心态会让你非常痛苦。你可能会聪明反被聪明误。
要成为顶尖高手,你需要惊人的耐心、专注和奉献精神。要想解决难题,你就不能轻易分心。你必须回到键盘前,克服困难。你必须投入努力,将项目推过终点线。如果你能在做到这些的同时,还不是一个傲慢自大的家伙,那就更好了。这正是顶尖人才与众不同之处。
十二、 绝不归咎于计算机 (Never Blame the Computer)
大多数开发者在遇到不稳定、看似“随机”的 bug 时,会归咎于软件、他人、他们的狗,甚至是天气。
顶尖开发者从不这样做。
无论计算机的行为看起来多么古怪或诡异,背后总有合乎逻辑的解释:只是你还没有找到它而已!
顶尖高手会不断深挖,直到找到原因为止。他们可能不会立刻找到原因,甚至可能永远也找不到,但他们绝不会归咎于外部因素。
凭借这种态度,他们能够取得惊人的进展,学到其他人无法企及的东西。如果你把 bug 误认为是无法理解的魔法,那么它对你来说就将永远是魔法。
十三、 勇于承认“我不知道” (Don’t Be Afraid to Say “I Don’t Know”)
在面试中,我曾刻意追问候选人,直到他们至少说出一次“我不知道”。原因并非我想显得高人一等(尽管有些人可能有这种印象)。不,我是想触及他们知识的边界。我想和他们一起,站在他们自认为所知的边缘地带。很多时候,我自己也不知道答案。老实说,我并不在乎答案本身。我在乎的是,候选人是否在试图蒙混过关。
最优秀的候选人会说:“嗯,这个我不知道,但这问题很有趣!如果让我推测的话,我会认为……” 然后他们会开始基于逻辑进行推导。这表明你具备成为一名卓越工程师的潜力。
如果你害怕说“我不知道”,那要么是出于傲慢,要么是出于防御心态。我不喜欢团队里有蒙混过关的人。最好是承认自己不可能无所不知。一旦你接受了这一点,你才真正允许自己去学习。正如阿尔伯特·爱因斯坦所说:“重要的是,永不止步地提问。”
十四、 拒绝猜测 (Don’t Guess)
“**面对模棱两可,拒绝猜测的诱惑 (In the Face of Ambiguity, Refuse the Temptation to Guess)**” —— 这是 PEP 20《Python 之禅》(The Zen of Python) 中我最喜欢的准则之一。
而猜测的诱惑实在是太大了!
我自己也曾多次经历这种情况,并且没能抵制住诱惑。
当你猜测时,可能发生两种情况:
最好的情况是:你猜错了,你错误的假设最终导致了一个 bug。
最坏的情况是:你猜对了……于是你再也不会停下来反思自己。你基于错误的假设构建了自己的心智模型。这可能会长期困扰你。
再次强调,抵制猜测的冲动。去提问,去阅读官方文档,去使用调试器,去刨根问底。不惜一切代价去找到确切的答案。
十五、 保持简洁 (Keep It Simple)
聪明的工程师写“聪明”(可能意味着复杂)的代码。卓越的工程师写简洁的代码。
这是因为大多数时候,简洁就已足够。而且简洁的代码比复杂的代码更易于维护。有时候,追求极致的“正确”确实很重要,但懂得何时需要、何时适可而止,正是区分顶尖与普通的关键所在。
保持简洁,你就能成就很多事情。专注于真正重要的事情上。
结语 (Final Thoughts)
以上所列并非一份核对清单,也不是一场竞赛;优秀的工程实践更不是赛跑。
只是,不要自欺欺人地以为可以跳过艰苦的努力。这其中没有捷径。祝你在成为更优秀工程师的旅程中好运。
参考资料
[1]
The Best Programmers I Know: https://endler.dev/2025/best-programmers/