The Best Programmers I Know

Matthias Endler

我认识的最优秀的程序员

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

希望这能给某些人带来启发,我把在我们这个行业中最出色的人身上观察到的特质记录了下来。真希望我在刚入行时就拥有这份清单。如果当时就遵循这条路径,能为我节省大量时间。

阅读参考文档

如果说作为一名年轻的程序员我本该做一件事,那便是去阅读参考文档,也就是去阅读我所使用工具的参考资料。比如阅读Apache Webserver DocumentationPython Standard LibraryTOML spec

别去 Stack Overflow,别去问 LLM,别,直接去看源头。很多时候,你会发现它出人意料地易懂且写得很好。

真正精通你的工具

优秀的开发者会在本质层面上理解他们所使用的技术。

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

而专家(在阅读过参考文档之后!)会坐下来为这个工具编写配置,他们理解其中的每一行,并能向同事解释清楚。这样就不会留下任何疑惑!

要真正了解一个工具,你必须了解:

  • 它的历史:是谁创造了它?为什么?为了解决什么问题?
  • 它的现状:谁在维护它?他们在哪里工作?在做什么?
  • 它的局限性:什么时候这个工具不合适?什么时候它会出问题?
  • 它的生态系统:有哪些库?谁在使用它?有哪些插件?

例如,如果你是一名后端工程师并且大量使用 Kafka,我期望你对 Kafka 有很深的了解——而不仅仅是从 Reddit 上看到的那点东西。至少,如果你想成为最优秀的工程师之一,我会这样期待。

阅读错误信息

意思是真正去阅读错误信息,并尝试理解其中写了什么。事实证明,如果你静下心来仔细揣摩错误信息,它就会开始向你“说话”。最优秀的工程师能从极少的上下文中推断出大量信息。仅仅通过阅读错误信息,你就能自行解决大部分问题。

当你帮助那些不具备这项技能的人时,这也会让你感觉自己拥有了超能力。就像“杯中占卜”一样。

拆解问题

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

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

不要害怕弄脏双手

我认识的最优秀的开发者会阅读大量代码,而且从不害怕去碰它们。他们从不说“这不适合我”或“这方面我帮不了你”。相反,他们直接动手,在实践中学习。代码终究只是代码。只要投入时间和精力,他们就能掌握任何所需的技能。不知不觉间,他们就成了团队中处理那些事务的首选之人。很大程度上正是因为他们一开始就是唯一不害怕去触碰这些代码的人。

总是帮助他人

与此相关的一点是,优秀的工程师总是很抢手、很忙碌,但他们总会尽力提供帮助。那是因为他们天生好奇,而这种乐于助人的心态正是让他们成为优秀工程师的原因。团队中有他们是一件非常愉快的事,因为他们是问题的解决者。

写作

大多数出色的工程师都善于表达,并且乐于分享知识。

最优秀的人总有某种渠道来输出自己的想法:博客、演讲、开源,或是这些方式的结合。

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

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

永不停止学习

我认识的一些最优秀的开发者已经60多岁了。他们能轻松超越我。部分原因在于他们一直在学习。如果有他们还没尝试过的新工具或喜欢的语言,他们就会去学。这样,他们总能毫不费力地保持领先。

这一点并非理所当然:很多人在大学毕业或开始第一份工作后,很快就停止了学习。他们固执地认为学校里教的就是做事的“正确”方式。一切新事物都是不好的,不值得花时间。于是有了25岁就“精神退休”的人,也有68岁依然思维敏捷的人。我希望有一天能成为后者。

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

头衔并不重要

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

建立声誉

如果你能做出出色的工作,你可以成为一名可靠的工程师,但只有当你的出色工作为人所知时,你才能成为最优秀的工程师之一;至少要在一个(更大的)组织内部为人所知。

有很多方法可以为自己建立声誉:

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

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

建立声誉是一个长期目标。它不会一夜之间发生,也不必如此。而且它不会偶然发生。你每天都要出现并投入工作。随着时间的推移,工作本身会为你发声。会有更多的人信任你和你的工作,他们会想要与你合作。你将参与更受瞩目的项目,你的圈子也会不断扩大。

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

保持耐心

你需要对计算机和人都保持耐心,尤其是对自己。不是所有事情都会立刻奏效,人们也需要时间来学习。不是你周围的人愚蠢,他们只是信息不完整。没有耐心,你会觉得全世界都在与你作对,你周围的人都无能至极。那会是一个非常痛苦的处境。你聪明反被聪明误。

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

永远不要责怪计算机

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

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

无论计算机的行为看起来多么古怪或难以捉摸,总有一个合乎逻辑的解释:只是你还没找到而已!

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

抱着这种态度,他们能够取得惊人的进步,并学到他人学不到的东西。当你把缺陷误认为是无法理解的魔法时,它就永远只能是魔法。

不要害怕说“我不知道”

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

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

如果你害怕说“我不知道”,那你就是出于傲慢或防御心态。我不喜欢团队里有胡说八道的人。最好承认你不可能无所不知。一旦你接受了这一点,你就给了自己学习的机会。Albert Einstein(阿尔伯特·爱因斯坦)说过:“重要的是永不停止提问。”

不要猜测

“面对模棱两可,拒绝猜测的诱惑”这是PEP 20 – The Zen of Python中我最喜欢的一条规则。

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

我也曾多次身陷其中,并因自己的想当然3而失败。

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

  • 最好的情况下,你猜错了,不正确的假设导致了一个缺陷。
  • 最坏的情况下,你猜对了……而你将永远不会停下来质疑自己。你基于错误的假设构建心智模型。这可能会困扰你很长时间。

所以,再次强调,要抵制猜测的冲动。去提问,去阅读参考文档,使用调试器,要彻底。采取一切必要手段去找到答案。

保持简单

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

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

保持简单,你就能取得巨大的成就。专注于正确的事情。

结语

以上内容不是一份清单,也不是一场竞赛;卓越的工程不是赛跑。

只是不要自欺欺人地以为可以跳过艰苦的努力。没有捷径。祝你的旅程好运。

原文由 Matthias Endler 发布

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