编程是否需要数学知识?

117

我在大学期间曾与一位朋友辩论过:对于任何资深程序员来说,高级数学是否必要。他坚决反对这一点。他认为,程序员只需要从高中或大一的基础数学知识入手,没有必要去学习更深入的数学知识,几乎所有的编程任务都可以在不需要高深数学知识的情况下完成。然而他也强调了算法是程序员必备的基础技能。

我的立场是,计算机科学的进步几乎完全依赖于数学的进步,因此深入了解数学将有助于程序员在处理实际世界中具有挑战性的问题时取得更好的成果。

我仍然不能确定哪一方的观点是正确的。您可以从自己的经验出发告诉我们您的立场吗?


7
十年后,我给我的高中数学老师打了电话,告诉他我从未在整个职业生涯中使用过高级数学。我知道这是不好的行为,但这是一个很好的问题!加一分。 - Chris McCall
2
https://dev59.com/n3VC5IYBdhLWcg3w4VRz和来自http://stackoverflow.com/search?q=should+I+study+math的许多其他问题 - dmckee --- ex-moderator kitten
请查看此问题中得票最高的答案。 - Boris Stitnicky
不是关闭,而是应该迁移到程序员。 - Chris Cudmore
71个回答

111
回答你的问题,我必须说:"不,数学对于编程并非必需。" 然而,正如其他人在此线程中所建议的那样,我相信理解数学和能够“算法思维”之间存在关联。也就是说,能够抽象地思考数量、过程、关系和证明。
我大约9岁时开始编程,当时学到的数学知识还不多。然而,经过一些努力,我能够理解变量、for循环、goto语句(请原谅我,当时我使用的是Vic 20 BASIC,还没有读过Dijkstra的任何书)以及基本的坐标几何来在屏幕上制作图形。
我最终获得了纯数学荣誉学位和计算机科学辅修学位。虽然我主要专注于分析,但我也学习了相当多的离散数学、数论、逻辑和可计算性理论。除了能够将统计学、概率论、向量分析和线性代数的一些思想应用于编程外,我在本科期间研究的很少有直接应用于商业和研究编程的数学学科。
然而,我坚信数学所要求的形式化思维方法——谨慎的推理、寻找反例、建立公理基础、发现概念之间的联系——在我处理大型复杂编程项目时非常有帮助。
考虑运动员为他们的运动训练的方式。例如,足球运动员无疑会花费大量时间在基本足球技能上。然而,为了提高他们的身体素质,他们可能还会在健身房里骑自行车或划船机器,做举重等等。
学习数学就像是进行举重或交叉训练,以提高你在编程方面的心理力量和耐力。当然,练习基本的编程技能是绝对必要的,但学习数学是一种不可思议的心理锻炼,可以提高你的核心分析能力。

6
我想强调的是,数学不仅是锻炼你思维能力的“举重训练”,还可以为你打开新问题和解决方案的大门。例如,在我的图像处理实习期间,如果没有深刻理解偏微分方程,我就无法实现我们的降噪算法。最终的代码简单明了,但非常精确。正是数学帮助我们达到了这个目标。更令人惊奇的是,这些公式的美妙之处。一小段偏微分方程式可以转化为几页代码。如果没有最初的公式,很难想象你会得到它。 - Joe
编程并不需要数学,因为编程本身就是数学。它可以是好的数学,也可以是糟糕的数学(比如将猩猩的长鸣转写成Ook语言时),但每当程序员设计某个对象模型时,他通常会无意识地进行一种数学行为。所以,再次强调,一个人不需要读数学书才能编程,但这并不改变编程是数学的事实,正如欧几里得所说,没有捷径可走。 - Boris Stitnicky

56
虽然编程不一定需要高深的数学知识(除非你要编写高级数学能力方面的程序),但编程和数学的思维过程非常相似。你从已知的基础出发(公理、已被证明的理论),试图到达某个新的地方。你不能跳过步骤。如果你跳过了步骤,那么你就需要填补空白。这是一个关键的思维过程,使这两个领域极其相似。
此外,数学家和程序员都在抽象层面上进行批判性思考。真实世界中的事物由对象和变量表示。能够从具体转换为抽象也将这两个领域联系起来。
如果你擅长其中一个,很可能你也会擅长另一个。

