我刚刚获得了软件开发文凭。现在,我们从基本的Java开始(例如,您可能会说到底)-很好,除了知道如何在Java中做“ Hello World”之外,我没有编程经验。 br />我一直在听说数学与编码有关,但是怎么回事呢?什么样的一般例子可以说明数学和编程是如何结合在一起的,或者相互依赖的?

我很抱歉我的问题很模糊,我才刚刚开始对这种世界有一个大概的了解我正以代码猴子学生的身份加入...

评论

编程是数学。 zh.wikipedia.org/wiki/Discrete_mathematics

@Dave,这就是为什么我在评论中有一个链接,而不是作为答案。
@FiascoLabs不仅如此-语言结构和逻辑也是数学的子领域。编程不过是应用数学。

无关紧要的是,以Java开头并不是“从底部开始”。

@ CharlesE.Grant,许多数学系学生都做同样的事情(并且仍然通过了考试)。

#1 楼

首先,我是一名数学家-专业的数学家(因为我因做数学而得到报酬)。我不是程序员。我做了一些编程工作,但是非常肯定是关于“货物崇拜”品种的(请参阅对https://tex.stackexchange.com/q/451/86的第一条评论和我的回复),而通常没有什么可以使我对此感兴趣网站(实际上,我在TeX聊天室中看到链接后,在这里注册了此答案)。

我的答案摘要是:数学是编程。

最近,我不得不向非数学学生群体教授数学课程。他们是编程部分。我认为这太棒了!最后,我将能够向已经了解基本概念并且已经具备基本数学工具包的人们教授数学。当我问到其中有多少人实际写过一个程序并得到0到1之间的答案时,我感到非常失望。有些数学领域与编程直接相关,与评估算法和对语言等进行分类有关。我不是在说那些。还有一个程序正在尝试将所有数学转换为可以由计算机评估的正式语言。这有点接近我在说的内容,但是即使专注于此,也会错过我要说的主要内容。我所从事的数学和我所从事的编程与主题几乎完全无关。它们之间的联系在不同的层次上。

我要开始的地方是对主要问题的评论:


数学,那么所有人类活动都是数学的一种形式。如果是这种情况,那么数学一词就没有什么用处,因为它不能用来区分一项活动与另一项活动。是的,那是在做数学。但是“数学”仍然是一个有用的词,因为正如这首歌所说,“这不是您要做的,而是您做事的方式。”我想说的是,当我以数学方式接近事物时,我正在做数学。有时,这就是“硬核”数学:制定定义,证明定理。有时并非如此。有时候,它正在编写愚蠢的小程序,以便我的孩子可以学习他们的拼写单词。这可能是数学中最重要的可转移技能。借此,我的意思是能够剥离所有不必要的东西并专注于重要属性。适合这个问题的观点。我们通常在线性代数中使用基变公式(这会导致可怕的矩阵和可怕的并发症)来处理这一问题,但它比这更适用。从本质上讲,就是这样一种想法,即仅仅是因为某种东西已经以一种方式呈现给您,而不必一定是您使用它的方式。这将事物本身的观点与呈现方式分开。这可能是非常实际的:所有事情都是使有用或有效的事情。如果我有一个向量列表,并且将它们存储为x坐标列表和y坐标列表更有效,那就这样吧。
形式与函数如果一件事物可以用许多不同的方式呈现,那么说一个特定的呈现就是事物就不再公平了。再次错误地引用这首歌:“这不是你的本领,而是你的所作所为”。 br />现在,对我到目前为止所写的内容可能会有很多(负面)反应。一个将是“那不是数学,那是很好的感觉。”我在上面提到我的话时(或不好的意思)同意“所有人类活动都是数学形式”的观点。另一个将是“这不是问题中所指的数学类型。”这几乎可以肯定是对的,在这里,我实际上对那些说“至少我十年没有动过数学”的人表示同情。他或她错了,当然,他们从事数学已有10年了,因为每当他们编写程序时,他们都在从事数学。他们只是没有意识到。在这里,我们要指出的是为什么我对已经是程序员的学生进行数学教学的可能性感到非常高兴。我最近编写了一个有趣的3D形状浏览器,其中涉及使用一些数学运算来找出必须应用于数据的投影和其他变换。我很高兴发现自己实际上在编码四元数!但是,当然,与我工作时的数学相比,所涉及的数学是微不足道的。那是“信封背面”的东西。这种类型的数学,然后我同意您在需要时选择它的感觉,如果您需要比Wikipedia上复杂的东西,那么您会找到真正的数学家来为您做。但是,为了能够在需要时将其拾起,则需要学习一些东西。那东西可能不是您实际使用过的任何东西,但了解到某些东西使您在以后的生活中实际使用的东西变得更加容易。因此,这就是我不同意Coder的地方:如果您要使用任何数学,则确实需要学习一些数学,并且需要从数学方面进行学习(顺便说一句,这并不意味着证明定理)。 br />
最后就是“数学就是程序设计”。您可以通过成为一名优秀的程序员来学习所有这些东西。而且,如果您已经学到了这些东西,那么您会发现数学容易得多,因为您会理解,当我们谈论向量空间中的向量时,它只是Vector类的一个实例,这意味着我们可以做所有在该实例上执行:加,减,缩放等。这就是为什么我很乐意向程序员教授数学。但是,以数学家的身份讲,我会说其中的第一个“抽象”在数学中比在编程中容易学习,因为数学是对抽象的追求。每当我们看到某种行为时,我们的训练总是在问:“使它以这种方式表现的那件事是什么?如果我采取另一种相似的事物,它会以同样的方式发生吗?我必须为此而失去才能停止那样的行为吗?” (将其极端化将导致“ cent数学”-搜索该词)。但是,我们不能仅使用“现实世界”对象(无论它们是什么)来执行此操作,而是使用已经抽象的东西来执行此操作。我以一个经典的数学家笑话来结束我的讲话:


数学家和物理学家都参加了关于涉及24维空间的某些新模型的研讨会。之后,他们进行了讨论,物理学家说:“那真的很难。我的意思是,一个人如何可视化24维空间?”数学家回答:“哦,这很容易。只需可视化n维空间,然后将n =24。”。



添加了2012-03-2

这个答案有很多评论,表达了各种观点。现在,主持人已经删除了这些内容,我理解我会尽量将它们合并(或回应)到我的答案中。

但是,我不确定是否可以。阅读这些评论以及本页上的其余内容,我只能得出这样的结论,即关于数学的真正含义存在巨大的误解。而且,我没有足够的能力来解释它。幸运的是,已经有人链接到洛克哈特的《哀叹》,所以我将解释推迟到此。尽管我可能会有所不同(随着我在科学环境中的成长,我会更加强调数学的实验性质),但我认为我无法将其更好。我仍然认为我可以添加一些内容。除了对什么是数学的误解外,对“做数学”的含义也有误解。我看到了两种几乎矛盾的立场:


数学是关于方程和公式的。因此,没有必要研究它,因为存在维基百科(这几乎是欧拉对狄德罗的副密码学挑战的反面)。
数学是关于定理和定义的。因此,没有必要研究它,因为程序永远不会证明任何东西(这与...完全一样的谬误……在此处插入喜欢的谬论)。

两种立场虽然相互矛盾,但最终以在同一个地方:程序员学习任何数学都是没有意义的-可以肯定的是,不是从数学家那里学来的!毕竟,他们对什么了解什么?程序员真正需要知道的任何东西都可以在Wikipedia中找到,或者抄袭他人。我敢打赌,你们中的大多数人都会对自己有个私笑,然后想:“啊,我敢打赌,我知道那时的程序是什么样子。”您可能会感到有点自鸣得意和优越(尽管我确信您对自鸣得意和优越感感到难过)。

我在上面描述的是货运崇拜数学。

因此,当我说您应该学习一些数学知识以理解数学的工作原理时,我说这是出于与您看到我写的一些代码完全相同的理由:“您的生活有多轻松?如果您要停止从StackOverflow剪切和粘贴代码,并学到了一些有关如何正确执行代码的知识。”来自数学家。为什么这样?这是一个比喻。我最擅长的语言是TeX。 (全部说明,真的!)。现在,假设我想了解更多关于TeX的知识,而Don Knuth恰好在城里,并提供了一些有关TeX的教程,这是碰巧的。或者我可以在Wikipedia上阅读它。或者也许是Perl和Larry Wall,或者是C#(是正确的吗?)和Jon Skeet。这些人很可能不是最好的老师,但他们一定会以他们所知道的数量来弥补这一点!我们是编写实际语言的人,然后编写您使用的库。当然,您不必知道如何证明定理-您不会编写库!但是,如果您对我们的想法有所了解,那么它可能会帮助您理解为什么我们以这种方式编写该库,并且如果您知道它可以帮助您更好地利用它。

在Wikipedia上查找方程式和证明Poincaré猜想之间存在中间立场,正如-提到洛克哈特的哀叹-在“我对艺术不是很了解,但是我知道自己喜欢什么”之间存在中间立场。以及成为莫奈(Monet),以及在“'ANY'钥匙在哪里?”之间。并成为唐·克努斯(Don Knuth)。如果您还在上大学,那么您将有一个绝佳的机会向该领域的专家学习,他们出于某种原因愿意花时间向您解释。


我想进一步扩展的另一点是,为什么作为程序员,您不应该害怕学习更多的数学。这不是深度连接,也不是有用性。您对计算机进行编程的能力可以直接帮助您学习数学。我只想提及一些。


了解变量。许多人对简单的陈述感到困惑,例如“让我们成为自然数...”。或“让epsilon> 0”。在数学中有一些地方必须记住变量的范围。这些在编程中都是司空见惯的。学习将数学陈述转换为程序,就会发现更容易掌握内容。
证明的本质。如果您曾经编写过测试或编写了可供他人使用的程序,那么您将了解证明的核心。执行此操作时,您必须知道用户输入的内容都可以处理(在此处插入必填xkcd参考)。这就是证明!无论“用户/ Universe”放入什么的演示,该语句都会成立。实验人员会倾向于“如果在正常情况下能够正常运行,那是真的”,但是程序员知道,总会有那个孩子会尝试Alt + G + Shift +ÅØÆ只是为了看看会发生什么。
DRY。很抱歉把这个给你弄破了,但是我们发明了它,而不是你。几千年来我们一直在“不重复自己”。这就是为什么我在书架上有一份Euclid元素的副本,它仍然很有用。

还有更多。如果我对编程有更多了解,我会写一本书《程序员的数学》,其目的不是教“程序员应该知道的数学”,而是“每个人都应该知道的,但为程序员优化的数学”。 。但是我可能永远不会对编写程序有足够的了解-除非有人愿意与我合作!


我会留在那里。如果我想的更多,我可能会改变自己写的东西。希望我能更好地解释它。在几个月的时间内,我什至可能会不同意其中的一部分。如果有人希望进一步辩论,或以其他方式发表评论,最好不要在此处的评论中这样做。你知道在哪里找到我的。

评论


这是我在SE上读过的最好的答案之一。顺便说一句,有一本宏伟的“程序员数学”书;它被称为“具体数学”,由TeX的作者Donald Knuth共同撰写。我刚得到一份副本,这太棒了。我感觉像你相反当我意识到(对我而言)理解数学课中概念的最佳方法就是编写一个程序来为我做事时,我对编程很认真。当然,那时候我想使用程序而不是手工进行死记硬背,我的数学老师不喜欢。

–Jason Lewis
2012年3月2日在23:36

杜德,+ 100。

–巴里·布朗(Barry Brown)
2012年4月3日在22:03

注册只是为了支持这个

–leo
2012年4月18日在1:05

究竟。如果没有数学可以教给您的分析思想,您就无法做好程序。

–惨败实验室
2012年4月22日在1:56

有没有关于编程数学的好书(从数学角度看编程)?

– qed
14-10-22在14:55

#2 楼

它们并没有那么紧密的联系。对于编程而言,了解数学非常重要,尤其是与算法性能相关的分支,但是简单的事实是,没有数学分支会告诉您Singletons是一个糟糕的主意,例如,或何时更倾向于继承而不是合成,或者您是否真的需要那种灵活性,而不是重复自己,以及其他数十种核心编程必需品。

数学也许可以表达您的程序可以做什么,但是它肯定不能告诉您最容易维护,最易读和可行的方法。

评论


1)单身人士本身没有什么问题,2)算法信息论,形式语言和指称语义与由于某些原因而您如此关注的那些简单事物直接相关(它们对编程的重要性不大)一般来说)。

