这两年接触了不少语言, 感触最深的是每个语言都有它独特的运用场景。
而且未来的开发趋势不是只是用一种语言, 而是基于多语言的开发,这样可以充分利用每个语言的特性开发不同的任务。
接下来, 我想谈谈我使用过的语言和我对这些语言的看法。
最先接触的一门语言是C。 那是在进入大学之后,大一上学期就会教的一门语言。 C 语言学起来一点都不简单。 C 语言最难的一部分就是对指针的理解, 我想说这是C语言的精华之一。 因为要充分理解指针,我们就得理解计算机系统的内存结构, 如 栈 和 堆, 所以学习指针, 我们必须得更深入的了解计算机系统。 而且指针也是数据结构的基础, 数据结构中的链表和树都是基于指针来实现的。 C语言的特点是高性能 和 可移植性高, 所以C语言通常是系统开发的首选语言, 如 redis, nginx, lua。 但是C语言的缺点是需要手动分配和回收内存, 并且对复杂数据类型的封装比较少, 如 C语言中没有string类型, 所以基于C语言的开发效率会比较低。
既然学过了C, C++当然是少不了了。 C++ 是在大二学的, 当时觉得C++是个非常难的一门语言, 可能当时是第一次接触面向对象, 很多概念都不理解。对C++最大的印象就是 STL 库, 封装了很多复杂的数据类型和算法, 可以快速提升开发效率。
紧接着, 在大二也开始学习java了,java也是我后面工作的主要语言。 java最大的特点就是面向对象。 所以对一些大型的复杂项目, 面向对象可以对业务完成很好的封装。 如果要说面向对象最好用的一个特性, 我会选择多态。 多态在业务开发中占据了重要的角色, 并且可以提供非常好的扩展性。 面向对象最难用的特性, 我会选择继承,因为如果一个父类被很多子类继承, 修改父类的代码可能会牵一发而动全身。
Python 是最近两年才开始学习的语言, 不得不说我真的很落伍,这么火的语言, 我居然学习的那么晚,得自我反省一下了。 我用Python的初衷是刷算法题。 以前我是用java刷, 但是发现java刷题太费劲了。 用了python刷题以后,我发现刷题的速度快了一半。 所以选择正确的语言干正确的事情是多么重要啊。 后面去公司实习, 主要是负责devops, 都是用python写一些自动化的脚本。 也用python 开发过一些自然语言, machine learning 和 deep learning 的 项目。 python 的学习给我打开了一个语言的新世界, 后续我就不断的学习一些新的语言去解决不同的问题。 python我最欣赏的一个特性就是让高级数据类型符号化(当然这也是脚本语言的标志之一)。 其次就是python提供了很多语法糖,很多复杂的代码一行就可以搞定。 另外python也支持函数式编程,一行代码不是梦。总之, python是一门特别好的语言, 可以用它做web, 如有flask 和 Django 两大web 框架, 也可以做devops去写自动化的脚本, 当然现在最火的一个方向就是数据分析和人工智能,python 有很多优秀的库。
Javascript 是最近学习的一门语言。 上了一门web system的课, 主要是学习前端开发。 随着web的爆炸式增长, javascript 已经成为了一门不可替代的语言。 javascript最值得学习的特性就是异步编程, javascript就是为异步而生的语言, web的交互性注定了javascript要通过异步来提升性能。 javascript 的另外一个特点就是面向原型(prototype),理解javascript就必须得好好的理解原型。javascript 需要掌握的一个数据类型就是 obeject, 这也是javascript的核心之一。 另外就是得理解javascript的闭包 以及函数的context, 这些不理解的话, 开发会踩很多坑。
接下来我想聊一下linux底下的小众语言 sed 和 awk。 这两门语言在处理字符串方面是非常强大的, 如果涉及到字符串的自动化工作, sed 和 awk 是很好的选择。 sed 可以实现字符串增删改查的自动化, 并且支持强大的正则表达式 , 通常会和 awk, grep一起使用, 可以实现oneline 编程。 awk 也是处理字符串, 但是偏向于 csv格式的数据, 可以进行数据的提取,统计, 聚类等操作。 在实现期间, 我曾经用这两门语言 很简单的完成了一些自动化的脚本, 通常一行代码可以完成很复杂的功能。 所以如果做一些devops的工作, 需要好好的去学习者两门语言。
讲了sed 和 awk, 当然要讲perl。 perl我基本没用过。 但是 perl 在处理字符串方面是最最最强大的。 sed, awk支持的功能, perl 统统支持。 并且sed, awk,grep 的正则表达式语法有些不兼容, 但是直接使用perl就没有这个问题了,并且perl的正则表达式是所有语言中最强大的, perl的正则表达式语法也是语言界的标准。 所以如果要涉及文本自动化工作,perl是个不二选择, 当然perl的学习需要费点心思, 因为perl会用到很多反人类的字符@_$_!@$#
接下来, 我要讲一下我非常喜欢的一门语言, 那就是 ruby。 ruby是一门纯粹的面向对象的语言, 但是我更喜欢ruby的函数式编程。因为用ruby去刷算法题, 很多情况下一行就可以搞定。 当然ruby也是因为ruby on rails 这个web 框架而开始流行的,有不少著名的项目是基于ruby开发的, 如github 。 在web开发方向, ruby 也是一个不错的选择。
现在,我要谈到一门上古语言了, lisp 要登场了。我是在学习人工智能课程中了解了listp。 lisp 是一门纯粹的函数式编程语言,如果要学习函数式编程 和理解函数式思想, 一定要学习一下lisp。 在lisp, 一切皆函数。 当然lisp中无数的括号(), 可能会把人折磨疯了, 并且要写一个嵌套的for 循环, 在lisp也不是那么简单啦。 Lisp是一门学术性语言, 偏向于人工智能, 如果要说现在lisp 现在的用途, 可能就是编写emac的插件了。
除了Lisp, 我还学习了另外一门非常有意思的语言,prolog。 prolog这个语言算是领域专用语言了, 可以用于逻辑推理。 也就是prolog可以定义一个推理规则, 可以基于规则, 进行事实的推理。
语言有面向对象, 有函数式, 有面向过程,有混合式, 也有领域专用, 没有一个语言可以解决所有问题。 所以开发的趋势是多语言的开发,在架构设计,系统维护和业务建模, 要充分的利用不同语言的特性。 语言是工具, 开发效率才是王道。 所以我个人永远不会在乎语言排行榜, 也不会去争论, 只要好用就好。