您必须精通数学才能成为一名优秀的程序员吗?[关闭]


78

似乎传统的观点表明,好的程序员也擅长数学。或两者之间存在内在联系。我读过的许多编程书籍都提供了许多示例来解决数学问题,或者以某种方式与数学相关,就好像这些示例对大多数人来说是有意义的。

因此,我想提出的问题是:要成为一名优秀的程序员,您是否必须精通数学?


1
@Mark不一定。学习主题和喜欢它是两件事。
Maxpm 2011年

3
你是国王吗?还是双胞胎?如果没有,我建议您在提及自己时坚持“我”。
drxzcl 2011年

1
@jk-您是正确的,很可能是physics.about.com/od/alberteinstein/p/einsteinpro.htm仍然认为,编程
尚需大量技巧

3
我以为我从不喜欢数学。后来,我意识到我对语法不满意。
MrFox 2012年

1
所有程序员都一直在使用数学,他们只是没有意识到,因为它与在学校教授的数学有很大不同。离散数学,lambda微积分,布尔代数,逻辑(!)是我们每天都会使用的真正高级的数学概念。
rotman 2012年

Answers:


83

我认为这取决于您要执行哪种编程。就作为商业世界中的程序员而言,我会说答案是否定的。您可以在不了解高级数学的情况下成为一名出色的程序员。当您最终不得不处理数学时,通常在业务需求中定义公式,因此仅需在代码中实现即可。

另一方面,如果您想成为低级程序员或创建3D图形引擎,则数学将发挥巨大作用。


6
我想补充一点,我已经看到一些数学和物理学博士写了可怕的代码。这些技能在一定程度上重叠,但是它们是不同的学科。
MrFox 2012年

133

我不赞成,是的,你需要数学思维。大多数人认为数学是在做算术或记住奥术公式。这就像在询问您是否需要完美的拼写或非凡的词汇才能成为一名优秀的作家。

写作是关于沟通,数学/编程是关于清晰逻辑思考的过程(以不会犯错误的方式;等式不平衡,或者程序不编译)。具体来说,这种逻辑思维体现在:

  • 能够估计/理解数字之间的差异:O(n ^ 2)vs O(lg(n)),KB,MB,GB的直观感觉,磁盘与RAM的比较慢。如果您不知道KB与GB相比有多小,那么您将浪费时间优化无关紧要的事情。
  • 函数/函数编程(方程f(x)= x ^ 2与您编写该方法的方式如此相似吗?“算法”和“函数”一词早在数学世界中就已经存在了。第一台计算机诞生了:-))
  • 基本代数以创建和重新排列自己的方程式,取平均值,基本统计

因此,我要说的是,您需要一种数学思维方式,能够构造和操纵程序正在执行的思维模型,而不是事实和定理的集合。诸如图形或数据库之类的某些字段也会具有您需要的某些事实,但是对我而言,这并不是“擅长数学”的本质。


1
数学专业与数学思维方式:就像了解所有物理公式和能够准确地将橡胶球从20码外的篮板弹起之间的区别一样!
2011年

9
我还要补充说,许多优秀的程序员都知道如何下棋或走棋:-)
xanatos 2011年

1
尽管您是为计算机设置而不是自己解决问题,但基本上很多计算机代码都是代数。如果您不完全掌握代数知识,该如何做一个体面的工作呢?
罗伦·佩希特尔

18
数学思维是编程的关键。我要投赞成票以强调这一点。
Gus 2012年

4
+1 数学对于理解编程语言至关重要,因为它是我们的技能基础。我们日常使用的大多数编程语言构造都来自诸如lambda演算之类的数学学科。
MattDavey 2012年

53

编程有许多不同的领域,其中许多领域不需要特别高的数学知识水平。您将永远无法编写3D引擎,但是您一定能够开发业务和Web应用程序。让我们面对现实-在大多数计算机程序中,最常见的数学运算是将数字加1。

