在观看了 Michael Feather 的 SCNA 演讲“自我教育和工匠”之后,我很想听听离散数学证明有用的软件开发中的实际示例。
6 回答
离散数学已经触及软件开发的各个方面,因为软件开发的核心是计算机科学。
http://en.wikipedia.org/wiki/Discrete_math
阅读该链接。您将看到有许多实际应用,尽管这个维基百科条目主要是在理论上讲。
我在大学的离散数学课程中学到的技巧在 Layton 教授的游戏中帮助了我很多。
这算得上是有帮助的……对吧?
有很多现实生活中的例子,地图着色算法是有用的,除了着色地图。我期末考试的问题与六向交叉路口的红绿灯编程有关。
正如 San Jacinto 所指出的,编程的基础与离散数学密切相关。此外,“离散数学”是一个非常广泛的术语。这些事情可能使挑选特定示例变得更加困难。我可以想出一些,但还有很多很多其他的。
编译器实现是一个很好的示例来源:显然那里有自动机/形式语言理论;寄存器分配可以用图形着色表示;用于优化编译器的经典数据流分析可以用格状代数结构上的函数来表示。
一个使用有向图的简单示例是在构建系统中,该系统通过执行拓扑排序来获取各个任务中涉及的依赖关系。我怀疑,如果您尝试在没有有向图概念的情况下解决此问题,那么您最终可能会尝试使用繁琐的簿记代码在整个构建过程中跟踪依赖关系(然后发现您对循环依赖并不优雅)。
显然,大多数程序员不会编写自己的优化编译器或构建系统,因此我将根据自己的经验选择一个示例。有一家公司为卫星导航系统提供道路数据。他们希望对他们的数据进行自动完整性检查,其中之一是网络应该全部连接起来,即应该可以从任何起点到达任何地方。通过试图找到所有位置对之间的路线来检查数据是不切实际的。然而,可以从道路网络数据中导出一个有向图(以它编码诸如转弯限制之类的东西的方式),这样问题就可以简化为找到图的强连通分量 - 一个标准图 -由有效算法解决的理论概念。
我一直在学习软件测试课程,其中 3 节课专门用于复习与测试相关的离散数学。从这些方面考虑测试计划似乎真的有助于使测试更有效。
特别是对集合论的理解对于数据库开发尤其重要。
我敢肯定还有许多其他应用程序,但这里想到的是两个。
只是众多例子之一...
在构建系统中,使用拓扑排序的作业很流行。
我所说的构建系统是指我们必须管理具有依赖关系的作业的任何系统。
它可以是编译程序、生成文档、构建建筑物、组织会议——因此在任务管理工具、协作工具等方面都有应用。
我相信测试本身正确地从 modus tollens 开始,一个命题逻辑的概念(以及因此离散数学),modus tollens 是:
P=>Q。!Q,因此 !P。
如果为 P=>Q 插入“如果功能正常工作,则测试将通过”,然后将 !Q 视为给定(“测试未通过”),那么,如果所有这些陈述实际上都是正确的,您有一个有效的、合理的基础来返回该功能以进行修复。相比之下,许多,也许是大多数测试人员都遵循以下原则:
“如果程序运行正常,测试将通过。测试通过,因此程序运行正常。”
这可以写成:P=>Q。Q,因此 P。
但这是“肯定结果”的谬误,并没有显示测试人员认为它显示了什么。也就是说,他们错误地认为该功能已经“验证”并且可以发货。当给定 Q 时,P 实际上可能是真的,也可能是不真的,因为 P=>Q,这可以用真值表来表示。
Modus tollens 是 Karl Popper 将科学视为伪造的概念的核心,测试应该以大致相同的方式进行。我们试图证伪该功能在任何显式和隐式情况下始终有效的说法,而不是试图验证它是否在狭义上有效,即它可以以某种被禁止的方式工作。