数学和编程的关系

数学并不是计算机科学的基础

  很多人都错误的认为,计算机科学是数学的一个分支,数学是计算机科学的基础,数学是更加博大精深的科学。这些人以为只要学会了数学,编程的事情全都不在话下,然而事实却并非如此。

  事实其实是这样的:

  • 计算机科学其实根本不是数学,它只不过借用了非常少、非常基础的数学,比高中数学还要容易一点。所谓“高等数学”,在计算机科学里面基本用不上。
  • 计算机是比数学更加基础的工具,就像纸和笔一样。计算机可以用来解决数学的问题,也可以用来解决不是数学的问题,比如工程的问题,艺术的问题,经济的问题,社会的问题等等。
  • 计算机科学是完全独立的学科。学习了数学和物理,并不能代替对计算机科学的学习。你必须针对计算机科学进行学习,才有可能成为好的程序员。
  • 数学家所用的语言,比起常见的程序语言(比如C++,Java)来说,其实是非常落后而糟糕的设计。所谓“数学的美感”,其实大部分是夜郎自大。
  • 99%的数学家都写不出像样的代码。

  数学是异常糟糕的语言

  这并不是危言耸听。如果你深入研究过程序语言的理论,就会发现其实数学家们使用的那些符号,只不过是一种非常糟糕的程序语言。数学的理论有些是有用的,然而数学家门用于描述这些理论所用的语言,却是纷繁复杂,缺乏一致性,可组合性(composability),简单性,可用性。这也就是为什么大部分人看到数学就头痛。这不是他们不够聪明,而是数学语言的“设计”有问题。人们学习数学的时候,其实只有少部分时间在思考它的精髓,而大部分时间是在折腾它的语法。

  举一个非常简单的例子。如果你说x-1表示x的-1次方(x的倒数),那么f-1表示什么?f的-1次方,f的倒数?别被数学老师们的教条和借口欺骗啦,他们总是告诉你:“你应该记住这些!” 可是你想过吗:“凭什么!” x-1表示x的-1次方,而f-1,明明是一模一样的形式,表示的却是函数f的反函数。一个是求幂,一个是反函数,风马不及,却写成一个样子。这样的语言设计混淆不堪,却喜欢以“约定俗成”作为借口。

  如果你再多看一些数学书,就会发现这只是数学语言几百年累积下来的糟粕的冰山一角。数学书里尽是各种上标下标,带括号的上标下标,x,y,z,a,b,c,f,g,h,各种扭来扭去的希腊字母,希伯来字母…… 斜体,黑体,花体,双影体,……用不同的字体来表示不同的“类型”。很多符号的含义,在不同的子领域里面都不一样。有些人上一门数学课,到最后还没明白那些符号是什么意思。

  很多人学习微积分都觉得困难,其实问题不在他们,而在于莱布尼兹(Leibniz)。莱布尼兹设计来描述微积分的语言(∫,dx, dy, ...),从现代语言设计的角度来看,其实非常之糟糕,可以说是一塌糊涂。我不能怪莱布尼兹,他毕竟是几百年前的人了,他不知道我们现在知道的很多东西。然而古人的设计,现在还不考虑改进,反而当成教条灌输给学生,那就是不思进取了。

  数学的语言不像程序语言,它的历史太久,没有经过系统的,考虑周全的,统一的设计。各种数学符号的出现,往往是历史上某个数学家有天在黑板上随手画出一些古怪的符号,说这代表什么,那代表什么,…… 然后就定下来了。很多数学家只关心自己那块狭窄的子领域,为自己的理论随便设计出一套符号,完全不管这些是否跟其它子领域的符号相冲突。这就是为什么不同的数学子领域里写出同样的符号,却可以表示完全不同的涵义。在这种意义上,数学的语言跟Perl(一种非常糟糕的程序语言)有些类似。Perl把各种人需要的各种功能,不加选择地加进了语言里面,造成语言繁复不堪,甚至连Perl的创造者自己都不能理解它所有的功能。

  数学的证明,使用的其实也是极其不严格的语言——古怪的符号,加上含糊不清,容易误解的人类语言。如果你知道什么是 Curry-Howard Correspondence 就会明白,其实每一个数学证明都不过是一段代码。同样的定理,可以有许多不同版本的证明(代码)。这些证明有的简短优雅,有的却冗长繁复,像面条一样绕来绕去,没法看懂。你经常在数学证明里面看到“未定义的变量”,证明的逻辑也包含着各种隐含知识,思维跳跃,非常难以理解。很多数学证明,从程序的观点来看,连编译都不会通过,就别提运行了。

  数学家们往往不在乎证明的优雅性。他们认为只要能证明出定理,你管我的证明简不简单,容不容易看懂呢。你越是看不懂,就越是觉得我高深莫测!这种思潮到了编程的时候就显出弊端了。数学家写代码,往往忽视代码的优雅性,简单性,模块化,可读性,性能,数据结构等重要因素,认为代码只要能算出结果就行。他们把代码当成跟证明一样,一次性的东西,所以他们的代码往往不能满足实际工程的严格要求。

  编程是一门艺术

  从上面你也许已经明白了,普通程序员使用的编程语言,就算是C++这样毛病众多的语言,其实也已经比数学家使用的语言高明很多。计算机科学并不是数学的一个分支,它在很大程度上是优于数学,高于数学的。有些数学的基本理论可以被计算机科学所用,然而计算机科学并不是数学的一部分。数学在语言方面带有太多的历史遗留糟粕,它其实是泥菩萨过河,自身难保,它根本解决不了编程中遇到的实际问题。

  编程真的是一门艺术,因为它符合艺术的各种特征。艺术可以利用科学提供的工具,然而它却不是科学的一部分,它的地位也并不低于科学。和所有的艺术一样,编程能解决科学没法解决的问题,满足人们新的需求,开拓新的世界。所以亲爱的程序员们,别再为自己不懂很多数学而烦恼了。数学并不能帮助你写出好的程序,然而能写出好程序的人,却能更好的理解数学。我建议你们先学编程,再去看数学。

