Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2013-01-04) madmanahong答“程序员学习数学的困惑”

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

在CSDN里看到一个老帖子,有程序员问学习数学的困惑,问题如下:

我很喜欢程序语言,很喜欢并且还学的可以。但是听很多人说,作为程序员一定的数学好。但是我数学不好,可怕的是我不喜欢数学,对数学不感兴趣。但是我又对程序语言很感兴趣,很矛盾。我不喜欢数学,但是当我碰到程序中的数学问题时,往往是根据程序去学数学,不喜欢先学数学再根据数学去解决程序问题,往往是根据程序算法问题,再去学数学。因为我觉得这样学起来更加有效率,单纯得学数学我觉得太枯燥了。

我该怎么办?很多人都说:如果碰到问题再去学数学,那样太迟了。我情愿先学程序,再学数学。面对这样得矛盾,我真的不知道该怎么办了?我不只一次得问自己,我适合做程序员吗?但是我的兴趣告诉我,我很爱程序。对语言又疯狂得痴迷。但是很多人说数学会是我的瓶颈,但是我觉得我通过程序算法,再去学数学很实用。专门得去学数学,我觉得太枯燥。并且和很多得实际问题不挂钩,都是太多得理论问题。很多人都说理论才是根本。

说到数学只能说不感兴趣,还不敢说讨厌。学起来嘛,只能说凑合。

既然我这么爱程序语言,听从了一些人的建议我要好好学数学。我想听听那位高手说说该怎么学数学,该去攻克那学数学课程。注重那些数学课程的学习。

其中一位叫“madmanahong”的同学的回答,让我觉得相当好,也解决了我的一些困惑,所以记录在这里。如下:


忍不住上来发一个帖子。

我是赞成要学习数学的,这是我多年程序的体验。当然,具体学不学要看你所在的领域和感兴趣的话题,
我不否则你不会数学也可以挣到月薪20K。不讨论学习数学对事业的帮助,对薪水的帮助,因为也许很多人啥也不会,
但是他们出行都用BWM7系!

我觉得不支持数学的程序员往往是应用级程序员。譬如你可以做一个程序界面,可以封装一些简单的程序接口,或者修改注册表,访问数据库,如果熟悉设计模式,那么你的代码可以在公司内受到好评。如果熟悉架构和网络编程,你甚至也可以做一个游戏服务器,或者类似BT或者emule的p2p文件共享平台。

所有这些都没有问题,但总有一天,你会发现其中的局限性。

譬如让你写字符串子串查找功能的时候,在ttesttstglkjwerj串中查找lkj子串,你也许只会用普通线性查找。却将KMP算法忽略了。

譬如让你写一个对5G的文本数据进行排序的时候,你一直擅长的qsort或者std::sort或许无所能及。这时你只能依靠败者树。

又或者,现在让你写一个3D的凹凸影射(Bump Mapping), 实时阴影(ShadowVolume), 或者更高深的3D渲染效果的时候,抱歉我当时也是浅尝则止。你只能重新打开工程数学,来看矩阵的操作。

同样,如果要你实现一个数据库,你只能看B树或者其他算法,当然,我曾经也是认为有了MySQL,谁还会自己去做数据库,但是我现在的公司确实在使用自己开发的数据库,还好面试我的时候我说出了B树的大概原理。

搜索引擎不用说了,里面的数学知识大家都应该清楚,尽管分词操作大量依靠于词典,但是很多算法你依然逃脱不了,譬如文本文类有KNN,SVM,K临近。文本抽词,给你一篇文本,让你抽出其中的关键词或者让你使用程序自动抽出这篇文章的摘要,听起来神奇,但是使用什么数学,什么马尔可夫模型,这一切都变成了事实。

还有还有,你可能下载了几个电影,你会发现为什么电影文件体积这么小,但是播放的影片确还是接近DVD效果,深入研究,你发现这就是很流行h264/AVC,同时作为程序员你想探究原理的话,那么恭喜你,你将不得不拿出大学的高等数学,同时翻开概率与数理统计,更甚至你要学习数字信号处理(DSP)这门计算机专业没学过的课程,还没有完呢,你还必须学习信息论这种抽象的学科,从中了解香农(shannon)这个伟大的人物,了解熵这个很古怪的名词。等等

