最后更新日期:2020-05-30
我只在 Web 领域有过正式的开发经验,所以以下对编程语言的评价也是以 Web 应用为基准。
我认为每个程序员都应该掌握 3 大类编程语言:
1. 系统 shell
系统 shell 也就是每个操作系统提供的最基本的命令行。很遗憾,这类几乎没有选择余地。
Windows 上主要有 cmd 。现在也有 PowerShell ,其他选择包括 VBScript 。
Linux 从兼容角度看只有 bash 可以用。coreutils 的全套命令也应该掌握,其他辅助命令包括 sed, awk 和 curl 。
如果你觉得 bash 学起来麻烦,推荐用 shellcheck 做静态检查,一些编辑器还有相关插件。
2. 脚本语言
如果只是一些简单的任务,系统提供的 shell 也够用了。但如果需要更复杂的逻辑,就必须使用一门“真正的”编程语言。
这类语言我自己的使用经历大致如下:
Lua → Ruby → NodeJS + TypeScript
选择 Lua 的理由是它简洁小巧,我很喜欢 Lua 的语言设计。
后来转投 Ruby ,因为我当时想写一个 DNS Server ,而 Lua 在网络编程方面没有内置的解决方案,各种第三方库又各自为阵,有些还无法跨平台,所以我选择了语言和社区都更成熟的 Ruby 。
选择 Ruby 的另一个理由是,它对函数式编程的支持比 Python 好(比如 Array 自带 select / map / reduce 三件套)。
后来我在工作中熟悉了 TypeScript 和 NodeJS 。我几乎很自然地就将个人项目也切换到 TypeScript 上来了。相比动态类型语言,其实我个人更喜欢静态类型语言,因为类型可以帮助我更精确地表达我的程序,同时更早发现错误。只是以前一直苦于没有兼具动态类型的方便和静态类型的严谨的编程语言。而今天,我认为 TypeScript 已经做到了。
而在函数式编程方面,用《JavaScript 语言精粹》的说法,JavaScript 就是个套了一层 Java 外衣的 Lisp 。再加上 RamdaJS 这样的神库,我认为 js 的函数式编程生态比 Ruby 更好。
最近我在看各大云厂商的产品,几乎所有云厂商都支持用 nodejs 编写云函数,nodejs 已俨然成为“云原生”编程语言,前景不可限量。
3. 重型语言
如果需要对系统底层资源进行更精细的控制,那么脚本语言也可能不够用了,这时就需要一门“重型”语言。
这类语言我的使用历史如下:
Java → Scala → C++
Java 是大学时接触的,正统、严谨,生态极为成熟,用来做后端完全没问题。
转投 Scala 的理由是,对函数式编程的支持更好,能以更优雅的方式写程序。
最近我又转投 C++ ,因为我发现,我错怪 C++ 了。年轻的时候什么都不懂,看了几篇文章(尤其 Linus Torvalds 炮轰 C++ 那篇),就跟着起哄,以为 C++ 是垃圾语言。不但跟着起哄,到最后连自己都信了。先入为主,放弃了自己的思考和尝试,直接拿别人的结论来用,我认为这对于人生和做决策是很致命的。
现在有了多年编程经验后再看,我认识到 C++ 是一门很不错的系统级编程语言。它对系统底层有着极强的控制力,同时生态很成熟。如果你仔细设计好对象的生命周期,用好 RAII 的话,其实也不是那么难用。C++ 独特的模板元编程可以搞出很多很巧妙的东西。
C++ 20 即将推出对标 Haskell 的类型类(Type Class)的概念(Concept)了,有可能让模板元编程产生质变,我对 C++ 的未来还是很期待的。
其他备选语言:
- Rust: 关注中,等社区更成熟后可能会尝试
- C# 和 F#: 我看好微软开源的 .net core 在桌面编程方面的优势,未来如果有这类场景可能会尝试
其实说回来,目前为止对我的编程思想影响最大的语言是 Scala 。至今我在设计自己的库时,仍然会参照 List, Future, Iterator 等 Scala 核心类的设计,map / flatMap 永远是那么经典,几个简单的函数组合起来就可以“让常用的功能变得方便,让不常用的功能变得可能”。Scala 的 parser-combinator 第一次让我体会到函数式 + 运算符重载能做出如此优雅的 API ,如果让我自己想的话可能一辈子也想不到这种思路。更不用说 Scala 整个语言处处透露出“严格设计类型系统,从而让用户不可能写出错误的程序”的思想。这种思想指明了 API ,或者说用户界面(User Interface)设计的方向:我称之为“无说明书”设计。
设计这个话题太大,就放到下次再聊吧。
P.S. 后续更新:用户界面设计的原则