Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

通过acc提到的“王垠”,我看到一篇特别深刻的文章。。。

784 views
Skip to first unread message

alont

unread,
Apr 29, 2021, 10:13:49 AM4/29/21
to
这篇文章多多少少减轻了我对自己没学过高等数学对编程的恐惧感

https://www.yinwang.org/blog-cn/2015/07/04/math

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

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

事实其实是这样的:

计算机科学根本不是数学,它只不过借用了非常少,非常基础的数学,比高中数学还要容易。
所谓“高等数学”,并不是研究计算机科学必须的。你可以用计算机来做微积分计算,可是这时候你其实是在做数学工作,用计算机作为工具。你研究的并不是计算机科学。这就像你可以用计算机来设计建筑,但建筑学却不是计算机科学的基础。
计算机是比数学更加基础的工具,就像纸和笔一样。计算机可以用来解决数学的问题,也可以用来解决不是数学的问题,比如工程的问题,艺术的问题,经济的问题,社会的问题等等。
计算机科学是完全独立的学科。学习了数学和物理,并不能代替对计算机科学的学习。你必须针对计算机科学进行学习,才有可能成为好的程序员。
数学家所用的语言,比起常见的程序语言(比如C++,Java)来说,其实是非常落后而蹩脚的设计。所谓“数学的美感”,其实大部分是夜郎自大。
99% 的数学家都写不出像样的代码。
数学是异常糟糕的语言
这并不是危言耸听。如果你深入研究过程序语言的理论,就会发现其实数学家们使用的那些符号,其实是一种非常糟糕的程序语言。数学的理论很多是有用的,然而数学家门用于描述这些理论所用的语言,却是纷繁复杂,缺乏一致性,可组合性(composability),简单性,可用性。这也就是为什么大部分人看到数学就头痛。这不是他们不够聪明,而是数学语言的“设计”有问题。人们学习数学的时候,其实只有少部分时间在思考它的精髓,而大部分时间是在折腾它的语法。

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

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

直到今天,数学家们写书仍然非常不严谨。他们常犯的一个错误是把 x2 这样的东西叫做“函数”(function)。其实 x2 不是一个函数,它只是一个表达式。你必须同时指明“x 是参数”,加上 x2,才会成为一个函数。所以正确的函数写法其实看起来像这样:f(x) = x2。或者如果你不想给它一个名字,可以借用 lambda calculus 的写法,写成: λx.x2。

可是数学家们灰常的喜欢“约定俗成”。他们定了一些不成文的规矩是这样:凡是叫“x”的,都是函数的参数,凡是叫“y”的,都可能是一个函数…… 所以你写 x2 就可以表示 λx.x2,而不需要显式的写出“λx”。殊不知这些约定俗成,看起来貌似可以让你少写几个字,却造成了许许多多的混淆和麻烦。比如,你在 Mathematica 里面可以对 x2 + y 求关于x的导数,而且会得到 y'(x) + 2x 这样蹊跷的结果,因为它认为 y 可能是一个函数。更奇怪的是,如果你在后面多加一个 a,也就是对 x2 + y + a 求导,你会得到 2x!那么 y'(x) 到哪里去了?莫名其妙……

相对而言,程序语言就严谨很多,所有的程序语言都要求你必须指出函数的参数叫什么名字。像 x2 这样的东西,在程序语言里面不是一个函数(function),而只是一个表达式(expression)。即使 JavaScript 这样毛病众多的语言都是这样。比如,你必须写:

function (x) { return x * x }
那个括号里的(x),显式的声明了变量的名字,避免了可能出现的混淆。我不是第一个指出这些问题的人。其实现代逻辑学的鼻祖 Gottlob Frege 在一百多年以前就在他的论文“Function and Concept”里批评了数学家们的这种做法。可是数学界的表达方式直到今天还是一样的混乱。

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

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

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

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

数学里最在乎语言设计的分支,莫过于逻辑学了。很多人(包括很多程序语言专家)都盲目的崇拜逻辑学家,盲目的相信数理逻辑是优雅美好的语言。在程序语言界,数理逻辑已经成为一种灾害,明明很容易就能解释清楚的语义,非得写成一堆稀奇古怪,含义混淆的逻辑公式。殊不知其实数理逻辑也是有很大的历史遗留问题和误区的。研究逻辑学的人经常遇到各种“不可判定”(undecidable)问题和所谓“悖论”(paradox),研究几十年也没搞清楚,而其实那些问题都是他们自己造出来的。你只需要把语言改一下,去掉一些不必要的功能,问题就没了。但逻辑学家们总喜欢跟你说,那是某天才老祖宗想出来的,多么多么的了不起啊,不能改!

