编程是数学的一个子集吗?

66
我听说过很多次编程实际上是数学的一个子集。有些人建议面向对象编程在其根源上是基于数学的,但除了一些明显的例子外,我不理解这种联系:

  • 使用归纳法证明递归算法,
  • 形式化正确性证明,
  • 函数式语言,
  • λ演算,
  • 渐近复杂度,
  • 确定有限状态自动机、非确定有限状态自动机、图灵机和理论计算等,
  • 以及盒子里的所有内容都是二进制的事实。

我知道数学对编程非常重要,但我对这种“子集”观点感到困惑。编程在哪些方面是数学的一个子集?

如果有足够强的联系,我希望得到一个与企业/OO开发相关的解释。


39
编程也是艺术。 - ryw
3
每个计算机程序都可以在图灵机上编写,这是一种纯数学工具。它证明了编程是数学的一个子集。 - rafek
6
数学也是一种艺术。 - Andreas Rejbrand
1
我听过很多人说编程是数学的一个子集。但我从来没有听过任何了解编程、数学或两者都了解的人这么说过。 - Jon Hanna
微积分学(如牛顿微积分学)可以被视为“低层数学”(极限和牛顿导数的定义)到“高层数学”(牛顿微积分学)的抽象,这种抽象类似于面向对象范式中的抽象。 - user1300214
显示剩余2条评论
29个回答

84

从算法等方面需要进行抽象思考时,它属于数学范畴。
当涉及计划时间表、可交付成果、测试时,它是工程。
当你不知道最终结果会是什么时,它就是艺术。


3
有人知道他们的计划在开始时会变成什么样子吗? - hugoware
3
那意味着它始终是艺术。 - mpen
14
我会加上一句话:“当你试图向别人解释时,这就是巫术。” - bta

58

编程是应用数学中最难的分支之一;较差的数学家最好还是保持纯数学家身份。

--E. W. Dijkstra


1
真的吗?我认为优秀的数学家能够比大多数其他职业更快地理解代码,物理学家也一样。 - JGilmartin
一位优秀的应用数学家比一位纯粹的数学家更能理解代码。 - Mark Cidade
2
@MarkCidade - 你有任何类似证据来支持这个说法吗,即所有优秀的应用数学家比任何纯数学家更好地理解代码(无论是“好”还是不好)? - user554546
代码只是一种逻辑符号,就像数学符号一样。应用数学家需要理解希腊语、希伯来语和阿拉伯语。纯数学家需要关注的只是集合符号、方框和箭头。 - Mark Cidade
2
@MarkCidade - 哈哈大笑。当然,如果想在自己的符号中使用来自某种语言的字母,就必须对该语言完全流利。按照这一论点,所有说英语的人也都必须精通拉丁语和希腊语,对吧? - user554546

47

总的来说,记住数学是逻辑的正式编码,这也是我们在软件中所做的。

你问题中列出的主题都涉及到了数学问题。我们能够在相当高的抽象层次上进行编程,因此原始的数学可能并不会直接显露出来。例如,你提到了DFA...你可以在程序中使用正则表达式而不需要知道任何数学,但是当你想要设计一个好的正则表达式引擎时,你会发现更需要数学知识。

我觉得你碰到了一个有趣的点。编程既是一门艺术又是一门科学。有很多“工具”,而你并不一定需要坐下来做大量高级数学才能简单地编写一个程序。实际上,在你编程时,你可能并没有真正在做很多数学或计算机科学方面的事情。

只有当我们开始解决计算机科学中的困难问题时,数学才会出现。你深入研究的越深入,它就会以更低的抽象层次呈现出来。

还有一些编程领域并不一定需要你工作,但它们涉及更多的数学。例如,虽然你可以学习一种语言并编写一些应用程序而不需要任何正式的数学,但在没有一些应用数学知识的情况下,你无法在算法分析方面取得很大进展。


3
有人认为数学也是一门艺术,一旦你掌握了基本理论并开始为一些更有趣的问题找到证明,就可以进行推理。虽然结果可能遵循严格的规则,但是得出这些规则的过程不需要(甚至应该不要)呈现刻板和死板的形式。 - Adam Luchjenbroers
4
我们不使用数学,我们使用逻辑。逻辑是数学的超集。如果没有涉及数字,那就不是数学。数学是处理数字的逻辑子集。 - user213265
22
boytheo说“数学是处理数字的逻辑子集”。我/强烈/不同意。询问任何一位数学家,他们都会说数学包含拓扑学,涉及形状,以及代数学,涉及结构等。此外,如果你碰巧询问一个使用ZFC作为数学基础的人,他们会告诉你,数学是应用于/集合/的形式逻辑,而不是数字。好吧,除了我们将数字用作某些集合的名称之外,例如0={},1={0},2={0,1}等,并且根据我们对数字的直观理解来考虑这些集合之间的关系(即2+2=4,而不是2+2={0,1,2,3})。 - Jonas Kölker
6
你可能会认为“算术”是逻辑学的一个子集,处理数字,但有很多数学与数字无关。 - bta

32

虽然没有提到编程,但这个想法仍然很相关。