时间: 2024-11-08 10:40:30

数学和编程的关系的相关文章

数学和编程到底是什么关系?

不知道什么时候开始,数学和编程被捆绑到了一起,数学不好学编程也不行,很多人的意识数学系毕业的学编程一定厉害. 只能说,确实多虑了,至于数学好就编程好更是想多了,两者也是没有绝对的关系,基本的加减乘除已经可以应付绝大多数的场景了. 这时候大家会说算法都是数学构成的啊,满满的都是数学元素.我从大一就开始接触编程,到现在毕业两年,既在大型国企做过飞控算法,也在世界500强外企做过通信算法开发,真的没有那么多算法用你去开发,所谓的算法落实到个人就是逻辑,就是业务,你要用的算法基本都是现成的,直接用就好了

王垠:数学和编程

好些人来信问我,要成为一个好的程序员,数学基础要达到什么样的程度?十八年前,当我成为大学计算机系新生的时候,也为同样的问题所困扰.面对学数学,物理等学科的同学,我感到自卑.经常有人说那些专业的知识更加精华一些,难度更高一些,那些专业的人毕业之后如果做编程工作,水平其实比计算机系毕业的还要高.直到几年前深入研究程序语言之后,对这个问题我才得到了答案和解脱.由于好多编程新手遇到同样的困扰,所以我想在这里把这个问题详细的阐述一下. 数学并不是计算机科学的基础 很多人都错误的认为,计算机科学是数学的一个

数学和编程

好些人来信问我,要成为一个好的程序员,数学基础要达到什么样的程度?十八年前,当我成为大学计算机系新生的时候,也为同样的问题所困扰.面对学数学,物理等学科的同学,我感到自卑.经常有人说那些专业的知识更加精华一些,难度更高一些,那些专业的人毕业之后如果做编程工作,水平其实比计算机系毕业的还要高.直到几年前深入研究程序语言之后,对这个问题我才得到了答案和解脱.由于好多编程新手遇到同样的困扰,所以我想在这里把这个问题详细的阐述一下. 数学并不是计算机科学的基础 很多人都错误的认为,计算机科学是数学的一个