用一阶逻辑(first-order logic)这样的东西,你可以写出一些毫无意义的语句。逻辑老师们会告诉你,记住啦,这些是没有意义的,如果写出来这些东西,是你的问题!他们没有意识到,如果一个人可以用一个语言写出毫无意义的东西,那么这问题在于这个语言,而不在于这个人。一阶逻辑号称可以“表达所有数学”,结果事实却是,没有几个数学家真的可以用它表达很有用的知识。到后来,稍微明智一点的逻辑学家们开始研究这些老古董语言到底出了什么毛病,于是他们创造了 Model Theory 这样的理论。写出一些长篇大部头,用于“验证”这些逻辑语言的合理性。这些问题在我看来都是显而易见的,因为很多逻辑的语言根本就不是很好很有用的东西。去研究它们“为什么有毛病”,其实是白费力气。自己另外设计一个更好语言就完事了。

在我看来,除了现代逻辑学的鼻祖 Gottlob Frege 理解了逻辑的精髓,其它逻辑学家基本都是照本宣科,一知半解。他们喜欢把简单的问题搞复杂,制造一些新名词,说得玄乎其玄灵丹妙药似的。如果你想了解逻辑学的精华,建议你看看 Frege 的文集。看了之后你也许会发现,Frege 思想的精华,其实已经融入在几乎所有的程序语言里了。

编程是一门艺术
从上面你也许已经明白了,普通程序员使用的编程语言,就算是 C++ 这样毛病众多的语言,其实也已经比数学家使用的语言好很多。用数学的语言可以写出含糊复杂的证明,在期刊或者学术会议上蒙混过关,用程序语言写出来的代码却无法混过计算机这道严格的关卡。因为计算机不是人,它不会迷迷糊糊的点点头让你混过去,或者因为你是大师就不懂装懂。代码是需要经过现实的检验的。如果你的代码有问题,它迟早会导致出问题。

计算机科学并不是数学的一个分支,它在很大程度上是优于数学,高于数学的。有些数学的基本理论可以被计算机科学所用,然而计算机科学并不是数学的一部分。数学在语言方面带有太多的历史遗留糟粕,它其实是泥菩萨过河,自身难保,它根本解决不了编程中遇到的实际问题。

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

如果你想了解更多关于数学语言的弊病以及程序语言对它们的改进,我建议你看看这个 Gerald Susman 的讲座。

acc

unread,
Apr 29, 2021, 11:27:38 AM4/29/21
to
王垠是 moses 提的 😃 我顺着说了一下

The Edwin

unread,
Apr 29, 2021, 8:47:07 PM4/29/21
to
我也受您几位的影响看了他的博客。
他说了很多实话,也思考了很多事情。
我喜欢这个伙计的想法和观念。
生活中如果多一些这样的人就好了。


在 2021/4/29 23:27, acc 写道:
> 王垠是 moses 提的 😃 我顺着说了一下
>

The Edwin

unread,
Apr 29, 2021, 8:50:38 PM4/29/21
to
他说:
世界上就是缺少这样能够说出自己想法的人,所以才会变得像今天这个样子。

我深以为然。
现实不但如此,还有很多说出自己想法的人被杀掉了。

acc

unread,
Apr 30, 2021, 4:37:47 AM4/30/21
to
> 现实不但如此,还有很多说出自己想法的人被杀掉了。

吾闻之: ℐ𝒻 𝓎ℴ𝓊'𝓇ℯ ℊℴ𝒾𝓃ℊ 𝓉ℴ 𝓉ℯ𝓁𝓁 𝓅ℯℴ𝓅𝓁ℯ 𝓉𝒽ℯ 𝓉𝓇𝓊𝓉𝒽, 𝒷ℯ 𝒻𝓊𝓃𝓃𝓎 ℴ𝓇 𝓉𝒽ℯ𝓎'𝓁𝓁 𝓀𝒾𝓁𝓁 𝓎ℴ𝓊.
又闻: 察见渊鱼者不祥,智料隐匿者有殃
中国历史上有无数的 "不见容", 还可以看看希腊的苏格拉底.
不同的人会采取不同的应对方式, 比如渔父莞尔而笑,鼓枻而去,乃歌曰:“沧浪之水清兮,可以濯吾缨;
沧浪之水浊兮,可以濯吾足。”遂去,不复与言。