哦,没有鼠标悬停文本... :( - Sebastian Mach
我喜欢XKCD,但我不同意这个观点。 - alan2here
2
@alan2here http://xkcd.com/386/ :) - personaelit

32

好的,我在大学主修数学和计算机科学专业。如果集合A代表数学,集合B代表计算机科学,那么它们的交集为A intersects B,而不是A是B的子集。

毫无疑问,计算机科学的许多创始人,如图灵和迪克斯特拉等,都是数学家。互联网的大多数创始人要么是数学、物理或工程专业的博士。计算机科学的大部分核心概念来自于数学,但编程本质上并不是数学。数学帮助我们在日常生活中,但两者并不相同。

然而,毫无疑问,计算机最初的设计目的就是进行计算。在这么短的时间内,我们已经走过了很长的路。


我同意 - 数学构成了大多数计算机系统的重要部分,但编程不一定是数学。在我看来,大多数程序的核心基础是它们所代表的逻辑。逻辑和数学是不同的,尽管有关联。 - Dr8k

24

1917年,爱因斯坦作为一名著名的数学家而被人们所知。直到广岛事件发生后,普通大众才最终意识到物理学不仅仅是应用数学。

当人们不理解某些东西时,他们会尝试把它视为他们所理解的东西的一种类型。他们通过类比思考。编程曾被描述为数学、工程、科学、艺术、手工艺、建筑等领域。这些都不是完全错误的;编程从中借鉴了各方面的知识。真正的问题是编程领域只有大约50年的历史。人们还没有将其融入到他们的心智分类中。


19

这里有很多混淆。

首先,“编程”目前并不等同于“计算机科学”。当Dijkstra称自己为“程序员”(更或者说是发明了这个称号)时,他不是简单地制作CRUD应用程序,而是进行应用计算机科学。让我们不要被这个概念混淆-今天,在商业环境中,大多数程序员所做的事情与计算机科学之间存在巨大差异。

现在,可以说计算机科学是数学的一个分支;但正如Knuth所指出的(在他的论文“计算机科学及其与数学的关系”中,收录在他的计算机科学选集中),也可以认为数学是计算机科学的一个分支。

实际上,我强烈推荐这篇论文给任何考虑数学和计算机科学关系的人阅读,因为Knuth将领域划分得非常清晰明了。

但是,回到你最初的问题:对于从业者来说,“企业/OO开发”与数学相去甚远-但这主要是因为操作的较低级别所涉及的严肃数学问题已被抽象化了(通过编译器、操作系统、指令集等)。同样,对于驾驶汽车来说,并不需要先掌握内燃机的高级知识。当然,如果你想设计更高效的汽车......


2
我同意。如果我可以详细说明一下,大多数盎格鲁-撒克逊传统中所谓的“计算机科学”更类似于应该称为“软件工程”的内容。概念建模、工作量估算和其他我们开发人员每天执行的任务与科学无关。 - CesarGon

10

如果您的数学定义包括所有形式的形式逻辑,而编程仅通过代码中存在的逻辑和计算来定义,则编程是数学的一个子集 QED ;-)

但这就像说绘画只是在表面上涂上彩色颜料 - 它完全忽略了艺术、洞察力、直觉、整个创作过程

有人可能会用同样的推理认为音乐是数学的一个子集

因此,我必须说不,编程不是数学的一个子集。编程使用数学的一个子集,但也需要非数学技能/才能 [就像音乐创作一样]


+1 如果使用 Q.E.D.,欧几里得会感到自豪。 - Zach Johnson

6
免责声明:我是一名IT顾问,主要开发门户和架构相关的内容。我拥有心理学学位,但在大学里从未学过数学。尽管如此,我的工作做得很好,因为我认为编写代码并不需要掌握数学(即“重型”数学知识)。你需要具备分析思维、解决问题的能力和高度的抽象思维。但数学并不能给你这些东西,它仅仅是需要类似技能的另一门学科。我在心理学方面的研究也适用于我处理可用性问题和数据存储的日常工作中。语言学和符号学也扮演了一定的角色。
但请等一下,不要急着批评我。我并不是说电脑完全不需要数学——显然,在设计加密算法和硬件等方面,你需要真正的数学技能——但如果像许多程序员一样,你只是使用中低级语言(比如C)或更高级别的语言(比如C#或Java),大多数情况下消耗预先构建的框架和API,那么你并不真正需要理解傅立叶变换、哈夫曼树或莫比乌斯带背后的数学原理……让其他人处理这些,让我在其之上构建价值。我并不傻,我知道线性和指数算法以及数据结构的区别等。我只是对重写快速排序或一个新的视频压缩技术没有兴趣。

1
你说得完全正确:编程并不需要数学知识,就像驾车不需要了解机械原理一样。当然,这并不意味着编程不是基于数学的。同样,任何人在不了解机械原理的情况下都无法制造汽车... - nico

5

嗯,撇开这一切,除此以外...!

数学在编程的许多方面都被使用,例如:

  • 创建高效和智能的算法
  • 了解大O符号
  • 安全性(比如RSA)
  • 还有更多...

我认为编程需要数学才能生存。但我不会说它是一个子集。这就像吹玻璃使用物理属性一样,但这些艺术家不会称自己为物理学家。


对啊...我完全明白数学对编程的重要性,但是我对子集参数有些困惑。 - moffdub
数学在编程中被使用。但这并不意味着编程就是数学。数学被用于金融、汽车制造、房屋建设。数学被用于计算假期应该持续多久。这是否意味着假期就是数学?编程与数学完全不同。我们解决问题,而不是方程式。此外,我不同意有人说逻辑是数学的子集。事实上恰恰相反,数学是逻辑的子集。从这个意义上讲,我们可以很容易地理解,当我们进行编程时,我们正在进行逻辑推理,而不是数学 :) - user213265

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接