Posted in Uncategorized

美国的数学考试允许使用计算器的真正原因

当我还在上初中的时候,要说有什么最喜欢玩的东西,那便是计算器。

那时我们流行用国产的自然手写计算器,不过其实功能是很弱的,远远比不上卡西欧的手写计算器。最典型的是国产的计算器表示分数只能用“a/b”的横行形式,但是卡西欧则能使用竖行形式。值得玩味的是,当时国产的计算器卖12元,而卡西欧卖120元;十年后,国产的计算器功能还是那么简陋,但是外壳做工提升了一下,便卖到30元,而卡西欧则降价到56元。

那时候每天把玩、研究计算器比打游戏还兴奋,我甚至自己不知道怎么就开发出了一种类似于倒计时的玩法,通过输入一串提前预设好的数据,然后一直按着方向键向下,就能在屏幕上连续出现10、9、8……的倒计时,而且时间正好间隔正好是1秒钟。现在回想起来,这大概是我编过的第一个程序,虽然实际上并不是编程,但是在实现方法上却和用计算机编程有异曲同工之妙。

而在那时,我便常常听说美国的学生允许使用计算器,而老师们也常说,美国人因为爱用计算器,所以数学不如我们。那时的我年少,倒也迷信几分这种话语,全然不知道美国的数学水平在世界是前列的,而我们中国人真正进入到现代数学的体系,则可能得到鸦片战争以后。因此,光以这种浅薄的根基来说,我们中国人所谓的水平数学高超,实则是一种计算能力,而这种计算能力又是十分初等的,其实是不足挂齿的。

计算器、计算机诞生后,我们更是明白,其实所谓的单一计算,根本不是人的长处,我们比计算机聪明的地方在于我们有着很强的思维能力,而计算机则没有,但比较起单一计算能力,人则远远不如计算机。我并不是否定基础运算的作用,基础运算的能力其实是非常重要的,但远远没有我们中国人所强调的那么重要。实际上,美国中小学的学习中也是较为强调基础运算的作用的,我观察到那些做数学视频的美国人的口算能力也是很强的,不输给中国人。我们中国人学习了很久的数学,其实陷入了一种重复劳动的尴尬,劳动量很大,但是思维的提升非常有限,而美国人则往往把精力花费在如何提升数学思维上。

最近从头开始学习一本地地道道的美国微积分教材后,更是让我明白其中的根本差距。

我不知道中国考试强调不用计算器的原因是什么,也许是对自己祖传的算术方法比较自信,也许是怕计算器削弱学生的计算能力,也许是怕有人靠计算器作弊,但从结果而言,既然不允许使用计算器,那么考试的答案就必须是能通过手写计算而出的。这就导致了我们很容易在特殊值上获得一种简单化的倾向,从而严重削弱了在真实世界中解决问题的能力。典型的比如三角函数,如果我们为了考试方便,当然都是用几分之pi的简单值,但实际上在工程运用中,通常会出现零点几的数值,学生往往搞不明白这个值到底代表什么含义(实际上是弧度值),也不明白如何转换成常用的角度值。

上述问题紧接着而来的就是,因为我们必须尽可能地简化计算,除了使用特殊值外,还必须让整个函数变得易于计算,但现实生活中,函数往往是复杂的,因此我们就会抛弃掉那些真实的案例。而因为美国允许使用计算器,所以他们的教科书和课后练习中会直接以现实生活中会出现的各种函数来举例,我印象比较深的有日落时间和每日温度是一个经过变换的sin函数。这些真实存在的物理公式,往往带有不那么凑巧的系数,用手计算可以说是很困难,但是用计算器则不然。因此,只要是真正明白各种数学知识的原理,实际上这些题目都是不可怕的,按部就班地拿计算器计算便是。

我们这种避免使用真实工程中可能出现的情况的倾向,就很容易让书本与考试脱离实际,让学生无法掌握真正的知识原理,也无法运用到生活实践上去。长此以往,不但丧失能力,更容易产生对数学的畏难情绪,看到真实存在的那些看似很复杂实则很简单的数学公式也会觉得如临大敌,怀疑自己是不是智商不如人,也不知道学数学到底有什么用。