我会很高兴地承认我从来没有特别喜欢数学或擅长数学(我实际上毕业于英语文学专业!),并且已经作为专业开发人员工作了12年以上。我主要开发Web应用程序,很少需要那么多数学。更重要的是具有逻辑思维能力,能够将问题分解为多个部分并具有对所涉及的各种技术和框架的广泛理解的能力。

作为一个程序员,你更可能有实施的现有算法比设计一个完全新的一个。需要算出复利吗?您无需自己弄清楚,只需查找公式并应用即可。大多数问题已经解决,您只需要知道如何以选择的语言来实施解决方案即可。这并不是说擅长数学不是优势。只是这并不完全必要

当我在80年代中期上学的家庭计算机不太普及时,我经常编写程序来解决数学作业。我常常无法做到,但是我可以应用任何需要的公式作为软件例程。您无需成为另一位毕达哥拉斯就可以算出直角三角形的最长边,您只需要能够使用a² + b² = h²所选语言进行编码即可。


3
财务和会计不坏的,除非你做期权定价或类似的东西。

5
克里斯,您有一个要点,但是即使在财务应用程序中,您也更可能会实施公式而不是设计公式。
Dan Diplo

2
@Mark-是的,但是我想说的是,四舍五入问题更多的是要知道使用正确的类型的问题。您无需精通数学即可了解(例如)十进制的货币值要比浮点数更好。而且我认为数学家不会自动实现要使用的正确数据类型-这是学习的问题。
Dan Diplo

3
@ SK-logic:更严格地说,计算机所做的一切都是合乎逻辑的。其中一些逻辑运算被解释为数学(有些人声称逻辑是数学的一个分支,这在某些哲学家的愤慨中很大)。
Donal Fellows

3
@Donal研究员,形式 逻辑是数学。无论如何,哲学家都因其对数学的历史贡献以及后来重新崛起的数学家而受到认可(例如,通过发明诸如“单峰论”之类的怪异事物)。
SK-logic

30

您不必精通数学。但是,您必须精通逻辑和解决问题的能力。但是,擅长逻辑和解决问题的人通常也擅长数学。我要说的是,这实际上取决于数学的类型。您可能对微积分(像我一样)感到可怕,而仍然是一个优秀的程序员(像我一样)。但是,如果您对离散数学和集合论感到困难,则可能会发现很多编程方面的工作很困难。


您不必善于逻辑就可以擅长于“问题解决”。使用启发式技术可以解决许多(即使不是大多数)问题,这些启发式与逻辑无关。
ElGringoGrande 2011年

1
您确定自己是一个优秀的程序员吗?:)
罗素

17

我认为重要的一点是,仔细研究为什么您不喜欢数学。

对学科学科的不喜欢通常是在学校发生的事情,可能是由于与老师发生某种形式的冲突,对自己的学科能力缺乏信心或同伴小组的压力。

编程!=数学。对我来说,它甚至不像数学那样“感觉”(尽管我在数学学习的最后阶段做得还不错,但我很喜欢数学)。您可能在数学中使用的许多技能是有用的,即使在编程中也是必需的,但是许多程序员在很大程度上会自学。在学校不喜欢数学对您的编程能力或编程乐趣几乎没有任何影响。


我看到了很多关于数学的不好的教导。它的本质是将问题转化为已知的问题,然后无需多余的单词即可说出“已解决”。但是在教学中,可能需要您继续进行,并重新实施证明以降低水平。
2013年

16

数学与程序设计紧密相关,因为数学实际上是人与计算机之间的通用语言。您不需要了解许多高级编程的数学知识,因为很多数学知识都是在幕后的,但是它有助于理解许多更高级的编程概念。如果您打算进行更多的底层编程(系统或设备编程),那么您将需要了解更多的数学知识。


11
+1。如果您想做“高级”的事情,例如信号处理,机器学习,计算机视觉,3D渲染,物理模拟,动画,计算几何,密码学以及其他很多我无法想到的领域,那么您还需要数学。现在。
nikie 2011年

2
@nikie:是的,但这是应用数学。差异很大。^^
gablin 2011年

