为什么想说这个呢?有几个原因:

  1. 前几天在知乎上面看到一个提问说自己要工作了,想学习一门编程语言,是学习Java好还是Python好呢?
  2. 经常看到各种机构统计的yyyy年mm月的编程语言变化榜单,我也老想点进去看看自己喜欢的语言排名如何?
  3. 编程语言对于我们技术人是基本功。不过话说现在编程已经全民化了,小学生已经开始学了,或许以后就不光是我们技术人的基本技能了。
  4. 当然最后一个就是想表述一下我自己对编程语言的看法。

先立个flag:之前几篇文章比较长,今天这篇必须简短。

我认为必须掌握的语言

前端工程师必须擅长JavaScript、CSS、HTML(5)。我不是前端,JS、CSS、HTML都懂点皮毛,能照猫画虎,但没有系统学习过,不班门弄斧了,但我知道这三者是前端的基石,不论是哪种前端框架,底层核心也就是这些东西。

嵌入式工程师必须擅长C。嵌入式属于比较偏底层的技术了,而且因为嵌入式设备资源有限(其实严格说手机也算嵌入式设备,但现在高端手机比中低端笔记本配置都高...),所以非常适合C这种性能高,依赖少的语言。没做过底层的朋友可能还不知道C程序其实是可以不依赖操作系统直接在硬件上面运行的(当然前提是你没有使用特定OS的一些系统调用),系统启动时BootLoader直接加载运行即可。比如我之前做嵌入式时使用的一个网络协议栈LWIP就是可以直接在硬件上面使用的。这是很多其它语言做不到的(不要提汇编...)。

大数据工程师必须擅长Java。这个就不多解释了,看看Apache下面的大数据软件,以及一些闭源的大数据软件,绝大多数都是Java写的。当然很多对Scala支持的也比较好,但还是Java更通用些。

(容器)云计算工程师必须擅长Go。这个当然有些武断,其实云计算更多的属于IaaS、PaaS,比较偏底层,都是和操作系统、网络等打交道的,所以一些早期偏底层云计算产品其实使用的是C、C++之类的(其实还有一些比较偏的语言,比如Erlang)语言写的,OpenStack算是比较知名的IaaS层软件了,虽然其主要语言是Python,但涉及底层的都是用C写的,然后Python直接调用C库(可自行Google)。所以这里说的云计算要学Go主要是针对这几年异军突起的CaaS、FaaS、BaaS、Serverless等,一方面是这些XaaS都是容器生态的,而容器是Go写的;另一方面Go不论是从性能还是易用性等方面都比较适合这些技术平台的开发。

AI工程师必须擅长Python/R。这个对机器学习、深度学习、NLP等AI领域知识有了解的应该都知道,Python应该是目前支持最好的语言了。我刚开始学习ML的时候还尝试用Go,结果当然是行不通,后来才又学习了Python,配套生态是真的好,Numpy、Pandas、Scipy、Matlotlib、scikit-learn、Keras、TensorFlow等等,而且很多还可以和Spark(pyspark)的MLlib配合使用,不论是构建模型,还是可视化,真的是非常方便。

区块链工程师必须擅长Go。前面的几个后端方向都是工作中真正用过,但区块链这个的确是没有实战过,只是个人兴趣了解过一些开源的平台,比如以太坊之类的。而且也看过、面过一些招聘区块链工程师的公司,语言方面的要求基本都是Go。区块链和云计算类似,都算是技术平台,所以理所当然Go也非常合适。

另外,所有后端工程师都应该会熟练的写Shell,不解释。

怎么学

上面说了这么多,好多语言都没列(比如我不会的宇宙最**的语言PHP...),因为编程语言太多了,根本是列不完的。而且对于编程语言我的观点和之前对于英语的观点一样,都属于工具,不用单纯去学习工具。需要什么学什么,什么时候需要什么时候学。但为了能让你在需要的时候学习快一点,我个人觉得一个合格的程序员(不论前端后端)应该至少熟练掌握三类语言:

  • 1门偏底层的语言,最佳人选就是C语言,
  • 1门高级点的面向对象的语言,Java/C++(更推荐Java)就是一个不错的选择。
  • 1门脚本语言,简单点的就是Shell,复杂点的就是Python或其它的。

学习底层语言说白了其实是为了学习内存管理、信号处理、网络协议、网络通信、各种锁、线程/进程间通信、进程调度、中断等操作系统的知识,这些是最最经典的东西,任何语言底层其实都是这些,但这些东西往往只有在底层语言里面你才可以看得比较清楚,学的比较透彻。这里又要忍不住推荐《UNIX环境高级编程》这本书了,基本上这些东西在这本书里面都有。

学习一门面向对象的语言其实是为了更容易的找对象。不不不,说错了,是为了学习面向对象的思考方式、编程模式。其实最核心的就是学习封装、继承、多态、接口、泛型编程这些东西。

学习一门脚本语言我觉得主要是可以提高平时的工作效率,比如后端编程经常需要登录、管理多个服务器,除了借助Xshell(Windows)、Termius(Mac)这些工具外,直接写个shell脚本通过不同参数控制也是非常方便的。而且其实像Shell、Python这些脚本语言在生产中用的也是挺多的。

所以,虽然语言学不完,但其背后的东西很多都是相似的,只要一门语言学好了,学到精髓了,同类型的语言就是手到擒来,所以我建议上面的三类语言中每类都至少深入学习一门。另外,还要提一门语言,那就是SQL,说实话虽然我做过两年的数据库内核开发,但SQL掌握的还真不是很好,我觉得勉强算个中级水平吧。但我越来越发现这个语言的性价比极高,传统的数据分析其实觉大多数都是SQL做的,而现在的大数据处理、分析软件(比如Spark SQL、Hive SQL、Impala、Kylin、Phoenix等)很多也都支持SQL(虽然不完全兼容标准SQL,但也支持的非常好了),即使你不会写MapReduce、不会写Spark程序,不会写Flink程序,那会写SQL在一些情况下也是OK的。所以建议大家(我自己...)也可以好好学习下这门语言,绝对物超所值。

接下来几篇文章我准备发一下我之前写的几篇Go语言的教程,主要我觉得这门语言真的非常棒,既有C语言般的性能,又比较简单,特别是开发Web后端程序、多并发程序。即使不专门学习,也可以当小说一样简单了解下一些概念,说不定以后就会用到了。毕竟这东西现在很火,我们技术人要对新技术敏感,不然一不小心就被淘汰了。

OK,这篇文章就到这里,没有很长...吧(啪..啪..啪)。