提问人:Jose B. 提问时间:9/9/2008 最后编辑:OdedJose B. 更新时间:6/12/2013 访问量:10804
一个好的开发人员应该知道的核心数学概念是什么?[关闭]
What are the core mathematical concepts a good developer should know? [closed]
问:
自从2006年从一所非常小的学校毕业以来,我的课程结构很糟糕,而且已经过时了(我是一个外国人,当时不知道有更好的学校),我开始意识到,从数学和软件的角度来看,我错过了很多基本概念,这些概念大多是其他高级概念的基础。
也就是说,我试图收听/观看麻省理工学院关于算法导论的开放课件,但很快意识到我错过了几个数学概念,无法更好地理解课程。
那么,一个好的软件工程师应该知道哪些核心数学概念呢?你会推荐哪些可能的书籍/网站?
答:
从我们 CS 人员所说的“离散数学”开始。微积分和线性代数也可以派上用场,因为它们可以让你踏入许多应用领域的大门。一旦你掌握了这三个,就去学习概率论。这 4 个将使您在 95%(我编造的)应用程序领域中胜任。
评论
有一本书被推荐了......标题类似于具体数学。在几个问题中提出了建议。
评论
我的数学背景真的很差(受过训练的地质学家),但我在高中上过一门离散数学课,作为一名程序员,我每天都在使用这些概念。这可能是我所有教育中最有价值的课程,因为它与我目前的职业有关。
基础代数和统计学是很好的起点,也是许多其他领域的基础。
“归纳证明”是程序员需要了解的核心数学概念。
评论
程序员的数学。一本好书。
评论
一般算法分析中的大 O 表示法,以及与标准集合(排序、检索插入和删除)相关的
我会说布尔逻辑。和,或者,XOR,不是。 我发现作为程序员,我们比其他数学概念更频繁地使用它。
我认为这取决于你的专注力。几年前,我购买了唐纳德·克努斯(Donald Knuth)的《计算机编程艺术》(Art of Computer Programming)。看了书后,我意识到几乎所有东西都是微积分证明。如果你有兴趣开发自己的通用算法和证明,那么我建议你能够理解上面的书,因为这是你在那个世界中要处理的。另一方面,如果您只想/需要使用各种排序/搜索/树/等...例程,然后至少使用大 O 符号、布尔数学和一般代数就可以了。如果您正在处理 3D,那么几何图形和三角形也是如此。
我倾向于使用方面而不是做证明,虽然我想这些年来我做了一些聪明的事情,但我从来没有坐下来开发一个新的排序程序。我能给出的最好的建议是了解你的领域需要什么,但让自己接触到更高的层次,这样你就知道它的存在以及还有多少东西要学,否则你不会得到太多的成长。
布尔代数是理解控制结构和重构的基础。例如,我见过许多由不知道(或不能使用)德摩根定律的程序员引起的错误。再举一个例子,有多少程序员立即认识到这一点
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 场精彩讲座。每个时长约为一小时二十分钟。
我会选择兰登所说的领域:
离散数学、线性代数、 组合数学、概率和 统计学、图论
并添加数理逻辑。
这将使您掌握 CS 的大多数领域。如果你想进入特殊领域,你必须深入研究一些领域,特别是:
Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory
这里有一个简单的问题,当我看到不理解它的开发人员时,这让我感到困惑:
- 操作顺序
评论
- 布尔代数
- 集合论
- 离散数学
按重要性排序:
- 计数(循环需要)
- 加法、减法、乘法、除法。
- 代数(只有真正需要理解变量的使用)。
- 布尔代数、布尔逻辑和二进制。
- 指数和对数(即理解 O(n) 表示法)。
任何比这更高级的东西通常是特定于算法或特定于域的。根据您感兴趣的领域,以下内容也可能是相关的:
- 线性代数和三角学(3D 可视化)
- 离散数学和集合论(数据库设计、算法设计、编译器设计)。
- 统计学(嗯,用于统计和/或科学/经济应用,可能也可用于算法设计)。
- 物理(用于模拟)。
理解函数也很有用(不记得该领域的数学术语是什么),但如果你知道如何编程,你可能已经这样做了。
我的观点是:一个十岁的孩子应该知道足够的数学才能理解编程。对事物的基本理解并不需要太多的数学知识。这完全是关于逻辑的,真的。
具体数学涵盖了大多数主要主题。一本关于离散数学的好书,如罗森的《离散数学及其应用》,将填补任何空白。
评论
“计算机编程的艺术”的第 1 章旨在提供这一点。
嗯,这取决于你的目标是什么。正如有人所说,如果你喜欢解决难题,线性代数、组合学、概率与统计和图论都很重要。函数的渐近增长(bit-Oh 表示法)非常重要。如果您需要分析一些更复杂的算法,您还需要掌握求和和级数(参见 Cormen&others Introduction to Algorithms 的附录)。
即使你喜欢“面向企业的 Java”或“服务器端 PHP”,当你的老板希望你让服务器更快地工作时,你会发现一些统计和算法复杂性(因此是组合学、归纳法、求和法、级数等)很有用,而添加新硬件似乎没有帮助。:-)我经历过一次。
- 布尔代数
- 集合论
为什么每个人都把概率和统计学都列入黄金清单,却没有提到微积分?如果没有极限、导数、积分和级数的至少工作知识,就无法理解概率和统计是关于什么的。总而言之,微积分(连同线性代数)是所有数学的主力军。
回到学校,我的老师说,对于商业应用,你需要知道的就是加、减、乘、除。请求者将知道并告知您需要什么的所有其他公式。现在意识到这是为了资助报告和以应用为重点的学校。直到今天,这对我来说仍然适用。我从来没有一次需要知道比这更多的东西。
我认为算法和理论非常重要。能够提出一个快速、正确的解决方案是优秀程序员与其他程序员的区别。此外,能够证明你的算法(使用标准的证明技术——归纳法、矛盾法等)同样重要。
查看《计算机科学基础》一书
本书的作者是:Al Aho 和 Jeff Ullman,整本书可在线获取。
作者在序言中对本书的目标是这样说的:
"计算机科学基础涵盖的科目通常分为
离散数学课程和数据结构计算机科学
的二年级序列。我们一直打算在选择数学基础时着眼于计算机用户真正需要什么,而不是
数学
家可能选择的东西。
是的,我想说的是,对归纳的基本理解有助于您理解 n 在算法中代表什么。此外,一些逻辑和离散结构也很有帮助。
如果你必须做任何类似于机器学习的事情,概率和统计是非常有用的。
我在“计算你的技能”博客文章中介绍了基础知识,其中讨论了 Xbox Live 的 TrueSkill 排名和匹配算法的工作原理。
复习数学的网站:http://www.khanacademy.org/
评论