易飞滔Todd | 次生进化

如何学习一名新的编程语言

前几天为了学习吴恩达deeplearning.ai的课程,在coursera平台上进行了信仰充值,59美金包了一个月,坑人的是,吴恩达的课程只除了3/5,为了不浪费我的钱,我想再找个有认证的课刷一下,于是找到了据称比较难的programming-languages课程。

programming-languages这门课用到了ML、Racket、Ruby等三种语言,从语言的选择就可见不走寻常路了,我初步了解了一下,应该是一门偏向函数式编程的介绍编程语言范式的课程。用这个老师Dan Grossman的话说,这是像练武术的人搞一些挑水扫地蹲马步的活动。恰好函数式编程我也不是太熟,不妨一刷。第一次作业一次性拿了满分,看来我还是有写函数式编程代码的天赋么?

类似的试图一次性学习所有编程语言的还有之前见过的一本书《代码之髓》,日本人写的,大概翻过一下,把编程语言中一些主要的概念拿出来对比着讲。愤怒的大牛王垠也写过一篇如何掌握所有的程序语言,值得一读。

Dan Grossman也总结了语言学习中的五个要素:

  1. 语法,代码怎么写的,这部分肯定是要学会的,但也没什么难度,没什么意思;
  2. 语义,这些语法代表什么含义,代码是怎么运行的,理解到这部分,代码才能在脑子里跑起来;
  3. 惯用法,如何使用语言特性表达计算,很多语言都有cook book,比如C#,你不用Linq而老是用for循环,那是很暴殄天物的;
  4. 库,一般来说,只是学“语言”跟库关系不大,但是要做实际项目,库可能就很重要了;
  5. 工具,每种语言可能都有一系列的衍生工具,帮助你更好的完成工程。

这其中第1项是基础,2、3两项,是理解一门语言的关键与难点,而4、5两项,则是衍生品。

我的目标也是掌握所有的程序语言,如果借这次机会学透了函数式语言,我觉得问题不大,因为所有的语言几乎都是C和Lisp之间的光谱分布。核心语法一般1~2天能学会,而语义、惯用法或者说语言特性无非就是一些核心概念里面打转,而库和工具可以在使用中熟悉。