– SK-logic
2012年2月26日在18:01

那时您的经验一定会受到限制。只要是域模型的一部分,单例是必要且不可避免的。而如何建立领域模型是一个数学问题,仅此而已。是的,那些对形式语言理论无知的人正在制造出可怕的模型和可怕的语言。

– SK-logic
2012年2月26日在18:20

@dave:这种方法的危险在于,无论多么愚蠢,任何人都可以通过陈述一个截然不同的立场来使您偏离明智,合理的立场。求平均值并不能替代评估论点。

–迈克尔·伯格沃德(Michael Borgwardt)
2012-2-26在23:44

@ SK-logic:你们两个有可能只是在谈论“单身”到底是什么的不同概念吗?在我看来,SK-logic谈论的是抽象思想,即在系统中仅具有某个实体的一个实例,有时这正是所需要的。不幸的是,这个抽象概念与使用公共静态工厂方法的糟糕的实现细节紧密相关,因为GoF本书以此为例说明了如何访问这种Singleton。

–迈克尔·伯格沃德(Michael Borgwardt)
2012-2-26 23:48

请不要更多关于Singtons的非主题讨论

–mattnz
2012年2月27日在0:18

#3 楼

数学和编程以两种方式关联。

一种是数学可以用来推理计算机程序。它可以帮助回答诸如“随着输入数据的变化,我的程序的运行时间将如何变化?”,“是否可以保证我的程序找到问题的答案?”,“我的程序是否尽可能有效?”之类的问题。 ”,“我应该如何重新安排程序以使其更快或更省内存?”。在高年级课程中,通常会涉及诸如计算理论,算法设计和计算机语言设计之类的主题。

