我多次听说所有编程都是数学的一个子集.有些人认为 OO从根本上来说是以数学为基础的,但除了一些明显的例子外,我没有得到这种联系:
使用归纳来证明递归算法,
正式的正确性证明,
功能语言,
lambda演算,
渐近复杂度
一般而言,DFA,NFA,图灵机和理论计算,
而且盒子上的所有东西都是二进制的.
我知道数学对于编程非常重要,但我对这个"子集"视图感到困惑.编程数学子集的方式是什么?
我正在寻找可能与企业/ OO开发相关的解释,如果有足够强的连接,那就是.
从某种意义上说,它需要对算法等进行抽象思考.
它是工程学,涉及计划时间表,可交付成果,测试.
当你不知道它最终会如何发展时,这是艺术.
编程是应用数学最困难的分支之一; 较贫穷的数学家最好保持纯粹的数学家.
--EW Dijkstra
总的来说,请记住,数学是逻辑的正式编纂,这也是我们在软件中所做的.
您问题中的主题列表存在数学问题.我们能够在相当高的抽象水平上进行编程,因此原始数学可能不会让你盯着你.例如,你提到了DFA ..你可以在你的程序中使用正则表达式而不需要知道任何数学,但是当你想要设计一个好的正则表达式引擎时,你会发现更多的数学需求.
我想你已经找到了一个有趣的观点.编程是一门艺术,一门科学.有许多"交易工具",你不一定坐下来做很多高水平的数学,只是为了编写一个程序.事实上,当你编程时,你很多人并没有真正做很多数学或计算机科学.
当我们开始解决数学出现的计算机科学中的难题时.你走的越深,它就越能充实自己......通常在较低的抽象层次中.
还有一些编程领域,你不一定要工作,但它们涉及更多的数学.例如,虽然你可以学习一门语言并且在没有任何正式数学的情况下编写一些应用程序,但如果没有一些应用数学,你将无法在算法分析方面取得很大进展.
好的,我是大学的数学和CS专业.我会说如果集合A是数学而集合B是CS,则A与B相交.它不是子集.
毫无疑问,许多计算机科学的父亲和母亲都是像图灵和戴克斯特拉这样的数学家.大多数互联网创始人都是数学,物理或工程博士.计算机科学的大多数核心概念来自数学,但编程行为并非真正的数学.数学在日常生活中帮助我们,但两者并不相同.
但毫无疑问,计算机背后的原始推理是好的,计算的东西.在如此短的时间内,我们已经走了很长一段路.
不提编程,但想法仍然相关.
爱因斯坦在1917年被称为着名的数学家.直到广岛,广大公众终于认识到物理不仅仅是应用数学了.
当人们不理解某些东西时,他们会试图把它理解为一种他们理解的东西.他们以类比的方式思考.编程被描述为数学,工程,科学,艺术,工艺,建筑领域......这些都不是完全错误的; 它借鉴了所有这些.真正的问题是编程领域只有50年左右的历史.人们还没有把它融入他们的心理分类学中.
这里有很多混乱.
首先,"编程"(目前)并不等同于"计算机科学".当Dijkstra称自己为"程序员"(或多或少发明了标题)时,他并没有抽出CRUD应用程序,而是实际应用计算机科学.让我们不要混淆我们 - 今天,商业环境中的大多数程序员和计算机科学之间存在着巨大的差异.
现在,可以说,计算机科学是数学的一个分支; 但是,正如Knuth所指出的那样(在他的"计算机科学及其与数学的关系"一文中,收集在他的计算机科学论文中),也可以说数学是计算机科学的一个分支.
事实上,我强烈推荐这篇论文给任何想到数学与计算机科学之间关系的人,因为Knuth很好地阐述了这个领域.
但是,回到你原来的问题:对于一个从业者来说,"企业/ OO开发"与数学相去甚远 - 但这主要是因为大多数涉及低级操作的严肃数学已经被抽象出来了(编译器) ,操作系统,指令集等).类似地,驾驶汽车不需要先进的内燃机物理知识.当然,如果你想设计一款更高效的汽车......
如果您对数学的定义包括所有形式的形式逻辑,并且编程仅由代码中存在的逻辑和计算定义,则编程是数学QED的子集;-)
但这就像是说绘画只是在表面上涂上彩色颜料 - 它完全诠释了艺术,洞察力,直觉,整个创作过程
有人可能会说,音乐是同一推理的数学子集
所以我不得不说,编程不是数学的一个子集.编程使用数学子集,但也需要非数学技能/才能[很像音乐作品]
免责声明:我是一名IT顾问,主要开发门户和架构.我有心理学学位.我从未在大学学过数学.我完成了我的工作.而且通常都很好.为什么?因为我不认为你需要知道数学(如'重'数学的东西)来编写代码.您需要分析思维,解决问题的技能和高水平的抽象.但数学并没有给你这个.这只是另一门需要类似技能的学科.在处理可用性问题和数据存储时,我的心理学研究也适用于我的日常工作.语言学和符号学也发挥了作用.
但是等等,只是不要激怒我.我并不是说计算机根本不需要数学 - 显然,在设计加密算法和硬件等时你需要真正的数学技能 - 但是,如果像许多程序员一样,你只需要使用中/低级语言(像C)或更高级别的东西(比如C#或java),主要消耗预构建的框架和API,你真的不需要理解傅里叶变换或霍夫曼树或莫比斯条带背后的数学原理......让其他人处理那,让我在它上面建立价值.我不傻.我知道线性和指数算法和数据结构等之间的区别.我只是没有兴趣重写quicksort或一个漂亮的新视频压缩技术.
好吧,除了这一切......!
数学用于编程的许多方面,例如
创建高效智能的算法
理解大O符号
安全性(如RSA)
更多......我认为编程需要数学才能生存.但我不会把它称为子集.这就像吹玻璃使用物理属性一样,但那些艺术家并不称自己为物理学家.