啊。实际上,数学不是通用语言。逻辑是。逻辑是哲学家的领域。无论如何,关于计算机的实际工作方式,比起数学,您最好了解电气/电子工程和形式哲学。如果您正在从事计算机科学,那么您仅需要数学本身,而这实际上并不是职业生涯中的编程。
RibaldEddie

14

一个很好的一个?不太可能。大多数设计模式至少在数学概念上有一定基础。对于编程必不可少的事物,例如变量,循环,过程和对象,类似于代数,微积分和集合论等数学领域中的概念。

还应考虑计算机科学是数学的一个子集:所有编程所基于的算法和形式逻辑从根本上讲是数学

如果您讨厌数学,那么您将讨厌编程。


13

几乎每个人都回答:“要成为一名优秀的程序员,您需要了解数学吗?” 正如许多人已经说过的那样,正确的答案是:“不,不是真的,但这会有所帮助。”

但是我对这个问题的解释是“数学能力和编程能力之间是否有很强的相关性?” 正确的答案是:“是的。” 如果您在代数,几何和微积分中苦苦挣扎,那么您可能不太擅长处理抽象和/或进行逻辑思考。如果您不擅长数学,那么您可能永远不会成为一名优秀的程序员。(不是您不应该尝试。)


11

这取决于您要编程的内容。例如,如果不了解适当的数学概念,以任何程度的连贯性启动3D游戏引擎将非常困难(如果不是不可能的话)。


11

“喜欢”和“胜任”是完全不同的东西-只要您有适当的计算能力,我就看不出您为什么必须喜欢数学的原因。

但是,这里要绝对清楚-程序设计在数学上有很强的基础,迟早几乎所有非平凡的开发都将涉及计算-您不能从中躲藏。

任何编程都涉及逻辑(数学的基础),大多数现代编程都可能涉及涉及集合论的事物(例如SQL)(即使它不是很明显),并且如果不这样做,则很可能是您陷入困境更加明确地基于数学的领域(例如游戏编程)(渲染-数学,AI->概率和随机性-数学...)等等。

上面的结果是,您必须对数字感到满意-当然,您必须明白为什么“世界上有10种类型的人,懂二进制的人和不懂二进制的人”很有趣。但是您可能会原谅“ 2 + 2 = 5 ...对于非常大的2值”。


+1,这真令人沮丧;我实际上笑了那个笑话。

10

数学的基本概念是算法的遵循,设计,理解,实现和使用。如果你不能做数学,那是因为你不能做这些事,如果你不能做这些事,那你就不能成为一个有效的程序员。

常见的编程任务可能不需要任何特定的数学知识(例如,除非您要执行3D图形或物理模拟之类的任务,否则您可能不需要向量代数和微积分),但是基本技能是相同的,并且缺乏能力一个领域中的能力将因另一领域中相应能力的缺乏而匹配。


9

老实说,我在学校是个可怕的数学学生。代数当时完全超出了我,我认为自己的D没什么比这更高的。

但是,几年后,在担任专业软件开发人员之后,我回到大学学习了代数课程。令我惊讶的是,这是我上过的最简单的一门课,而且我得到了A。

事实是,编程教会了我代数,因为实际上所有事物都只是代数表达。

所以不,您不需要启动它。它有帮助,但不是必需的。软件开发作为一种数学教学方法的美丽之处在于,编译器,调试器和执行程序是验证您答案是否正确的绝妙方法。在这方面,调试尤其是学习的一大福音,因为您可以单步执行代码并观察算法评估的每一步。


经过10年的软件开发,我回到了学校,并且遇到了同样的事情。我发现微积分和统计学要容易得多,因为我可以将大多数概念与我多年来编写的某些功能联系起来。当我自学SQL连接时,当我想到未知的维恩图时,我会很生气。就像作弊一样。
Heath Lilley

7

尽管肯定不会造成伤害,但这在一定程度上取决于您在做什么。

例如,计算机科学专业的人必须经过很多数学才能获得学位。CS通常集中在算法及其正确性上,这已通过高级数学风格的证明得到了证明。许多大学的CS课程与他们的数学课程非常接近,以至双专业仅几门课。我本人还是软件工程专业的学生,​​但距离数学辅修课程还有2门课程。

