自从2006年从一所规模很小的学校毕业,那里的计算机程序过时且缺乏完善(当时我是个外国人,不知道有更好的学校),我意识到我错过了很多基本概念,这些概念是数学和软件方面其他较高概念的基础。
例如,我试图收听/观看麻省理工学院的开放式课程《算法导论》,但很快就发现我缺少了几个数学概念,以便更好地理解该课程。
那么,一个优秀的软件工程师应该了解哪些核心数学概念?您会推荐哪些书籍/网站?
自从2006年从一所规模很小的学校毕业,那里的计算机程序过时且缺乏完善(当时我是个外国人,不知道有更好的学校),我意识到我错过了很多基本概念,这些概念是数学和软件方面其他较高概念的基础。
例如,我试图收听/观看麻省理工学院的开放式课程《算法导论》,但很快就发现我缺少了几个数学概念,以便更好地理解该课程。
那么,一个优秀的软件工程师应该了解哪些核心数学概念?您会推荐哪些书籍/网站?
程序员的数学。非常值得一读。
布尔代数对于理解控制结构和重构非常基础。例如,我曾经看到许多由程序员因不知道(或无法使用)德摩根定律而引起的错误。另一个例子是,有多少程序员立即认识到
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%以上的时间没有太大区别。但当你遇到陌生的情况时,拥有自己解决问题的工具非常好。
最后,数学所需的严密性和精确性对于编程非常有用,无论具体技术如何。再次强调,我职业生涯中看到的许多程序错误(甚至规范)都源于粗心的思考。
我会选择Landon提到的领域:
离散数学、线性代数、组合数学、概率与统计学、图论
并加上数理逻辑。
这将使您掌握大多数计算机科学领域。如果您想进入特殊领域,您必须深入某些领域:
Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory
任何比这更高级的内容通常都是特定于算法或特定于领域的。根据您感兴趣的领域,以下内容也可能相关:
理解函数也很有用(不记得这个领域的数学术语是什么了),但如果您知道如何编程,您可能已经知道了。
我的观点是:一个10岁的孩子应该知道足够的数学知识来理解编程。基本理解并不需要太多数学知识,关键在于逻辑。
数学归纳法证明
是程序员必须了解的核心数学概念。"我们计算机科学专业通常从“离散数学”开始学习。微积分和线性代数也非常有用,因为它们可以让你进入许多应用领域。一旦掌握了这三个,再学习概率论。这四个领域将让您掌握95%(这只是一个瞎编的数字)的应用领域。
《具体数学》涵盖了大部分主要主题。像Rosen的《离散数学及其应用》这样的好书将填补任何空白。