因此,我认为,中国的数学教育是必须摆脱重复低效的,不能把学生的精力都浪费在重复计算上。让学生真正懂得函数的意义,各种公式的意义,才是对他们的一生有根本性的帮助的,才是对整个国家和社会的进步、发展有真正的帮助的。

现代计算机、编程语言以及各类运算软件的普及,使得普通人也能掌握强大的算力,而如果放在古代,是需要职业数学家们花费几年甚至数十年去手动计算、验证一个算式的结果。所以,如果我们到了现代还将我们的思维放在计算能力这种最基础的事情上,几乎可以说对自己、对社会、对人类都是没有任何帮助的。我们应该把主要精力放在如何计算上,也就是算法。

比如我在学习极限时,给定一个函数式,要求分别以正负0.1,0.01,0.001,0.0001的差值从左右两个方向不断逼近某点a,计算出数值并列表。即便使用计算器,仍然是一项较为浩大的工程,而且意义不大,因为我们主要是要了解极限的思想。这时候,运用我所掌握的编程知识,编写一个程序,就能全自动给出运算结果。

下图便是我用自己Python编写的一段程序,只有区区几行。如果要更改函数的算式,只需要修改f(x)内的算式;如果要添加更多差值以求得更加精确的极限值,修改delta_x即可;如果要修改要逼近的点的值,修改a的数值即可。

所以,最终,我们可以得出结论:掌握思想才是王道,其次是掌握工具的使用。这样,我们才可以在通往真理的道路上越走越远,而不是原地打转。

Posted in Uncategorized

开发应与开发环境相适应:Windows下的开发环境最优解

最近尝试各种开发环境后,逐渐明白所谓的开发环境,还是原生态最好。

什么叫原生态呢?

比如C语言在Linux上就叫原生态,在Windows上就不叫原生态。最典型的例子是Visual Studio一直不支持C语言,直到最近一两年才终于开始支持C语言的开发。

在Windows上用C语言编程,可以选择的IDE少之又少,无论是界面还是功能,都不尽然如人意,甚至不乏很多老古董,比如Turbo C/C++(如图)。

这原始而又朴素的画风简直欲罢不能,但的确有很多高手当年就是靠这款IDE走上了封神之路

老手应该都知道通过编译器配合VS Code会有比较现代化的C语言编程体验,但是在Windows上找编译器那叫一个困难。

在Windows上最受欢迎的编译器是MinGW64,但是它内置的GCC版本是8.1.0,上GCC官网一查这是2018年的版本。GCC 9.0早就出了,MinGW64卡在8.0也就算了,但好歹得升级到最新的8.4吧?没办法,MinGW64的升级进度就卡在8.1不动了,基本不怎么更新。

如果你直接用Linux,一条命令就可以安装GCC,版本直接就是最新的9.0以上(也要看什么发行版,Debian应该是8.0的)。在Windows上安装MinGW64也谈不上顺畅,要下载、安装、配置环境变量等等,较为繁琐。

除了编译器版本老旧外,在Windows写C还会出现一些和Linux环境完全不同的结果。

比如用VS Code编译运行C文件,即便不加”\n”在string的结尾,最终printf()出来的结果仍然是自动换行的。但是在Linux下编译运行,结果会被忠实地还原,不加”\n”就不会换行。这样一来,在Windows下写C,一方面不利于养成添加“\n”的习惯,另一方面自己也很难排查出实际结果,以为自己当初写的时候并没有问题。

再比如在使用pointer(指针)时,Windows环境下的内存地址并不是0x开头的。

当然,最经典而且最现实的问题是,基本上经典、权威的C语言教程都是基于Linux环境,那么你用Windows编译、运行、调试时往往跟教程讲的不一样,要自己想办法解决。