那些随心所欲说话的人, 说的不一定都对. 我观察他们一个共同点就是不拉帮结伙. 所以就被围剿了. 围剿
对单打独斗, 可以说是人和动物的对抗, 人比动物先进所以就胜了. 希望现在的信息时代, 这些人能加强一下
自己的 "连接". 当然了这意味着改变, 而这些人不一定喜欢改变, 他们本质上可能就不怕死 - 我觉得这一条
尤其需要改 😁 也意味着连不上的时候, 也要想着 "以后能连上"

J Magazine Cn

unread,
Apr 30, 2021, 6:04:19 PM4/30/21
to
这些文章应该多推荐点

alont

unread,
May 1, 2021, 12:05:17 PM5/1/21
to
今晚我又抽空看他的博客,越来越喜欢他的文章了,想报名他的学习班,
但苦于自己基础太差以及半年内确实也没时间,只能暂时搁浅,不过我觉得
我肯定会找机会成为他的学生的。他真的适合做教育,他的思维方式
太与众不同了。我喜欢。

我感激认识这个人,虽然我还没真的“认识”,谢谢Moses, acc。

attend

unread,
May 5, 2021, 9:51:59 AM5/5/21
to
大概好多年前听说过这个人,因为一片文章,完全用 GNU/Linux 工作,很喜欢。
后来就关注了一下他。当时觉得他愤世嫉俗,从清华博士退学,然诺去美国也退学
了几家。后来在美国大公司上班。这两年又回国了,不知道现在干啥呢。当时水木
社区讨论他的挺多,有夸狂妄的,有夸有才的。

这些年过去了,他在中国美国都生活过,没听说有什么成果。现在在水木社区偶尔
还有人提起,基本一边倒了。前两天特斯拉刹车事件,有个叫王垠的分析出些内
容,有理有句。大家觉得回国后总算干出点实事,结果是另一同名的王垠。

他的那篇文章,我一直留着呢:

=======================================
标 题: 完全用 GNU/Linux 工作
发信站: ????(Sat May 10 17:37:17 2003)


完全用 GNU/Linux 工作

半年来,Linux 高效的完成了我所有的工作。

Hi! 我们先来看看很关键的一种计算机软件叫做“操作系统”(名词解释略 :P)。GNU/Lin
ux 是一个操作系统,如果你不知道它是怎样一个系统,可以参考
http://www.kernel.or
g.

由于 GNU/Linux 这个词太长,下面如果没有特别指明,“Linux”就是指“GNU/Linux”。
由于某种我不明白的稀奇古怪的法律原因,Linux 不能叫做 UNIX。我只是一个无
名小卒,
所以可能没有人无聊到想找我打官司,所以我可以随便提到一些专有名词,而不用
声明“
foo是bar公司的商标”。我可以说:Linux 实质上是 UNIX,而且是最有生命力,最
有前途
的 UNIX。以后我用在 Linux 身上的说法同样适用于其它 UNIX,反之也成立。
我与 Linux 的故事

这是我写过的最长的一段个人历史,因为我对 Linux 实在非常有感情。不喜欢看
别人历史
的人可以跳过这节。

下面还有喔 (2%) 第(1-23)行 | g 跳转 | l n 上下篇 | / ? 搜索 | s e 开头末尾|




On 29/04/2021 15:13, alont wrote:
> 这篇文章多多少少减轻了我对自己没学过高等数学对编程的恐惧感
>
> https://www.yinwang.org/blog-cn/2015/07/04/math
>

Moses

unread,
May 7, 2021, 3:00:20 AM5/7/21
to


还有同名的王垠? 应该就是他吧...


>>>>> "attend" == attend <att...@home.srv.com> writes:

attend> 大概好多年前听说过这个人,因为一片文章,完全用
attend> GNU/Linux 工作,很喜欢。后来就关注了一下他。当时
attend> 觉得他愤世嫉俗,从清华博士退学,然诺去美国也退学
attend> 了几家。后来在美国大公司上班。这两年又回国了,不
attend> 知道现在干啥呢。当时水木 社区讨论他的挺多,有夸
attend> 狂妄的,有夸有才的。

attend> 这些年过去了,他在中国美国都生活过,没听说有什么
attend> 成果。现在在水木社区偶尔 还有人提起,基本一边倒
attend> 了。前两天特斯拉刹车事件,有个叫王垠的分析出些内
attend> 容,有理有句。大家觉得回国后总算干出点实事,结果
attend> 是另一同名的王垠。