但是,话虽如此,我学到的许多证明,数据结构,搜索方法和算法正确性东西自从我完成学业以来就没有真正被直接使用过。但是我很难说这至少没有给我一个良好的基础,也没有更好地理解我的低水平工作。

因为无论您如何看待,从最低的角度看,您所做的一切都归结为数学。


7

您能在没有数学的情况下成为一名优秀的软件开发人员吗?是的,我想是这样。您能否成为人们一直在谈论的那种英雄程序员?我想不是。

问题是,大多数(如果不是全部)英勇的程序员(例如Dennis Ritchie)都具有计算机科学或数学背景。要成为一名真正的优秀程序员,您需要了解的知识不仅要肤浅,还意味着您必须深入研究正式的计算机科学。而计算机科学只是应用数学。

同样,对lambda演算的理解对于OS架构师或语言设计师来说将是无价的。


7

我已经看到这个话题来回争论。我曾与那些拥有数学学位的人合作过,他们认为他们可以编程,并且在一两年内可以改变职业。我有幸与之合作的最好的程序员之一,拥有生物化学博士学位,从未在学校上过正规的编程/ CS课,而是自学成才,并创办了一家成功的软件公司!

最终,对优秀的程序员有益的是一个能够理解逻辑,工作流,能够通过示例学习并愿意研究解决方案的人。另外,您必须学习您的应用程序所针对的业务。我讨厌程序员,他们不懂会计,却编写会计应用程序。他们总是做出错误的假设,并确实减慢了发展速度。

您会发现,无论您上哪所学校,一年内放学后的学习都比四年中学到的要多。学校教您如何学习基本技能-但是随着时间的流逝,现实世界中的经验将变得更加有价值。

经验是最好的老师,只要您将数学应用到软件开发中,只要您学习业务,就可以了。另外,请记住,就像之前的文章所述,除非您尝试使用3D图形引擎或GIS应用程序等图形坐标系,否则,您真正需要的就是通过高中学习的数学。

我曾经从事过会计和计费系统的工作,而不必为处理总帐或允许输入数据而弄清楚Log(x),SIN,COS等。老化期刊不是“高数学”,而是评估AP问题的关键。

仔细想想,我从来没有在他们的办公桌上遇到过一个会计科学计算器的会计师!


5

最简洁的答案是不。我认为这是一个神话,但是它被传播了,因为数学问题通常非常适合由计算机解决。

因此,在大学/学院中,人们会遇到需要在综合学科中解决的数学问题,但是通常会发现,与实施解决方案所需的代码相比,数学实际上更难解决。

进入现实世界后,您会越来越发现这些问题已为您解决了很多,您的工作就是将它们用代码实现。


5

您必须学习数学或创建自己的数学。无论哪种方式,以某种形式或另一种方式擅长都是很重要的。

只要您可以使用价值观并理解它们的作用,原因以及您可以使它们发挥作用,那么传统的数学可能就不一定总是必要的。有时它甚至会妨碍您。

除了数字以外,还有其他可视化字节值的方法,但它们绝对是考虑最多的方法。例如,编写一个将所有值都考虑为颜色的程序是可行的。

如今的编程从能够将1和0表示为不同类型的数据中获得了很多价值。尽管实际上1和0根本不是数字,但是电波长发生了变化,但是数学并没有像物理学那样起作用,但是,...对于理解大量的东西非常重要。其他程序员说和编码。

仍然有可能成为一个没有数学的优秀程序员,无论多么困难。


1
将所有值视为颜色几乎更有意义。当您离频谱的一端太远时,您
就会跳到

度数(例如0-360,0-256除外)有时也有帮助=)您实际上不需要从数字意义上思考颜色或度数,而只需考虑值的“满”程度。
Garet Claborn 2011年

5

我刚刚完成了离散数学的入门课程,发现由于编程,我几乎已经了解了谓词逻辑的所有知识。语法是新的,它基本上只是与布尔值一起使用。

