
本文翻译自:The Best Programmers I Know
在我的生命中,我遇到了很多开发者。最近,我自问:“成为最优秀的人需要什么?他们有什么共同点?”
希望这篇文章能激励到某个角落里的人,我记录下了我在我们行业中遇到的最杰出人物所展现出的特质。我希望在我刚开始的时候就有这份清单。如果我当时遵循了这条道路,它将为我节省很多时间。
阅读文档
如果作为一个年轻的程序员,我应该做的事情之一就是 阅读文档。也就是说,阅读 Apache Web 服务器文档,Python 标准库,或者 TOML 规范。
不要去 Stack Overflow,不要询问 LLM,不要 猜测,直接查看一手文档。很多时候,它出人意料地容易访问且编写得很好。
精通你的工具
优秀的开发者对所使用的技术的理解是 根本性的。
能够 使用 一个工具是一回事,而真正 理解 它则是另一回事。一个普通用户可能会摸索不定,容易困惑,操作不当,无法优化配置。
专家(在阅读了文档之后)会坐下来为这个工具编写配置,他们对工具的每一行都了如指掌,并能向同事解释。这样就不会留下任何疑问!
要深入了解一个工具,你必须知道:
- 它的历史:谁创造了它?为什么?为了解决什么问题?
- 它的现状:谁在维护它?他们在哪里工作?在什么上?
- 它的限制:什么时候这个工具不适合?什么时候它会失败?
- 它的生态系统:存在哪些库?谁在使用它?有哪些插件?
例如,如果你是一名后端工程师,并且大量使用 Kafka,我期望你对 Kafka 非常了解 —— 而不仅仅是你在 Reddit 上看到的东西。至少,这是我对你期望成为最优秀工程师的标准。
阅读报错信息
就是真正阅读错误信息并尝试理解其内容。事实证明,如果你静下心来阅读错误信息,它似乎开始对你说话。最优秀的工程师可以从非常少的上下文中推断出大量信息。仅通过阅读错误信息,你就可以自己解决大部分问题。
如果你帮助那些没有这种技能的人,这也感觉像是一种超能力。就像 “从杯子里读取信息” 一样。
拆解问题
每个人有时都会陷入困境。最擅长的人知道如何摆脱困境。他们会简化问题,直到它们变得容易理解。这是一种难以学习的技能,需要大量的经验。或者,你可能拥有出色的解决问题的能力,例如,你很聪明。如果不是这样,你可以通过训练来提高,但没有任何捷径可以绕过分解难题。世界上有一些问题对于任何参与的人来说都太难一次性解决了。
如果你是一名专业开发者,那么这就是你得到报酬去做的大部分工作:拆解问题。如果你做得正确,这会感觉像是 “开挂”:你只需不断解决拆解后的简单问题,直到完成。
不要害怕动手实践
我所知道的最好的开发者阅读了大量代码,并且他们不畏惧去修改它。他们永远不会说 “那不是我的事” 或 “我帮不上忙”。相反,他们只是开始并学习。代码只是代码。他们可以通过时间和努力掌握任何所需的技能。不知不觉中,他们成为了团队中遇到任何问题时的首选人物。主要是因为他们是唯一不畏惧去修改它的人。
乐于帮助他人
这是一个和上面相关的观点。优秀的工程师需求量大,总是很忙,但他们总是愿意提供帮助。这是因为他们的好奇心强,他们的支持性思维是他们最初成为优秀工程师的原因。有他们在团队中是一种纯粹的快乐,因为他们是问题解决者。
写作
大多数出色的工程师都善于表达,乐于分享知识。
最好的开发者都有自己的思想输出渠道:博客、演讲、开源项目,或者这些的组合。
我认为写作技巧与编程之间存在强烈的关联。我所认识的顶尖工程师都至少精通一门人类语言 —— 很多时候甚至更多。掌握你的写作方式就是掌握你的思维方式,反之亦然。一个人的写作风格在很大程度上揭示了他们的思维方式。如果它令人困惑且缺乏结构,他们的编码风格也会如此。如果它简洁、富有教育意义、结构良好,有时甚至机智,他们的代码也会如此。
优秀的程序员从驾驭文字中找到乐趣。
永不停止学习
我所认识的最好的开发者中有些已经 60 多岁了。他们可以轻松地绕过我。部分原因在于他们持续学习。如果有一个他们尚未尝试的新工具或他们喜欢的语言,他们会去学习。这样,他们几乎不费吹灰之力就能始终保持在最前沿。
这并非理所当然:很多人在大学毕业后或开始第一份工作后很快就停止了学习。他们陷入了这样的思维定式,认为在学校学到的是 “正确” 做事的方式。所有新事物都是不好的,不值得他们花时间。因此,有 25 岁的人 “心理上已经退休”,而 68 岁的人仍然思维敏捷。我努力希望有一天能属于后者。
与此相关的是,最好的工程师不会追随潮流,但他们总是会仔细评估新技术的益处。如果他们拒绝采用,他们可以清楚地告诉你 “为什么”,在什么情况下这项技术是一个好的选择,以及有哪些替代方案。
地位并不重要
最优秀的开发者会与资深工程师和初级开发者进行交流。他们没有等级之分。他们试图从每个人身上学习,不论年龄大小。新来的人通常还没有深陷办公室政治,思维依然清新。他们不知道为什么事情会 “困难”,因此他们提出了创造性的解决方案。也许过去的障碍已经不复存在,这使得这些人成为灵感的绝佳来源。
建立声誉
如果你做了出色的工作,你可以成为一名优秀的工程师,但只有当你因为你的出色工作而闻名时,你才能成为最优秀之一;至少在(更大的)组织中是这样。
有许多方法可以建立自己的声誉:
- 你为(更大的)组织构建并发布了关键服务。
- 你编写了一个著名的工具。
- 你为流行的开源工具做出了贡献。
- 你编写了一本经常被提及的书籍。
为什么我认为以你的工作而闻名很重要?上述所有方法都是扩展你在社区中影响力半径的方式。知名的开发者比非知名的开发者影响的人要多得多。你能编写的代码是有限的。如果你想 “扩大” 你的影响力,你必须成为一个思想领袖。
建立声誉是一个长期目标。它不会一夜之间发生,也不必如此。它也不会意外发生。你每天都要出现并完成工作。随着时间的推移,工作会为自己说话。更多的人会信任你和你所做的工作,他们愿意与你合作。你将参与更多声望较高的项目,圈子会不断扩大。
我曾听说过这样一个观点,即你的最新作品应该掩盖你之前所做的一切。这是你走在正确道路上的好迹象。
保持耐心
您需要耐心对待计算机和人类,尤其是对自己。不是所有事情都会立刻顺利,人们也需要时间来学习。这并不是你周围的人愚蠢;他们只是信息不完整。如果没有耐心,你会觉得全世界都在与你作对,周围的人都是无能之辈。那是一个糟糕的地方。你太聪明了,这对你自己来说并不好。
要想成为最优秀的人,你需要难以置信的耐心、专注和奉献。如果你想解决难题,你不能轻易分心。你必须回到键盘前才能克服它。你必须付出努力,将项目推过终点线。而且,如果你能在不成为一个傲慢的家伙的情况下做到这一点,那就更好了。这就是最优秀的人与其他人之间的区别。
永远不要责怪计算机
大多数开发者会责怪软件、其他人、他们的狗,或者天气,为那些脆弱的、看似 “随机” 的 bug 找借口。
最好的开发者不会这样做。
无论计算机的行为看起来多么古怪或淘气,总有一个逻辑上的解释:你只是还没有找到它而已!
最好的做法是继续挖掘,直到找到原因。他们可能不会立即找到原因,甚至可能永远找不到,但他们绝不会责怪外部环境。
有了这种态度,他们能够取得惊人的进步,学习到其他人无法学到的东西。当你把错误当作无法理解的魔法时,魔法就会永远如此。
不要害怕说 “我不知道”
在面试中,我刻意要求候选人至少说出一次 “我不知道”。原因并非我想显得高人一等(尽管有些人确实有这种印象)。不,我想触及他们知识的边界。我想站在他们认为已知事物的边缘。通常,我自己也不知道答案。坦白说,我对答案并不关心。我关心的是当人们通过胡说八道混过面试时。
最优秀的候选人会说 “嗯,我不知道,但这是个有趣的问题!如果我要猜测,我会说……” 然后他们会继续推导出答案。这是你有可能成为一位优秀工程师的迹象。
如果你害怕说 “我不知道”,那么你可能是出于自负或防御心理。我不喜欢团队中的胡说八道者。最好承认你不可能知道一切。一旦你接受了这一点,你就允许自己学习。“重要的是你不停止提问,” 爱因斯坦曾说过。
不要猜测
“面对歧义,拒绝猜测的诱惑” 这是我最喜欢的 Python Zen(PEP 20 – The Zen of Python)规则之一。PEP 20 – The Zen of Python。
而且猜测的诱惑是如此之大!
我多次陷入过这种情况,并且因为自己的雄心而失败了。
当你猜测时,可能会发生以下两种情况:
- 在最好情况下,你错了,你的错误假设导致了一个 bug。
- 在最坏情况下,你对了…… 但你永远不会停下来质疑自己。你会在错误的假设基础上建立你的心理模型。这可能会困扰你很长时间。
再次,抵制猜测的诱惑。提问,阅读参考资料,使用调试器,务必彻底。做一切必要的事情来获得答案。
保持简单
聪明的工程师编写聪明的代码。卓越的工程师编写简单的代码。
这是因为大多数时候,简单就足够了。而且简单比复杂更容易维护。有时,确实很重要要做到正确,但知道区别才是将最优秀者与其他人区分开来的关键。
通过保持简单,你可以实现很多事情。专注于正确的事情。
最后的思考
上面的内容不是一份清单或一场竞赛;伟大的工程不是一场赛跑。
只是不要骗自己以为你可以跳过艰苦的工作。没有捷径。祝你在旅程中好运。