数学与程序相关的第二种方式是使用编程来解决数学问题问题。这很重要,因为实际上可以将许多“普通生活”问题重铸为数学问题,然后在计算机上解决(也许近似解决)。这些主题几乎在您的所有课程中都得到一定程度的体现,尤其是在离散数学和数学建模课程中。

评论


数学不能帮助您保证程序会找到答案。那将解决停止问题,这是不可能的。

– DeadMG
2012年2月27日在7:40

@DeadMG对于任意程序都是不可能的。在某些情况下,可以很好地证明给定程序终止或不终止。

–吕克·丹顿(Luc Danton)
2012年2月27日在7:57



@DeadMG,这是关于停止问题的常见误解。停止问题并不是说您无法证明某个程序是否停止,而是说没有一种算法或证据可以应用于所有程序来决定它们是否停止。参见例如en.wikipedia.org/wiki/Halting_problem和programmers.stackexchange.com/questions/125882/…。

–Charles E. Grant
2012年2月27日7:59



啊啊那是我的错愚蠢的投票锁定...如果您可以编辑自己的帖子,以便我可以取消投票?

– DeadMG
2012-2-27在8:03

@DeadMG,您是否知道大多数典型的编程任务根本不需要图灵完备的语言?在其余情况下,几乎总是有专门的暂停证明。

– SK-logic
2012年2月27日在8:08

#4 楼

数学教育对计算机科学很重要的两个具体示例是:

1)使用关系演算的关系数据库。


关系演算由两个计算组成,元组关系微积分和域关系微积分,它们是数据库关系模型的一部分,并提供了一种声明性方式来指定数据库查询。这与关系代数
相反,后者也是关系模型的一部分,但是提供了一种用于指定查询的更多方法方法。

关系代数可能会建议这些步骤来检索提供某些样本书的电话的电话号码和书店名称:

Join book stores and titles over the BookstoreID.
Restrict the result of that join to tuples for the book Some Sample Book.
Project the result of that restriction over StoreName and StorePhone.


一些样本书。

