一个好的开发人员应该知道哪些核心数学概念?
自2006年从一所很小的学校毕业以来,这个学校的课程设计得不好而且过时了(我是外国人,那时还不知道任何一所更好的学校),我逐渐意识到,我错过了很多基本概念,数学和软件观点,这些观点大多是其他更高概念的基础。
IE。我试图听/看麻省理工学院关于算法入门的开放课件,但很快意识到我缺少几个数学概念来更好地理解该课程。
那么,一个好的软件工程师应该知道哪些核心数学概念?我们会向我推荐哪些书籍/网站?
解决方案
回答
首先,我们CS员工称之为"离散数学"。微积分和线性代数也可以派上用场,因为它们可以带我们进入许多应用领域。掌握了这三个要素后,请继续学习概率论。这4个将使我们在95%(我组成)的应用程序领域中具有竞争力。
回答
有一本值得推荐的书。书名有点像《混凝土数学》。在几个问题中提出了建议。
回答
我的数学背景确实很差(接受过地质学家培训),但是我在高中时参加了一次离散数学课程,并且每天都以程序员的身份使用这些概念。这可能是我所有学历中最有价值的一门课,因为这与我目前的职业有关。
回答
基础代数和统计学是很好的起点,也是许多其他领域的基础。
回答
"归纳证明"是程序员要了解的核心数学概念。
回答
程序员数学。一本好书。
回答
在一般算法分析中以及与标准集合(排序,检索插入和删除)有关的Big O表示法
回答
我会说布尔逻辑。 AND,OR,XOR,NOT。
我发现作为程序员,我们比其他数学概念更频繁地使用它。
回答
我认为这取决于关注重点。几年前,我购买了Donald Knuth的一套《计算机编程艺术》。看完这些书后,我意识到几乎所有东西都是微积分证明。如果我们有兴趣开发自己的通用算法及其证明,那么我建议我们能够理解上述书籍,因为它是我们在该领域所要处理的。另一方面,如果我们只想/需要使用各种排序/搜索/树/等例程,那么至少要有大的O表示法,布尔数学和一般代数都可以。如果我们要处理3D,则也要进行几何图形和Trig处理。
我倾向于在使用方面而不是在证明方面,尽管我想认为多年来我做过一些聪明的事情,但从未坐下来开发新的分类程序。我能提供的最好建议是,了解我们所需要的领域,但要使自己处于更高的水平,以便知道它的存在以及有多少要学习,否则我们将不会获得太大的增长。
回答
布尔代数是理解控制结构和重构的基础。例如,我已经看到许多由不了解(或者无法使用)德摩根定律的程序员引起的错误。再举一个例子,有多少程序员立即意识到
if (condition-1) { if (condition-2) { action-1 } else { action-2 } else { action-2 }
可以改写成
if (condition-1 and condition-2) { action-1 } else { action-2 }
离散数学和组合数学极大地有助于理解各种算法和数据结构的性能。
如Baltimark所述,数学归纳法在推理循环和递归时非常有用。
集合论是关系数据库和SQL的基础。
作为类比,让我指出,木匠通常在构造屋顶和楼梯之类的东西时使用各种经验法则。但是,掌握几何知识可以解决没有"固定"经验法则的问题。这就像学习通过语音阅读而不是对基本词汇的视觉识别一样。 90%以上的时间差异不大。但是,当我们遇到不熟悉的情况时,非常高兴拥有自己制定解决方案的工具。
最后,无论特定的技术如何,数学要求的严格/精确度对于编程都是非常有用的准备。同样,我在职业生涯中见过的许多编程错误(甚至规范)中的根源都是草率的。
回答
离散数学
线性代数
组合学
概率统计
图论
回答
对于离散数学,这里有来自Arsdigita大学的20堂很棒的讲座。每个大约一个小时二十分钟。
回答
我会选择兰登所说的领域:
Discrete Math, Linear Algebra, Combinatorics, Probability and Statistics, Graph Theory
并添加数学逻辑。
这将使我们掌握CS的大多数领域。如果我们想进入特殊领域,则必须深入一些领域,尤其是:
Computer graphics -> Linear Algebra Gaming -> Linear Algebra, Physics Computer Linguistics -> Statistics, Graph Theory AI -> Statistics, Stochastics, Logic, Graph Theory
回答
当我看到不了解它的开发人员时,这是一个让我感到困惑的简单方法:
操作顺序
回答
- 布尔代数
- 集合论
- 离散数学
回答
按重要性顺序:
- 计数(循环需要)
- 加,减,乘,除。
- 代数(仅真正需要了解变量的使用)。
- 布尔代数,布尔逻辑和二进制。
- 指数和对数(即理解O(n)表示法)。
比这更高级的通常是特定于算法或者特定于域的。根据我们感兴趣的领域,以下内容也可能相关:
- 线性代数和三角学(3D可视化)
- 离散数学和集合论(数据库设计,算法设计,编译器设计)。
- 统计信息(很好,用于统计和/或者科学/经济应用。可能也对算法设计有用)。
- 物理(用于模拟)。
理解函数也很有用(不记得那个区域的数学术语是什么),但是如果我们知道如何编程,我们可能已经知道了。
我的观点是:十岁的孩子应该掌握足够的数学知识,以便能够理解编程。对事物的基本理解并不需要太多的数学运算。确实,这全都与逻辑有关。
回答
具体数学涵盖了大多数主要主题。一本关于离散数学的好书,例如罗森的《离散数学及其应用》,将填补所有空白。
回答
"计算机程序设计的艺术"的第1章旨在提供确切的信息。
回答
好吧,这取决于目标是什么。有人说过,如果要解决难题,线性代数,组合数学,概率统计和图论非常重要。函数的渐近增长(位Oh表示法)非常重要。如果我们需要分析一些更复杂的算法,则还需要掌握汇总和序列(请参阅Cormen&others算法简介的附录)。
即使我们是"企业用Java"或者"服务器端PHP",当老板希望我们获得服务器时,也会发现一些统计和算法复杂性(因此,组合,归纳,求和,系列等)很有用工作更快,添加新硬件似乎无济于事。 :-)我已经经历过一次。
回答
- 布尔代数
- 集合论
回答
为什么每个人都将概率和统计信息包括在黄金清单中而不提及微积分?至少在没有极限,导数,积分和级数的实际知识的情况下,才能理解概率和统计量的含义。总而言之,微积分(与线性代数一起)是所有数学的主力军。
回答
回到学校后,我的讲师对商业应用程序说过,我们需要知道的所有知识都包括加,减,乘和除。请求者会知道并告知我们所需的所有其他公式。现在意识到这是为财务报告和应用程序重点学校筹集资金的。至今,这对我来说都是正确的。我再也不需要知道更多。
回答
我认为算法和理论非常重要。能够提出快速正确的解决方案的原因是优秀程序员与其他程序员的区别。同样,能够证明算法(使用标准证明技术-归纳,矛盾等)也同样重要。
回答
查看《计算机科学基础》一书
这本书的作者:Al Aho和Jeff Ullman,整本书都可以在线获得。
这是作者在序言中对本书目标的评价:
"计算机科学基金会涵盖了经常被拆分的学科
离散数学课程和计算机二年级水平序列之间的关系
数据结构科学。我们一直打算选择数学
着眼于计算机用户真正需求的基础,而不是关注
数学家会选择什么。"
回答
是的,我想对归纳法有一个基本的了解会有所帮助,这样我们就可以理解n在算法中所代表的含义。逻辑和离散结构也很有用。
回答
如果我们必须做类似于机器学习的任何事情,那么概率和统计量将非常有帮助。
我在"计算技能"博客文章中介绍了基础知识,在其中讨论了Xbox Live的TrueSkill排名和配对算法的工作原理。
回答
一个学习数学的网站:
http://www.khanacademy.org/