You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
7.4 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词 | 作为程序员,为什么你应该学好数学?
你好我是黄申目前在LinkedIn从事数据科学的工作主要负责全球领英的搜索引擎优化算法和数据架构的搭建。
2006年我博士毕业于上海交通大学计算机科学与工程专业在接下来十余年时间里我曾经在微软亚洲研究院、IBM研究院、eBay中国研发中心做机器学习方向的研究工作也负责过大润发飞牛网和1号店这两家互联网公司的核心搜索和推荐项目还写过一本书《大数据架构商业之路》。
对于数学和计算机编程的联系我之前也没有思考过。直到有一次在硅谷的一个技术交流Meetup上我听到一位嘉宾分享说“如果你只想当一个普通的程序员那么数学对你来说并不重要。但是如果你想做一个顶级程序员梦想着改变世界那么数学对你来说就很重要了。”
听完这句话我马上感受到强烈的共鸣因为就我自己的工作经历而言越是往高处走就越能发现数学的重要性。我知道数学对于我们每一个程序员来说都是最熟悉的陌生人。你从小就开始学习数学中考、高考、研究生考试还要考数学所以那些熟悉的数学定理、数学公式陪伴你至少也有10年时间了。
但是自从做了程序员你可能早就把数学抛在了脑后甚至觉得曾经为了应试而“硬学”的数学应该是彻底没什么用了终于可以和他们say goodbye了。毕竟作为一个基础学科数学肯定是没操作系统、数据结构、计算机网络这样的课程看起来“实用”。
起码我之前就是这么认为的。大学的时候,我非常喜欢编程,甚至还翘过数学课,专门在图书馆看计算机类的图书。那会儿我觉得,数学这东西,完全就是应试教育,我更喜欢计算机这样操作类的课程,不喜欢待在教室里听数学老师讲那些枯燥的理论和定理。
再到后来,我读了硕士,开始接触机器学习,猛然间才发现,机器学习表面上是“写程序”,但实际上剥去外表,本质上就是在研究数学。从那会儿开始,我对数学的认知也才逐步客观和理性起来。
再到现在,我参加了工作,写了这么多年代码,我想说,数学学得好不好,将会直接决定一个程序员有没有发展潜力。因为往大了说,**数学它其实是一种思维模式,考验的是一个人归纳、总结和抽象的能力**。把这个能力放到程序员的世界里,其实就是解决问题的能力。
往小了说,不管是数据结构与算法还是程序设计,其实底层很多原理或者思路都是源自数学,所以很多大公司,在招人时,也会优先考虑数学专业的毕业生,这些人他们数学基础很好,学起编程也更容易上手。
所以我觉得,**如果编程语言是血肉,数学的思想和知识就是灵魂**。它可以帮助你选择合适的数据结构和算法、提升系统效率、并且赋予机器智慧。尤其是在大数据和智能化的时代,更是如此。
举个例子,比如我们小学就学到的余数,其实在编程的世界里也有很多应用。你经常用到的分页功能,根据记录的总条数和每页展示的条数,最后来计算整体的页数,这里面就会有余数的思想。再难一点,奇偶校验、循环冗余检验、散列函数、密码学等等都有余数相关的知识。
遇到这些问题的时候,你能说你不懂余数吗?我想你肯定懂,只是很多时候没有想到可以用余数的思想来解决相关问题罢了。那为什么没有想到呢?我认为,本质原因还是你没有数学思维,还是你数学的基础不够好。
所以,在这个专栏里,我想和你重点聊聊数学。当然,我知道数学博大精深,所以在一开始做专栏的时候,我就和极客时间团队一起定义好了专栏的边界,用一句话来说就是“**只做程序员需要学的数学知识**”。
首先,我梳理了编程中最常用的数学概念,由浅入深剖析它们的本质,希望能够帮你彻底掌握这些最基础、也最核心的数学知识。其中包括那些你曾经熟悉的数学名词,比如数学归纳法、迭代法、递归、排列、组合等等。
其次,我把线性代数和概率统计中的抽象概念、公式、定理都由内而外地讲了出来,并分析它们在编程中的应用案例,帮助你提升编程的高阶能力。对于这些内容,我会从基本的概念入手,结合生活和工作中的实际案例,让你更轻松地理解概念的含义。
比如,对于朴素贝叶斯方法,我会从基本的随机现象、随机变量和概率分布等着手。随后,我会逐步深入,结合这些数学知识在编程算法中的应用进行展开。比方说,贝叶斯定理是什么,随机变量之间的独立性是什么,这些是如何构成朴素贝叶斯方法的,而最终朴素贝叶斯又是如何被运用在机器学习的分类算法之中的。
![](https://static001.geekbang.org/resource/image/72/61/7288e9715163adb95f7047ae0c263a61.jpg?wh=1142*856)
这样的讲解路线,既能让你巩固基础的概念和知识,同时也能让你明白这些基础性的内容,对计算机编程和算法究竟意味着什么。
不过话又说回来,我认为数学理论和编程实践的结合其实是“决裂”的,所以学习数学的时候,你不能太功利,觉得今天学完明天就能用得着,我觉得这个学习思路可以用在其他课程上,但放在数学里绝对不合适。
因为数学知识总是比较抽象,特别是概率统计和线性代数中的概率、数据分布、矩阵、向量等概念。它们真的很不好理解,也需要我们花时间琢磨,但是对于高级一点的程序设计而言,特别是和数据相关的算法,这些概念就非常重要了,这可都是先人总结出来的经验。
如果你能够将这些基本概念和核心理论都搞懂、搞透,那么面对系统框架设计、性能优化、准确率提升这些难题的时候,你就能从更高的角度出发去解决问题,而不只是站在一个“熟练工”的视角,去增删改查。
最后,我希望数学能够成为你的一种基础能力,希望这个专栏能帮你用数学思维来分析问题和解决问题。数学思想是启发我们思维的中枢,如果你对数学有更好的理解,遇到问题的时候就能追本溯源,快、准、稳地找到解决方案。
伽利略曾经说过,“宇宙这本书是用数学语言写成的”,数学是人类科学进步的重要基础,所以,你我都要怀着敬畏的心态去学习、思考数学。同样,我还要求我自己的孩子一定要学好数学,因为我确信,这对于他未来的发展来说,至关重要。
编程的世界远不止条件和循环语句,程序员的人生应当是创造的舞台。我希望,通过这个专栏的学习,能够让你切实感受到数学这个古老学科的活力和魅力。
好了,说了这么多,相信你已经下定决心和我一起攻克数学。重新开始就要告别过去,你可以在留言区做个“**数学学习复盘**”,在之前的学习过程中,你的学习状况是怎样的?你遇到的最大困难是什么?现在,你最希望学到的是什么?
Now你说我听