简而言之:也许您不必显式地学习数学,但是仅仅通过成为一名程序员,您就可能在没有意识到的情况下学习了一些数学。也就是说,通过成为“优秀程序员”,您实际上也成为了数学家(在某种程度上)。

柯里-霍华德同构说明我的意思:基本上,它指出数学证明和某些计算机程序是“同构”,也就是说,它们是写同样的事情不同的方式。当然,它实际上比这更复杂,但是我不是数学家,所以这是我能给出的最佳解释。希望它不会太远了。

总之,不仅CS和编程的许多领域都涉及大量数学,而且即使基本的编程思想(例如布尔值)也基本上是伪装的数学。


4

这是一个很难回答的问题,可能会引起很多争论。

这个问题之所以如此困难的原因之一是,它部分取决于您所从事的工作类型。大多数业务应用程序不涉及很多数学,因此您可以对代数和业务数学有深入的了解。但是,更高级的应用程序要求更高级的数学,您开始需要对微积分,线性代数等有扎实的理解。

但是,这只是方程式的一部分,因为您仍然需要一定程度的数学才能进行编程本身的练习。不用说,您需要熟悉逻辑才能编写基本程序和基本代数。尽管您需要了解离散数学的某些方面,才能使基本程序正常运行,但是才能确定什么是使好的算法用于给定问题的原因。

回到问题的核心。我个人认为您不需要成为一名数学家就可以成为一名优秀的程序员。但是,我确实认为您需要熟悉数学才能成为一名优秀的通才程序员。


4

当然是。

甚至运行工厂业务编程也需要一些数学技能。

工厂运行业务编程需要数据库技能。成为一名优秀的数据库程序员,需要了解数据库的工作方式,以及查询处理器在翻译查询时使用的算法。如果不了解限制和导数(或者甚至不了解行y = x与行y = x ^ 2两次相交的基本理解),则无法准确比较散列匹配内部联接查询计划与嵌套循环联接查询计划。

同样,一个好的程序员只要研究一点,就可以在任何领域工作:游戏,模拟,嵌入式开发,编译器,操作系统,Web东西,数据库等。能够做所有这些事情(或更多)准确地能够快速学习如何做所有这些事情)需要相当数量的数学背景。

我想说的是,我应该在某些时候具备以下经验:

  1. 3个学期的Calc
  2. 差分方程
  3. 线性代数
  4. 现代代数
  5. 基本概率,计数和统计

4

数学不仅仅是公式。理解关于集合论的一些数学原理对于掌握类型系统上的复杂概念非常有用,因为理解复杂性对于有效使用数据结构至关重要。

图论也非常有用,因为许多编程问题都可以用图来建模。在开发业务应用程序时,我感到非常惊讶,发现最短路径定理为我遇到的棘手问题提供了一种优雅的解决方案!



4

数学是编程的前奏。

能够与抽象,模型,函数的“对象化”,转换和时间概念的各层工作,数学是所有这些的理想训练场。

无需数学就可以开发出正确的编程心态,但这要困难得多。

但是,除了专业领域外,仅了解数学是很重要的,知道一切的名称以及如何证明给定定理并不重要。因此,即使您因为在没有真正理解的情况下学到了所有数学而在数学上取得了不错的成绩,您仍然会在编程方面遇到困难。


4

数学知识对某些应用程序(例如游戏,人工智能,计算机图形等)很有用,但是数学可以教给您除公式或复杂方程式之外的内容。

学习数学就像学习新的编程语言一样。实际上,编程是应用数学的。当您学习一种新语言时,您会学到很多东西,这些都使您成为一名更好的程序员。数学并没有什么不同,但是,如果您真正掌握数学,即使您在工作中不使用高级数学,也将永远成为一名更好的程序员。

原因很简单:数学教您用另一只眼睛看世界。它教您无需编程即可使用不同的方法解决问题。这种新的思维方式无疑会引导您找到更好的工作方式。

编程是一门艺术。数学是一门艺术。如果将两者结合起来,您将成为更好的艺术家。


编程从根本上讲只是应用逻辑,而实际上数学也只是应用逻辑。
RibaldEddie

3

没有。

