नमस्ते

今年,让我们一起学 12 门编程语言吧

最近尝试学习 Haskell 的时候发现一个在线评测系统(online judge),不同于算法竞赛用的 OJ,exercism 没有任务点、明确的运行时间和内存限制以及严格的输入输出要求。相反,你可以直接看到用于测试你的程序使用的代码,这包括了输入输出的规则以及真正用来测试代码的测试点。

更有趣的是,在把所有的测试点过掉之后,exercism 提示你可以邀请一位 mentor 来看看你的代码、指出可以改进的地方。我尝试性地使用了一下这个功能,然后跟一个大哥讨论一个小问题讨论了一下午。

打开 exercism 的网站,能看到他们在九月开始了一个叫 #12in23 的活动,大意是建议用户在 2023 年通过 exercism 学习 12 门编程语言。然后给出了他们支持的语言列表,我算了一下,如果每年都学 12 门,应该够学八九年的。

我开始学习 Haskell 的一大原因也是刚刚完成一个阶段性的任务,一时间对类似的事情感到疲倦,打算休息一段时间。但是每天就这么玩游戏确实还是有点无聊,就想还是开发一点软件吧,不然,要不要学个新语言?

至于为什么是 Haskell,这就要提到假期在研究编译原理的时候我遇到了一个叫“表达式问题”的难题,这个问题有趣的点是它在支持面向对象范式编程和支持函数式编程的语言中都存在,并且表现的方式正好相反。我看了很多相关的资料,发现它们中关于函数式编程的段落我基本上都看不懂。这直接引起了我的好奇心,想学一门纯粹的函数式语言。

很多年前的一个下午,我突然从午睡中惊醒,我初次接触编程学习的语言是 C,可是 Unity 中使用的脚本语言是 C#,一个人能同时学习两种语言吗?我跑去电脑前开始紧张地翻阅百度,然后在一篇不知道还能不能找得到的百度知道上得到了令我信以为真的答案:最好是只学一门。不过当时到底还是没把 Unity 研究明白,最后 C# 也没学会。至于后面因为好奇心而学习的 Python,则纯粹的是抱着一种破罐子破摔的态度:反正那么多语言也没学会,不差这一个。

至于后来开始打信息奥赛的时候,我才把这个观点更新为:可以学习多门编程语言,不过最好从 C 语言开始,因为这会让你学习其他语言更简单。后来随着学会的知识越来越多,我对这一点的认识也变成了:学习 C 语言确实会让你学习其他语言更轻松,并且反过来也仍旧成立。

以 Haskell 为代表的很多语言宣称自己是“纯的”函数式编程语言。在很多这么宣称自己的语言里,赋值这个操作通常是不被允许的(至少是不被鼓励的)。如果一个名字绑定上了一个值,那之后的任何时候这个名字代表的值都是不变的,这让写出“纯的”函数更加轻松。换句话说,函数式编程里的变量是不可变的。

变量不可变。这听起来就充满矛盾,并且让编程过程变得更加困难。事实上,如果说指令式编程是在学习如何教会机器做事情,函数式编程就是在学习如何对数据进行变换。以这种全新的方式思考,就好像在重新学习如何编程,重新学习如何把逻辑过程变成计算机能够理解的指令。

之前看《计算机程序的构造与解释》的时候看到一句话:“如果谷歌的程序员没有研究过函数式编程,那么他们就不可能写出 MapReduce 这一解决并行问题的框架。”如果说学习一门编程语言能够让我学习其他编程语言变得更轻松的话,那么一定是因为它们共享一些相同的设计思想,而我熟悉这些思想,所以我会感到那些陌生的语言亲切。那么我感到学习 Haskell 非常困难的原因也非常显而易见了——其中设计的设计思想我完全没有接触过,而学习编程语言就是在学习其中的设计思想。

看起来我的编程背景并没有让我学习新的编程语言更轻松。那么到底要学多少编程语言呢?我现在的回答会是,你可以从你喜欢的任何一个编程语言开始,逐步体会它的编程思想,然后通过学习更多其他的语言感受其他的编程思想,直到你觉得足够了就好。

不过,抛开所有的这些不谈,学新东西总是很快乐的。所以,让我们一起学 12 门编程语言吧。

今年,让我们一起学 12 门编程语言吧

https://blog.rasp505.top/index.php/archives/12/

作者

Rasp

发布时间

2023-10-20

添加新评论