算法跟数学公式没太大的关系,算法讲究的是逻辑思维能力,其中重点在逻辑思维,不是各种公式,涉及到的数学公式只是都相当简单的小儿科。相信你能学好的。数学不是必须学好的,但是学好数学对理解和编写算法特别有用的,算法就是给你的一种思维,所以你要做的是好好理解并吸收。计算机语言非常之多,不同的领域使用的语言不会一样,一时半会讲不完,这些都是其次,关键是要懂得编程的思想,理解计算机的想法,让计算机按你的想法去替你做事情(各种算法),那你就会是一个合格的计算机砖家,你可以看到类似google,微软等国际大公司招聘程序员时候出的题目,不会像中国应试教育那样出一大堆应试题,更多的是主观题,算法题,以及一些精辟的语言理解题,有一个系列的书都用 Thinking in XXX 命名,实际上玩计算机也是如此,先想好你要做什么,然后用某种途径(语言+算法)去让计算机照你的想法做。
学会读代码,说明你已经学会了一门语法,学会写代码,说明你已经学会了一门技术。并且它们考虑的思维是相反的,所以,只有不断读代码---总结思路,逆向思维--才能学会写代码!数学对于程序设计师来说到底重不重要?!类似这样标题的讨论,在网络上已经不知道被讨论多少次了。前两天又在小白的blog上看到了他的看法。以前正方总是喜欢拿算法与效率来表明数学很重要的立场,反方或是最近普遍的观点是要依照需求。两方都没错,我也有一点心得跟大家分享。先来谈谈数学在大家的心中是长什么样子。研究所顺利考上的向往已久的计算所,成为名符其实的本科系学生,本以为可以不用再玩数学了,但我发现我错了,是不用再玩那些抽象的高等数学没错,但线性代数、机率统计、离散数学等…用了更多的数学,我想不出来有哪门研究所的课没用到数学的。而且你最后的硕士论文要写出来,数学更是不能少的。你以为玩网络不需要数学?大错特错,里面一堆机率统计的东西。电机需要数学吗?当然需要!最基本的傅利叶转换就够搞死你了,所有工科的系所都逃不了数学的魔掌。就算你到了管理学院,会计系要用数学、经济系要用数学、连心理系中有些领域也需要数学。虽然所需要的数学不尽相同,但都在数学的领域里。我开始后悔当年没把数学念好,博士班念到一半念不下去了,其中一个原因是我数学太烂了。
写程序需要数学吗?要看程序的目的?那我们就像讨论一个简单的程序,算出1加到100的总和。完全以程序结果为导向的人,或是训练有素的程序女/男工,甚至有时连我都会直觉地写出这样的程序:
int Sum1To100(){ int sum = 0;
for(int i=1; i<=100; i++) { sum += i; } return sum;}
上面这个程序片段还算很容易让人一眼就看懂,可是我们明明高中时就学过了这种数列级数的算法了,怎么还会写出上面这么笨的程序呢?
int Sum1To100(){ int sum = ((1 + 100) * (100 - 1 +1)) /2;
//或更精简的int sum = (101 * 100) >> 2;
return sum;}
稍微动一下脑袋,可以让你的程序变得很有效率。怕别人看不懂?是不会加个批注在程序代码里面喔!相信聪明的你,很容易就可以分析出来这两个例子的两种写法,在效能上迶多大的差异,但这不是我在这里想要表答数学是如何增加效率的。
我想要表答的是,我们明明辛苦了12年,学了一堆的数学,为什么我们要放弃这样的基本训练?我们笑美国人的数学不好,请问你又用了多少的数学来帮助你的生活和你的工作?学了又不用,那不如从小学开始就分科系好了,不喜欢数学、怕数学的,就选则完全用不到数学的科系。我今天不是要大家在写程序是时钻研哪种算法、公式等,去计较那些在现在动不动在2GHZ, 3GHZ,双核、四核所省下的那微小的效率。而是你的态度!你宁愿多打一些code,也不愿动一下脑筋,如果你的态度是这样子的话,那也是活得下去啦,不过你的水平就不过如此而已。你会反驳说,需要用到算法、要讲求效率时,我再去研究一下就好了,干嘛说的很严重似的。
今天我们一时兴起要去爬阳明山,没问题啊,那种程度的山,只要双脚健全走得动的人都能爬。如果换成现在流行的登山步道呢?这需要一点点体力才行。如果你要去爬台湾百岳呢?合欢山的东峰算是最简单的吧?开车到山脚下,穿个好一点的鞋子、好一点的衣服、多一点的体力,也还不是太大的问题。那爬玉山呢?虽然现在爬玉山已经很方便了,连行李都可以请人帮你背,但平常没有一些训练,要爬上去不是那么容易的事。你要站在世界的最高点,去挑战圣母峰,那全世界没几个人办得到,而且办到的人事前可是经过了严格的训练。
你想把自己摆在什么位置?你想要成就到什么样的高度?如果你只想在二、三流的公司里,打项目游击战,赚个还算可以的薪水,那的确,你不怎么需要数学,连软件工程的理论也不太需要,最重要的唬弄客户的技术纯熟就可以了。去年TX面试后,我才知道必需十倍努力才行。而这个努力不是我在面试前,看看什么教战手册、写写网络上的考古题我就能够通过的,而是必需把一些数学的训练熟到变成很自然的反应才行。
简单的问你就好了啦,上面那个用循环写的1加到10000的那个例子,如果10000改用n的话,那需要多少时间,用大O(big O)来表示。如果你不能很快的推论出是O(n)的话,那你的履历连投都不要投。为什么Google会这么重视算法和效率?应该说世界级的大公司都重视,Yahoo、微软、YouTube…,因为你写的程序不是给几十个人、几百个人用而已。而是同一时间有几百万,甚至上千万人使用。一个人慢0.1秒好了,一百万人就10万秒,超过一天耶。浏览一个网页,慢几秒钟你都不能忍受了,更何况是一天。你说能不计较算法和效率吗?
你想过什么样的生活是你自己决定的,但你想要当个世界级的软件工程师的话,把学数学就当作是一种修行吧!不要怕没地方用,因为你时时刻刻都可以用到它。当你的修行到了某个程度,要挑战高山,就比别人容易多了。好好,不想深入就算了,但你不觉得放弃12年的数学训练很可惜吗?至少花点脑筋用一下嘛~~,大家都多少用一点,软件的水平就会慢慢提升了,你说是吗