当我们说把一门编程语言「学会」的时候,我们到底在讨论什么?
我最近在某宝上找到了很便宜的 Mathematica 授权。当然,店铺名称和授权的来路我就不便在此透露了,我只能告诉大家有这么回事。我本人虽然并不是搞数学的,但是我对于 Mathematica 背后的设计思路很感兴趣。尤其是我很在意它强大的符号计算功能:它可以把一切「表达式」都当成「符号」并加以操作,这似乎是不止于「可以将数据和程序等价」的高阶能力。如果你曾学习过 LISP 的某种实现,可能会对这种魔法有所耳闻。
于是我买了一份授权。
在大学的时候,我从图书馆里借过两本书:APL 编程语言和Haskell 趣学指南。这两本书我虽然草草翻过,但是我并没有学会 APL, 也不是很懂 Haskell. 这两种语言所能够表述的结构和我们所熟悉的过程式的语言几乎完全不同。当时我或许可以跟着书上的例子敲敲打打,每个语言的关键字我也记了不少,但是我完全不可能站出来说「我会用 Haskell」或者「我会用 Dyalog APL」。
我想,更为生动的例子是这样的:如果只是学会了一门语言的语法,背上了几千个单词,就可以说自己「学会」了这门外语么?在座的各位有多少人有自信说自己真的学会了英语?即使大多数人从事于信息技术领域——一个几乎所有知识都必须以英语为载体的领域?
借用柯里-霍华德同构的思想,即数学证明和程序之间是完全等价的,我们未尝不可以认为:编程的学习就是一个数学分支的学习。当我们讨论「学会编程」的时候,其实也就是在讨论「学会数学」。正如同「学会数学」不仅仅是「知道数学符号的意义」和「怎么把这些符号画到纸上」,而更多的是「通过这些数学符号的适当组合给出严谨的证明」一样,学会编程不仅仅意味着知道每个关键词的含义并把它输入到计算机里,而更多的是关于如何通过编程语言去解决编程问题。「编程思想」的培养就是一种「数学思想」的培养。
把编程看作数学证明这个类比实在是过于好用了,它甚至能回答为什么有些程序就是写不出来:因为数学不会就是不会;或者因为这么做会产生悖论,所以在这个体系下不能这么做。
不同的编程语言、不同的编程思想,不妨看作不同的数学工具、不同的数学领域。如果你是范畴论大佬,那么你或许会认为所有的数学都是大差不差的;如果你是编程大佬,那么你或许也会认为所有的编程语言也都是大差不差的——当然,有些数学工具在解决一些领域的问题时更为好用;有些编程语言在实现一些特定的功能时更为好用。
所以,究竟怎样才算「学会编程」?学会语法够了么?力扣刷题一千问够了么?独自设计并实现一个完整的程序够了么?或许针对不同的场景,学会语法、刷够题、可以设计程序,就已经可以认为是学会了编程。但是对于我个人而言,对编程的学习更像是对一门数学分支的学习——而学海无涯。
Your comments will be submitted to a human moderator and will only be shown publicly after approval. The moderator reserves the full right to not approve any comment without reason. Please be civil.