因此,你可以说那些经常做填字游戏或玩Scrabble的人比不做这些的人更有可能擅长编程。这种关系似乎是基于可能性而非严格的依赖关系。 - Liam
数学解决问题的严谨和纪律感可以转化为编程。在这两个领域中,你需要有能力分解问题并从显而易见的方向开始解决,然后再从更具创造性的方向进行探索。 - Bramha Ghosh
4
我很钦佩的两位大牛程序员并没有学过计算机科学,他们受过数学方面的训练,后来改变了职业方向:Miguel de Icaza 和 Alexander Stepanov。顺便一提,Stepanov曾经说过,在研究数学时,“你不是从公理开始,而是最后得到了公理” :D - Joe Pineda
@Liam - 这涉及到模式匹配和在短期内在内存中操作数据。这两种活动都需要这些技能。 - jcolebrand
"如果你在其中一种编程语言很擅长的话,那么很有可能你也能很擅长另一种。" - Thorbjørn Ravn Andersen

39

计算机科学 ≠ 编程

说真的,我认识一些好的和不好的程序员,他们的专业背景有英语、心理学和计算机科学等。一些我很崇拜的著名开发人员并没有计算机科学的背景,比如Perl的Larry Wall是语言学家。 另一方面,了解你正在工作的领域对你很有帮助,因为这样你至少可以看到你的数据是否有意义,并帮助客户/用户深入了解他们真正想要的东西。 当然,还有计算复杂度、高效数据结构和程序正确性等问题。这些是你在计算机科学中学到的,对于几乎任何领域都有用,但它们既不必要也不充分。


12
我认为我听过的最好的一句话是:“计算机科学与天文学一样,不是关于计算机或望远镜的。”(Dijkstra) - tloach
5
我认为stackoverflow.com 的创建基本上是为了克服这种单行回答,然而有15个志同道合的人将这个无用的答案推到了榜首。我对你没有个人恩怨,但我已经举报了你的答案为“冒犯性”。至少在我看来是这样的。 - simsim
2
@simsim:我觉得人们认为CS学位与编程有关是很无礼的。 - tloach
3
不管Joel和Jeff创建这个网站时想的是什么,重要的是要创建一个程序员互相帮助的社区。我认为David的简短回答非常到位。+1 - Scottie T
@ Scottie:如果只是“创建一个程序员互相帮助的社区”,那么论坛和邮件列表就足够了。也许我的回答有点严厉,但看到15个用户投票支持一个完全不知所措的“答案”还是很惊讶的,当然,在编辑之前是这样的。 :-) - simsim

29

我猜我会成为第一个告诉你需要数学的人。正如其他人所说,数学在某些开发方面并不是非常重要,但批判性思维和结构化分析的基础非常重要。

更重要的是,数学在理解调度器、优化、排序、协议管理和计算机的许多其他方面所涉及的基础知识方面非常重要。尽管从计算水平上涉及的数学不太复杂(主要是高中代数),但理论和应用可能相当复杂,因此通过对微积分的扎实理解将大有裨益。

你完全可以没有数学知识,不应该让对数学了解不够深入阻碍你前进,但如果有机会或倾向,我建议你尽可能学习更多数学,包括微积分、数论、线性代数、组合数学以及实际应用。所有这些都在计算机科学的广泛范围内具有实际和理论应用。

我认识的人在两个领域都非常成功(那些没有专注于数学的人和那些学过物理或数学的人),但在两组人中,他们都喜欢数字问题和学习算法和数学理论。


我赞同这个观点。虽然没有它也可以过得去,但是你会后悔自己的决定吗?如果你期望有一个稍微有趣/具有挑战性的工作,那些你所掌握的数学技能肯定会对你有所帮助。 - Andras Vass
好的!GrayWizardx和其他人:作为一个自学者,你们有什么推荐的阅读材料吗?当我年轻时,数学教学的方式非常糟糕,让我非常反感。我不想把责任归咎于别人,但是数学的呈现方式确实很恶劣。现在是时候挽回了。在你们看来,自学这里提到的数学(微积分、线性代数、离散数学等)有多容易?有没有特定的教材推荐?大学学位已经不再是一个选择! - Emmel
1
@Emmel,我在巴恩斯和诺布尔看到了《漫画数学指南》和《漫画微积分指南》,我知道几天前还看到了《线性代数入门指南》。至于实际资源,曾经有一些很好的数学网站(面向学生等),但我不确定它们中有多少仍然存在。偶尔我会去社区大学“旁听”数学课程(选修,通过/不通过),并进行一些复习。虽然我已经五六年没做过了,但上一次还是相当有帮助的。 - GrayWizardx

26

