每个计算机系毕业的人,大都学过不少数学课,而且不少学校的计算机系的数学课,通常比一般的其他工科专业的数学要难一些,比如不上高等数学,而是学数学分析,不上线性代数而去上高等代数。但是,大部分毕业了后去做程序员的人,即使是所谓的名校计算机系毕业的,大都工作中也基本完全用不上学的那些数学,基本上,一半时间在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下,这点时间差别,大部分情况下,也就是让你等程序执行测试的时候,多个倒杯水的时间。但是很多新鲜,好玩,有挑战的问题,很多数学的概念没有的话,恐怕不是多等个倒水的时间了。而如果你过了这个门槛,你又会发现,一个崭新的世界,又到了你的面前。
回过头来,我说数学重要的话,那么重要的是哪些呢?大家常说的通常是离散数学,不过最近比较热门的机器学习这个方向,我目前看到的相关资料都大量依赖于线性代数和概率论,以及一点点微积分。所以,如果你和我一样,希望做点有追求的技术工作的话,开始花点时间学习数学吧。其实万事开头难,也许你和我一样,对着一堆公式符号,感到头晕眼花,但是如果真得按下心来,看上一个小时,这么坚持个一周,其实就会发现,这没啥难的,就当学门新的编程语言得了。
PS:如果在google中搜索程序员 数学的话,第一个链接是程序员怎样学数学,我觉得这篇文章写得相当不错。我也非常同意,广度有限比较有效,容易激发学习的兴趣,而且能和实际的工作和现实世界的问题、项目相结合。
我也觉得数学蛮重要的……
不过有时候会很难找到平衡的点,往专业性方向走的话,每个细分领域都可以投入一辈子时间进去没完没了。想起你之前说的话,说生命如此短暂,掌握技艺(知识?)却要如此长久。呵呵。
“生命如此短暂,掌握技艺却要如此长久”,是乔叟说的,从Peter Novig(Google的Research Director)的一篇很有名的博客(http://www.norvig.com/21-days.html)那里抄来的。
的确向你说的,很多东西没底的,不过我现在是觉得,以技术为生的话,数学成了一个从熟练工再往上走的一个必要的门槛了。
思维方式最重要,有思路,其他什么的都是工具而已,不管是编程还是数学。
我认为这是对大部分程序员的一种误导,这就和以前CSDN之流的网站上一堆半吊子的家伙喜欢说的“关键是掌握面向对象的思想”一样,忽悠小孩儿呢。99.99%以上的人不是天才,对于具体的技能,就是需要学习,训练才能掌握、使用,乃至利用这些技能做出一些事儿来。对于大量的数学知识,你不知道,不熟练,有再多所谓的“思维方式”也没用。
我所说的“思维方式”不包括“面向对象的思想”这种所谓的“思想”,我指的是“critical thinking”之类的思维方式。再者,我没有贬低熟练使用工具解决问题的重要性。
那是我理解错了,话说我买了本”Beyond Feeling”,不过一直没看。不过,回到做个Programmer这个话题,对于大部分人来说,花时间区分什么是思维方式,什么是工具,不如先多花点时间好好掌握工具。很多事情是你了解了工具,才能有想法有能力往下走的。不过,不抬杠了。对于所谓的Critical Thinking,我一直没啥感觉,也许是从来逻辑思维比较显著,所以没有这方面困扰;也许是智商有限,暂时还没突破到需要这种思考方式的时候
我们应该都蛮critical thinking的,呵呵。
我这几天也在看数学,不过是看概率统计和一些简单的回归。飞机上看了1/10本集异壁(貌似是讲机器学习的?),那叫一个头晕脑胀……
到上海去找你聊天去,我们现在算相关行业了,呵呵。
GEB我也弄了一本,看了个开头,这本不算是机器学习吧,是本很奇怪的科普书。现在的机器学习其实入门都是概率统计回归啥的。等你来上海啊,啥时候回来呢?
概率统计回归俺倒是重新学了一些:)这些在营销里都要用到的。不过也是发现深入下去是无底洞。
GEB我只看了开头,很多地方很像我们之前学的可计算性之类的东西。这本书散发着妖异的气质,呵呵。
今晚回上海。很想留上海,不过估计十有八九会去别的城市,上海电商和网络营销公司太少了。
机器学习啥的其实门槛也不高
业余抽点时间就能上手了(精通比较难), 贵在坚持
浩浩最近在做啥呀?
我打算碰到机器学习的问题直接问你们两个。。。比我自己学快,哈哈。
Pingback: 不对自我设限与来自未来的挑战
Pingback: 作为一个程序员,数学对你到底有多重要 | Cafish的小屋
Pingback: 灰色的灵魂 » Blog Archive » Hadoop背后的数学