在大学时代,我碰巧和一位朋友辩论过高等数学是否对任何资深程序员都是必要的.他曾经激烈地反对这一点.他说,程序员只需要高中或新学一年级大学数学的基础数学知识,而且几乎所有的编程任务都可以在不需要高级数学的情况下实现.然而,他认为算法是程序员的基础和必备资产.
我的立场是,所有计算机科学的进步几乎完全取决于数学的进步,因此,当他们处理真实世界的挑战性问题时,全面的数学知识将极大地帮助程序员.
我仍然无法确定论证的哪一方是正确的.你可以根据自己的经验告诉我们你的立场吗?
为了回答你提出的问题,我不得不说,"不,数学不是编程所必需的".然而,正如其他人在这个帖子中提出的那样,我认为理解数学和能够"算法思考"之间存在相关性.也就是说,能够抽象地思考数量,过程,关系和证据.
我在大约9岁的时候开始编程,并且说我在那个阶段学到了很多数学就好了.然而,通过一些努力,我能够理解变量,for循环,goto语句(原谅我,我是Vic 20 BASIC,我还没有读过任何Dijkstra)和基本的坐标几何来将图形放在屏幕上.
我最终继续完成纯数学荣誉学位,辅修计算机科学.虽然我主要关注分析,但我也研究了相当多的离散数学,数论,逻辑和可计算性理论.除了能够将统计学,概率论,矢量分析和线性代数中的一些想法应用于编程之外,我研究的数学很少,直接适用于我的本科学位课程以及之后做的商业和研究课程.
但是,我坚信数学要求的正式思维方法 - 仔细推理,寻找反例,建立公理基础,发现概念之间的联系 - 在我处理大型复杂的编程项目时,已经是一个巨大的帮助.
考虑运动员为他们的运动训练的方式.例如,足球运动员无疑将大部分训练时间花在基本的足球技巧上.然而,为了改善他们的一般健康状况,他们可能还会在健身房骑自行车或划船机,做重量等等.
学习数学可以比作重量训练或交叉训练,以提高你的心理力量和编程的耐力.你必须练习基本的编程技巧,但学习数学是一项令人难以置信的心理训练,可以提高你的核心分析能力.
虽然编程可能不需要高级数学(除非你编写高级数学能力),编程和数学的思维过程非常相似.你从一个已知事物(公理,以前被证实的理论)的基础开始,并尝试到达一个新的地方.你不能跳过步骤.如果您跳过步骤,则需要填写空白.这是一个关键的思维过程,使两者非常相似.
此外,数学家和程序员都在抽象地批判性思考.现实世界的东西由对象和变量表示.从具体转换为抽象的能力也链接两个字段.
如果你擅长一个,你很可能会擅长另一个.
计算机科学!=编程
好吧,说真的,我认识好的和坏的程序员,他们是英语和心理学专业,有些是计算机科学专业.我作为开发人员钦佩的一些非常有名的人没有CS背景.例如,拉里·沃尔(Perl)是一位语言学家.另一方面,了解您正在处理的域名是有帮助的,因为您至少可以查看您的数据是否有意义,并帮助您的客户/用户深入了解他们真正想要的内容.是的,存在计算复杂性和高效数据结构以及程序正确性的问题.这是你在计算机科学中学到的东西,几乎在任何领域都有用,但它既不必要也不充分.
我想我会是第一个人说你做需要的数学.正如其他人所说,数学对于某些发展方面并不重要,但批判性思维和结构化分析的基础非常重要.
更重要的是,数学对于理解调度程序,优化,排序,协议管理以及计算机的许多其他方面等许多基础知识非常重要.虽然从计算水平涉及的数学并不复杂(其主要是高中代数),但理论和应用可能非常复杂,因为通过微积分对数学的扎实理解将会带来很大的好处.
你能不能没有它,绝对,你不应该让一个不那么全面的数学知识阻止你,但如果你有机会,或倾向我会尽可能多地学习数学,微积分,数值理论,线性代数,组合学,实际应用,所有这些都在广泛的计算机科学中具有实践和理论应用.
我认识那些在围栏两侧非常成功的人(那些没有专注于数学的人,以及那些为了物理或数学而去学校的人),但在这两个群体中他们都喜欢数学问题并且学习算法和数学理论.
我有数学学位,但我不记得在我的职业生涯中一次要求数学.它在训练我的思维逻辑思维方面很有用,但我没有使用流体动力学,量子理论或马尔可夫链编写任何代码.(我怀疑,最后一次是最有可能出现的.)
大多数业务线开发人员大多数时候都不需要高级数学.有时知道三角学可以提供帮助,当然能够理解足够的数学来实现数学上描述的算法可能很重要 - 但除此之外?罗.
不要忘记大多数程序员都没有推进计算机科学 - 他们正在构建应用程序.我不需要了解先进的工程技术来驾驶现代汽车,尽管通过先进的工程技术几乎可以肯定地改进了这款汽车.
我认为拥有高级逻辑(离散)数学可以提供帮助.这与设定理论一起.在处理常见的计算机程序时,这些学科可以提供很多帮助.然而,我在大学里学到的很多其他数学都是微积分,据我所知,微积分的使用非常有限.由于90%(或类似的东西)的编程是用非常简单的数学做商业应用程序,我想说在大多数情况下,你可以通过很少的数学知识来获得.但是,对布尔代数,逻辑,离散数学和集合论的充分理解可以真正让你达到下一个层次.
这取决于你在做什么.如果你做了很多3D编程,那么3D几何知识肯定是必要的,你不同意吗?;-)如果你想创建一个像JPG这样的新图像格式或像MP3那样的新音频格式,如果你无法理解余弦或傅里叶变换,你也会很丢失,因为这些是基于最有损压缩的基础.如果你比较熟悉你的数学,很多其他问题都可以得到更好的解决.
还有许多其他的编程任务你会发现不需要太多数学.
我会反对这里说"是"
我从土木工程改为编程(混凝土糟透了!).我的数学背景包括通常的第一年的东西,第二年和第三年的微积分(Diff EQ,体积积分,系列,傅里叶和拉普拉斯变换)和数值分析课程.
我发现我的数学计算机编程非常缺乏.我缺少完整的离散数学和逻辑领域,而且我只能生存,因为有大量的教科书库,维基百科和沃尔夫勒姆.最先进的算法基于高级数学,如果不进行广泛的研究,我无法开发高级算法(基本上相当于半个课程的工作量.)我当然无法提出新的算法,因为我只是不喜欢没有数学基础作为巨人的肩膀可以站立.
如果你发现这个主题非常有吸引力,那么请继续学习.其余的将自然而然.
是的,没有必要使用高级数学 - 如果你是商业编程 - 现成的软件.
但是在处理硬核时,例如:
计算控制机器人的轨迹
创建类似AI的应用程序以支持不确定性和自动推理
玩三维运动和图形
一些高级数学知识可能派上用场.并不是说它们是"超越世界"的问题.
我不得不创建一个软件来试图"预测"办公室所需的纸张数量(而这只是为了找出近似值的最佳方法).
但是你必须要小心,因为在使用高级东西时很容易迷失 - 我的一个朋友使用图灵来存储动态菜单的状态只是为了正确显示它 - 哼哼......也许他在想象中走得太远了.
什么类型的编程?
根据我的商业经验,我不需要高级数学,但这在很大程度上取决于你所在的领域.
计算机图形学需要大量的高等数学.许多学术计算机编程都需要高等数学.
所以说,擅长数学的人和擅长编程的人之间往往存在相关性.
我希望这个如愿的回答有所帮助.
某些领域的开发人员需要数学,但在其他领域几乎没用.
如果您是游戏开发人员并且必须经常使用物理 - 理解数学是至关重要的.如果您正在使用高级视觉控件 - 没有几何图形就无法做很多事情.如果您计划进行一些财务计算 - 那将非常有助于掌握统计数据.
另一方面,在过去的5年里,我只有2到3个项目,根本不需要任何数学.其中只有一次是谷歌搜索没有帮助.
在一天结束时,甚至财务计算通常是客户为您做的事情,并为您提供实施的公式.
因此,如果您从事"应用软件"业务,您很可能永远不会使用您的数学学位.如果你在学术软件中,数学是至关重要的.
我同意克里斯的观点.我也会说"是".但这取决于您的市场,如上所述.如果您只是创建一些基本的"现成"应用程序或编写工具来帮助您的日常工作......那么数学就不那么重要了.
工程定制软件解决方案需要大量解决问题和批判性思维.当存在数学背景时,绝对增强的技能.我在数学方面辅修了我的计算机工程学位,我赞扬我所有的数学导向背景,为什么我今天就在这里.
这是我的2美分,我从上面的内容可以看出许多人不同意.我鼓励所有人都认为我不是说你没有数学背景就没有这些技能,我只是说这些技能是具有这种背景的副作用,并且可以积极地影响软件.
根据我的经验,编程需要数学,你无法摆脱它.整个编程基于数学.
问题不是黑与白,而是更多彩.问题不在于你是否需要数学,而是需要多少.更高水平的数学将为您提供更多工具,并为不同的路径打开思路.
例如,如果您只知道加法和减法,则可以编程.当需要乘法时,您将不得不执行许多添加.乘法简化了重复添加.代数允许人们在将数学实现到程序之前简化数学.线性代数提供了转换图像的工具.布尔代数提供了减少所有这些if
语句的机制.
不要忘记数学,逻辑和哲学的兄弟.逻辑将帮助您有效地使用case
或switch
声明.哲学将帮助您理解编写您正在修改的代码的人的想法.
是的,你不需要太多的数学来编写程序.某些程序可能需要比其他程序更多的数学 更多的数学知识会比那些理解力较差的人更有优势.在这些时代,人们需要获得这些工作所能获得的所有优势.
我已经专业编程了8年,因为我12岁就是一个爱好.
数学是没有必要的,逻辑是.虽然数学是非常有用的,但是说它没有必要就像说要杀死一个人,没有必要使用枪,你可以用刀.嗯,这是真的,但那把枪让它变得容易多了.
有几个最低限度,你应该已经满足.您需要了解基本的代数表达式和符号,以及常见的计算机等价物.例如,您需要知道指数是什么(3到3是27),并且常见的计算机表达式是3 ^ 3.代数的常用符号确实在语言之间发生了变化,但其中许多使用了一种统一的方法.其他人(看着你的LISP)没有.您还需要了解操作顺序.
你需要理解算法思想.首先,然后这个产生这个用于此计算.你有可能理解这一点,或者你没有理解这一点,如果你不理解,这是一个相当困难的障碍; 我发现这是你得到的东西,而不是你能学到的东西.相反,有些人并没有"获得"艺术.他们不应该成为画家.此外,CS课程中的学生也无法弄清楚为什么这不起作用:x = z + w; z = 3; y = 5; 并不是说他们不理解加法,而是他们没有理解明确表达的要求.如果他们理解,电脑也应该,对吗?如果你看不出上面这三行有什么问题,那么就不要成为程序员.
最后,你需要知道你的编程领域下的数学是什么.会计软件可以停在基本代数上.如果你是编程物理,你需要知道物理(松散)和三维几何中的数学(欧几里德).如果您正在编程架构软件,则需要了解三角函数.
这比数学更进一步; 无论您编程的域名是什么,您都需要完全理解基础知识.如果您是编程语言分析软件,则需要了解概率,统计,语法理论(多种语言)等.
很多时候,某些领域需要或者可以从您认为无关的知识中获益.例如,如果您正在编写音频软件,则实际上您需要了解三角函数来处理波形.
幅度也会改变一切.如果您正在对1000个项目的财务数据集进行排序,那么这并不重要.但是,如果它是1000万条记录,你会从实际了解矢量数学中获益,并深入理解二进制级别的排序(系统如何按字母顺序排序?它如何知道'a'小于'b "?)
您将发现作为一名程序员,您的一般知识库将会爆炸,因为每个项目都需要在直接的编程领域之外进行更多的学习.如果你对自学习感到娇气或懒惰,并且不喜欢每周花费10多个小时从事"家庭作业"的想法,那就不要成为程序员.
如果你喜欢思考练习,如果你喜欢学习,如果你能想到抽象的东西,比如没有计算器的数学或没有画板的设计,如果你有生活和爱好的广泛品味,如果你是自我批评的,可以扔掉'如果你喜欢完善事物,那就成了一个程序员.不要把这个决定建立在数学上,而应该是逻辑思考和学习的能力.那些是重要的; 数学只是副产品.
当然,这取决于你想成为什么样的程序员,或者更好的是你的雇主希望你成为什么样的程序员.我认为微积分和代数是必需品,统计和线性编程确实是公文包中的好工具,也许分析(衍生,积分,函数......)可以不用.但是如果你想知道皮肤深层的东西(例如电子产品,或者一些非平凡的算法),那么"高级"数学就是你最好不要去的地方.
我所做的大部分编程都涉及物理模拟研究,包括电磁学,量子力学和结构力学等.由于问题域具有与之相关的高级数学,因此我很难在不使用高级数学的情况下解决它们.
所以你的问题的答案是 - 这取决于你想要做什么.
如果您要编写新的编程语言,高级数学知识至关重要.或者您需要编写自己的算法.
然而,对于大多数的一天到一天的节目-从网站到保险处理应用程序-只有基本的数学是必需的.
具有可靠数学(不仅仅是算术)或逻辑背景的人将很好地应对算法,变量使用,条件推理和数据结构.
不是每个人都可以设计UI.
不是每个人都可以制作有效的代
不是每个人都能清楚地评论和记录.
不是每个人都可以做一个好的算法
数学将帮助你达到一定程度,但仅限于一点.
我不认为高级数学知识是一个优秀程序员的要求,但根据个人经验,我认为对高级数学有更好把握的程序员也能成为更好的程序员.这可能仅仅归因于更具逻辑性的思想,或者由于他们解决数学问题的经验而更符合逻辑的观点.
数学的基本概念是以下,算法的设计,理解,实现和使用.如果你不能做数学,那是因为你不能做这些事情,如果你不能做这些事情那么你就不能成为一个有效的程序员.
常见的编程任务可能不需要任何特定的数学知识(例如,你可能不需要矢量代数和微积分,除非你正在做3D图形或物理模拟等任务),但潜在的技能组是相同的,缺乏能力在一个域中,将匹配另一个域中相应的缺乏能力.
Math是用于创建程序的工具箱.我推荐Cormen的算法导论.它涉及更"肮脏"的东西.
- Greatest lowest limit (managing resources) - Random variables (game programming) - Topological sort (adjusting spreadsheets) - Matrix operations (3d graphics) - Number theory (encryption) - Fast fourier transforms (networks)