关系代数和关系演算在逻辑上是等效的:
对于任何代数表达式,在微积分中有一个等价的表达式,反之亦然。此结果称为Codd定理。


下一个领域是人工智能(AI)和机器学习。

例如这些是用于查看udacity的CS 373类:对机器人进行编程的描述。 :概率推理,计算机视觉,机器学习和计划,所有这些都集中在机器人技术上。广泛的编程示例和作业将在制造自动驾驶汽车的背景下应用这些方法。您将有机会通过视频访问该领域领先的研究实验室,并与在斯坦福大学和Google制造自动驾驶汽车的科学家和工程师会面。

先决条件:讲师将具备扎实的编程知识,所有编程都将使用Python。



WEEK 1:

概率基础知识带有粒子过滤器的汽车定位

WEEK 2:

高斯和连续概率使用卡尔曼滤波器跟踪其他汽车

第3周:

图像处理和机器学习查找对象在传感器数据中

第4周:

规划和搜索确定使用A *搜索行驶的位置通过动态编程查找
最佳路线>第5周:

控制装置通过PID控制转向和速度

第6周:

将所有内容组合在一起编写自动驾驶汽车
/>
第7周:

测试您的知识的期末考试


评论


我想这属于AI领域,但是使用该术语时,大多数人会想到天空中的这个馅饼。无论如何,几乎任何模拟现实世界的程序几乎总是需要某种形式的高级数学。同样,任何带有传感器的系统几乎总是需要某种形式的高级数学。

–扣篮
2012-2-27在16:18



#5 楼

对于科学应用程序开发,游戏编程,实时系统,仿真系统以及此类应用程序,确实需要数学。毕竟,编程使用数学和科学来解决问题。另一方面,对要捕获用户信息以在数据库中注册用户的应用程序进行编程,不需要任何高级数学。尽管如此,所有程序员都将从“基本数论”,“代数”,“基本集论”和“基本数值分析”中受益。很大程度上来自编程。

评论


我同意。我从事大量的企业开发工作,并没有发现自己需要使用大量的高级数学知识,尽管一定会很好,因为它肯定会有所帮助。我想说,每个程序员都应该至少学习微积分1。其他类型的程序可能会利用傅立叶变换,统计模型和3D编程经常使用矩阵。

–真核聚糖
2012年2月27日15:47

@Makotosan,谢谢您的评论。但是,数学非常有趣,因为程序员的时间很短,因此最好将精力花在真正提高生产力上。对于那些有能力负担得起的人来说,额外的信息就成了奢侈品。

– NoChance
2012-2-27在16:30

我认为数学只是程序所需的领域知识,就像了解财务对Excel开发人员很重要一样。

–sixtyfootersdude
15年6月29日在20:17

#6 楼

我认为最重要的是,所使用的思维过程的相似性使两者看起来如此相似。

例如,两者都是非常合乎逻辑的。如果遵循相同的步骤集或相同的公式,则总会得出相同的结果。例如,1+1将始终等于2,并且set a = 1意味着a将始终为1(直到您将其设置为其他值)。

另一个示例是需要进行空间思考。在数学方面,我发现我经常不得不把数字记在脑海中,并想像自己在做什么。作为一个非常简单的示例,我将分解数学问题,使类似13x13的东西变成13x10 + 13x3,这对我的大脑来说要容易得多,因此我需要跟踪13x10=130 + 13x3=39,所以要跟踪130+39 = 169。可视化不可见的事物或将问题分解为较小的问题的这种能力通常应用于编程。

所以我觉得尽管您不需要具备数学背景来进行编程,但数学被定义为用数字执行计算,您确实需要具有与解决数学问题时所用的思维过程和理解类似的思维过程。

评论


一些基本数学是获得该系统的,逻辑的问题解决过程的通常垫脚石。语言结构,再也不是在学校里不再学的东西,也是另一个垫脚石。编译器具有解析器是有原因的,您在解析和关注代码结构方面越擅长,您越有可能进行良好的编程。

–惨败实验室
2012年4月22日下午2:00

#7 楼

我想到目前为止,您已经学会了微积分和一些三角学的元素。然后您称其为数学。这就像称一条双腿为“人类”。

微积分与编程无关,并且与物理学和工程学紧密相关。您将需要用于游戏引擎的物理学和用于统计分析的微积分。 (统计分析可以吸引更多的工作,这是我们可以接受的)。

对我们来说,微积分更多地是关于将编程与现实世界联系起来。计算演算是研究这种关系到目前为止有多糟糕的分支。 (扰流器:它已经很糟糕了,但是我们可以无限期地检查它)

研究代数101和逻辑101,研究帕斯卡尔的历史,莱布尼兹(是的,他几乎发明了微积分,把它弄错了一半,与牛顿争辩,直到一切开始几乎是合理的-仍然构思出了二进制编码的东西)和巴贝奇(Babbage),您的许多疑惑都会消失。 (不过,您对数学的定义将永远改变)

#8 楼

编程跨越了许多传统的学科。了解数值方法以及如何有效而适当地应用计算是许多程序员每天要做的事情之一。

#9 楼

在这里,我将告诉您一些实际的知识,我在解决某些计算问题(特别是在Internet领域)时遇到了数学问题:因数分解可用于诸如情感分析之类的许多工作。
您需要了解微积分和求和法,才能弄清所编写代码的复杂性。
概率在概率信息检索/搜索中大量使用
/>朴素贝叶斯定理用于预测分析中。
您需要了解诸如超平面等东西,才能使用称为SVM的概念,该概念又在机器学习中用于解决分类问题。
您需要了解熵
搜索引擎使用的潜在语义索引/主成分分析在很大程度上依赖于矩阵代数。
等等……


