三种代码

Avatar of Robin Rendle
Robin Rendle

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 价值 200 美元的免费积分!

每次我开始一个新项目时,我都会将我正在查看的代码组织成三种类型,或者说是类别。我认为这些类型可以应用于任何代码库、任何语言、任何技术或开源项目。无论我是在编写 HTML 或 CSS 还是构建 React 组件,考虑这些不同的类别都帮助我弄清楚要重构和优先考虑什么,以及现在要保留什么。

这些类别是:无聊代码、盐矿代码和放射性代码。

让我解释一下。

无聊代码

无聊代码指的是当你阅读它时完全理解的代码。无需重构它,并且它以不会让你想要跳进河里自杀的方式执行其功能。无聊代码就是好代码。它不会做后空翻,也不会试图给你留下深刻印象。你可以使用它而无需编写更多代码或在其之上设计黑客。无聊代码完全按字面意思执行,并且永远不会造成任何意外。

这个函数有意义,这个道具命名清晰,这个 React 组件很简单。这里没有循环嵌套循环,也不需要进行任何脑力体操。

然而,无聊代码几乎不可能编写,因为我们对它的理解在我们开始解决问题时几乎总是很不完整。看看为一个简单段落设置对比度可以考虑多少因素。要编写无聊代码,我们必须勤奋,必须不断重构,并且必须在每月月底的工资单之外关心代码库。

无聊代码很好,因为无聊代码很友好。

盐矿代码

这是那种荒谬且毫无意义的代码。它是那种我们几乎无法阅读的代码,但它埋藏在代码库的深处,几乎不可能更改。但是!它并没有泄漏到我们代码的其他部分,因此我们大部分时间可以忽略它。它可能并不漂亮,我们可能不想在有生之年再看一眼它,但它并没有主动造成任何损害。

它是我们几乎可以忘却的代码类型。它是那种如果打开并篡改会很危险的代码,但目前,一切都还好。

麻烦埋藏很深。

放射性代码

放射性代码是每个工程团队真正的心腹大患。它是“今天不想去上班”的那种代码。它不仅很糟糕,而且正在积极地毒害我们的代码库,并随着时间的推移使一切变得更糟。想象一下代码库就像一个核反应堆;放射性代码是那些突破了容器并现在正在泄漏到我们代码库各个部分的东西。

举个例子?对于我们 Gusto 和设计系统团队来说,我认为我们的表单组件是放射性的。每个组件都会造成更多问题,因为我们永远无法按原样使用该组件;我们必须对其进行黑客攻击才能获得我们想要的东西。每次任何人都使用这段代码时,他们都必须在其上编写更多代码,随着时间的推移使情况变得更糟,并且它鼓励团队中的每个人都这样做。

在我们的设计系统中,当我们想要将一个类名添加到包裹表单元素的 div 时,我们必须在一个组件中使用formFieldClass 道具,而在另一个组件中使用wrapperClass。有一个名为isDefaultLayoutpropType,每个人都将其设置为false 并在其上编写自定义 CSS 类。换句话说,放射性代码不仅使我们难以理解所有这些无稽之谈的代码,而且还使我们越来越难以理解代码库的其他部分。因为我们现在正在查看的文件依赖于八个我们无法看到的东西。删除此放射性代码的结果意味着更改所有依赖于它的其他内容。

换句话说,放射性代码——就像我们的表单组件——使代码库无法信任。

放射性代码不仅对我们和我们的代码库有害,而且对我们的团队也有害。它鼓励不良习惯,在 Slack 线程中出现残酷的行为,更不用说它会导致团队成员之间的摩擦,而这种摩擦很难衡量。放射性代码还鼓励公司中的其他团队铤而走险,将新技术引入代码库,而放射性代码问题本身并非技术问题。任何人都可以编写这种代码,无论语言、系统或代码检查如何,只要他们在关注问题时不够注意。或者当他们试图过于聪明时。或者当他们试图给某人留下深刻印象时。

我们如何修复放射性代码?好吧,我们必须在它周围画一个圆圈,并将泄漏到代码库其他部分的疯狂行为控制住。然后我们必须做一些极其英勇的事情:我们必须让它变得无聊。