编程语言是一个已经被谈到耳朵发烫的话题,很多工程师都聊过。似乎无论怎么写,要么落入老生常谈的俗套,要么就是一堆理论上正确,但是对学习和理解编程语言并无多大益处的内容。
我跟池老师说:这篇可说的内容太多,反而不知道从何说起。池老师建议我:“任思维流动,想到哪写到哪。比如你可以点评一下自己最擅长的语言特性,比如新人学编程如何做到触类旁通,最后一通百通。”回想一下,这两个思路我似乎都用过了,以前写过点评 Ruby 和 Java 的文章,也写过自己的编程之路,今天说点平时不说的内容,可能不讨喜,但至少可以提供一些思考。
我在莱斯大学读硕士期间,课题就是程序语言和编译器设计。翻看当时用到的教科书和论文,需要我学习和掌握的内容大概都是这样的:
命令式程序语言、函数式程序语言、逻辑式程序语言、以及面向对象程序语言的本质区别
所以,很多人刚开始接触编程语言,第一反应是怎么用、好不好用。而我看到一门语言,第一反应是这门语言是怎么实现的,类型系统是什么,计算能力的边界在哪等等。最早接触的几种语言,比如 C、OCaml、Schema、Python、Java 等,都被我拿着“手术刀”解剖过。那个时候,我想到最多的成语是庖丁解牛和洞若观火。
我的硕士毕业设计是用 OCaml 去实现一个机器人仿真和控制的语言,有点像 Matlab 里的机械模拟库。研究的目的,说白了就是不断用 0/1 这样的离散数学和语言,去逼近物理世界中很常见的连续函数(如导数和积分),而挑战的就是有限的计算资源和时间。
后来到了博士阶段,课题变成了生物信息学,那个时候常常要做的是生物学中的大数据处理和建模。由于业界很多数据科学相关的库都是 Python 实现的,于是我使用到了大量的 Python 编程。
不过在处理海量数据的时候,Python 的性能就成为一个很大的瓶颈。经常遇到的情况是,一个脚本或者一个函数库,其复杂度在一个临界点后是指数增长的,稍微大一点的数据量,动不动就要跑几天,或者干脆跑不出来。
于是我又开始学习并使用一种叫做 Cython 的语言。这种语言在语法方面算是 Python 和 C 的混合体,其编译器可以将 Cython 代码转化为 C 并编译成性能很好的可执行代码。那时候除了建模需要的数据清洗和数据模型的训练,另一个挑战就是写出高性能的代码。
博士毕业后,我没有选择留在学术界,而是进入了互联网公司工作。
Square 和 Airbnb 都是以 Ruby 和 Java 为主要编程语言的公司。这个时候,语言上面临的挑战已经不再是其计算能力或者性能,而是如何在工程中用适当的语言搭建出一个方便协作、性能过得去、可读性好、模块化好、可重用、易扩展的代码库。
很多时候工程师们争论的问题,不再是对和错、是与否的问题,而是每个人的观点应用到相关的场景中的时候带来的优劣比较。也就是说,是不是把合适的技术用到了正确的场景中。平衡是我们在这个阶段要着重考虑的,这种平衡有时候是时间复杂度,有时候是空间复杂度。
最近几年我主要使用 Ruby 和 Java 编程,这两门语言的优缺点就不在这里说了,网上有很多类似的观点。关于 Java,后面我会写一篇“Java 开发的中常见问题”,下面我会来简单聊聊自己对软件工程和编程语言的一些看法,有的是点评别人的观点,有的是我自己的观点,分享给你,希望可以给你带来一些启发。
1 初学者不要纠结“先学哪种语言”,这种时间花的很不值得,还不如随便挑一个语言,跳进去游几圈试试。对于工程师来说,学习第一门编程语言只是万里长征的第一步,只要你还在这个领域,就不可能只学一种语言,只会一种语言的工程师根本就不能称之为工程师。