#10 楼

您的问题的问题在于,“数学”和“程序设计”都是非常广泛而又深入的主题,比任何人一生都可能掌握的知识要丰富得多(毫不夸张)。我本人持有数学硕士学位。在大学期间,与同龄人相比,我似乎学到的越多,知道的越少。感觉这几年来我是否变得不那么聪明了。当我将我的硕士学位论文提交给一组教授时,甚至他们中的大多数人似乎都不熟悉我所学的知识。如果将我与从事嵌入式汇编语言编程的人进行比较,您可能会认为我们是两个非常有才华的专业人员,但是即使我们都是“程序员”,我们的专业知识也会大相径庭。

如果您在学习高等数学(除了一年级微积分之外)方面取得了进步,您会发现数学为抽象推理注入了一门学科,将在您编程时很好地为您服务。我认为这门学科非常重要,因为在编程时您将处理抽象的问题。您将编写一些简短的程序来说明此概念,并且您将了解如何驱动计算机来满足您的意愿。但是,了解指针算术如何抽象地工作将使您不擅长在实际程序中使用指针。当需要处理一万行代码混乱并对指针算法进行一些更改时,您将需要能够以非常抽象的水平进行推理,做出战略性决策以平衡对更改影响的各种担忧代码。

作为程序员,您必须权衡代码的“可读性”,代码的性能,所生成程序的易用性以及许多其他问题。您必须能够进行非常抽象的比较,以使这些关注点之间达到平衡。您每天都会进行许多比较。我什至还没有开始进行时间管理。您将抽象地推断出您做某事会影响您按时完成任务的能力的可能性,再一次,您每天都会做出许多决定,这些决定都会影响您的工作。

最后,您必须保持自己的哲学纪律,以便能够吸收新的思想和观念,以便能够在旧的方法论和实践逐渐失效的情况下继续发展。再次,您将必须能够评估随之而来的想法,并与您已经知道的内容进行抽象比较。我们大多数人都知道,它与数学有很多关系;但是从抽象的角度看,它们有很多共同点。

评论


我特别喜欢“我们大多数人都知道”的部分。这就是我在阅读大多数答案时遇到的困难:“左手”不知道“右手”在做什么。

–安德鲁·斯泰西(Andrew Stacey)
2012年2月29日在9:31

我猜是“左手不知道右手在做什么”。 OP表示,他正在“从底层开始”使用Java。用Java编程有点像是从五金店用螺栓和木材建造东西,而不是加工这些螺栓并将活树变成木材(这更像是在Assembler中编程)

–维维安河
2012年2月29日15:21

#11 楼

数学描述(说)一个立方方程。

一种算法描述了如何求解该立方方程。一台机器正在编程。

计算机科学是对算法的分析-它的理论时间/空间效率,误差范围等。这可以看作是数学的一个分支。但是请注意,计算机科学和编程实际上并不是一回事。如果您想成为一名优秀的程序员,那么拥有计算机科学基础非常重要,因为它可以帮助您更好地设计和推理所开发的算法。但这不是必须的。

一个好的程序员可能不是(实际上常常不是)一个好的数学家,反之亦然。它们是可识别的独立技能。

评论


这取决于您的域。如果您只是想成为一名程序员,那么您实际上不需要了解数学。如果您想成为业务的关键部分(在许多领域),那么必须提出解决领域问题的解决方案至关重要。通常,只有具有扎实的数学背景才能得出这些解决方案。您可能不需要成为任何特定数学领域的专家,但您应该知道如何应用各种数学,以便找出哪种数学可以解决当前的特定问题。

–扣篮
2012年2月27日在20:47



#12 楼

这些年来,我已经看到很多关于此类论坛的问题,真正的问题在于发布者对数学的理解不足。例如,任何具有良好代数基础的人都知道,你不能除以零。但是我看到了很多问题,发帖人不理解这一点,后来又不理解错误信息,基本上说“你不能被零除”。我已经看到很多问题,很明显,发帖人不了解基本逻辑。我看到了太多的问题,在这些问题中布尔代数的概念显然不为人所理解。不需要了解它们背​​后的概念。顺便说一句,在多年的工作经验中,我从来没有遇到过对数学有扎实了解的糟糕程序员。

在某些领域中,您直接使用很多数学,例如游戏编程,统计编程,财务编程,一些嵌入式系统。在某些情况下,系统会为您提供需求中所需的方程式,有时却没有。但是,即使给定了方程式,要将这些方程式正确转换为编程代码也需要您了解该方程式的开头。

虽然您可以在基本的CRUD应用程序中仅用基本的代数学习,但是大多数更有趣的问题和更高级的工作都涉及数学理解。那么,为什么不从一开始就不深入学习数学来限制自己呢?

#13 楼

立即想到两个示例:

函数-将变换应用于输入变量以产生输出变量的想法深深扎根于数学。将一个函数作为参数传递给另一个函数的想法更是如此。通常,与编程相关联的抽象思维概念与数学非常相似。

#14 楼

从程序员的角度来看:数学是编程的一个子集。

数学在编程中的应用:

在编程中使用集合(数组,列表,映射等)时,您正在处理数学抽象的现实世界实现。

不使用数学进行编程:

