一万小时编程以后的思考 - matt


需要一万小时编程才可能是世界级专家:
在任何技能上获得世界级专业知识的关键在很大程度上取决于以正确的方式练习,总共大约 10,000 小时 ——Malcolm Gladwell in Outliers
好吧,我当然不是世界级的专家,但我已经将 10,000 小时的刻意练习用于编程。以下是我对编程的 31 条思考。
这些反思大多数不适用于初学者。这些反思不是职业建议。将它们视为成为技术吉他手的课程,而不是成为一名优秀的乐队成员。他们是为了让自己成为更好的程序员。

  • 浏览源代码几乎总是比在 StackOverflow 上找到答案要快。
  • 在许多情况下,您正在从事的工作在互联网上没有答案。这通常意味着问题很困难或很重要,或两者兼而有之。
  • 尽可能多地删除代码。
  • 语法糖通常是不好的。
  • 简单很难。
  • 拥有各种各样的工具,并知道该使用哪些工具来完成工作。
  • 了解最常用的内部结构,如 git 和 bash(我可以摆脱最粗糙的 git rebase 或 merge)。
  • 为重复的工作流程构建您自己的工具。没有什么比使用自己制作的工具更快的了(请参阅:我编写的软件)。
  • 只向最好的学习。所以当我学习Go时,我阅读了标准库。
  • 如果它看起来很丑,那很可能是一个可怕的错误。
  • 如果您必须编写不是文档字符串的注释,则可能应该对其进行重构。每一行新的评论都会增加这种可能性。(要了解更细致的内容,请参阅Linux 内核文档
  • 如果您不了解您的程序如何在生产中运行,那么您就不会了解程序本身。根据我的经验,最好的工程师知道他们的程序如何在各种环境中工作。
  • 上述规则也适用于构建管道。
  • 虔诚地使用他人的代码。
  • 推论:大多数代码都很糟糕。有时,自己编写更好的版本会更容易。
  • 一个粗略的经验法则:永远不要直接依赖可以轻松重写的小型库或本应很小的大型库。
  • 知道什么时候打破规则。对于像“不要重复自己”这样的规则,有时一点点重复比一点点依赖要好。
  • 将代码组织成模块、包和函数很重要。了解 API 边界在哪里实现是一门艺术。
  • 大多数时候选择最有效的工具,但也要选择你所知道的。Arch Linux 是现代开发人员最高效的操作系统吗?对我来说,是的,但对大多数人来说,可能不是。你应该使用 acme 吗?只有当你是罗伯派克时。
  • 避免圈复杂度。新手程序员甚至不知道他们已经纠结了依赖关系图,直到为时已晚。
  • 避免深度嵌套条件。对条件测试和命名约定有常识。
  • 正确命名变量。又是一门艺术。
  • 虽然很少见,但有时它是编译器的问题。否则,它始终是 DNS。
  • 谨慎使用深奥的语言特性,但在你应该使用的时候使用它们,因为这就是重点。
  • 技术的传播并不均衡。例如,前端开发人员可以从低级工程师那里学到很多东西(尤其是现在一切都已编译)。同样,JavaScript 开发人员可以教授云工程师的 UX 和可用性功能。
  • 因此,不同类型的工程师以不同的方式看待世界。
  • 有些程序员的效率是其他程序员的 10 倍。我知道,因为我既是 10x 程序员,又是 -1x 程序员。
  • 成为 10 倍程序员和 10 倍员工之间没有相关性(可能是负面的)。
  • 好的 API 易于使用且难以误用。
  • 配置周期从硬编码值到环境变量、CLI 标志、配置文件、模板化配置文件、DSL、通用 bash 脚本,再到硬编码值。知道你在这个七边形配置中的位置
  • 所有抽象层都是可延展的。如果遇到基本的墙,有时答案是走下一个抽象层。你并不局限于表面。

我的 10,000 小时都花在了什么地方?嗯,我已经编程大约 15 年了。最近,我在谷歌 Kubernetes 和私募股权公司 Blackstone 担任专业软件工程师。在此之前,我大学的大部分时间都在图书馆为我自己的项目编写程序,而不是编写证明(我应该在数学专业这样做)。在此之前,我在做各种各样的事情.
10,000小时我做了什么?最近的工作是在分布式系统中,但我已经编写了跨堆栈的代码。PHP、JavaScript、Go、Ruby、Python、C#、Java、Swift 等语言。前端、后端、移动、内核、云、运维,甚至一些 IT。我曾参与过像 Kubernetes 这样的大型开源项目并维护过子项目,这让我可以让一些最优秀的工程师对我的代码进行同行评审。