不须要数学就能成为一名顶尖的程序员,可是若是借助数学工具,你会发现另外一个世界。html
做者 | Arnuld程序员
译者 | 王坤祥面试
策划 | 万佳算法
每当我想深刻学习一下算法相关的内容时,其中涉及的一些复杂数学知识有时候就会成为“拦路虎”。编程
我认可本身的数学确实没学好,但也不至于很糟糕。不过,这种“不上不下”的数学水平,彻底没法应对业界 Big Tech 公司(亚马逊、苹果、谷歌、Facebook 和微软)的面试,尤为是面试被问到算法的一些问题,好比某个算法的时间和空间复杂度,或者具体的排序和搜索算法之间的比较等。设计模式
所以,我要学习全部这些知识点。在搜索和学习过程当中,我搜集了几篇有关编程所需的数学知识的文章。微信
在编程方面,最为知名的数学支持者是史蒂夫·耶格(Steve Yegge)。关于编程所需的数学,我列举了如下内容供你参考:编程语言
数学笔记—— http://www.eskimo.com/~scs/cclass/mathintro/top.htmlwordpress
《Math Everyday》—— https://sites.google.com/site/steveyegge2/math-every-day函数
《Math for Programmers》—— http://steve-yegge.blogspot.in/2006/03/math-for-programmers.html
成为一名黑客须要多少数学—— http://www.catb.org/~esr/faqs/hacker-howto.html#mathematics
谈数学—— http://www.paulgraham.com/college.html
《数学黑客》—— http://www.evanmiller.org/mathematical-hacker.html
《关于 C 语言实现的斐波那契数示例》—— http://blog.noblemail.ca/2013/01/on-calculating-fibonacci-numbers-in-c.html
若是你还没读过以上内容,那么你可能会错过我写这篇博客所要表达的意图。按照史蒂夫·萨米特(Steve Summit)、埃里克·雷蒙德(Eric Raymond)以及保罗·格雷厄姆(Paul Graham)的观点,你无需过多地关注数学就能够成为一名出色的程序员或者黑客(此处黑客泛指维基百科中对黑客的定义以及埃里克·雷蒙德(Eric Raymond)对黑客的定义)。
史蒂芬·诺布尔(Steven Noble)认为,程序员应该懂一些数学;埃文·米勒(Evan Miller)彷佛在某种程度上也赞成这一观点。我本人只是出于热爱而开始踏上编程之路的。
从 2009 年以来,我主要使用 C 语言进行编程,有时候还会用 C++,而且大部分时候是在 Linux 和 UNIX 环境下工做。我对编程充满热情,有时候须要使用多种不一样的语言进行编程,所以我必须学习用不一样的思惟方式工做。编写代码不是很难,可是,使用特定的编程语言并按照必定的范式寻找思路且创建模型,才是最难最耗时的工做。
我在编程道路上的经历告诉我, 编程不是数学 ,并且永远不是。若是你想学习计算机编程,那么去学计算机编程就行了,不须要你去翻阅数学书籍,而是要常常浏览一些编程论坛(好比 comp.lang.c 和 comp.lang.lisp)。关于浏览论坛,你可使用一个新闻阅读器,好比 Pan,订阅来自 GNU 的全部软件信息,并使用 Linux 发行版来处理平常工做,我趋向于使用轻量级版本。若是你想学习计算机编程而学习了大量的数学知识,那么颇有可能会迷失在复杂的数学理论当中,并朝着错误的方向前进,最终也不会学到太多的编程知识。
做为一名程序员,咱们的任务是编写代码,那咱们编写代码的最终目的是什么呢?编写代码的目的固然是解决现实世界中的问题呀! 使用代码解决现实世界中的问题,这就是程序员要作的事情。
那数学家是作什么的呢? 数学家的任务是使用数学语言来解释天然规律 。数学帮咱们解决了世界上的许多问题,好比物理学的一个分支量子力学,改变了咱们长久以来对原子世界的既有认识,这一进步离不开数据的魔力。数学无处不在,从化学工业到社会问题,咱们会用到统计学。平常生活的方方面面,都会看到数学影子。数学不只能够用来解释天然规律,还能用来解决现实世界中的问题。由于现实世界中的全部变量,均可以用数学语言来描述。
身为一个程序员我并不擅长数学,因此我会试图用本身的 直觉、常识、流程图或其余类型的图表来解决工做中遇到的问题 。这种状态持续了好几年,并逐渐养成了经过建立模型来解决问题的习惯。创建模型有一个很是明确的目的:对问题及其解决方案要始终保持清晰的思路。可使用语言符号、流程图或其余形式的图表来建立模型,模型具备明确的假设、规则和条件。向建立好的模型输入数据,通过该模型处理后输出计算结果。模型必须保持清晰和简洁。
数学模型是一种通用的抽象机制,能够应用于特定问题以获取解决方案。几个月前,当我阅读了前面提到的有关数学的文章后,我又读到了埃文·米勒的另外一篇名为《Don’t Kill Math》的文章,该文章其实是为回应布雷特·维克多的《Kill Math》而写的。
这两篇文章有点打击到我。首先,布雷特·维克多一直尝试在作几年以来我作的一样的事情,他在创做方面比我成功。我永远想不出能够适用于任何人的可靠模型,而布雷特已经作到了。是的,我很是高兴,由于我找到了一直在寻找的东西,而且准备跟随布雷特的脚步。可是我历来也没有这样作,这是为何呢?
我没法提出这样一个可靠的模型是有必定缘由的。我一直认为我构建的模型缺点什么东西。不管我作了什么,以及我作了多少工做,我始终感受缺乏一些很是基础的元素。每当我研究 Schrodinger 方程、Maxwell 方程、牛顿定律、开普勒定律、不肯定性原理或 Shulba-Sutras 时,我老是感受全部这些方程都是完整的,可是个人模型却并不完整。
这两篇文章《Kill Math》和《Dont’ Kill Math》都使我意识到了什么是完整性。这是在文章《Dont’ Kill Math》中提到的一个数学概念。埃文·米勒在本文中提出的问题以及对问题进行简单易懂的解释方式,结束了我对模型的探索。数学是解决问题和解释现象的简洁明了的方法。这些直白了当的特征是数学固有的,就像灵魂是每一个生物固有的同样。与不使用数学相比,使用它能够更快更好的解决问题。
这使我想到了一个很是基础的问题: 为何我会讨厌数学?应该是读书上学的时候,数学的教学方式存在问题 。课堂上老是被教导死记硬背数学公式,而不是真正的数学理念。这是学校的错误,是整个教育系统的错误,而不是学生的问题。回到最开始讨论的“成为一名优秀的程序员是否须要数学”这一问题,下图描述的是最开始现实世界解决问题的方式:
而后,数学开始应用,下面这张图描述的是大多数数学家所作的工做:
下图描述的是全部计算机程序员 / 软件工程师 / 开发人员所要作的工做:
埃文·米勒提到,你能够在不使用大量数学的状况下成为一名顶尖黑客,我认同他的说法,而且这与其余做者的观点一致。他阐述的重点是数学在解决现实世界中的问题上的做用,即数学在解决现实世界中的问题上简单而又粗暴,并且十分有效。
做为一个程序员,咱们的目标是解决问题,可是若是借助数学模型并将其应用到解决方案当中去(以下图所示),那么咱们就能够经过一些惊艳的方式来提供更好的解决方案。从而咱们的工做生活会变得轻松不少。
你不须要数学就能够成为一名顶尖的程序员,由于在工程上,咱们不会直接使用大量的数学理论。若是你想成为程序员,那么就去直接学习编程。计算机编程与数学有很大的不一样,做为程序员,你必须更多地专一于如何编写更好的程序,如何使用特定的范式思考(例如,函数、面向对象、泛型、过程、逻辑、声明等),在建立软件的方式上找到更好的方法,你须要了 [设计模式,尽管使用 C 语言编程不少年,设计模式仍将会给你的编程思考带来新的认识。
全部这些都与数学没有直接联系。你须要优先学习这些编程知识,而且这将会花费好几年的时间才能掌握它们,而后,若是有须要的话,就能够进阶学习数学了。
原文连接:https://lispmachine.wordpress.com/2014/12/05/how-much-math-you-need-for-programming/
另外的话,做为一名编程学习者,若是你想更好的提高你的编程能力,好好学习C/C++编程知识,之后努力成为高薪软件开发工程师的话!
C语言C++编程学习交流圈子,QQ群464501141【点击进入】微信公众号:C语言编程学习基地
编程学习书籍:
编程学习视频:
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比本身琢磨更快哦!