我拥有数学学位,但是在我的职业生涯中,我似乎从来没有用到过这些数学知识。它对于训练我的逻辑思维非常有用,但是我并没有使用流体力学、量子理论或马尔可夫链编写任何代码。(我认为最有可能用到的是后者。)

大多数业务开发人员大部分时间不需要高级数学。有时候了解三角函数可能会有所帮助,并且能够理解足够的数学知识以实现基于数学描述的算法可能很重要 - 但除此之外呢?不需要。

别忘了,大多数程序员并不是在推进计算机科学 - 他们正在构建应用程序。我不需要了解先进的工程知识就能驾驶一辆现代汽车,尽管这辆车几乎肯定是通过先进的工程技术进行改进的。


我同意你说的大部分内容,但是难道不能说,通过理解常见的数学原理,编程的许多方面可以更容易地实现吗?有时候,对于某些东西,使用公式比编写算法来计算相同的值要简单得多……只要你知道那个公式。 - BenAlabaster
@balabaster:有时候会发生这种情况,但我认为这种情况并不经常发生。同样,你其实不需要事先知道一个公式就能使用它。在数学上有一定的能力是很好的,这样你就能够在看到公式时理解它们,但在我看来,你很少需要大学水平的数学知识。 - Jon Skeet
11
数学专业?那你知道它不仅仅是数字。我拥有两个数学学位,经常使用其中的内容:布尔代数用于分析/简化逻辑,自动机/语言理论用于DSL构建,代数用于大O性能分析等。 - joel.neely

14

我认为掌握高级逻辑(离散)数学以及集合论会有很大帮助。在处理常见的计算机程序时,这些学科可以起到很大作用。然而,在大学里我学习到的其他数学课程大多是微积分,就我所知,它的使用非常有限。由于90%(或类似数字)的编程工作都是使用非常简单的数学运算来实现商业应用,因此我认为,在大多数情况下,你只需要掌握非常少的数学知识即可胜任编程任务。然而,对布尔代数、逻辑、离散数学和集合论有良好的理解可以让你进入更高的技术层次。


14

这取决于你在做什么。如果你要进行大量的3D编程,了解3D几何是必要的,你同意吗?;-) 如果你想创建像JPG这样的新图像格式或像MP3这样的新音频格式,如果你不理解余弦或傅里叶变换,那么你也会感到很迷茫,因为这些都是大多数有损压缩的基础。如果你非常熟悉数学,许多其他问题也可以更好地解决。

还有许多其他编程任务,你会发现并不需要太多的数学知识。


14

我会与众不同地回答,“是的”

我从土木工程转到编程(混凝土太难搞了!)。我的数学背景包括通常的第一年课程,第二、三年的微积分(微分方程、体积积分、级数、傅里叶和拉普拉斯变换)以及数值分析课程。

我发现我的数学在计算机编程中极为缺乏。我缺少整个离散数学和逻辑领域的知识,只能依靠大量的教科书、维基百科和沃尔夫拉姆来生存。大多数高级算法都基于高级数学,如果没有进行广泛研究(实际上相当于半门课程的工作),我就无法开发出高级算法。我当然也无法提出新的算法,因为我没有巨人的肩膀作为数学基础。


一个普通程序员真正编写了多少基本算法?我猜有80%的编程工作不涉及基本代数以外的数学。 - dbkk
@dbkk:一名普通程序员最常见的任务是设计对象模型,即某个领域的“业务逻辑”。这个过程本质上就是数学,尽管执行此任务的人通常不会这样反映。 - Boris Stitnicky

13
如果你对这个主题十分着迷,那么就开始学习吧。其他的会自然而然地随之而来。

9

是的,如果您编写商业现成软件,则无需进行高级数学计算。

然而,在处理以下困难问题时:

  • 计算轨迹以控制机器人
  • 创建类似于人工智能的应用程序,以支持不确定性和自动推理
  • 使用3D动画和图形

一些高级数学知识可能会很有用。并且这些问题并不像“超乎寻常”。

我曾经创建过一款软件来尝试“预测”办公室所需的纸张数量(找到最佳方法来近似值非常痛苦)。

但是,您必须小心,因为在使用高级功能时很容易迷失方向——我的一个朋友甚至使用图灵来存储动态菜单的状态以正确显示它,也许他太过于沉迷于他的想象之中了。


你可以添加一些需要真正理解计算机操作的内容,比如压缩文件、编辑MP3文件或其他任何需要实际理解计算机操作的内容,而不仅仅是简单地组合一个网站。 - tloach
4
他是如何利用图灵来做到这一点的?他使用了 ouija 板还是降神术? - Jared Updike

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