The Best Programmers I Know

Matthias Endler

我认识的最优秀的程序员

原文由 Matthias Endler 发布,订阅该博客

在我的职业生涯中见过很多开发者。最近,我问自己:“要成为最优秀的那一批人,需要具备什么?他们身上都有什么共同点?”

希望能给某些人带来一点启发,我把在我们这个行业里最杰出的人身上观察到的特质记录了下来。真希望我刚入行时就能看到这份清单。如果当时能照着这条路走,会为我省去很多时间。

阅读官方文档

如果要说作为年轻程序员最应该做的一件事,那就是去阅读官方文档,读你正在使用的东西的文档。比如去读 Apache Web 服务器文档Python 标准库,或是 TOML 规范

别去 Stack Overflow 上找,别去问大模型,也别靠,直接去看源头。很多时候,文档出乎意料地通俗易懂、写得很好。

真正精通你的工具

优秀的开发者对自己使用的技术有着根本层面上的理解。

使用一件工具是一回事,真正吃透(grok)它则是另一回事。普通的使用者只会笨拙地摸索,很容易困惑,用错方法,也不会去优化配置。

而专家(在读过文档之后!)会坐下来为工具编写配置,他们理解其中的每一行,并且能向同事解释清楚。这样就毫无含糊之处了。

要真正了解一件工具,你需要知道:

  • 它的历史:是谁创造的?为什么创造?为了解决什么问题?
  • 它的现状:现在由谁在维护?他们在哪里工作?在做什么?
  • 它的局限:什么时候不适合用它?它会在什么情况下出问题?
  • 它的生态:有哪些相关库?谁在用它?有哪些插件?

举个例子,如果你是一名重度使用 Kafka 的后端工程师,我会期待你对 Kafka 有很深的了解——而不只是从 Reddit 上看到的那些东西。至少,如果你想成为最优秀的工程师之一,我对你的期待就是如此。

读懂报错信息

意思是真正去读报错信息,并试着理解上面写了什么。事实证明,只要你静下心来仔细揣摩报错信息,它就会开始对你说话。最优秀的工程师能从极少的上下文中推断出大量信息。仅仅通过阅读报错信息,你就能独立解决大部分问题。

如果你去帮助一个不具备这种能力的人,这会感觉像是一种超能力。就像“看茶叶占卜”一样。

拆解问题

每个人都会遇到卡住的时候。最优秀的人懂得如何摆脱困境。他们把问题不断简化,直到变得可以消化。这是一项很难学会的技能,需要大量的经验。或者,你本身就拥有出色的问题解决能力,比如你很聪明。如果不是,你可以去训练这项能力,但无论如何都绕不开拆解难题。世界上有些问题对任何人来说都太过复杂,无法一次性解决。

如果你是一名职业开发者,这就是你拿薪水要做的大部分工作:拆解问题。如果做得好,你会感觉像在作弊:你只是一个接一个地解决简单的问题,直到全部完成。

别怕弄脏手

我认识的最优秀的开发者会阅读大量代码,而且不怕去动手改。他们从不说“这不归我管”或“我帮不上这个忙”。相反,他们会直接上手,在实践中学习。代码说到底就只是代码。只要花时间和精力,他们就能掌握任何需要的技能。不知不觉间,他们就成了团队里不管碰过什么都会被求助的人。主要原因就是,一开始只有他们不怕去碰。

乐于助人

相关的一点是,优秀的工程师虽然很抢手、总是很忙,但他们总会尽力帮忙。这是因为他们天生好奇,而这种乐于支持的心态正是让他们变得优秀的原因。团队里有他们是一件非常愉快的事,因为他们是问题的解决者。

写作

大多数厉害的工程师都善于表达,也乐于分享知识。

最顶尖的人总有某种输出想法的方式:博客、演讲、开源项目,或是几者的结合。

我认为写作能力与编程能力之间有很强的相关性。我认识的所有最优秀的工程师都至少精通一门人类语言——往往还不止一门。掌握写作的方式就是掌握思考的方式,反之亦然。一个人的写作风格很大程度上反映了他的思维方式。如果写作混乱、缺乏结构,他的代码风格也会如此。如果写作简洁、有启发性、结构清晰、时而机智幽默,他的代码也会如此。

优秀的程序员能在玩弄文字中找到乐趣。

永不停止学习

我认识的一些最优秀的开发者已经 60 多岁了。他们依然能轻松超越我。原因之一就是他们一直在学习。如果有他们没试过的新工具或喜欢的新语言,他们就会去学。这样一来,他们总能毫不费力地跟上前沿。

这一点并非理所当然:很多人在大学毕业或进入第一份工作后很快就停止了学习。他们固执地认为学校里教的就是“正确”的做法。一切新事物都是不好的,不值得花时间。于是有些 25 岁的人就已经“精神上退休”了,而有些 68 岁的人思维依然保持新鲜。我希望将来能成为后者。

有点相关的是,最优秀的工程师不会盲目追逐潮流,但他们总会审慎地评估新技术的价值。如果他们否定了某项技术,他们能准确地告诉你为什么、在什么情况下这项技术会是好的选择,以及有哪些替代方案。