attend> 他的那篇文章,我一直留着呢:

attend> =======================================标 题: 完
attend> 全用 GNU/Linux 工作发信站: ????(Sat May 10
attend> 17:37:17 2003)


attend> 完全用 GNU/Linux 工作

attend> 半年来,Linux 高效的完成了我所有的工作。

attend> Hi! 我们先来看看很关键的一种计算机软件叫做“操作
attend> 系统”(名词解释略 :P)。GNU/Lin ux 是一个操作系统,
attend> 如果你不知道它是怎样一个系统,可以参考
attend> http://www.kernel.or g.

attend> 由于 GNU/Linux 这个词太长,下面如果没有特别指明,
attend> “Linux”就是指“GNU/Linux”。由于某种我不明白的
attend> 稀奇古怪的法律原因,Linux 不能叫做 UNIX。我只是
attend> 一个无 名小卒,所以可能没有人无聊到想找我打官司,
attend> 所以我可以随便提到一些专有名词,而不用 声明“
attend> foo是bar公司的商标”。我可以说:Linux 实质上是
attend> UNIX,而且是最有生命力,最 有前途的 UNIX。以后我
attend> 用在 Linux 身上的说法同样适用于其它 UNIX,反之也
attend> 成立。我与 Linux 的故事

attend> 这是我写过的最长的一段个人历史,因为我对 Linux
attend> 实在非常有感情。不喜欢看 别人历史的人可以跳过这
attend> 节。

attend> 下面还有喔 (2%) 第(1-23)行 | g 跳转 | l n 上下篇
attend> | / ? 搜索 | s e 开头末尾|




attend> On 29/04/2021 15:13, alont wrote:
>> 这篇文章多多少少减轻了我对自己没学过高等数学对编程的
>> 恐惧感https://www.yinwang.org/blog-cn/2015/07/04/math
>>


--
Moses@GNUS

Moses

unread,
May 7, 2021, 3:11:20 AM5/7/21
to

他可是四大魔道编程天王之一, 小心入魔... :P

>>>>> "alont" == alont <alon...@gmail.com> writes:

alont> 今晚我又抽空看他的博客,越来越喜欢他的文章了,想
alont> 报名他的学习班,但苦于自己基础太差以及半年内确实
alont> 也没时间,只能暂时搁浅,不过我觉得我肯定会找机会
alont> 成为他的学生的。他真的适合做教育,他的思维方式太
alont> 与众不同了。我喜欢。

alont> 我感激认识这个人,虽然我还没真的“认识”,谢谢
alont> Moses, acc。

alont> On Thursday, April 29, 2021 at 8:47:07 PM UTC-4, The Edwin wrote:
>> 我也受您几位的影响看了他的博客。 他说了很多实话,也思
>> 考了很多事情。 我喜欢这个伙计的想法和观念。 生活中如
>> 果多一些这样的人就好了。
>>
>>
>> 在 2021/4/29 23:27, acc 写道: > 王垠是 moses 提的 😃
>> 我顺着说了一下
>> >

--
Moses@GNUS

shion

unread,
May 7, 2021, 3:25:32 PM5/7/21
to

囧,如果不是某APP推送过一条关于他的新闻,不然我还真想不起来这个人是谁

attend

unread,
May 10, 2021, 4:53:47 AM5/10/21
to
这个是学汽车的王垠。
  王垠:毕业于清华大学汽车工程系和人文学院编辑出版学专业,获工学学士和
文学学士学位,在汽车族的工作使两个学位找到了最佳的契合点。通过四年的工作
实践,对汽车和汽车行业有了全方位的理解,策划了多篇有重大影响的深度报道。
同时也是“读万卷书,行万里路”的身体力行者,从北非的沙漠,到外蒙的戈壁,从
可可西里的无人区,到泰国老挝的热带雨林,走过的路程不止万里,是全杂志社深
入险僻地区次数最多的编辑。现任汽车族杂志执行副主编。


这个是学电脑的王垠

王垠,四川大学97级本科毕业,保送到清华大学计算机系直博。期间曾在清华大学
计算机系软件工程专业就读,主要进行集成电路布线算法的研究。在此期间,他因
《完全用GNU/Linux工作》一文和对Te

On 07/05/2021 08:00, Moses wrote:
>
>
> 还有同名的王垠? 应该就是他吧...
>
>
0 new messages