一个优秀的开发者需要了解哪些核心数学概念?

62

自从2006年从一所规模很小的学校毕业,那里的计算机程序过时且缺乏完善(当时我是个外国人,不知道有更好的学校),我意识到我错过了很多基本概念,这些概念是数学和软件方面其他较高概念的基础。

例如,我试图收听/观看麻省理工学院的开放式课程《算法导论》,但很快就发现我缺少了几个数学概念,以便更好地理解该课程。

那么,一个优秀的软件工程师应该了解哪些核心数学概念?您会推荐哪些书籍/网站?

27个回答

62

Yegge的文章非常全面,并提供了其他几个进一步阅读的资源。 - Jose B.
4
到目前为止,这是我读过的关于这个话题最好的文章,它解答了你在学习数学方面的所有困惑和疑虑。我希望我可以给这篇文章更多的赞。非常感谢Gulzar,请分享更多像这样的文章如果您有的话。 - Ramadheer Singh

19

布尔代数对于理解控制结构和重构非常基础。例如,我曾经看到许多由程序员因不知道(或无法使用)德摩根定律而引起的错误。另一个例子是,有多少程序员立即认识到

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%以上的时间没有太大区别。但当你遇到陌生的情况时,拥有自己解决问题的工具非常好。

最后,数学所需的严密性和精确性对于编程非常有用,无论具体技术如何。再次强调,我职业生涯中看到的许多程序错误(甚至规范)都源于粗心的思考。


12

我会选择Landon提到的领域:

离散数学、线性代数、组合数学、概率与统计学、图论

并加上数理逻辑。

这将使您掌握大多数计算机科学领域。如果您想进入特殊领域,您必须深入某些领域:

Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory

10
按重要性顺序排列:
  • 计数(循环所需)
  • 加、减、乘、除。
  • 代数(只需要理解变量的使用)。
  • 布尔代数、布尔逻辑和二进制。
  • 指数和对数(即了解O(n)符号)。

任何比这更高级的内容通常都是特定于算法或特定于领域的。根据您感兴趣的领域,以下内容也可能相关:

  • 线性代数和三角学(3D可视化)
  • 离散数学和集合论(数据库设计、算法设计、编译器设计)。
  • 统计学(对于统计和/或科学/经济应用非常有用。对于算法设计也可能有用)。
  • 物理学(用于模拟)。

理解函数也很有用(不记得这个领域的数学术语是什么了),但如果您知道如何编程,您可能已经知道了。

我的观点是:一个10岁的孩子应该知道足够的数学知识来理解编程。基本理解并不需要太多数学知识,关键在于逻辑。


9
"

数学归纳法证明

是程序员必须了解的核心数学概念。"

2
真的吗?需要完成哪些编程特定任务? - Anders Sandvig
@Anders - 在算法开发的情况下证明证据。 - rjzii
1
幸运的是,归纳证明在我看来是最简单的。 - mmcdole

9
在一般算法分析中,大 O 符号 与标准集合(排序、检索、插入和删除)有关。

8

对于离散数学,这里有一套来自 Arsdigita 大学的精彩讲座。每个讲座约为一个小时二十分钟。


7

我们计算机科学专业通常从“离散数学”开始学习。微积分和线性代数也非常有用,因为它们可以让你进入许多应用领域。一旦掌握了这三个,再学习概率论。这四个领域将让您掌握95%(这只是一个瞎编的数字)的应用领域。


有些人称“离散数学”为“有限数学”。我认为它们是同一件事。 - Thomas Owens

7

@mamama:我之前从没注意到CM里缺少了那个。谢谢你指出来。 - Bill the Lizard

5
我认为这取决于你的重点。几年前,我购买了Donald Knuth的《计算机程序设计艺术》系列。看完这些书后,我意识到几乎所有内容都是微积分证明。如果你有兴趣开发自己的通用算法和证明,那么我建议你能够理解上述书籍,因为这是你在那个领域中要处理的内容。另一方面,如果你只想/需要使用各种排序/搜索/树等常规程序,那么最少需要掌握O大写符号表示法、布尔数学和普通代数即可。如果你涉及三维,则还需要掌握几何和三角学。
我倾向于更多地使用而非制作证明,虽然我认为我多年来做过一些聪明的事情,但我从未坐下来开发过新的排序程序。我能给出的最好的建议是学习你所需的领域知识,但也要接触更高级别的知识,以便了解它存在的程度以及还有多少需要学习的内容,否则你的成长将会受到很大限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接