我多次听说所有编程实际上都是数学的一个子集。一些人认为OO 从根本上讲是基于数学的,但除了一些明显的例子外,我不明白其中的联系:
- 使用归纳法证明递归算法,
- 形式正确性证明,
- 函数式语言,
- λ演算,
- 渐近复杂度,
- DFA、NFA、图灵机和一般的理论计算,
- 而且盒子上的所有东西都是二进制的。
我知道数学对编程非常重要,但我在这个“子集”视图中挣扎。以什么方式编程数学的子集?
我正在寻找一个可能与企业/OO 开发相关的解释,如果有足够强的连接,那就是。
从某种意义上说,它是数学,它需要对算法等进行抽象思考。
当它涉及计划时间表、可交付成果、测试时,它是工程。
当你不知道最终结果如何时,这就是艺术。
编程是应用数学中最难的分支之一;贫穷的数学家最好还是纯粹的数学家。
——EW 迪克斯特拉
总的来说,请记住数学是逻辑的正式编码,这也是我们在软件中所做的。
您问题中的主题列表充满了数学问题。我们能够在相当高的抽象水平上进行编程,因此原始数学可能不会让您眼前一亮。例如,您提到了 DFA。您可以在不知道任何数学知识的情况下在程序中使用正则表达式,但是当您想要设计一个好的正则表达式引擎时,您会发现对数学的需求更大。
我认为你找到了一个有趣的观点。编程是一门艺术,也是一门科学。有很多“交易工具”,你不一定要坐下来做很多高级数学才能简单地编写程序。事实上,当你在编程时,很多人并没有真正做太多的数学或计算机科学。
当我们开始解决计算机科学中的难题时,数学就出现了。你走得越深,它就会越充实……通常是在较低的抽象层次上。
还有一些编程领域你不一定要工作,但它们涉及更多的数学。例如,虽然您当然可以在没有任何形式数学的情况下学习一门语言并编写一些应用程序,但如果没有一些应用数学,您在算法分析方面不会走得太远。
没有提到编程,但想法仍然是相关的。
好的,我在大学时是数学和CS专业的。我会说如果集合 A 是 Math 而集合 B 是 CS,那么 A 与 B 相交。它不是一个子集。
毫无疑问,计算机科学的许多父亲和母亲都是像图灵和戴克斯特拉这样的数学家。互联网的大多数创始人都是数学、物理或工程学博士。计算机科学的大多数核心概念都来自数学,但编程行为并不是真正的数学。数学在我们的日常生活中帮助我们,但两者并不相同。
但毫无疑问,计算机背后的最初原因是很好地计算事物。在这么短的时间内,我们已经从那里走了很长一段路。
爱因斯坦在 1917 年被称为著名的数学家。直到广岛,公众才终于意识到物理学不仅仅是应用数学。
当人们不理解某事时,他们会尝试将其理解为他们确实理解的某种事物。他们以类比的方式思考。编程被描述为一个数学、工程、科学、艺术、工艺、建筑的领域……这些都不是完全错误的;它借鉴了所有这些。真正的问题是编程领域只有大约 50 年的历史。人们还没有将它整合到他们的心理分类中。
这里有很多混乱。
首先,“编程”(目前)不等于“计算机科学”。当 Dijkstra 称自己为“程序员”(或多或少发明了这个头衔)时,他并不是在开发 CRUD 应用程序,而是实际上在做应用计算机科学。让我们不要让这让我们感到困惑——今天,大多数程序员在商业环境中所做的事情与计算机科学之间存在巨大差异。
现在,可以说计算机科学是数学的一个分支。但是,正如 Knuth 指出的(在他的论文“计算机科学及其与数学的关系”中,收集在他的计算机科学论文选集中),也可以说数学是计算机科学的一个分支。
事实上,我强烈推荐这篇论文给任何思考数学和计算机科学之间关系的人,因为 Knuth 很好地展示了这个领域。
但是,回到您最初的问题:对于从业者来说,“企业/OO 开发”与数学相去甚远——但这主要是因为在较低级别的操作中涉及的大部分严肃数学已被抽象掉(由编译器、操作系统、指令集等)。同样,驾驶汽车也不需要具备内燃机物理学的高级知识。当然,如果你想设计一辆更高效的汽车......
如果您对数学的定义包括所有形式的形式逻辑,并且编程仅由代码中现有的逻辑和计算定义,那么编程是数学 QED 的子集;-)
但这就像说绘画只是将彩色颜料放在表面上——它完全忽略了艺术、洞察力、直觉和整个创作过程
有人可能会争辩说,音乐是数学的一个子集,同样的推理
所以我不得不说不,编程不是数学的一个子集。编程使用数学的一个子集,但也需要非数学技能/才能[很像音乐创作]
免责声明:我是一名 IT 顾问,主要开发门户和架构的东西。我有心理学学位。我在大学里从来没有学过数学。我完成了我的工作。而且通常很好。为什么?因为我认为您不需要了解数学(如“重”数学知识)来编写代码。你需要分析思维、解决问题的能力和高水平的抽象。但数学不会给你那个。这只是另一个需要类似技能的学科。在处理可用性问题和数据存储时,我在心理学方面的研究也适用于我的日常工作。语言学和符号学也发挥了作用。
但是等等,只是不要让我发火。我并不是说计算机根本不需要数学——显然,在设计加密算法和硬件等时你需要真正的数学技能——但是,作为许多程序员,如果你只是使用中/低级语言(像 C)或更高级别的东西(如 C# 或 java),主要使用预先构建的框架和 API,您并不需要了解傅立叶变换或霍夫曼树或莫比乌斯带背后的数学原理......让其他人处理那,让我在它之上建立价值。我不傻。我知道线性和指数算法以及数据结构等之间的区别。我只是没有兴趣重写快速排序或漂亮的新视频压缩技术。
好吧,除此之外……!
数学用于编程的许多方面,例如
我们所做的一切的基础是数学。
幸运的是,我们不需要擅长数学本身就可以做到这一点。就像你不需要了解物理学来驾驶汽车甚至驾驶飞机一样。
编程和纯数学的区别在于状态的概念。
看看http://en.wikipedia.org/wiki/Dynamic_logic_(modal_logic)。这是一种对随时间变化的事物进行数学分析的方法。此外,Hoare 三元组是一种形式化程序输入输出行为的方法。通过一些公理处理程序的顺序组合以及分配的工作原理,您可以完美地以数学上严格的方式处理状态随时间的变化。
如果你知道的数学不够,“发明”一些新的数学来处理你想要分析的东西。牛顿和莱布尼茨这样做是为了分析(我认为也就是微积分)。没有理由不为计算和编程而这样做。
我不相信我听说过编程是数学的一个子集。即使您提供的链接也只是一种建议的编程方法(不声称它是数学的一个子集),并且 wiki 页面也有很多分歧。
编程需要(至少一些)应用数学。数学可以用来帮助描述和分析程序和程序片段。编程与数学有着非常密切的关系,并大量使用它和其中的概念。但是子集?不。
我很想看到有人真正声称这是一个有明确理由的人。我想我从来没有
仅仅因为你可以用数学来推理某事并不意味着它是,事实上,一个数学对象。数学用于推理内燃机、放射性衰变和杂耍模式。使用数学不是在做数学。
我会说...
部分是数学,尤其是在理论层面。想象一下设计高效的搜索/排序/聚类/分配/fooifying算法,这就是数学......从数论到统计学的各个领域。
这部分是工程。复杂系统很少能达到理想的性能和可靠性水平,软件也不例外。许多软件开发都是为了在面对不可靠的硬件和(咳咳)人类时实现稳健性。
它部分是艺术。创造性和独特的软件设计经常会产生伟大的新想法……比如汇编语言、多任务操作系统、图形用户界面、动态语言和网络。
只是我的2美分...
数学+艺术+逻辑
你实际上可以争辩说,逻辑证明形式的数学类似于编程——
查看库里-霍华德的对应关系。这可能更像是数学家看待事物的方式,但我认为这正中了众所周知的钉子。
编程可能最初是作为数学的一个准子集开始的,但随着时间的推移,该领域日益复杂,导致编程成为为信息处理和计算创建良好抽象的艺术和科学。
编程确实涉及数学、工程和良好设计和实现的审美意识。算法是数学的延伸,系统工程方面在一定程度上与其他工程学科重叠。然而,无论是数学还是其他工程领域都对复杂、灵活且易于理解的抽象具有同等程度的需求,这些抽象可以在许多不同的层次上使用和调整,以解决新的和不断发展的问题。
对有用、灵活和动态抽象的需求首先导致了函数库的创建,然后是类/组件库,以及最近几年的设计模式和面向服务的架构。尽管后者更多地关注设计,但它们是对在编程问题和解决方案之间建立高级抽象桥梁的日益增长的需求的反应。
由于所有这些原因,编程既不是数学的子集,也不是数学的超集。它只是另一个使用数学的领域,其根源比其他领域更深。
您列出的主题是理论计算机科学中的主题,这是纯数学的一个分支。编程是一门使用理论计算机科学的应用科学。编程本身不是数学的一个分支,而是编程语言所基于的 Lambda 微积分/计算理论/形式逻辑/集合论等。
我也完全不同意 Dijkstra。它要么是自我祝贺,要么是 Dijkstra 被错误引用/断章取义。纯数学是一个非常非常非常困难的领域。它是如此的抽象,以至于应用数学的任何一个分支在难度上都没有可比性。这是一个需要巨大想象力飞跃的领域。我获得了计算机科学的第一个学位,主要关注理论 CS 和编程、操作系统、编译器等应用领域。我还获得了电气工程学位——可以说是工程中最困难的分支——并研究了应用数学的困难领域,如麦克斯韦方程、控制理论和一般的偏微分方程。我还研究过应用数学和纯数学,直到今天我发现应用要容易得多。至于纯粹的数学家,
现在有人倾向于学习一两年的微积分而不受应用程序的影响,并得出结论认为纯数学很容易。他们不知道他们在说什么。研究微积分甚至是与应用无关的拓扑学并不能让您对纯数学家所做的事情有所了解。实际证明这些定理的任务非常困难,我将听从计算机科学家的意见来指出其中的区别:“如果 P = NP,那么世界将与我们通常假设的完全不同。有在“创造性的飞跃”中没有特别的价值,在解决问题和一旦找到解决方案之间没有根本的差距。每个能够欣赏交响乐的人都是莫扎特;每个能够循序渐进的论证的人都是高斯。 ..”
I think mathematics provides a set of tools for programmers which they use at abstract level to solve real world problems.
我想说的是,当我们升级到第四代语言时,编程不再像以前那样关注数学了。汇编非常关注数学,C#,而不是那么多。想法?
如果你只是想要你老板给你的设计规范,那么它的数学并不多,但这样的工作一点也不好玩......但是,想出如何做事确实需要数学思想,至少是东西像抽象,图表,有时是数论的东西,取决于问题,微积分。就个人而言,我参与编程的越多,我就越能看到它的数学方面。但是,在大多数情况下,IMO,您可以从图书馆中拿起这本书并查找您需要做的事情的基础知识,但这需要预先掌握一些数学知识。
如果不了解其背后的数学原理,您真的无法设计“好的”算法。在 google 中搜索只能带您到此为止。
编程是一个太宽泛的主题。好的软件不仅基于数学(逻辑),还基于心理学、语言学等。算法是数学的一部分,但除了算法之外,还有许多其他与编程相关的东西。
作为一名数学家,我很清楚数学不等于编程,但用于解决任一学科问题的过程都非常相似。
解决更高层次的数学问题需要分析性思维、解决问题的可能方法的工具箱、该领域的经验以及一些形式化的构建答案的方法,以便其他数学家同意。如果你找到了一种特别聪明、抽象或优雅的解决问题的方法,你会得到你的数学家同事的赞誉。对于特别困难的数学问题,您可以分阶段解决问题,并使用称为猜想和证明的东西编写您的阶段论据。
我认为编程涉及相同的技能集。在编程中,同样的一套原则适用于解决和提出问题的解决方案。当您对编程困境有部分解决方案时,您可以将其作为个人库的一部分,并在以后将其用作另一个更大问题的一部分。这些技能似乎与数学中使用的技能非常相似。
数学和编程之间的主要区别在于,与数学相比,后者在不同的编程学科之间有更多的共同点。数学的两个领域在表现形式和用于交流领域的内容上可能非常非常不同。相比之下,至少对我而言,编程结构在许多不同的语言中看起来非常相似。
编程和纯数学的区别在于状态的概念。程序是使用逻辑(数学)在状态之间转换的状态机。用于在状态之间转换的实际逻辑通常非常简单,这就是为什么作为一名数学天才并不一定对程序员有那么大的帮助。
我成为程序员的部分原因是我不喜欢数学。我对数学本身没有问题,从概念上讲我很好,我只是不喜欢手工计算。当我发现我可以告诉计算机数学问题是什么并让它为我计算时,我一生的激情和事业就诞生了。
为了回答这个问题,根据我的母校,数学 == 编程,因为他们允许我参加 C++ 简介来满足我的数学要求。
编辑: 我应该提到我的学位是电信专业,当时只有一学期的标准文科数学要求。
数学是真理的最纯粹形式。一切都继承自数学。
阿门。
将编程与音乐进行比较也很有趣。无论如何,在英国,有基于计算的本科大学课程将根据所涉及的逻辑,模式等原因,以音乐资格为基础接受申请者。
数学很强大,编程很强大,如果数学是编程的一个子集,那么同样可以说编程是数学的一个子集。
数学是用语言描述的,通常是写下来的。因此,数学也是写作的一个子集吗?
从历史上看,数学先于计算机编程,但列表和过程可能先于数学,这两者都可以同样被认为是数学或与编程有关。
当然,编程可以用数学来表示,所以有一些基础可以证明编程是数学的一个子集。然而,计算机程序也可以实现数学,象征性地表示信息,就像数学通常在纸上完成时所做的那样,包括从基本公理出发的无限且仅在一定程度上定义的,以及允许定义相互使用的更高层次的结构和组合之外的其他类型的关系,支持图表的绘制并允许系统扩展。数学同样是编程的一个子集。
虽然数学可以表示诸如单词之类的结构,但数学是关于数字的设计。例如,字符串比数学更具编程性。
一半是数学,一半是人说话,呵呵。