【Hacker News搬运】不变量的问题是它们会随着时间的推移而变化
-
Title: The problem with invariants is that they change over time
不变量的问题是它们会随着时间的推移而变化
Text:
Url: https://surfingcomplexity.blog/2024/03/26/the-problem-with-invariants-is-that-they-change-over-time/
Cliff L. Biffle 在他的博客中撰写了一篇关于在 Oxide 进行调试冒险的文章,标题为《Who killed the network switch?》。文章中提到,当时的代码是正确的,但它基于一个假设,即任何借用的内存都可以 fit into one region。然而,当 Matt 实施了任务打包后,这个假设变得过时了,但没有人注意到。这篇代码仍然简单易读,但现在也是错误的。 这种假设是所谓的 _invariant_,即系统的不变性,它应该随着时间的推移而保持不变。在形式方法中,不变性扮演着重要的角色(例如,参见 Hillel Wayne 的 [Learn TLA+](https://www.learntla.com/index.html) 网站上的 [Writing an invariant](https://www.learntla.com/core/invariants.html) 一节)。 现在,考虑以下几点: * 我们的系统会随着时间的推移而改变。特别是,我们总是进行修改以支持在系统生命周期的早期无法预见的新功能。 * 我们的代码通常依赖于一些 _invariants_,这些是目前适用于我们系统的属性,我们假设它们将永远为真。 * 这些不变性是 _implicit_ 的:这些假设本身并没有在源代码中显式表示。这意味着没有简单的方法,例如,通过静态分析来机械提取它们。 * 一个改变可能会发生在任意远离依赖不变性正常工作的代码的地方,这个改变违反了假设的不变性。 这意味着这类故障模式是 _inevitable_ 的。如果你在这个行业待得足够久,你几乎肯定遇到过一个由新的改变导致的隐式不变性被违反的事件。如果你的系统活得足够长,它将会改变。最终,其中一个变化将使某人很久以前做出的假设变得无效,这个假设在当时是一个合理的假设。 隐式不变性,本质上,无法明确地强制实施。它们是时间炸弹,而且无处不在。 **发布日期**:2024 年 3 月 26 日。
Post by: kiyanwang
Comments:
kibwen: I'm happy to see people talking about the problem posed by implicit invariants, but this post strikes me as defeatist. This line especially:<p><i>> Implicit invariants are, by definition, impossible to enforce explicitly.</i><p>Yes, Hyrum's Law (and, at the limit, Rice's Theorem) and all that means that we won't ever be perfect, but just because an invariant is currently implicit doesn't mean it must remain implicit forever. We can identify classes of implicit invariants and make them explicit using things like type systems.
kibwen: I-;我很高兴看到人们谈论隐含不变量带来的问题,但这篇文章让我觉得是失败主义者。尤其是这一行:<p><i>>;根据定义,隐式不变量是不可能显式强制执行的</i> <p>是的,Hyrum;s定律(以及,在极限情况下,Rice定理),所有这一切都意味着我们赢了;t曾经是完美的,但仅仅因为不变量当前是隐式的;我的意思是它必须永远保持隐含。我们可以识别隐式不变量的类,并使用类型系统等方法使它们显式。
throwaway74432: Yes, it's called evolution. Software evolves as well as scales. Scaling is architected growth, evolution is unarchitected growth. (Sometimes scaling results in unarchitected growth, if the architecture was not reasonable.) There are many patterns for handling evolution, but they almost always involve a pattern outside of the existing architecture (a super architecture) to lean on for support. In my opinion, codifying and optimizing these super architecture patterns is one of the highest goals in software engineering because they allow for less error prone evolutions.
throwaway74432: 是的,它;这叫做进化。软件随着规模的发展而发展。规模化是有架构的增长,进化是无架构的增长。(如果体系结构不合理,有时扩展会导致非体系结构的增长。)有很多处理进化的模式,但它们几乎总是涉及现有体系结构(超级体系结构)之外的模式来获得支持。在我看来,编译和优化这些超级体系结构模式是软件工程的最高目标之一,因为它们允许较少出错的演变。