今天在 Emacs China 看到有人问 “OOP 还是 FP 更好” 的问题.
想了想, 做了如下回答
编程语言不管怎么变, 能力也好还是哲学概念也好, 编程语言的本质是, 建立代码和现实问题模型的桥梁, 如果编程语言本身的哲学理念和库能够极大简化解决现实问题的复杂度, 这门编程语言就是好的, 适合某一领域.
比如写硬件驱动, C 是保持性能又足够抽象的语言, 面对驱动编写简单直接又可靠, 函数式编程你再怎么吹牛, 你绕一个大圈圈还不是写底层状态, 那又何必绕圈圈呢?
Web 编程大多数都喜欢动态脚本语言, 现在浏览器这个 runtime 优化足够好以后, JavaScript 怎么动态性能也不差, 你看 NodeJS 比 Python/Ruby 的性能还好, 所以 JS 做 Web 编程就是爽, 语法不严谨是不严谨, 但是简单, 门槛低啊, 看着葫芦画瓢画多了, 自己也成为高手了.
大家都嫌 Lisp 括号多, 但是你看 Elisp 写编辑器插件多么得心应手? 状态/表达式和编辑器处理语法树严格对应, 你甚至都可以按照语法树解析的步骤, 一个一个 monkey patch 的边调试边写, 等所有状态写完了, 插件也就做好了.
那些 OOP 语言再怎么吹工业级别的软件质量, 但是一旦还要写编译器的时候, 函数式的威力就出来了, 极大的简化了编译器的各种状态和解析器的构建, 你看当年唐凤单刀用 Haskell 写了 Perl6 编译器, 就知道函数式语言的威力在什么地方了.
等你学了几十门编程语言以后, 拿七八样编程语言在各种现实场景干活解决问题以后, 你就会知道, 编程语言不过就是工具, 没有最好的编程语言和最好的编程理念能够解决所有场景的问题, 也不要天真的认为一门编程语言通吃天下, 编程语言本身是工具, 哪门编程语言解决现实问题越快, 代码越容易维护, 就去使哪门编程语言, 重要的不是编程语言, 而是锻炼自己理解现实需求和抽象代码的能力, 这才是最优的方式.
为什么大家会问这种问题? 因为很多时候, 大家觉得好的东西, 并不一定是真的好, 而是这些人太会写, 加上你自己读书少没文化的时候, 就会被他们洗脑, Haskell 的函数式编程思维(无锁, 副作用控制, monad 等), DHH 的约定即框架, Linus 的 C++就是垃圾语言, Golang 和 Rust 各领风骚的宣传, React/Angular/Vue.js 一个 Virtual DOM 就能忽悠很多人.
不是说这些技术和宣传不好, 关键是要保持头脑清醒, 多读书, 多锻炼, 自己的能力和独立思想才是关键.
很多我们今天在热烈争论的东西, 就是因为这帮有理工技术宅们除了有技术外, 内心还是一个闷骚的文艺青年, 技术牛逼再加上会写文章会作图, 就能轻易俘惑祖国未来的花朵. 比如:
- Haskell SPJ 就会写, 论文一篇一篇的, 数学符号吓死一堆人 (本质上就是函数别名, 但是一个你没看过的数学符号多拉风啊? )
- Rails 的 DHH 就会写, 把懒和工程最优写成人生赢家也就只有他了.
- Emacs 的 RMS 会不会写? 除了构建一堆牛逼的 GNU 工具外, 直接整了一个专门到处撕逼的 FSF 机构, 影响法律, 牛不牛?
反而像 John Carmack 这种 Real programmer 除了游戏让你膜拜外, 现在很少人知道他的厉害.
所以, 如果哪天你学有所成, 做了牛逼的技术和产品, 我建议你也去写点文章, 忽悠忽悠小白们, 哈哈哈哈