程序员怎样学数学

自从我读了Johnny von Neumann的传记,我已经为弥补我糟糕的数学技能花了15个月了。读了大量的数学书籍,不过呢,似乎我还有更多没有读,当然我会接着做的。

现在我就来告诉你这些。

(1) 首先: 程序员不认为他们需要了解数学。我常常听到这样的话。我不知道还有没有不同意的,甚至于以前是主修数学的程序员也告诉我,他们真的不是常常使用到数学!他们说更重要的是要去了解设计模式,面向对象原理,软件工具,界面设计,以及一些其他类似的东西。

你了解吗?他们完全正确。你不需要了解很多数学,你就能做个很棒,很专业的程序员。但是呢,同时你也不是真的需要知道如何来编程。我们要面对的是:有很多专业的程序员,他们认识到他们不是非常擅长数学,但他们还是寻找方法去提升。

如果你突然觉得自己好烂,周围的人都远远的超过你,你会怎么想呢?好,你可能会发现自己善于项目管理,或人事管理,或界面设计,或技术写作,或系统管理,还有许多其他程序员不必去精通的。你会开始堆积那些想法(因为工作永远干不完),当你发现一些你能掌握的东西时,你很可能会转移去全职的做这个工作。实际上,我认为有些东西你不需要了解,当前你还能够赖以生存的话。所以他们是对的:你不需要了解数学,并且没有数学你也能过的很好。但是最近我学到的一些东西可能会让你感到惊讶:在你知道如何编程之后,数学更容易学会。实际上,如果你先学数学,然后半路出家做程序员的话,你会发现编程简直就是小菜一碟。

学校里教数学的方式都错了。仅仅是教学的方法错了,不是教数学本身错了。如果你以正确的方式学习数学的话,你会学的更快,记住这点,对你,作为一个程序员来说很有价值。哪怕了解一点点相关的数学知识,就能让你写出可爱有趣的程序,否则会有些小难度。换句话讲,数学是可以慢慢学的,只要你有时间。

没人能了解所有的数学,就是最棒的数学家也不能。当人们发明新的形式去解决自己的问题时,数学领域就不断的扩展。和编程一样,一些给出的数学问题,不止一种方法可以去解决它。你可以挑个你最喜欢的方式。 数学是.嗯,请别告诉别人我说过这个哈;当然我也不指望谁能邀请我参加这样的派对,在我还活着的时候。但是,数学其实就是.我还是小声的说吧,听好了:(她其实就是一种乐趣啦!)

你学到的数学(和你忘了的数学) 。 这儿是我能记得的在学校学到的数学: 初中:数,数数,算术知识,初级代数("带问题的小故事") 。 高中:代数,几何,高等代数,三角学,微积分先修课 (二次曲线论和极限)。 大学:微积分,微分公式,线性代数,概率和统计,离散数学。 上面那个关于高中数学课程单子上所列的,怎么来着?美国高中几乎都是这样的课程设置。我认为其他国家也会很相似的,除了那些在9岁之前就掌握了这些课程的学生。(美国小孩同时却在热衷于玩魔鬼卡车竞赛,虽然如此,整个来说也算不上什么大损失。) 代数?是的,没问题。你需要代数,和一些理解解析几何的知识。那些很有用,并且在以后几个月里,你能学到一切你想要的,十拿九稳的。剩下的呢?我认为一个基本的介绍可能会有用,但是在这上面花整个学期或一年就显得很荒谬了。 我现在意识到那个书单列表是设计给那些以后要当科学家和工程师的学生的。他们在高中里所教的数学课程并不是为你的编程生涯做准备的,简单的事实是,多数的编程工作所需要的数学知识,相比其他工程师角色增长的更快。 即使你打算当一名科学家或者一名工程师,在你理解了什么是数学之后 所以,这样的书单列表不再有什么用了。学江詩丹頓Vacheron Constantin http://www.rhwatches.com/bigproc-21.html校教给我们的不是最合适的数学,并且方式也不对,难怪程序员认为他们不再需要数学:我们学的大部分数学知识对我们的工作没什么大的帮助。 他们没有教给你的那部分数学。

在现实中,计算机科学家经常使用的数学,跟上面所列的数学仅有很小的重叠。举个例子,你在中学里学的大部分数学是连续性的,也就是说,那是作为实数的数学。而对于计算机科学家来说,他们所感兴趣的95%也许更多的是离散性的,比如,关于整数的数学。 我打算在以后的博客中再谈一些有关计算机科学,软件工程,编程,搞些有趣的东东,和其他常常令人犯晕的训练。我已经从Richard Gabriel的《软件的模式》这本书中洞察到一个无关巨细的基本框架。如果你明显的等不下去的话,去读吧,是本不错的书。

从现在开始,不要再让"计算机科学家"这个词困扰到你。它听上去很可怕,其实数学不是计算机科学家所独有的领域。你也能作为一个黑客自学它,并且能做的和他们一样棒。你作为一个程序员的背景,将会帮助你保持只关注那些有实践性的部分。

我们用来建立计算模型的,大体上是离散数学,这是普遍的做法。如果正好今天你在看这篇博客,从现在起你正了解到更多的数学,并且你会认识到那样的普遍做法是不对的;从现在开始,你将有信心认为可以忽略这些,并以你想要的方式自学。

