在大学期间,我偶然与一位朋友辩论,高级数学对于任何资深程序员来说都是必要的。他过去经常对此进行激烈争论。他说,程序员只需要高中或大学一年级的数学基础知识就可以了,几乎所有的编程任务都可以完成,甚至不需要高级数学。但是,他认为算法是程序员的基本和必不可少的资产。
我的立场是,所有计算机科学的进步几乎都完全取决于数学的进步,因此,当程序员在处理现实世界中的难题时,透彻的数学知识将对他们有很大的帮助。
我仍然不能确定论点的哪一边是正确的。您能根据您的经验告诉我们您的立场吗?
在大学期间,我偶然与一位朋友辩论,高级数学对于任何资深程序员来说都是必要的。他过去经常对此进行激烈争论。他说,程序员只需要高中或大学一年级的数学基础知识就可以了,几乎所有的编程任务都可以完成,甚至不需要高级数学。但是,他认为算法是程序员的基本和必不可少的资产。
我的立场是,所有计算机科学的进步几乎都完全取决于数学的进步,因此,当程序员在处理现实世界中的难题时,透彻的数学知识将对他们有很大的帮助。
我仍然不能确定论点的哪一边是正确的。您能根据您的经验告诉我们您的立场吗?
Answers:
要回答您提出的问题,我必须说:“不,数学不是编程所必需的”。但是,正如其他人在该主题中所建议的那样,我相信理解数学与能够“从算法上思考”之间存在关联。也就是说,能够抽象地思考数量,过程,关系和证明。
我大约9岁时就开始编程,可以说我在那个阶段学到了很多数学。但是,通过一点点的努力,我就能够理解变量,循环,goto语句(原谅我是Vic 20 BASIC,但我还没有读过Dijkstra)和基本的坐标几何图形以将图形显示在屏幕上。
我最终与一名计算机科学辅修了纯粹数学的荣誉学位。尽管我主要专注于分析,但我还研究了很多离散数学,数论,逻辑和可计算性理论。除了能够将统计学,概率论,向量分析和线性代数中的一些思想应用到编程中之外,我所学的数学很少,可以直接用于我的本科学位课程以及之后进行的商业和研究编程。
但是,我坚信数学需要的形式化思维方法-认真的推理,寻找反例,建立公理基础,发现概念之间的联系-当我处理大型复杂的编程项目时,这是极大的帮助。
考虑运动员进行体育锻炼的方式。例如,足球运动员无疑将大部分训练时间花费在基本足球技能上。但是,为了提高他们的总体健康水平,他们可能还会在健身房里骑自行车或划船机,做举重等。
学习数学可以比作重量训练或交叉训练,以提高您的智力和编程耐力。练习基本的编程技能是绝对必要的,但是学习数学是一项令人难以置信的心理锻炼,可以提高您的核心分析能力。
尽管编程可能不需要高级数学(除非您正在编程高级数学能力),但编程和数学的思维过程却非常相似。您首先需要了解一些已知的事物(公理,先前被证明的理论),然后尝试着找到新的事物。您不能跳过步骤。如果您确实跳过了步骤,则必须填写空白。这是一个至关重要的思考过程,使两者极为相似。
此外,数学家和程序员都对抽象进行批判性思考。现实世界中的事物由对象和变量表示。从具体到抽象的翻译能力也将这两个领域联系在一起。
如果您擅长一个,很有可能会擅长另一个。
计算机科学!=编程
好吧,说真的,我知道好坏的程序员都是英语和心理学专业,有些是计算机科学专业的。作为开发人员,我非常欣赏一些非常有名的家伙,他们没有CS的背景。例如,拉里·沃尔(Perl)是一名语言学家。另一方面,这有助于您了解正在使用的域的知识,因为这样您至少可以查看您的数据是否有意义,并帮助您的客户/用户深入了解他们真正想要的。是的,这里存在计算复杂性,有效的数据结构和程序正确性的问题。那是您在计算机科学领域学到的东西,对于几乎所有领域的知识都是有用的,但这既不是必需的也不是足够的。
我想我会是第一个人说你做需要数学。正如其他人所说,数学对于开发的某些方面并不是那么重要,但是批判性思维和结构化分析的基础非常重要。
更重要的是,数学对于理解调度程序,优化,排序,协议管理以及计算机的许多其他方面所涉及的许多基础知识非常重要。尽管从计算级别涉及的数学并不复杂(主要是高中代数),但理论和应用可能会非常复杂,因为通过微积分对数学的扎实理解将大有裨益。
如果没有它,您能不能完全摆脱困境,并且您不应该让那么少的透彻的数学知识使您退缩,但是如果有机会,或者有这样的倾向,我将尽可能多地学习数学,微积分,数值理论,线性代数,组合数学,实际应用,它们在广泛的计算机科学中都具有实际和理论应用。
我认识过在围栏两边都非常成功的人(那些不十分注重数学的人,以及那些去物理或数学学校就读的人),但是在这两个小组中,他们都喜欢数值问题,并且学习算法和数学理论。
我拥有数学学位,但是我不记得在我的职业生涯中一次要求数学。这对于训练我的逻辑思维能力很有用,但是我还没有使用流体动力学,量子理论或马尔可夫链来编写任何代码。(我怀疑最后一个是最有可能出现的。)
大多数业务线开发人员在大多数时候都不需要高级数学。有时知道三角学会有所帮助,当然能够理解足够的数学以实现以数学方式描述的算法可能很重要-除此之外呢?没事
不要忘记,大多数程序员都没有推进计算机科学-他们正在构建应用程序。我不需要了解先进的技术来驾驶现代汽车,即使该汽车几乎可以肯定通过先进的工程进行了改进。
我在这里反对谷物,说“是”
我从土木工程切换到编程(具体糟透了!)。我的数学背景包括通常的一年级课程,第二年和第三年微积分(Diff EQ,体积积分,系列,傅里叶和拉普拉斯变换)和数值分析课程。
我发现我的数学非常难以进行计算机编程。我缺少离散数学和逻辑的所有领域,而我只能靠大量的教科书,维基百科和Wolfram生存。大多数高级算法都是基于高级数学的,如果不进行大量研究,我将无法开发高级算法(本质上相当于半课程的工作。)我当然无法提出新算法,因为我只是这样做没有作为站在巨人肩膀上的数学基础。
如果您发现该主题引人入胜,那么请继续学习。其余的自然而然。
是的,如果您要进行商业编程,则不需要现成的软件即可使用高级数学。
但是,在处理诸如以下的硬核内容时:
一些高级数学知识可能会派上用场。并不是说它们是“世界之外”的问题。
我必须创建一个软件来尝试“预测”办公室所需的纸张量(而仅仅为了找出近似值的最佳方法真是太难了)。
但是,您必须小心,因为使用高级功能时很容易迷路-我的一个朋友求助于使用Turing存储动态菜单的状态只是为了正确显示它-哼...他的想像力太深了。
什么类型的编程?
根据我的商业经验,我不需要高级数学,但这在很大程度上取决于您所在的领域。
计算机图形学需要大量的高级数学。许多学术计算机编程都需要高级数学。
所以说,擅长数学的人和擅长编程的人之间往往存在关联。
我希望这个一厢情愿的答案会有所帮助。
在某些领域,开发人员需要数学,而在其他领域,数学几乎没有用。
如果您是游戏开发人员并且必须大量从事物理工作,那么对数学的理解至关重要。如果您使用高级视觉控件-没有几何图形就无法做很多事情。如果您打算进行一些财务计算-扎实的统计知识确实有帮助。
另一方面,在过去的5年中,我只有2个或3个项目,这些项目根本不需要任何数学运算。其中只有1次发生在Google搜索没有帮助的情况下。
归根结底,即使是财务计算,也是客户经常为您做的事情,并为您提供实现的公式。
因此,如果您从事“应用软件”业务,则可能永远不会使用数学学位。如果您正在学习学术软件,那么数学至关重要。
以我的经验,编程需要数学,您无法摆脱它。整个编程都基于数学。
问题不是黑白的,而是更加丰富多彩的。问题不是您是否需要数学,而是多少。更高的数学水平将为您提供更多的工具,并为您打开不同的道路。
例如,如果您只知道加法和减法,则可以编程。当需要乘法时,您将不得不执行许多加法。乘法简化了重复加法。代数允许在将其实施到程序中之前简化数学。线性代数提供用于转换图像的工具。布尔代数提供了用于简化所有这些if
语句的机制。
并且不要忘记数学,逻辑学和哲学的同胞。逻辑将帮助您有效利用case
或switch
语句。哲学将帮助您理解编写您正在修改的代码的人的想法。
是的,您不需要太多数学来编写程序。有些程序可能比其他程序需要更多的数学。与不那么了解的人相比,更多的数学知识将为您带来优势。在这些时期,人们需要获得他们所能获得的所有优势。
我从事专业编程已有8年,从12岁起就是我的业余爱好。
数学不是必须的,逻辑是必须的。虽然数学是非常有用的,但是说数学没有必要,就像说杀了一个人,没有枪是必要的,您可以使用小刀。好吧,的确如此,但是那把枪使它变得容易得多。
有一些最低要求,您应该已经达到最低要求。您需要了解基本的代数表达式和表示法,以及常见的计算机等效项。例如,您需要知道什么是指数(3到3的指数是27),并且通用计算机表达式是3 ^ 3。代数的常用符号确实会在语言之间发生变化,但是其中许多都使用了某种统一的方法。其他人(看着您LISP)则不会。您还需要知道操作顺序。
您需要了解算法思想。首先是这个,然后是这个,产生这个用于计算中。是您了解还是不了解,如果您不了解,则很难跨越。我发现这是您“获得”的东西,并不是真正可以学习的东西。相反,有些人不会“获得”艺术。他们不应该成为画家。另外,有些CS课程的学生无法弄清楚为什么它不起作用:x = z + w; z = 3; y = 5;这并不是说他们不了解加法,不是因为他们没有把握明确表达的要求。如果他们理解,计算机也应该正确,对吗?如果您看不到以上三行代码有什么问题,请不要成为程序员。
最后,您需要了解编程领域内的数学知识。会计软件可以从基本代数停止。如果您正在编程物理学,则需要了解物理(宽松)和3维几何(欧几里得)的数学。如果您正在编写体系结构软件,则需要了解三角函数。
但是,这要比数学更重要。无论您要编程的领域是什么,都需要深刻理解基础知识。如果您正在编写语言分析软件,则需要了解概率,统计数据,语法理论(多种语言)等。
通常,某些领域需要或可以从您认为与之无关的知识中受益。例如,如果您正在编程音频软件,则实际上需要了解三角函数才能处理波形。
幅度也会改变事物。如果您要排序包含1000个项目的财务数据集,那没什么大不了的。但是,如果记录为1000万条,那么您将可以从实际上了解矢量数学以及对二进制级别的排序有深刻理解的系统中受益(系统如何按字母顺序排序?如何知道'a'小于'b '?)
您会发现,作为一名程序员,您的一般知识基础将会激增,因为每个项目都需要在编程的直接领域之外进行更多的学习。如果您对自学感到迷茫或懒惰,并且不喜欢每周花10个小时以上的时间做“家庭作业”的想法,请不要成为程序员。
如果您喜欢思考练习,喜欢学习,可以不用计算器就可以思考数学之类的抽象事物,也可以不用画板就能进行设计,如果您的生活和爱好有广泛的品味,并且自我批评并且可以抛弃“喜欢的想法,如果您喜欢完善事物,那么请成为程序员。不要以数学为基础,而是以逻辑思维和学习为基础。这些才是重要的。数学只是副产品。
当然,这取决于您想成为什么样的程序员,或者更好地取决于您的雇主希望您成为什么样的程序员。我认为微积分和代数是必不可少的,统计和线性编程确实是您公文包中的一个好工具,也许分析(导数,积分,函数...)可以不做。但是,如果您想深入了解事物的工作原理(例如,电子学或一些非平凡的算法),那么“高级”数学就是最好的选择。
我认为这确实取决于您要执行的操作,但是恕我直言,CS和OS理论在这里比数学更重要,并且您实际上只需要它们所涉及的数学即可。
例如,在现代OS中,有很多CS理论的调度理论和优化背景支持许多调度程序。这是一个需要一些数学知识的例子,尽管不是超级复杂的事情。
但老实说,对于大多数东西,您不需要数学。您需要的是学习在2和16基础上思考的能力,例如在心理上进行OR / AND的能力。例如,如果您有一个字节,并且在该字节中有两个3位字段和2个浪费的位,那么当字节值约为11时,知道哪些位在哪个字段中处于活动状态将使事情比必须使用的要快一些笔和纸。
我大约在进入代数课前的同一时间开始编程。因此,我不会说数学那么重要,尽管数学可以对某些类型的编程(尤其是函数式编程)有所帮助。
我还没有学习过离散数学,但是我看到了很多用数学符号编写的编程理论知识,这些知识在本课程中进行讲授。
另外,请确保您知道如何计算任何底数,尤其是底数2、8和16。
另外,这门预编程课确实为我带来了一些概念。我们教了联合,交叉点以及所有这些快乐的东西,并且它几乎完全与按位数学相似。而且我们非常详尽地介绍了布尔逻辑。我认为最有用的是当我们学习了如何减少复杂的布尔语句时。这非常方便:
(x|y) & (x|z) & (x|foo)
可以简化为
x | (y & z & foo)
我以前不太了解。
好吧,您产生了许多答复,没有,我没有全部阅读。我在这方面处于中间位置,不,您当然不需要数学就可以成为一名程序员。Linux中的汇编程序与设备驱动程序彼此之间并没有多少复杂,也都不需要数学。
无论哪种形式,您都不需要参加或通过数学课程。
我会同意,编程的解决问题的思维方式与数学解决方案的思维方式非常相似,因此数学很容易实现。相反,如果数学很难,那么编程可能就很难。当然,不需要课程,学位或任何纸质或奖杯就可以开始学习。
现在,如果您不能在头脑中,在纸上或使用计算器都无法快速将十六进制从二进制转换为十进制,那么您将陷入困境。如果您想进入网络以及其他与计时有关的事情,内核驱动程序通常会这样做,但不必这样做。你要挣扎。我知道有很多人拥有数学学位和/或计算机科学学位,和/或工程学位,他们在费率计算,每秒比特数,每秒字节数,要做某事需要多少内存等方面苦苦挣扎。在某种程度上,它可能被认为是某些人必须努力解决的诀窍。
我的底线是我相信意志的力量,如果您想学习这些知识,那么您将可以并且很简单。您不需要上课或花很多钱,例如linux和qemu可以让您长时间忙碌,使用不同的asm语言等,可崩溃的内核开发,嵌入式环境等。您不仅限于此,但我不认为您不愿意参加任何课程。然后,如果您想参加一些EE课程,一些CS课程和一些数学课程。
你需要数学。编程无非就是数学。除非根据数学解进行解释,否则理论物理学的任何发现都不会成为实际的(适用的)含义。如果不能在计算机上,尤其是在编程语言上无法解释这些问题,则无法通过计算解决。因此,设计了不同的语言来解决特定的问题。但是对于通用和广泛使用的编程语言(如Java,C,C ++),我们的许多编程任务都涉及重复(连续)解决方案,以解决相同的问题,例如从数据库,文本文件中提取值,将其放置在Windows(桌面,Web)上,进行操作相同的值,有时会从相似的设备访问某些数据(但给定不同的品牌名称,不同的端口和令人头疼的信息)等,而这些数据所涉及的范围不仅仅限于单一方法,