如果执行println("Hello World"),则使用某些数学来计算位置的事实。屏幕,字符串的长度等实际上基本上无关紧要。

使用数学编程:

以编程语言来实现数学和物理学可以使诸如计算机辅助设计之类的事情可能。

评论


两者之间既有数学方面的关联,也有编程方面的关联。两者都不是另一个的适当子集。如果您了解更多MATH,您就会知道。让我们绘制一个维恩图,看看是否可以在每个区域找到一个项目。代数与数学和编程有关。面向对象编程的原理并不严格与数学有关,而是抽象,因为数学是抽象。离散数学和统计数据对于程序员都非常有用。对于大多数程序员而言,微积分很少出现,但是30年来我从来没有。

– Warren P
2012年2月29日14:51



#15 楼

编程通常基于通常是数学模型的模型。

让我们以创建抵押计算器为例。为此,您需要知道什么是兴趣,什么是复合兴趣等等。如果您不了解基础数学,那么其他人必须向您提供该信息。通常,要做所有事情都是程序员的工作。但是,如果需要,您始终可以寻求帮助。

数学中有一些简单的概念,在编程中已广泛使用。例如表达式,方程式,变量,它们在编程中被广泛使用。如果您没有在数学上获得它,那您可能不是最好的程序员。

具有强大的数学知识,可以为您提供更多用于建模工作的知识。最终使您成为一个更好的程序员。例如,您可能想在一个项目中绘制一个二次方程,这样一来,您就会学到更多东西,因为您数学能力强。或者您编写程序来查找圆的区域,为您提供更多的经验。

在我短暂的教学生涯中,我发现,如果学生没有数学背景,那么他们在做数学时就会迷失财务问题。如果他们对模型迷失了,学习语言本身将变得更加困难,而且实在令人沮丧。

评论


某人是否可以解决财务问题,与他们在该领域的能力是否胜任有关,几乎与编程能力无关。我使用信号处理软件,其中包含很多数学知识。我的工作不是做数学,而是将数学家和工程技术人员(不在他们的专业领域中进行编程)产生的东西变成好的软件。因为那是我的领域。

– Blfl
2012-2-26在18:15



在大多数实际领域中,两者是分开的:有人拥有模型,而有人必须对其进行编程。所以是的,你是对的。但是,对于要从一开始学习编程的人来说,他们必须了解数学。否则会很困难。他们必须了解变量,表达式和不同的数学属性。我曾与优化团队合作。他们正在研究求解器。如果他们不懂数学,他们将永远都不会做。我是从学习的角度出发回答问题的,并且知道他只是一个刚开始学习编程的新手。

–名
2012-2-26在18:22



从学习的角度来看,必须具有数学背景,否则其他人将无法学习。

–名
2012-2-27在20:55

解算器在很大程度上是数学领域的问题,这使得我们有理由要对所涉及的数学有所了解才能进行求解。我并不是说编程中不涉及数学概念,但是正如@DeadMG在他的回答中指出的那样,该过程中有很多非常实际的方面,而数学绝对没有帮助。

– Blfl
2012-2-27在23:34

@ Birfl,DeadMG有点无知(而且几乎总是错误的)。数学将始终在所有“软”领域提供帮助。心理学很大程度上基于数学。社会学更加数学化。而且在系统设计的情况下,最好不要在语义方面没有很好的背景(这是来自离散数学)的情况下进行操作。编程中不存在非数学方面的问题。包括GUI设计和CRUD编码。

– SK-logic
2012年2月28日在8:23

#16 楼

计算机科学的理论基础(不仅仅是编程)本质上是数学的。从可计算性的定义到算法的分析和表达,再到编程语言的规范,所有内容都基于各种各样的数学。请参阅此Wikipedia页面,以了解所涉及的那种数学风格。

实际上,大多数不需要知道吊索代码是不是必须的。就应用数学而言,除非您进入一个需要大量数字运算技能(详细的物理模拟,信号分析,财务分析和预测等)的领域,否则您将不会使用除基本代数以外的任何东西。每天

#17 楼

老实说,这取决于您正在执行哪种编程。

如果您要使用某些逻辑制作轻型Web应用程序,则可能不需要许多学位要求的更高级的数学课程。如果您要处理的处理器负担更多,那么您将需要更多的数学运算。如果您从事任何科学领域的工作,那么您真的会希望随时掌握calc引用。

需要数学的另一个地方是如果您想编写游戏。您想对角移动的第二个位置,您需要开始进行一些仔细的计算,以免最终移动到NE的块时不会加速字符。

,您不一定需要先学习数学,然后再学习编程。学习编程,然后学习一些高级数学是完全有效的。在开始涉足Calc或Trig类之前,我开始进行编码,并且一切都很好。当我确实开始学习高级数学时,我发现编码确实对我有帮助,因为我可以通过在快速脚本中更改变量而不是笔和纸来探索更多的话题。

评论


您肯定需要了解游戏的触发数学和矢量数学。

–艾伦B
2012年4月4日在7:54

绝对。不过,我还发现,只要不按时完成任务,写作游戏可以成为一种重新学习高中时可能忘记的数学的好方法。

– kcunning
2012年4月4日在12:03

#18 楼

我绝不是数学专家!我在HS几何学上做得很好,这对我来说完全是逻辑。我发现编程和几何非常相似。布尔逻辑在我看来与几何证明非常紧密地联系在一起。

然后,几乎没有什么事情知道要使用模运算符来控制一行中有多少列。