对程序员来说,最有效的离散数学的分支是概率理论。这是你在学校学完基本算术后紧接着的课。你会问,什么是概率理论呢?你就数啊,看有多少次出现满堂彩?或者有多少次是同花顺。不管你思考什么问题,如果是以"多少种途径."或"有多大几率的.",那就是离散问题。当它发生时,都转化成"简单"的计数,抛个硬币看看.? 毫无疑问,在他们教你基本的计算用法后,他们会教你概率理论。

我还保存着大学里的离散数学课本,可能它只占了三分之一的课程,但是它却涵盖了我们几乎每天计算机编程工作大部分所用到的数学。

也真是够奇怪的,我的教授从没告诉我数学是用来干吗的,或者我也从来没有听说过,种种原因吧。所以我也从没有给以足够的注意,只是考试及格,然后把他们都忘光,因为我不认为它还和编程有啥关系。事情变化是我在大学学完一些计算机科学的课程之后,也许是25%的课程,可怜啊!我必须弄明白什么对于自己来说是最重要的,然后再是向深度发展。

我想,如果每门数学课都花上整整一周的时间,而只是介绍让你如何入门的话,那将非常不错。这是最有意思的一种假设,那么你知道了你正学习的对象是哪种怪物了。怪物,大概对每一门课都合适。

除了概率和离散数学外,还有不少其他的数学分支,可能对程序员相当的有用。学校通常不会教你的,除非你的辅修科目是数学,这些数目列表包括:

统计学,其中一些包括在我的离散数学课里,它的某些训练只限于它自身,自然也是相当重要的,但想学的话不需要什么特别的入门。

代数和线性代数(比如:矩阵),他们会在教完代数后立即教线性代数。这也简单,但这在相当多的领域非常有用,包括机器学习。

数理逻辑,我有相当完整的关于这门学科的书没有读,是Stephen Kleene写的,克林闭包的发明者。如果哪位牛掰有什么更好的入门建议的话,可以给我推荐。显然,这门学科明显是非常重要的一部分。

信息理论和柯尔莫戈洛夫复杂性理论,真不可思议,不是么?我敢打赌没哪个高中会教你其中任何一门课程。它们都是新兴的学科。信息理论(相当相当相当相当难懂)是关于数据压缩,柯尔莫戈洛夫复杂性理论(同样非常难懂)是关于算法复杂度的。也就是说,你要把它压缩的尽量小,你所要花费的时间也就变的越长;同样的,程序或数据结构要变得多优雅,也有同样的代价。它们都很有趣,也很有用。

当然,也有其他的一些因素,某些领域是重复的。也拿来说说吧,你所发现有用的那部分数学,不同于那些你在学校里认为有用的数学。

那微积分呢?每个人都学它,所以它也一定是重要的,对吗?

好吧,微积分实际上是相当容易的。在我学习它之前,它听上去好像是世界上最难的一件事,好像和量子力学差不多。量子力学对我来说真的不是那么容易理解,但是微积分却不是。在我意识到程序员能够快速的学习数学时,我拿起一些微积分课本用一个月通读了整本书,一个晚上读一小时。

微积分都是关于连续统的 变化的比率,曲线的面积,立体的体积,是些有用的东西,但是实际细节却包含大量的记忆量并且枯燥,作为一个程序员来说根本不需要这些。更好的方法是从整体上了解那些概念和技术,在必要的时候再去查询那些细节。

几何,三角,微分,积分,圆锥曲线,微分方程,和他们的多维和多元 这些都有重要的应用。不过这时候不需要你去了解它们,这大概不是个好注意,让你年复一年的去做证明和它们的练习题,不是吗?如果你打算花大量的时间去学习数学,那也是和你生活相关的部分。

学习数学的正确方法 。
cowronegu
(1)正确学习数学的方法是广度优先精仿瑞士手錶,而非深度优先。你要考察的是整个数学世界,学习每个概念的名字,区分出什么是什么。

具体来看,考虑用长除法?如果你能在纸上做长整除,现在就举起你的手。会有人举手吗?至少我不这么认为。回头看看在学校里学过的长除法,要是不让你觉得烦恼和愤怒才怪。当然,这是显然的,但你不一定要自己亲自去做,因为很容易用计算器来做。即使你不幸在一座没有电力的荒无人烟的小岛上,你起码还有个计算器,在你的手表上,补牙的什么东东,或其他什么上面。 为什么他们还教你这些呢?如果我们不能记精仿萬國IWC手錶 http://www.rhwatches.com/bigproc-2.html住怎样去做,为什么会感到含糊心虚呢?好像我们不需要再次知道它。除此以外,如果你命悬一线,你可以运用任意大的数来做长除法。想象你被囚禁在第三世界的地牢里,那儿的独裁者是不会放你出来的,除非你计算出219308862/103503391。你会怎么做呢?好吧,很容易,你开始从分子减去分,,直到不能再减只剩余数为止。
 

arrow
arrow
    文章標籤
    程序员怎样学数学
    全站熱搜

    gongzs118 發表在 痞客邦 留言(0) 人氣()