00.写作背景
社区里有女粉提问,如果不考虑失业,最推荐学哪几门编程语言?(PS:要求可以提升思维逻辑,有趣又好玩等等)
确实,地球人都知道,有时候 选择大于努力。如果你认为 PHP 是地球上最好的语言,而忽略了 JS 是地表人气最高的语言,那很难给编程以复利。文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
就我个人而言,高效掌握多种编程语言的思维模型,取决于如何分类才能效果拔群,而这可以诉诸“金字塔原理”。金字塔原理有两大特点:文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
- 独立互斥:编程语言的思维模型最好没有交集
- 完全穷尽:编程语言的编程范式最好全部覆盖
所以,本期我会提供若干编程语言的选择套路,仅供粉丝参考!(因为我只会 JS!)文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
01. 类型系统
一种学习路径是从类型系统维度来分析。首先,有/无类型系统,现代化高阶语言一般自带类型系统,所以这里我们不讨论无类型语言(untyped)和单类型语言(single-typed)。文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
现代语言的类型系统包括但不限于:文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
- 动态 vs 静态
- 强类型 vs 弱类型
其中动/静态类型相对清晰,强/弱类型则存在争议,这取决于你如何定义和理解强/弱类型。文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
举个栗子,TS 的官网如是说:“TypeScript is a strongly typed programming language.”(TS 是一种强类型编程语言。)但是我不同意,所以我会把 TS 归类为静态弱类型语言。文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
那如何从类型系统维度来找到性价比较高的编程语言呢?这需要使用集合或矩阵分析。文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
举个栗子,假设我们已经掌握了 JS,那下一门语言应该选 Haskell 还是 TS 呢?文章源自灵鲨社区-https://www.0s52.com/bcjc/javascriptjc/17268.html
可以看到,绿色集合覆盖了四大象限,而红色集合只覆盖了下半区。所以,对于 JS 爱好者而言,我会优先推荐 Haskell,不是 TS 学不起,而是 Haskell 更有性价比。当然,别忘了女粉的前提是:不考虑失业!
虽然从动/静态类型维度,JS 和 TS 独立互斥,学完 TS 之后我们可以掌握动/静态类型 + 弱类型,但我们还是缺乏强类型语言的思维模型。反之,如果我们选择 Haskell,我们掌握的是动/静态类型 + 强/弱类型,完全穷尽了当前类型系统维度的所有技能树。
因此,虽然投入成本都是学习了两门语言,但回报的复利是不等价的,这就是所谓的“选择大于努力”。
02. 编程语言排行榜
国外某些网站专门基于编程语言的人气和热度排行,所以我们可以参考编程语言排行榜。这是因为,人气爆棚的语言一般意味着:
- 元气满满的社区
- 丰富的生态系统
- 年薪百万的薪资
- 成熟的工业标准
举个栗子,地球人都知道,GitHub 是世界上最大的编程社区,所以我们可以参考 GitHub 最新的编程语言趋势。
可以看到,大数据告诉我,JS 目前是地球上人气最高的语言。当然了,人气跑分只是一个可供参考的风向标!粉丝请注意,统计学思维里至关重要的一个结论:相关性并不等于因果关系。
我们的目标始终是,只要选择的语言能够独立互斥、完全穷尽类型系统即可。
如图,只要最终选择出来的语言交集能够覆盖四大象限即可,至于这两种语言则并无强制要求,所以我们的选择是自由的。
03. 设计与实现
除了类型系统,还可以从其他维度来分类:
- 编译 vs 解释
- 内存管理机制
这里的控制变量改了,但分析方法大同小异,根据不同的维度去分类,画出一维或二维矩阵,但有时需要注意的是某些敏感的中间地带。
举个栗子,编译语言中可能还有 JIT(即时编译)的脚本语言,内存管理机制中可能有“半自动内存管理”的语言。
可以看到,JS 和 Rust 的位置比较特殊,这是因为 JS 介于解释型和编译型之间,Rust 则属于半自动内存管理。
04. 编程范式
编程范式(programming paradigm)又名编程范型,比如 OOP(面向对象编程)就是一种人气爆棚的编程范式。
现代化高阶语言大都为“混合范式语言”(multi-paradigm),即支持多种编程范式,人气最高的 JS 就是其中之一。因此,在基于编程范式分类时,建议优先考虑“独立互斥”,因为混合范式意味着更容易实现“完全穷尽”。
举个栗子,虽然我只会 JS,但 JS 本身就涉及了面向对象编程和函数式编程等编程范式。
可以发现,虽然语言和编程范式是一种一对多的关系,但 JS 也无法完全穷尽所有编程范式,比如逻辑编程。
无独有偶,Python、Go 和 Rust 等,包括起初不支持函数式编程的 C艹 和 Java 等语言,也都不约而同地拥抱混合范式,这也是编程语言进化论的一种历史趋势。其次,如果你只想深入某种编程范式学习,那选择特定的编程语言可能效果更好。
此外,同种编程范式可能有不同的实现方式。举个栗子,OOP 全称“面向对象程序设计”,OOP 的集大成者是设计模式,但 OOP 的实现方式相去甚远,包括但不限于:
- 是否支持多类继承
- 是否支持接口
- 是否支持原型
- 是否支持元类
但无论实现机制如何,原则上我们认为,能够支持 OOP 三大特性或 OOP 本质的编程语言都是“OOP 完备”的。比如 JS 的原型不同于经典面向对象语言的类式系统,Java 的单继承不同于 C艹 的多继承。但我们认为,它们都是“OOP 完备语言”,即它们都是面向对象语言。
讨论编程范式时,我们会注重理论思想,放松编码实践的技术细节。虽然但是,对于异步并发编程,我们不需要关注单线程还是多线程;但对于并行编程,我们就需要严格区分。
不幸的是,我目前尚未掌握“完全穷尽”所有编程范式的最佳学习路径!这里我想共享一张经典的编程范式技能树,仅供粉丝参考。
如图,我想现在你也可以理解,为什么我还没找到“完全穷尽”所有编程范式的最佳学习路径了吧......因为我学不动了!
05. 高潮总结
如果你想挑选编程语言提升思维,可以试试“金字塔原理”和画图分析,比如文氏图(集合)或矩阵分析。在多种编程语言中,优先选择支持混合范式的语言,然后根据不同语言的特点进行组合和对比学习,就能尽可能掌握不同语言的心智模型。
我只会 JS,这可以是 深度优先;我还会其他语言,这就是 广度优先,这两种学习方式某种程度上可以互补。
评论