每一个计算机系毕业的人,大都学过很多数学课,并且很多学校的计算机系的数学课,一般比通常的其余工科专业的数学要难一些,好比不上高等数学,而是学数学分析,不上线性代数而去上高等代数。可是,大部分毕业了后去作程序员的人,即便是所谓的名校计算机系毕业的,大都工做中也基本彻底用不上学的那些数学,基本上,一半时间在CRUD,另外一半时间在处理各种字符串、链表、Hash表,知道在面试中回答各类排序的时间复杂度是他们须要的数学的上线了。程序员
而在念书的时候,虽然上大学以前,有很多内行的外行的,年老的年轻的人告诉你,数学很重要啊。可是,一般来讲,各个学校的计算机系的同窗么,爱好学习的,可能重视的也是《Thinking in Java》,《C++ Primer》之类的语言书,或者设计模式之类的架构书,抑或是算法与数据结构这些玩意儿;而像我这样每天偷懒放羊的,也不会把数学看成是什么重要的课程好好学习。因此,“数学真重要”,这句话,彷佛对于你们来讲,始终只是飘在天上的一句话,随风飘逝了。面试
因而,五年过去了,程序员们都有了很多的工做经验了,若是不是对工做毫无追求混吃等死的程序员的话,对于每天干活的语言,不管是Java仍是C++应该都熟能生巧了,所谓的设计模式、重构、自动化测试等等也手到擒来了,大部分人的title上都加上了Senior了,牛一点的后面大概还跟上了一个Manager,然而,你们都开始考虑一个新的问题 — — “30岁之后怎么半?”。因而,转PM的转PM,考公务员的考公务员,像我这样仍然抱定 — — “你看人家美国Rohit都50了还不是每天写程序,别人想请还请不到的”的单纯想法的人愈来愈少了。而后,就算这些人,时不时也会以为,本身每天干的超越CRUD的,所谓写点OO的框架,不也是很无聊的体力活么,写程序的人干两年谁都会干。因而,又有很多人下海创业了,多年之后,这些人中的大部分都会和我同样悲催的没有挣到前继续回来给大大小小的公司写程序。算法
其实,杯具每每发生在一开始,其实,要是我们当年好好学习,才会发现,也许数学对于你当个不错的程序员来讲,没那么重要,可是要再往上走一步,有一点点技术上的创新,就都是数学的事儿了。两年前,我在T公司,用Configurator处理某个程序的时候,开始有点儿意识到这一点了,因而,那阵子还花了很多时间从新翻了翻数理逻辑。今年,换了新工做后为了工做看点儿机器学习的东西的时候,终于发现,这全都是数学啊。当你要超越CRUD,作任何一点点有创新性的技术的时候(不说产品),最有机会遇到的问题,实际上是数学问题。虽然从Spring到Hibernate到Rails之类的框架,或者Hadoop,HBase之类的分布式计算框架,也都是技术上的重大革新,可是这些框架类的程序,完善都是阶段性的,一旦出现后,很快都会有相应的Best Practice,又会成为熟练工种的活。而真正针对问题域的解答,反是天天均可以有些新鲜的想法、思路和方案的,这些,每每有个数学的门槛。因此若是你真是挺喜欢写程序的,并且但愿本身一直能写更好玩更难的程序,总有一天,你要过了这一道坎儿。编程
因此我非常赞成不知道是谁说的,若是你只想当个good programmer,那么数学不重要;可是若是你想当个great programmer,那么数学很重要。在你手里只有锤子的时候,你看什么东西都会是个钉子,想一想你若是没有学过算法和数据结构,可能你的大部分程序须要本身写排序的话,都会是傻傻地冒泡吧,反正对于大部分程序来讲,在如今这么快的PC下,这点时间差异,大部分状况下,也就是让你等程序执行测试的时候,多个倒杯水的时间。可是不少新鲜,好玩,有挑战的问题,不少数学的概念没有的话,恐怕不是多等个倒水的时间了。而若是你过了这个门槛,你又会发现,一个崭新的世界,又到了你的面前。设计模式
回过头来,我说数学重要的话,那么重要的是哪些呢?你们常说的一般是离散数学,不过最近比较热门的机器学习这个方向,我目前看到的相关资料都大量依赖于线性代数和几率论,以及一点点微积分。因此,若是你和我同样,但愿作点有追求的技术工做的话,开始花点时间学习数学吧。其实万事开头难,也许你和我同样,对着一堆公式符号,感到头晕眼花,可是若是真得按下心来,看上一个小时,这么坚持个一周,其实就会发现,这没啥难的,就当学门新的编程语言得了。数据结构