可能有人比较好奇,为什么教程是基于Linux的呢?因为C语言本来就是为Unix系统而生的,C语言之父同时也是Unix系统之父,而Linux和MacOS都是基于Unix开发的,但是只有Linux是开源免费的,所以自然用Linux教学了。另一方面,如今C语言使用的场景除了教学和嵌入式开发以及Linux系统开发外,使用场景有限,真有需求都转Python和C++了,所以C语言有点old school的感觉,而old school的专家学者都很钟情Linux,说是情怀也好,但更多的是一种精神和理念的认同与传承。

用Windows作为C语言默认系统的教程不是没有,但是基本上都是不值一看的垃圾。教程作者认为在Windows装个IDE更方便学习C语言,其实是作者自己既没有精神和理念的传承,水平也比较低,甚至都不清楚C语言的核心运作原理和操作系统原理,著名代表人物自然是谭浩强了。

所以结论是,直接在Linux上写C是最不折腾的。

但是如果只有一台电脑,又比较依赖图形界面,且兼顾工作、软件生态、娱乐,怎么办呢?

最好的解决方案是主系统仍然为Windows,然后开启一台Linux虚拟机(使用Server版本即可),然后在Windows上通过VS Code、Terminal等连接那台虚拟机。VS Code现在对SSH远程开发的支持非常好,所以我非常推荐使用这一方式进行开发。

VS Code SSH远程连接教程:https://jaylinwu.wordpress.com/2020/12/30/vs-code-ssh-remote-connect-to-linux-server-real-solution/

长期开启虚拟机,其实对CPU的要求不算太高,一般最近几年生产的CPU都能轻松搞定。主要是宿主机内存要大,磁盘IO性能要好。内存建议16G起步,磁盘至少是SATA SSD且创建虚拟机时把虚拟硬盘存放在SSD上。

如果是跨平台的编程语言,则对开发环境要求没那么高,比如Java、Python,可以直接在Windows上用IDE或者VS Code。在这种情况下,我倒是比较愿意直接在Windows上跑,因为这样可以节省下开启虚拟机的资源,且代码直接在实体机上跑性能也会更好。此外,同时打开的窗口数量更少,系统UI更为统一,操作和切换的体验较好。

除了在实体机上开启虚拟机,有条件可以在本地搭建一台专门跑代码的Linux服务器。

购买一台VPS(云主机)也是不错的选择,然而,国外的云主机常常卡掉线,跑SSH极度不稳定,国内的VPS价格更加昂贵,性价比很低。根据我的初步测算,在实体机上开启本地虚拟机,哪怕只分配单核、1GB内存,其性能应该比Vultr上5美元/月的一款还要强得多。

用远程VPS的好处大概就是24小时不关机且网络条件更好(访问外网,可以开启80端口)。远程VPS当然也不用另外掏电费,但是本地虚拟机的耗电量也非常低(取决于当前任务的负载),就算跑满CPU,也不过是60W而已。除此之外,本地虚拟机使用快照等功能也是完全免费的,而VPS有可能另外收费。

当然,如果你的预算足够充足,购买高配VPS的体验应该是非常好的。

Vultr的价目表。
高配主机的性能很强,但租金价格一样不便宜,自己配一台本地实体机显然划算很多。

不过,整体而言,现在云端远程开发是一个流行的大趋势,倘若云端VPS的价格能一降再降,那么本地虚拟机的优势会被压缩。

Posted in Uncategorized

为什么我选择将博客迁移到WordPress.com上

其实一直以来,大多数单纯写文字分享博客的人总会把精力放在不该关注的地方:博客的界面样式如何、博客的SEO、博客的性能优化、博客的安全性、博客的备份、要不要上https等等。

自从上次偶然看到业内大牛讨论GitHub Pages托管博客的一篇文章,大致是说写博客的几重境界,到了最后,应该是只管自己写,其他的都交给别人去做。此语可谓一语点醒梦中人,让我明白为什么自己在Digital Ocean上搭建了WordPress,反而不热衷于写作了:为外物所累。

Continue reading “为什么我选择将博客迁移到WordPress.com上”