验证优先开发:超越测试先行
Computer Things
Subscribe Archives March 18, 2025
验证优先开发
或者:为什么测试先行开发和测试驱动开发并不相同
前段时间,我在 Blue SiteFootnote 11 上争论说“测试先行开发 (TFD)”和“测试驱动开发 (TDD)”是不同的。前者是“在编写代码之前编写测试”,后者是一种范式、文化和规范的集合,它基于 TFD。更广泛地说,TFD 是验证优先开发 (Verification-First Development, VFD) 的一个特例,而 TDD 不是。
VFD:在编写代码之前,采取一些方法来验证代码是否正确,或者至少对将要采取的措施有所了解。
“验证”可能意味着编写测试,或者弄清楚如何在类型中编码不变性,或者添加契约,或者创建一个正式模型,或者编写一个单独的脚本来检查程序的输出。 只要有_一些_适当的东西就位,你就可以在构建代码的过程中运行它。 理想情况下,我们会为每个有趣的属性进行验证,但在实践中这很少可能。
通常,在代码部分完成之前,我们无法进行验证。 在这种情况下,弄清楚我们稍后将编写的验证仍然有帮助。 关键是要有一个_计划_并及时执行。
我使用“代码”作为我们程序员所做的任何事情的替代,而不仅仅是软件程序。 在使用约束求解器时,我尝试找到我知道答案的代表性问题。 在编写正式规范时,我在满足这些属性的设计之前弄清楚系统的属性。 在安全性和其他主题中可能也有等效项。
VFD 的好处
- 在编码之前进行验证可以降低我们完全跳过验证的可能性。 这相当于职业版的“做完作业才能看电视”。
- 如果我们首先在已知无法通过的代码上运行验证器,则更容易确保验证器正常工作。 调试可以工作的代码需要更多的自律。
- 我们可以在开发过程中更早地运行检查。 在破坏代码五分钟后意识到我们的代码已损坏,总比两个小时后意识到要好。
仅此而已,这些就是验证优先开发的好处。 这些也是以相对较少的投资获得_巨大的_好处。 VFD 的专门化,例如测试先行开发,可能具有更多好处,但也具有更多缺点。
VFD 的缺点
- 它会减慢我们的速度。 我知道很多人说“不,实际上它会让你从长远来看更快”,但那是_从长远来看_。 有时我们参加马拉松,有时我们冲刺。
- 验证会妨碍探索性编码,在这种编码中,我们不确切知道我们想要什么或如何做某事。
- 任何特定形式的验证都会对我们的代码施加压力,使其更容易使用该方法进行验证。 例如,如果我们主要通过类型不变量进行验证,我们需要弄清楚如何在语言的类型系统中表达这些东西,这可能不适合我们需要的特定不变量。Footnote 22
“压力”是否是一个真正的缺点存在很大争议
如果我必须总结是什么让“测试驱动开发”与 VFD 不同:Footnote 33
- 验证的形式应该专门是测试,而且是单元测试
- 测试压力总是好的。 “让你的代码更容易进行单元测试”与“让你的代码更好”相同。
这是所有各种“驱动”——TDD、Type Driven Development、Design by Contract——的共同点,即这种范式的目的是施加压力。 许多 TDD 专家声称,“拥有一个好的测试套件”只是 TDD 的次要好处,而真正的好处是它如何提高代码质量。Footnote 44
他们是否正确不是我想争论的事情:我看到这些方法都改善了我的代码结构,但也有时会恶化它。 无论如何,我认为压力总体上是 VFD 的一个缺点,尽管原因有些特殊。 如果没有压力,VFD 将完全独立于代码本身。 它将_只是_关于验证,我们的决定将完全取决于我们希望如何验证。 但是设计压力意味着我们的验证方法会影响我们正在检查的系统。 如果这些以某种方式冲突怎么办?
VFD 是一种技术,而不是一种范式
“技术”和“范式”之间的主要区别之一是范式彼此不能很好地协作。 如果你试图同时进行“正确”的测试驱动开发和“正确”的 Cleanroom,你的头就会爆炸。 而 VFD 作为一种“技术”意味着它可以与其他技术甚至许多完整的范式很好地协作。
开始使用它也不需要大量的练习。 在思考验证和使用所涉及的特定验证方法方面都需要练习才能_很好地使用_,但我们可以使用它不好,仍然受益。
- LinkedIn,你觉得我指的是什么?↩
- 在制作我自己的 sphinx 扩展时,这一点让我吃尽了苦头。 官方指南以一种高度动态的方式做事,Mypy 无法对其进行静态检查。 我不得不以一种完全不同的方式做事。 虽然最终结果更好!↩
- 有人会对我大喊大叫,说我完全错过了 TDD 的重点,那就是 XYZ。 好吧,猜猜怎么着,已经有人对我大喊大叫,说只有愚蠢的白痴才会认为 XYZ 在 TDD 中很重要。 放入你想要的任何 XYZ。↩
- 奇怪的是,所有范式都声称的另一件事:它们会带来更好的文档。 我可以看到这个论点,我只是觉得_每一个_都提出这个主张很奇怪!↩
如果您正在网络上阅读此内容,您可以在此处订阅。 每周更新一次。 我的主要网站是此处。 我的新书,Logic for Programmers,现在可以提前体验了! 在此处获取。
阅读更多:
-
Paradigms succeed when you can strip them for parts On the value of "scavenging" for paradigm adoption
-
I have complicated feelings about TDD They're not all good and not all bad
不要错过接下来会发生什么。 订阅 Computer Things: 你的电子邮件 (you@example.com) 订阅 评论并订阅 这封电子邮件由 Buttondown 为您提供,这是开始和发展您的新闻通讯的最简单方法。