“早期失败”的含义是什么意思,什么时候你想这样做?

时间:2010-05-10 23:58:44

标签: fail-fast-fail-early

表达“早期失败”是什么意思,在什么情况下这种方法最有用,何时会避免这种做法?

5 个答案:

答案 0 :(得分:25)

从本质上讲,快速失败(又名早期失败)就是对您的软件进行编码,以便在出现问题时,软件失败 as 就像可能一样明显,而不是试图在可能不稳定的状态下进行。

  

快速失败
  作者:Jim Shore   由Martin Fowler编辑   http://www.martinfowler.com/ieeeSoftware/failFast.pdf

     

...
  幸运的是,有一种简单的技术   将大大减少这些数量   你的软件中的错误。它不会减少   错误的总数,在   至少不是一开始,但它会成功   大多数缺陷更容易找到。

     

技术是建立你的   软件“快速失败。”

     

立即和   可见的失败

     

有些人建议制作   你的软件工作健壮   自动解决问题。   这导致软件“失败缓慢”。   该计划继续工作   错误但后来以奇怪的方式失败。

     

快速失败的系统恰恰相反:   当问题发生时,它立即失败   并且明显地。快速失败是不直观的   技术:“立即失败,明显失败”   听起来它会使你的软件更多   脆弱,但它实际上使它更强大。   错误更易于查找和修复,因此更少进入   生产。
  ...


还要注意 fail-fast iterator 的相关概念 - 迭代器,在对迭代器之外的集合进行某些修改之后,尽快抛出而不是在可能不稳定的情况下继续,或非确定性状态。

答案 1 :(得分:5)

早期失败体现了以下想法:在构建软件时,您失败或测试失败或者您发现错误时更容易纠正(也更便宜)。它也适用于您的业务模型。最好早点发现(例如测试版),而不是发布后。

答案 2 :(得分:4)

“早期失败”意味着程序应该引发异常并在出现问题时停止工作。 (它在实用程序员的提示列表中描述为Crash Early

在我的生物信息学工作中,我倾向于使用“早期失败”方法,因为我最关心的是确保正确性。相比之下,Rails允许您隐藏故障。例如,Rails'try允许您在对象上调用某些内容,如果该对象为nil,则不会引发异常。我想这是因为有了网站,确保程序继续运行比正确性更重要。

答案 3 :(得分:1)

我曾经有一个为我工作的初级oracle程序员,他在所有代码周围放置了“忽略一切”异常块,因此从未见过错误。这最初让他的代码看起来很棒,但是: A)虫子需要更长的时间才能找到; 和 B)之后我失去了所有(好吧,80%)对自己能力的信念。

我已经教过人们,这是一件非常糟糕的事情,因为它隐藏了错误。

不要将此与能够处理低质量输入的代码模块(例如在浏览器中也不是有效的XHTML的HTML)混淆 - 这些根本不需要导致失败。更有可能的是,他们确实多年前导致失败,但解决问题的方法是让系统对如何恢复做出合理的假设。

答案 4 :(得分:-1)

这意味着:“尽早捕捉错误”。如果可能的话,你想知道他们在那里就在那里=)。

越早发现错误,删除它就越便宜。如果你在编写错误的线路时就能知道错误,那就太棒了。您可能确切地知道您打算做什么,并且最有能力快速删除该错误。

另一方面,如果你只是在一个月后或者在它被释放后捕获了这个bug,那么伤害就会大很多。用户已经不得不处理它,你不会记得你在想什么(或者你甚至不会为公司工作,所以有人需要找出你的想法)。