我强烈赞成这样一个想法,即成为一个有程序员(或朋友/同事/顾问)的优秀程序员,同时又是一名出色的数学家。 br />

#19 楼

简单的答案;数学使您快速。当然,您可以Google / se / wikipedia解决您的编码问题,但是可以完成足够的数学运算,而且您不需要这样做。信不信由你,经过适当训练的人脑比Google快。此外,您所掌握的数学知识越多,您就能越快地了解google / se / wiki给您的结果,而您就需要进行深入研究以了解人们的看法。在解决编程问题的过程中,无论如何您最终都会学习数学,但是如果您专注于数学,这将是一个效率更高的过程。

您的问题有点像摇滚乐手在问为什么他们将需要正规的音乐训练。没有它,有可能成功吗?当然。如果您这样做的话,它会使您更讨厌吗?绝对正确。

稍​​微复杂一点的答案-当数学家和程序员使用“解决方案”一词时(对于问题,不是方程式,即不是“根”),它们的含义几乎相同。学习解决数学问题可以帮助您学习解决编程问题。

顺便说一句-并没有针对任何人的冒犯-任何说自己是一个很好的程序员但讨厌数学的人大胖骗子。发生的是,他们被不良的高中生或大学讲师拒之门外,从那时起,他们就觉得自己“不擅长数学”。没有学习障碍的任何人(即,任何能够学习OO语言的人)都可以进行包括二年级微积分在内的所有事情。

#20 楼

数学和99%的编程活动几乎没有共同之处。数学不一定是优秀的程序员。我参加了几门大学水平的数学课程,包括但不限于线性代数的微积分I,II,III元素,以及其他几门课程。

我已经担任软件工程师超过10年了并且只需要很少使用基本数学之外的任何东西。在某些需要数学的地方有一些例外:例如图形和其他领域。但是99%的编程和软件工程都不需要数学。它需要逻辑思维,算法,OOP,函数,分解问题等。

#21 楼

1)在学习编程时,您会遇到技术术语(即算法)。要分析算法,必须对多项式,对数和指数函数的性质有所了解。

2)在计算机科学应用程序的基础上,必须对离散数学和连续数学有所了解编写有意义的解决方案。可以通过以下课程来进一步了解这一点:-

--->计算机科学数学

--->矩阵编码:通过计算机科学进行线性代数应用程序。

对于初学者来说,我觉得像python / scheme这样的动态类型化语言是最适合编程的语言。诸如Java / C++之类的静态类型语言并不是最好的开始。从“麻省理工学院/ UOC-伯克利/斯坦福大学”发行的Opencourseware比普通的大学课程可以为您提供更好的指导。我敢打赌你!!!

#22 楼

我个人要说的是,这取决于所涉及的编程级别。数据模型及其之间的相关性,涉及的编程算法。例如:编写一个输出“ Hello World”的程序,我认为不需要使某人熟悉高等数学。
数学参与程度取决于需要以编程方式解决的问题的复杂程度。

#23 楼

仅凭我的经验,就不再了:
我不是数学家。我不是天才,只是天才。
...多年以后,我意识到我比直觉更能干

首先,我从零开始学习了(死系统)(单独以及纸质文档和示例),
... C,C ++娱乐之后,Java则是工作。数学问题(即使基本/极简代数对您有所帮助),但在逻辑上却是一个逻辑问题。

现在许多工具(如Eclipse)可以帮助并纠正您:您必须专注于要完成的工作只有52个保留字...以及许多对您不利的库。

因此,如果您喜欢语言,请选择一个Java项目,研究Pattern Design,UML,了解JVM以及将其与Bigloo结合使用和Scala,在一万小时内一次又一次地了解。

Java的经验为您提供了高薪工作,并且在大型工业项目中工作了很长时间,您将能够切换到另一个环境,因为你会讲信息,不t数学。

如果理解语言(单词,含义,概念和其他隐藏的逻辑科学,如语义,本体论等)对您的人类来说是一个不错的目标,那么您一生都可以开始现在。

,否则,尝试另一种方法。

最好的问候

评论


同样,请参见下面的帖子。您在做数学,只是选择不接受。

–詹姆森
2012年3月11日23:42

我看到了,但我发现还有其他帖子回答了关于第一个关于数学兴趣的学生的问题(他们知道基础,而不是专业),他们以-1 ^ n讲拉丁语,哲学,语言的逻辑...真实生活。数学的思维是否如此狭窄,以至于所有不处于等式状态的事物都被拒绝了,而又不了解周围的生活,而忘记了牛顿是从苹果的直觉开始的?也许是主持人向其他世界敞开胸怀,这将使讨论的双方更加充实。不管怎样,我会小心谨慎的。

–cl-r
2012年3月20日14:29

#24 楼

有人差点砸了上面的头。编程是数学。更具体地说,编程是数学逻辑的一个分支,称为可计算性理论或递归理论。

数学的其他分支直接涉及,特别是形式语言和自动机理论。这些帮助描述了用于模式匹配的正则表达式以及用于描述和解析编程语言的形式语法。

任何说编程不是数学的人都不知道他们在说什么,或具有别有用心的动机,例如“知识产权”最大化主义者,他希望通过获得有关算法或其他一些基本数学事实或发现的专利来获利。

一些关于数学编程的参考资料,推论不知道您在说什么:

程序就是证明:19世纪逻辑和21世纪计算

程序就是证明:Lambda微积分中的模型和类型

Wikipedia的Curry-Howard通讯文章

关于计算机科学中逻辑的非常规有效性

