程序员怎样学数学:编程是小菜一碟(2)
我想,如果每门数学课都花上整整一周的时间,而只是介绍让你如何入门的话,那将非常不错,这是最有意思的一种假设,那么你知道了你正学习的对象是哪种怪物了.怪物,大概对每一门课都合适.
除了概率和离散数学外,还有不少其他的数学分支,可能对程序员相当的有用,学校通常不会教你的,除非你的辅修科目是数学.这些数目列表包括:
统计学,其中一些包括在我的离散数学课里,她的某些训练只限于她自身.自然也是相当重要的,但想学的话不需要什么特别的入门.
代数和线性代数(比如,矩阵).他们会在教完代数后立即教线性代数.这也简单,这但相当多的领域非常有用,包括机器学习.
数理逻辑.我有相当完整的关于这么学科的书没有读,是Stephen Kleene写的,Kleene closure 的发明者,我所知道的还有就是Kleenex.这个就不要读了.我发誓我已经尝试了不下20次,却从没有读完第二章.如果那位牛掰有什么更好的入门建议的话可以给我推荐,给个回复.虽然,这明显是非常重要的一部分.
信息理论和柯尔莫戈洛夫复杂性理论.真不可思议,不是么?我敢打赌没哪个高中会教你其中任何一门课程.她们都是新兴的学科.信息理论是(相当相当相当相当难懂)关于数据压缩,柯尔莫戈洛夫复杂性理论是(同样非常难懂)关于算法复杂度的.也就是说,你要把它压缩的尽量小,你所要花费的时间也就变的越长,同样的,程序或数据结构要变得多优雅也有同样的代价.他们都很有趣,也很有用.
当然,也有其他的一些因素,某些领域是重复的.也拿来说说吧:你所发现有用的那部分数学,不同于那些你在学校里认为有用的数学.
那微积分呢?每个人都学它,所以它也一定是重要的,不对吗?
好吧,微积分实际上是相当容易的.在我学习它之前,它听上去好像是世界上最难的一件事,好像和量子力学差不多.量子力学对我来说真的不是那么容易理解,但是微积分却不是.在我意识到程序员能够快速的学习数学时,我拿起一些微积分课本用一个月通读了整本书,一个晚上读一小时.
微积分都是关于连续统的 -- 变化的比率, 曲线的面积, 立体的体积.是些有用的东西,但是实际细节却包含大量的记忆量并且枯燥,作为一个程序员来说根本不需要这些. 更好的方法是从整体上了解那些概念和技术,在必要的时候再去查询那些细节.
几何,三角,微分,积分,圆锥曲线,微分方程,和他们的多维和多元 -- 这些都有重要的应用.不过这时候不需要你去了解它们.这大概不是个好注意让你年复一年的去做证明和它们的练习题,不是吗?如果你打算花大量的时间去学习数学,那也是和你生活相关的部分.
学习数学的正确方法
正确学习数学的方法是广度优先,而非深度优先.你需要生存在空间里,学习事物的名字,区分出什么是什么.
以透视的方法来对待的话,考虑用用长整除.(汗一个,感觉译的不准确)现在就举起你的手如果你能在纸上做长整除.手吗?谁呢?我可不这么认为.
回头看看在学校里学过的长除法,要是不让你觉得烦恼和愤怒才怪.当然,这是显然的,但你不一定要自己亲自去做,因为很容易用计算器来做,即使你不幸在一座没有电力的荒无人烟的小岛上.你起码还有个计算器,在的手表上,补牙的什么东东,或其他什么上面.
为什么他们还教你这些呢?为什么我们感到含混心虚讷,如果我们不能记住怎样去做?这不是好像我们需要再次知道她.除此以外, if your life were on the line,你可以运用任意大的数来做长除法.相象你被囚禁在第三世界的地牢里,那儿的独裁者是 不会放你出来的,除非你计算出 219308862/103503391.你会怎么做呢?好吧,很容易.你开始从分子减去分母,直到不能再减 只剩余数为止.if pressed,你可以想个办法估计好作为十进制的余数反复来减(这种情况下,0.1185678219,Emacs M-x calc 告诉我的.够精确了! )
你也许能明白因为你知道除法就是反复的减.对除法概念的直觉是根深蒂固的.
学习数学的正确方法是忽略实际的算法和证明,对于大部分情况来说, ...:他们的名字,他们的作用,他们计算的大致步骤, (有时是)谁发明了他们,发明了多久了,他们的缺陷是什么,和他们相关的有什么.把数学当文科来学.
为什么讷?因为第一步应用在数学上的是问题的确定.如果你有一个问题去解决,并且如果你没有头绪如何开始, 这将花费你很长的时间来弄明白.但如果你知道这是个变异的问题,或者是一个凸优化问题,或者一个布尔的逻辑问题, 然后你起码能知道从哪着手开始寻找解决方案.
现在有许许多多的数学技术和整个的学科分支.如果你不知道组合逻辑是什么,甚至连听都没听说过, 那么你是不可能意识到在组合逻辑中可以找到的解决答案的问题的,难道你会么?
但那实在是个大新闻哪,因为阅读这些领域,学习实际算法,建模和计算结果的方法,记住这些名字都是容易的.在学校里他们教你链式法则,你也能回忆起他们并能运用在考试题上,但有多少学生能真正的了解他们到底意味着什么呢? 所以当他们遇到变种的链式问题时他们就不懂得如何运用公式了.让人感到讽刺的是,了解这是什么比记住如何运用公式更为容易.链式法则仅仅是如何对链式函数求导的意思,函数 x() 引用函数 g() ,你要求导 x(g()) .好,程序员知道所有和函数相关的;我们每天都使用他们,所以现在这比过去在学校更加容易能够相象出问题.
这就是为什么我认为他们以错误的方式在教数学. 对大多数高中毕业生来说,他们专门教授的内容不是可以靠经验来证明数学是如何有用的,他们教的那些恰恰是非经验式的内容.在你学习如何求导和做积分之前,你将要学习如何计数,怎样编程.
我认为学习数学最好的方法是每天花15到30分钟逛维基百科.那上面有数千数学分支的相关文章. 可以从一些你感兴趣的文章着手(比如,炫理论,或者,傅立叶变换,或者张量理论,就是能冲击你相象力的东西) 阅读.如果有什么你不理解的,就去了解那些链接.如此这般直到你累到不行.
几个月后,这么做会纵向扩展你的数学知识面.比如,你会发现一些模式--比如,数学的每个分支看上去都包括了一个有着复杂的多元版本的变量,所以线性代数将会琢建爬满你的 书单列表,直到你强迫自己学会他实际上是怎样工作的,你要下载个电子书或买本书,直到你 能从中找到乐趣.
藉着维基百科,你也能快速的找到一条了解数学基本原理的途径,条条大道通罗马.在某些领域,数学几乎总是形式化我们的"常识",所以我们能减少或证明那些领域里的新事物.对数学本身的研究就是无止境而且令人着迷的:构造形式模型本质的能力,证明,自明的系统, 规则表示,信息,和计算.
符号是个很重大的但很快被放弃的东西.数学符号是关闭你通往另一个世界的符咒.即使你熟悉累加,积分,多项式,指数,等等,如果你看到一堆符号堆彻的异常复杂时,你就把他实现的功能简单的当成一个原子操作好了,不要深究太多.
然而,从观察数学来说,尝试着明白人们正在试图解决的问题(那些已被证明了的问题某天也许会对你有实际用途), 你会开始在符号中看到相同的类型,你也不再排斥他们.比如,累加符号(大写符号-西格马)或者 product sign(大写符号-pi)起初看上去让人心里没底,即时你了解了他们的基本原理.但如果你是个程序员,你会认识到他仅仅是个循环:一个累加值,一个累乘.积分是一段连续曲线的相加,所以那不会让你郁闷太久.
一旦你习惯了数学的许多分支,和许多不同的符号的格式,你就走在了解许多数学知识的 路上了.因为你不再害怕,你将会发现问题,其实他们会自动跳到你面前."嗨,"你会思索,"我 了解这个.这是乘法符号!"
这样你就能扔掉计算器了.有一个充满相象的计算器比如 R,Matlab,Mathematica,甚或是 支持向量机的C语言库.但几乎所有有用的数学都是重型自动机,所以你能够让一切都变的自动化.