【问题标题】:What are the core mathematical concepts a good developer should know? [closed]优秀的开发人员应该了解哪些核心数学概念? [关闭]
【发布时间】:2010-09-08 07:21:45
【问题描述】:

自从 2006 年从一所非常小的学校毕业后,我的课程结构很糟糕且过时(我是外国人,当时不知道有更好的学校)我开始意识到我错过了很多基础知识来自数学和软件角度的概念,这些概念大多是其他更高概念的基础。

即我尝试在Introduction to Algorithms 上收听/观看来自麻省理工学院的开放课件,但很快意识到我遗漏了几个数学概念以更好地理解课程。

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

【问题讨论】:

    标签: algorithm math language-agnostic


    【解决方案1】:

    Math for Programmers。很好的阅读。

    【讨论】:

    • Yegge 的文章非常透彻,并提供了其他一些资源供进一步阅读。
    • 到目前为止,我读过的关于这个主题的最好的(est)文章,解答了你所有关于学习数学的困惑和困境。我希望能给这个更多 + 非常感谢 Gulzar,如果你有的话,请分享更多这样的文章。
    【解决方案2】:

    布尔代数是理解控制结构和重构的基础。例如,我见过许多由不了解(或无法使用)德摩根定律的程序员引起的错误。再举一个例子,有多少程序员立即意识到这一点

    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+%的时间没有太大区别。但是当您遇到不熟悉的情况时,拥有工具来自己制定解决方案是非常好的。

    最后,数学所要求的严谨性/精度对于编程来说是非常有用的准备,无论具体技术如何。同样,我在职业生涯中看到的许多编程(甚至规范)错误的根本原因都是草率的思考。

    【讨论】:

      【解决方案3】:

      我会选择兰登所说的领域:

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

      并添加数学逻辑。

      这将使您掌握 CS 的大多数领域。如果你想进入特殊领域,你必须深入一些领域,特别是:

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

      【讨论】:

        【解决方案4】:

        按重要性排序:

        • 计数(循环需要)
        • 加法、减法、乘法、除法。
        • 代数(仅真正需要了解变量的使用)。
        • 布尔代数、布尔逻辑和二进制。
        • 指数和对数(即理解 O(n) 表示法)。

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

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

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

        我的意思是:一个十岁的孩子应该知道足够的数学知识才能理解编程。对事物的基本理解并不需要太多的数学知识。真的,这都是关于逻辑的。

        【讨论】:

          【解决方案5】:

          “归纳证明”是程序员要了解的核心数学概念。

          【讨论】:

          • 真的吗?这需要哪些特定于编程的任务?
          • @Anders - 在算法开发的情况下证明证明。
          • 幸运的是,归纳证明是最简单的 imo。
          【解决方案6】:

          Big O notation在一般算法分析中,与标准集合相关(排序、检索插入和删除)

          【讨论】:

            【解决方案7】:

            对于离散数学,here 是来自 Arsdigita 大学的 20 场精彩讲座。每个大约有一个小时二十分钟。

            【讨论】:

              【解决方案8】:

              从我们 CS 人员所说的“离散数学”开始。微积分和线性代数也可以派上用场,因为它们可以让您踏入许多应用领域的大门。一旦你掌握了这三个,就去学习概率论。这 4 项将使您具备 95%(我编造的)应用领域的能力。

              【讨论】:

              • 有些人称“离散数学”为“有限数学”。我相信它们都是一回事。
              【解决方案9】:

              Concrete Mathematics 涵盖了大部分主要主题。一本关于离散数学的好书,如 Rosen 的 Discrete Mathematics and Its Applications,将填补任何空白。

              【讨论】:

              • @mamama:我以前从来没有注意到 CM 没有注意到这一点。感谢您指出。
              【解决方案10】:

              我认为这取决于您的注意力。几年前,我购买了 Donald Knuth 的《计算机编程艺术》。看了书后,我意识到几乎所有东西都是微积分证明。如果您有兴趣为它们开发自己的通用算法和证明,那么我建议您能够理解上述书籍,因为这是您在那个世界中要处理的内容。另一方面,如果您只想/需要使用各种排序/搜索/树/等...例程,那么至少大 O 表示法、布尔数学和一般代数就可以了。如果您正在处理 3D,那么几何和三角也是如此。

              我更倾向于使用而不是做证明,虽然我想这些年来我做了一些聪明的事情,但我从来没有坐下来开发一个新的分类程序。我能给出的最好建议是了解你所在领域的需求,但要让自己接触更高的层次,这样你就知道它的存在以及还有多少要学,否则你不会有太大的成长。

              【讨论】:

                【解决方案11】:

                我会说布尔逻辑。与、或、异或、非。 我发现作为程序员,我们比其他数学概念更频繁地使用它。

                【讨论】:

                  【解决方案12】:

                  基础代数和统计是很好的起点,也是许多其他领域的基础。

                  【讨论】:

                    【解决方案13】:

                    当我看到不理解它的开发人员时,这是一个让我感到困惑的简单问题:
                    - 操作顺序

                    【讨论】:

                    • 同意。我曾经辅导 CS 入门课程,但我花了一段时间才意识到有些学生在掌握这一点时遇到了问题。对于我们大多数人来说,处理是一件很自然的事情,一开始很难相信有些人不会。
                    • 这里也一样。当我意识到他们根本不知道我在说什么时,我总是有点停不下来。
                    【解决方案14】:

                    “计算机编程的艺术”的第 1 章旨在提供这一点。

                    【讨论】:

                      【解决方案15】:

                      推荐了一本书……书名类似于《具体数学》。在几个问题中被推荐。

                      【讨论】:

                      • 它假设你已经清楚了你的基础,它是入门但高级的。我们还能从 knuth 那里得到什么。
                      【解决方案16】:

                      回到学校,我的一位导师说过,对于商业应用程序,所有你需要知道的加法、减法、乘法和除法。请求者将知道并告知您需要什么的所有其他公式。现在意识到这是为以报告和应用为重点的学校提供​​资金。直到今天,这对我来说都是正确的。我从来不需要知道更多。

                      【讨论】:

                        【解决方案17】:

                        查书Foundations of Computer Science
                        本书作者:Al Aho 和 Jeff Ullman,整本书可在线获取。

                        这就是作者在前言中对本书目标所说的话:

                        "计算机科学基础涵盖了经常被拆分的学科
                        离散数学课程与计算机中的二年级序列之间的关系
                        数据结构科学。我们一直打算选择数学
                        着眼于计算机用户真正需要的基础,而不是
                        数学家可能会选择什么。”

                        【讨论】:

                          【解决方案18】:

                          一个复习数学的网站: http://www.khanacademy.org/

                          【讨论】:

                            【解决方案19】:

                            我的数学背景真的很差(受过地质学家培训),但我在高中时参加了discrete math 课程,并且作为程序员每天都在使用这些概念。这可能是我在所有教育中学习的最有价值的课程,因为它与我目前的职业有关。

                            【讨论】:

                              【解决方案20】:

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

                              【讨论】:

                                【解决方案21】:
                                • 布尔代数
                                • 集合论
                                • 离散数学

                                【讨论】:

                                  【解决方案22】:

                                  嗯,这取决于你的目标是什么。正如有人所说,如果你要解决难题,线性代数、组合学、概率统计和图论很重要。函数的渐近增长(bit-Oh 表示法)非常重要。如果您需要分析一些更复杂的算法,您还需要掌握求和和级数(参见 Cormen 等人的算法简介附录)。

                                  即使您喜欢“企业级 Java”或“服务器端 PHP”,您也会发现一些统计和算法复杂性(因此是组合、归纳、求和、系列等)在您的老板想要您时很有用让服务器更快地工作,添加新硬件似乎没有帮助。 :-) 我经历过一次。

                                  【讨论】:

                                    【解决方案23】:
                                    • 布尔代数
                                    • 集合论

                                    【讨论】:

                                      【解决方案24】:

                                      为什么每个人都将概率和统计列入金榜,而没有提到微积分?如果没有极限、导数、积分和级数的工作知识,就无法理解概率和统计是关于什么的。总而言之,微积分(连同线性代数)是所有数学的主力。

                                      【讨论】:

                                        【解决方案25】:

                                        我认为算法和理论非常重要。能够提出快速且正确的解决方案是优秀程序员与其他程序员的区别所在。此外,能够证明您的算法(使用标准证明技术——归纳、矛盾等)同样重要。

                                        【讨论】:

                                          【解决方案26】:

                                          是的,我想说的是对归纳的基本理解有助于您理解 n 在算法中代表什么。一些逻辑和离散结构也很有帮助。

                                          【讨论】:

                                            【解决方案27】:

                                            概率和统计非常有用,如果您需要做任何类似于机器学习的事情。

                                            我在“Computing Your Skill”博文中介绍了基础知识,其中讨论了 Xbox Live 的 TrueSkill 排名和匹配算法的工作原理。

                                            【讨论】:

                                              猜你喜欢
                                              • 1970-01-01
                                              • 1970-01-01
                                              • 2011-10-11
                                              • 2011-02-08
                                              • 2010-09-26
                                              • 2011-10-05
                                              • 2010-12-04
                                              • 2010-11-22
                                              • 1970-01-01
                                              相关资源
                                              最近更新 更多