我们是程序员,但我们不必只是某一门语言的程序员。
编程语言
今天跟大家聊聊编程语言这个东西,“第二”只是个泛指,想必多数开发者也都掌握了不止一门编程语言。
我真正开始编程是在大四实习的时候,开发主要用的是Java,Web方向。但那会公司比较小,既要学着写后端又要学着写前端,所以JavaScript用的也算熟悉。但在那会的我看来,这两者并没有太大差别。也没有太多关于面向对象、函数式这些编程范式的概念。后来我开始做Android,对Java和面向对象编程的理解日益加深。
后来我接触到了爬虫,从正则表达式到jsoup,再后来我开始用Python来写。对于Python,用的越久,我对它越是喜欢。Python的代码总是看起来很像伪代码,可以用很少的代码实现我们想要的东西,爬虫、数据分析、网站、脚本,都可以用Python轻易实现。
随着学习的深入,我开始思考我学过的编程语言们。它们有的大开大合,有的简洁明快,有的深沉厚重。它们有解释型和编译型之分,也有无类型、强类型、弱类型、动态类型和静态类型的区分。编程范式也各有不同,命令式、函数式、面向对象等等。但它们也有相同的部分。所以,用合适的编程语言去做它适合的事情。
我的小确幸
我庆幸自己遇到我熟悉的那些编程语言们,他们带给了我很多。
先说我的老朋友,Java。Java是我最先用熟的编程语言,也因为对Android的喜欢,Java是我使用时间最长的编程语言。我更多的是用它来写一些好玩的App,好玩的动画效果,当然也靠它吃饭。
然后是JavaScript,靠着它我做了一些小东西,比如我的主页,我的blog,我的瞎编名人名言motto。靠着它我做了一些工作之外的,我喜欢的东西。
最后说说Python。用Python写的最多的是爬虫,比如我比较喜欢看小说,我用Python爬了N多本某网站的5星小说。在工作中也有一些特殊的场景需要用到爬虫的小知识,如果想偷懒的话。我维护blog的脚本也是用Python写的。偶尔我也会用Python做一些简单的数据处理和分析。Python在工作上和工作之外都帮了我很多。
和编程语言做朋友
我不是某种语言的死忠粉,比如不会高呼“PHP是世界上最好的语言”,对我有用的我都可以去学。学的编程语言越多,越能快速的学会其他任意一门新的编程语言。
之前同事推荐过一本书叫《代码之髓》,这本书从编程语言的衍生发展以及主流编程语言之间的对比等角度梳理了编程语言的“特性”,这些特性通常是所有编程语言必须的,不管是编译型还是解释型,也不管它是动态类型还是静态类型。王垠也在如何掌握所有的程序语言中讨论过这个问题。
通常在我们学习一门新的编程语言的时候,更多的应该去关注这些“语言特性”:
变量以及运算
流程控制
函数
作用域
类型
容器和字符串
错误处理
并发
垃圾回收
编程范式
我们应该关注编程语言对这些特性的实现,然后对比我们已经学过的其他语言。
拿Java和Python的面向对象来讲,首先我们要关注这两门语言各自对面向对象的定义以及各自的规则。然后可以对比一下它们的不同。比如如果我们要实现一个可以显示内容的窗口,同时希望这个窗口具有可滚动的特性。在Java中,我们一般会定义一个窗口类,然后定义一个具有滚动特性的接口来实现。但在Python中我们可以完全可以定义一个窗口类和一个滚动类,使用多重继承来实现。
那么为什么会存在这种差异呢?Java为什么不支持多继承呢?其实这仅仅是不同语言针对多继承中菱形继承所造成冲突的不同解决方案而已。至于菱形继承相关问题不是本篇重点,大家自行搜索即可,这里只是举个例子。
如果我们能用一种语言的基本特性写出来很棒的代码,那么换一种语言同样可以。
如何选择“第二”编程语言
最后说说如何选择“第二”编程语言的问题。这里我有几点建议:
选择一门和“第一”编程语言编程思想不同甚至是相反的语言。
比如如果已经学了一门静态类型语言,不妨选一门动态类型语言学一下,方便在对比中学习,体会不同编程思想的魅力。
选一门能拓展自己能力范围的“第二”编程语言。
比如A是一名Android开发,那么A可以选择学一下IOS开发和前端开发,拓展一下自己的能力圈。
选一门自己感兴趣的“第二”编程语言。
第一门语言用来“吃饭”,第二门当然可以选择一门自己感兴趣的。比如如果A是一个前端工程师,A对机器学习感兴趣,不妨学习一下Python和机器学习相关的算法。
当然,其实计算机编程一多半的功力不在语言上体现,而是解决问题的思路,也就是如何去运用程序语言解决问题的能力。这方面的能力也不仅仅是看看数据结构和算法能培养起来的,必须多写多练多学习开源,持之以恒才行。