逻辑的非常规有效性

>是的,这些在数学逻辑的“逻辑”部分上很繁重,但通常认为数学是一些公理, d它们的逻辑结果是通过一阶逻辑得出的。

否则,成为“ IP”最大化主义者是物有所值的:

如何在算法中申请专利我们。算法不是可专利的,但是通过不将算法称为算法来授予算法专利。在网络上发现很多指出或试图解释这种矛盾的材料并不难。

评论


-1为结尾。

–Charles E. Grant
2012-2-27在0:57

@chars ad hominem针对谁?原始海报?我认为关于专利的观点很有见识(即使可以用更好的措词来表达)。

– gcbenison
2012年3月30日15:40

@gcbenison,“任何人说编程不是数学……或别有用心”都是典型的自发攻击:我不必对你的论点做出回应,因为你是一个坏人。我觉得这很烦人,因为我不认为编程是数学,而且我认为软件专利是可憎的。我确实拥有应用数学硕士学位,尽管我是否知道自己在说什么肯定会引起争议。

–Charles E. Grant
2012年3月30日16:56



@commentators:谢谢。我过去常常忽略这些行为,因为它们是自我推定的苦难归咎于他人。 ---布鲁斯·埃迪格(Bruce Ediger):怀疑手势反射正在进行中。

–cl-r
2012年4月2日15:34



@ cl-r:我想到的是非常具体的示例,例如SCO反Linux运动和nature.com/news/…如果我们作为程序员让律师定义数学以造福于律师,那么我们对整个文明都将是极大的伤害。

–布鲁斯·埃迪格(Bruce Ediger)
2012年4月2日在20:56

#25 楼

数学是编程的一切。例如,在游戏编程中,您需要使用matyhs进行物理处理,并减少所有工作。要在Java中移动玩家的x位置,您可以执行int x = x + speed * deltaTimeint x = x - speed * deltaTime,但是您可能会说这是基本的数学运算,因此让我们继续研究更高级的内容。有一种对棋手评级的算法称为Elo算法。



如果您仍然认为这是基本的,请尝试一下。当您获得生日,月份和年份时,如何计算某人的年龄。从今年减去出生年份,然后检查月份是否小于该月份,并且是否不减去1。

这不是魔术,这是一项艰苦的工作和良好的数学。

#26 楼

好的,为此,我可能会得到大量的反对意见,但是编程和数学是两个完全不相关的东西。仅仅作为加法,乘法和基本逻辑运算之类的基础知识的人,就可以成为一个了不起的开发人员。也以非数学方式掌握。您只需考虑一下这些东西,想象一下您的脑袋突然翻转,瞧,如果有人解释了什么是日志和能力,您就可以分辨出这些东西到底是什么大事。它很简单,或者让您为证明自己感到骄傲,因为您可以通过将离散数学等命名为数学领域来扩展编程的含义,但是可以学习许多微分方程和积分,以及如何证明,恕我直言,这并不是最好的主意,如果您想成为一名程序员,该怎么做。时间,当我需要数学进行实时渲染时,我从程序员的角度学到了一切,而没有任何定理证明,而且对我来说,与所有数学教授相比,它很容易掌握。评论“如果你不懂数学就不能成为一个好的程序员”。当然可以,很容易!

我现在了解数学知识,因此我可以与数学背景的程序员讨论所有对数和差异,但仅仅是出于这样的原因,他们不会晕。因为这些东西在99.9%的时间内都是无用的,所以从程序员的角度来看,它可以被更有效地学习1000倍。

哎呀,程序员至少需要5年才能掌握编程语言+框架+最佳实践。为什么在地球上他们应该学习如何证明定理?数学系学生从事数学工作,程序员使这些工作运行,这就是它的工作方式。

评论


一个孩子告诉他妈妈,他不需要数学,因为他会长大并成为百万富翁棒球运动员。他妈妈告诉他“您需要数学才能数百万”。

–Nav
2012-2-27在3:01

抱歉,我不同意。学习数学可以教您如何逻辑思考。如果您不能逻辑思考,那么您将要编写的只是一堆无法扩展的代码。我并不是说您必须是数学专家,甚至不是数学专家,也不必在日常生活中使用它。但是,如果您想解决实际的编程问题,则需要进行研究。

– jmort253
2012年2月27日5:18



@ jmort253:学习数学不会使您成为有逻辑思维的人。它要么是与您息息相关的事物,要么不是。我从学校开始就讨厌数学,但是我很合逻辑。编程不是数学,我从事系统编程已有10年以上的时间,我可以100%自信地告诉您,在进行Web开发或SQL管理时,您可以期望更少的数学。您的任务不是开发新的数学理论,而是要使用最有效的算法和容器,以可维护的方式使用有限的资源来使事物正常工作。

–编码器
2012-2-27在19:38

@Nav:对于每个人来说,基本数学运算(包括x和y的方程式)都有意义。但是,数以百万计的资产通常是会计师和律师的工作,因为否则,您将错过某些州法律,该州法律必须与声明做一些事情,并且以任何一种方式放松一切。您应该足够聪明,以了解发生了什么事情,但是一旦您擅长于某件事,使用专门的服务将在您保持良好身材的同时正确,快速,准时地为您做事,从而降低成本,保持辛苦赚来的前5名。

–编码器
2012-2-27在19:43

数学不是求解方程式的过程。如果您所见过的唯一数学是在学校教授的数学,那么您从未见过实际的数学。

–doppelgreener
2012年2月28日在7:01