头衔并不重要

最优秀的开发者与首席工程师和初级开发者交流时一视同仁。没有等级之分。他们试图向每一个人学习,无论年长还是年轻。新人往往还没有陷入办公室政治,思维依然新鲜。他们不知道为什么事情会“很难”,所以会提出富有创意的解决方案。也许过去的障碍已经不复存在,这使得他们成为极好的灵感来源。

建立声誉

如果你能做出好成绩,你可以成为一名可靠的工程师,但只有当你的好成绩被人所知——至少在(更大的)组织内部被人所知——你才能成为最优秀的那一批。

建立声誉有很多方式:

  • 你为(大型)组织构建并交付了一个关键服务。
  • 你写了一个著名的工具
  • 你为某个热门的开源工具做出了贡献
  • 你写了一本被经常提及的书

为什么我认为让别人知道你的成果很重要?以上所有方式都是在社区中扩大你影响力半径的途径。知名的开发者比不知名的开发者能影响到更多的人。你能写的代码终究是有限的。如果你想“规模化”你的影响力,就必须成为思想上的引领者。

建立声誉是一个长期目标。它不会一夜之间发生,也不必如此。而且它不会意外降临。你每天都要到岗、踏实做事。久而久之,成果自会说话。更多的人会信任你和你的工作,他们会想要与你共事。你将参与更受瞩目的项目,这个圈子也会越滚越大。

我曾听说过这样一个观点:你最新的作品应该盖过你之前做过的一切。这是一个表明你正走在正确道路上的好迹象。

保持耐心

你需要对计算机和人都保持耐心,尤其是对自己。不是所有事情都会立刻奏效,人们也需要时间学习。不是你身边的人愚蠢,只是他们掌握的信息还不完整。如果没有耐心,你会觉得全世界都在与你作对,身边的人都无能透顶。那会是一种非常痛苦的状态。你只是太聪明,反而害了自己。

要成为最优秀的人之一,你需要极大的耐心、专注和投入。如果你想解决难题,就不能轻易分心。你必须回到键盘前去克服它。你必须付出努力把项目推向终点。而如果你能做到这些的同时还不傲慢讨嫌,那就更好了。这正是区分最优秀者与普通人的地方。

不要责怪计算机

大多数开发者会把不稳定、看似“随机”的 bug 归咎于软件、归咎于别人、归咎于自家的狗或是天气。

最优秀的开发者不会这样。

无论计算机的行为看起来多么反复无常、捉摸不定,背后总是有一个符合逻辑的解释:只是你还没有找到而已!

最优秀的人会一直深挖,直到找到原因。他们可能不会立刻找到,也可能永远找不到,但他们从不归咎于外部环境。

抱着这种态度,他们能够取得巨大的进步,学到别人学不到的东西。当你把 bug 误认为是无法理解的魔法时,它就永远都会是魔法。

不要害怕说“我不知道”

在面试中,我会不断追问候选人,直到他们至少说出一次“我不知道”。原因并不是我想显得比他们高明(尽管有些人确实是这么认为的)。不,我是想触及他们知识的边界。我想和他们一起站在他们自以为知道的边缘。很多时候,我自己也不知道答案。说实话,我也不在乎答案是什么。我在意的是那些在面试中胡编乱造的人。

最优秀的候选人会说“嗯,我不知道,但这是个很有意思的问题!如果非要我猜的话,我会说……”然后他们会接着去推导出答案。这就是你有潜力成为一名优秀工程师的标志。

如果你害怕说“我不知道”,那你就是出于傲慢或防备心理。我不喜欢团队里有满口胡话的人。承认你不可能无所不知要好得多。一旦你接受了这一点,你才能让自己去学习。阿尔伯特·爱因斯坦曾说:“重要的是永不停止发问。”

不要猜测

“面对模棱两可,拒绝猜测的诱惑。”这是我在 PEP 20——Python 之禅中最喜欢的一条规则。

而猜测的诱惑真的非常非常大!

我也曾多次身陷其中,因自己的想当然栽了跟头。

当你猜测时,可能会发生两种情况:

  • 最好的情况下,你猜错了,不正确的假设导致了一个 bug。
  • 最坏的情况下,你猜对了……然后你就再也不会停下来质疑自己。你基于错误的假设构建起自己的心智模型。这可能会困扰你很久。

所以,抵制住猜测的冲动。多提问,查阅文档,用调试器,做事要彻底。想尽一切办法去找到答案。

保持简单

聪明的工程师写出聪明的代码。卓越的工程师写出简单的代码。

这是因为大多数时候,简单就足够了。而且简单比复杂更易于维护。有时确实需要把事情做得精益求精,但能分辨其中的区别,正是区分最优秀者与普通人的关键。

保持简单,你就能成就很多。专注于真正重要的事情。

最后的话

以上这些不是一份清单,也不是一场竞赛;卓越的工程本身也不是赛跑。

只是别自欺欺人地以为可以跳过艰苦的付出。没有捷径。祝你的旅程好运。

本文章由 muse-spark-1.2-contributor 进行翻译

评论