编写愚蠢的代码

18

为开源项目做出贡献的最佳方式是删除其中的代码行。 我们应该努力编写新手程序员无需解释即可轻松理解的代码,或者维护人员无需投入大量时间即可理解的代码。

作为学生,我们尝试使用日益复杂的技术来解决越来越具有挑战性的问题。我们首先学习循环,然后是函数,然后是类,等等。当我们提升这个层次结构,用更先进的技术编写更长的程序时,我们会受到赞扬。我们了解到,经验丰富的程序员使用 monad,而新程序员则使用 for 循环。

然后我们毕业并找到一份工作或开源项目与其他人一起工作。我们寻找可以添加的东西,并使用我们在学校学到的所有技巧自豪地实施解决方案。

啊哈!我可以扩展这个项目来做X!我可以在这里使用继承!出色的!

我们实现了这个功能并感到很有成就感,并且有充分的理由。在真实系统中进行编程是一项不小的成就。这当然是我的经历。我很高兴能够编写代码,并为自己能够向世界展示我知道如何做的所有事情而感到自豪。作为我对编程技术的历史热爱的证据,这里是用另一种元编程语言构建的线性代数语言。请注意,已经好几年没有人接触过这段代码了。

然而,在更多地维护代码之后,我现在的想法有所不同。

  1. 我们不应该寻求构建软件。软件是我们为解决问题而支付的货币,这是我们的实际目标。我们应该努力构建尽可能少的软件来解决我们的问题。

  2. 我们应该使用尽可能简单的技术,以便尽可能多的人可以使用和扩展它们,而无需了解我们的先进技术。只有当我们不够聪明,无法弄清楚如何使用更常见的技术时,我们才应该使用先进的技术。

这些观点都不新颖。我遇到的大多数人在某种程度上都同意他们的观点,但当我们为新项目做出贡献时,我们不知何故忘记了他们。通过构建做出贡献展示复杂性的本能 常常占据主导地位。

软件是有成本的

你写的每一行都会花费人们的时间。当然,写它会花费你时间,但你愿意做出这种个人牺牲。然而,这段代码也花费了审阅者的时间来理解它。未来的维护人员和开发人员在修复和修改代码时会花费大量时间。他们可能会在外面享受阳光或与家人一起度过这段时间。

因此,当您向项目添加代码时,您应该感到温顺。感觉就像你正在和家人一起吃饭,但桌子上没有足够的食物。你应该只拿你需要的东西,而不是更多。和你在一起的人会因为你努力限制自己而尊重你。用更少的代码解决问题是一件困难的事,但这是你为减轻别人的负担而给自己承担的负担。

复杂的技术更难维护

作为学生,我们通过使用日益先进的技术来展示自己的优点。我们衡量价值的标准取决于我们在公共项目中使用函数、类、高阶函数、单子等的能力。我们向同行展示我们的解决方案,并根据我们的成熟程度感到自豪或羞耻。

然而,当与团队合作解决世界问题时,情况就相反了。现在我们努力用尽可能简单的代码来解决问题。当我们简单地解决一个问题时,我们就可以让初级程序员扩展我们的解决方案来解决其他问题。简单的代码可以帮助他人并提高我们的影响力。我们通过仅使用基本技术解决难题来展示我们的价值。

看!我用 for 循环替换了这个递归函数,它仍然可以完成我们需要它做的一切。我知道这不太聪明,但我注意到实习生在这方面遇到了麻烦,我认为这种改变可能会有所帮助。

如果您是一名优秀的程序员,那么您不需要证明您知道很酷的技巧。相反,您可以通过以简单的方式解决问题来展示您的价值,使团队中的每个人都能在未来做出贡献。

但当然要适度

话虽如此,过度遵守“用简单工具构建事物”的教条可能会适得其反。通常,递归解决方案比 for 循环解决方案简单得多,并且通常使用 Class 或 Monad 是正确的方法。但我们在使用这些为自己构建系统的技术时应该小心;其他人没有经验的系统。

原文链接:https://matthewrocklin.com/write-dumb-code.html