C语言入门基础之数组——数学和编程的完美结合(图)

C语言入门基础之数组--数学和编程的完美结合(图)姐姐又来更新了,刚刚过完周末,是不是玩的很开心啊,放松后我们来学习新知识吧!现在我们要讲数组啦,编程往往和数学紧密联系着,想必在我们高中有学习过集合吧.那么在编程中我们怎么表示集合呢?刚学编程的小可爱可能学到变量时候发现,如果我需要用很多变量存储同意作用的值,需要大量的变量.现在让小姐姐给你介绍下二维数组吧,小可爱可要认真学了哦!记得给小姐姐点赞,?( ′???` )比心大家都玩抖音吧,我们每个人都有一个抖音号,我们还会关注一些小姐姐的抖音号,那

【转】数学与编程——求余、取模运算及其性质

声明 转自:https://blog.csdn.net/chensilly8888/article/details/42834697 此博文简短有精悍的讲述了在数学与计算机科学中求余与取模运算的区别, 在不同语言下取模的意义以及取模运算的性质 由于我觉得oi编程的话,只需要弄懂取模的性质就行了,因为编程竞赛的时候,是只用一种语言写的,自己平常打代码也就熟悉了那种语言的语法之类的. 取模运算的性质 如果a≡b(mod m),x≡y(mod m),则a+x≡b+y(mod m). 如果a≡b(mod

道与术 - 谈谈我对数学和软件产品之间关系的理解

JFinal 波总和我在 谈谈我对 JFinal Marketing 的一些看法 博文的评论中谈到了数学和软件之间的关系. 这篇文章中我再详细说说我的理解. 纵观人类知识的积累, 大致可以分为 "道" 与 "术". 所谓"道", 即天道, 也就是自然规律. 而"术", 即技术, 是人类对已发现自然规律的应用. 自先秦而降中国文化即重道而轻术, 这当然有其历史局限性, 但道在术先也是毋庸置疑的. 波总在 JFinal 4.8 发

【数学与语言的关系】

语言虽有不同,但都是为了表达同样的意思,语言是人类对信息的编码,与计算机的处理方式原理相同,只是计算机处理更快,能处理的数据也更庞大:传输信息的通道就是信道,信道宽,信号就不需要压缩,信道宅窄,信号就需要压缩,例如在还没有发明造纸术的中国古代,文字的流传依靠刻竹简,雕石碑等方式,成本很大,因此古人惜墨如金,就是一种因为信道窄而对信息的压缩,与其他文明的文字记录规律一样,出现频度高的词语相对较短,比较好写,因为这样才更有效率: 语言是对世界的描述,数字也可以对世界进行描述,这是两种方式.为什么说数

探索性思维——How to Solve It

我觉得这篇文章和什么都能扯上点关系,比如编程. 很多人已经讨论过数学与编程的关系了,这里不想过多探讨,只是简单提一下:有些人把数学贬低地一文不值,认为做一般的应用软件用不到数学:而有些人则把数学拔高到一个很高的位置,认为一些比较上层的领域像机器学习,包括其父.子类人工智能和深度学习都需要用到些相对晦涩的数学知识.我的看法是:尽自己的能力学习更多的数学知识总是没有坏处的.当然,辨证的来看,过度学习偏废了机器本身也就不说什么了(仁者仁智者智吧,王垠也写过一篇文章,我想附在这里:数学与编程,希望勿喷,

编程需要知道多少数学知识?

数学和编程有一种容易让人误解的联系.许多人认为在开始学习编程之前必须对数学很在行或者数学分数很高.但一个人为了编程的话,需要学习多少数学呢? ([伯乐在线编注]:本文仅为 Al Sweigart 一家之言,再推荐 Alan Skorkin 的这篇文章<数学是成就卓越开发人员的必备技能>.) 实际上不需要很多.这篇文章中我会深入探讨编程中所需要的数学知识.你可能已经都知道了. 对于基本的编程,你需要知道下面的: 加减乘除 - 实际上,电脑会帮你作加减乘除运算.你仅需要知道什么时候运用它们. 模运