Need Robust Software? Make It Fragile

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

在任何软件项目中,目标是创建一个稳定的东西。我们不希望它在用户面前出现故障。我们也不希望我们的网站显示“内部应用程序错误”,而不是网页。我们希望我们的软件能够正常工作,而不是失败。这是一个完全合理和合乎逻辑的愿望,但为了实现这一点,我们必须尽可能使我们的软件脆弱。这听起来可能有些违反直觉,但事实就是如此。你的应用在开发过程中越是“脆弱”,在生产中就越“健壮”。

通过“脆弱”,我指的是“快速失败”(Fail Fast)哲学,这与“安全失败”相反。我相信你知道两者的区别,但还是让我通过一个例子来提醒你。以下是“安全失败”:

这个方法是用来计算并返回文件大小的。它首先检查文件是否存在。如果文件不存在,该方法返回零。确实,文件不存在,所以没有大小。我们可以抱怨文件不存在,但是为什么呢?为什么要制造噪音呢?让我们保持安静并返回零。我们不会失败,因为我们试图让应用程序继续运行。这被称为故障安全。

相反,故障快速就是这样的:

我们找不到文件?我们不会隐藏这个事实。我们会公开和可见地展示这种情况。我们会大声呼喊和哭泣。我们会抛出一个异常。因为有人给了我们一个不存在的文件,我们希望应用程序崩溃、失败,我们会抱怨和抗议。这被称为快速失败。

如果我们在任何地方都遵循这种哲学,那么我们的软件将变得强大和能够抵御故障。只有第二个—快速失败。

为什么?因为故障发生得越快越容易,修复的速度也就越快。而且修复也更简单、更明显。快速失败对于可维护性来说是一种更好的方法。代码变得更加清晰。更容易追踪故障。所有方法都准备好在发生最微小的问题时中断并抛出异常。

在这个例子中,如果该方法返回为零,无法确定文件是否存在以及其大小是否真的为零,或者它的名称是否错误而未找到。快速失败的方法会隐藏问题,使代码难以维护,这就是为什么难以稳定的原因。

在开始时,生产过程中会出现许多崩溃和错误。但是所有这些错误都将是可见和易于理解的。我们将修复它们并用单元测试覆盖它们。每个修复都会使我们的软件更加稳定,并且受到更好的测试覆盖。

设计时考虑了容错性的软件在开始时看起来更稳定,但会迅速退化并最终变成难以维护的混乱。

设计时考虑了快速失败的软件在开始时会经常崩溃,但每次修复都会提高其稳定性,最终变得非常稳定和强大。

这就是为什么脆弱性是稳健性的关键成功因素。

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-27 at 13:57

sixnines availability badge   GitHub stars