如果你要说我忽悠你。我还会告诉你在无损压缩领域,如果利用数学证明最小的信息熵,同时否则了哈夫曼编码的地位(huffman),因为哈夫曼编码中,最小的信息,你至少要用1个bit表示。你想过用0.1个bit来表示一个信息吗?如果没有,那么赶紧去看看神奇的算术编码。

看到这里,如果你已经不耐烦了,想破口大骂,那就骂吧,我也想骂,因为我大脑中能想到的维度只有3维,那就是x-y-z坐标系,可是为了实现有损压缩的最高境界,为了去除信息的相关性,离散余弦变换(DCT)这种在N维空间中表示一个信息的想法差点让我脑力衰竭!!

写到这里,想想这么多,我前两天帮朋友做的那个用程序自动把歪的图片调正还算是比较简单的,因为霍夫(hough)变换这个东西包括理论才几页而已。

其实我写到这里,人工智能(AI)不愿意了:“为什么不提我?为什么不提专家系统??”。

我说算了吧,程序中用到的数学太多了,都提出来,可能就字符限制了,还是套用展堂的话:“我能给你说三天三夜不带重样的!”


差点忘了补充一点,BT和EMULE中的DHT其实也是用到数学的,譬如KAD网络就用到一种特殊的查找算法。

同时我要声明,我觉得没有贬低任何人之意。

我只是阐述自己的观点:数学很重要。


我觉得你举的那两个例子都和数学没关系,数学讨论的是严谨性,讨论的是原理。

很多东西我们不了解数学,也是可以解决的,就像你说的那两个例子。

但是数学绝对不是禁锢。利用数学你才能计算出随机事件,或者计算出我们无法模拟的情况。

假设你第一个例子中的灯泡是漏水的,或者你没有水源,又或者不满足理想状态的时候,你又怎么办呢?

同时我觉得这个例子完全是不真实的,如果这个人精通数学,那么让他去计算灯泡的体积,和放入水中测试的速度应该是一样快的!

同时你的第二个例子我觉得也是不真实的,这种东西主要的目的是让人打破禁锢,但针对的角度绝对不是数学。

这种例子应该放到成功学或者策划讨论大会山,但我想如果真的放到数学家的案桌上,会被耻笑的。

======================

我觉得你应该举一个更简单真实的例子,譬如说测量长度的例子,

如果你想测试房屋的高度,那么很简单,你可以利用尺子或者绳子,但是如果你要测试赤道的长度,你怎么办?

同时假设让你测量月球到太阳的距离,你又怎么办????!!!!

======================

不是说使用数学的方法就是禁锢,熟悉数学的人可以在两难中选择取舍,譬如在H264中,大师们懂得利用近似运算来取代精确的DCT,

大师们知道利用分块的方法来弥补每个象素的运动补偿。


我觉得在国内,很多人轻视数学是因为鄙视国内的数学教育,但是我觉得,如果你因为鄙视国内的数学教育而不去学习数学的话,

那实际上是悲哀的。

数学交给了我们一种解决问题的方法,尽管在生活中,你不必每件事情都使用数学,我看到楼上有人说:买个菜还要用一元二次方程?

我就晕,不要把所有不沾边的联想到一起,难道你学过了唐诗宋词,就一定要在买菜讨价还价的时候用??

同时试想,如果没有数学,买菜的时候,只好一斤一斤买,买10个鸡蛋付10次钱!!!

==========================

不要把所有的缺点和禁锢都归于数学,不要把国内一些迂腐的死背分子作出来的事情归结于数学的过错。

这都是你们自己想出来的,而不是像爱因斯坦那种伟大的数学家(也算吧)做出来的事情。

同时,你说的:只拿"数学模型"去解决问题是很可笑的。。

是的,我们没有只拿数学去解决问题,我们这里谈论的是数学的重要性,没有说只用数学,数学家自己也觉得只用数学很可笑,

所以,他们往往把数学和哲学或者心理学结合到一起……


这位madmanahong同学才是真正的牛人,向他学习。

comments powered by Disqus