就像大多数科学学科一样,对数学概念有很好的了解将很有帮助,尤其是在评估效率之类的东西时。但是对于大多数编程任务,只有当您要解决的问题与数学有关时,您的数学能力才有意义。

计算机擅长于数学,因此早期计算机被广泛用于完成与许多复杂数学工作相关的“艰巨工作”是有道理的。许多软件仍然可以解决复杂的数学问题,在那种情况下,擅长数学将有助于您编写更好的程序,但这并不是使您成为优秀的程序员的原因。


3

通常,从某种意义上说,您不需要知道微积分或三角方程即可完成大多数工作。如果您要进行繁重的图形/游戏编程,那么可以。一个著名的Quake 数学技巧就是一个很好的例子。但是,在处理高级数学时必须要考虑的思想当然适用于编程。通过编程,您正在开发自己的逻辑结构,自己的功能,自己的“证明”。

在工作中(内部企业工作流程和应用程序)进行数学运算的唯一时间是我做一些需要统计知识的报表应用程序时,但这仅仅是因为它直接适用于需求。


3

我会说不一定。某些程序设计学科(密码,图形,物理引擎等)对于数学上的倾向肯定具有明显的优势,但是我认为对微分方程的深入了解不会对例如Web程序特别有用。

布尔逻辑可能是成为一名优秀程序员的必要条件,但是如果许多人在高中数学上没有取得好成绩的人证明自己擅长编程,这也不会令我感到惊讶。


3

我要说的是,您绝对不需要擅长数学就可以成为一名优秀的程序员。

我作为程序员的第一份工作是为B-52和Cruise Missile任务计划进行3D图形处理。这是一个数学密集型的应用程序,但实际上我只需要访问数学上很好/很好的人即可。我不需要知道用于计算两点之间较大圆弧距离的公式。我确实需要知道如何转换公式,以便它可以在编程语言中使用。飞行模拟也一样。波音做了所有我们只需要应用的数学运算。

这段经历还帮助我了解了谁将成为一个好的程序员,而谁却不是。这项工作使飞行员和航海家担负起程序员的职责,并帮助程序员理解任务的需求。您通常可以在几周内告诉您哪些飞行员和航海家会擅长于此。数学专业的学生通常会立即着手编程。

所以我想说,擅长数学会使您更有可能擅长编程,但是我知道很多擅长数学的优秀程序员。


3

我不喜欢数学,而且数学成绩总是很低。我不想说我是一个优秀的程序员,但是我在软件行业已经有10年的成功了。


1
我完全和你的数学成绩有关。我实际上觉得我不是一个糟糕的程序员,并且对数学并不感到糟糕,但是由于某种原因,无论我如何努力,我似乎​​都无法超越“数学”课程的“平均”成绩。
布莱恩·哈灵顿

@Bryan,我可以
谈谈

3

不喜欢数学的人有可能成为优秀的程序员吗?

不,不,不,是,不!

不,因为经常需要它。

(! (a | (! (b && c) || d) && (! e)))

为什么不起作用?

foo ('a', 'b', 19, g(h))
bar ('c', 'd', 44) 

可以用更抽象的方式重写吗?

968毫秒是大于还是小于0.7秒?您需要多少MB,机器需要多少Ghz,一个字节就足够了-数学是日常工作的一部分。有时是明确而又高级的数学。

总是隐式降低数学。

数学是一个广阔的领域,从计算到矩阵,再到几何,逻辑,统计,类别理论,图论。因此,如果您认为自己在不使用数学的情况下进行编程-也许您错了。

如果您在Project Euler页面上查看问题,您会发现困惑,我不知道如何使用数学来解决它。(并不是说我不用数学就可以解决它们。)请注意,问题的大小通常是如此之大,您无法用蛮力解决它们。

但是-由于我无法解决其中的许多问题(目前大约是2/3),这是否意味着我不喜欢数学?

如果您不学习数学,那么您可能不知道在哪里可以找到日常生活的数学,包括编程。

即使您只是专门致力于在屏幕上移动GUI组件以使其看起来不错,您还是在以某种方式进行数学运算。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.