跟我交流较多的朋友们会知道,我是很早就坚持研发人员要多学会几套编程语言的人,特别是新的开发语言。有段时间,我甚至都在准备尝试自己设计一个有应用场景的编程语言。计算机语言是人设计的,了解了核心的原理,真的没那么困难。当然,要做的出色,有很多用户,那就是另外一回事了。
基于C/C++语言的开发我做了10年以上。后来我逐渐的把应用需求分解到其它语言中去,PHP/Python/JavaScript(前端/Node.js),我都花了不少功夫研究。我在开发过程中能做到各种语言随时切换,得心应手,没有任何障碍。并且,仰仗着过去在C/C++时代打下的良好基础,我可以在源码级研究并理解编程语言。特别是用C写的各种脚本语言,只要觉得手册没写清楚的,我就直奔源代码看个明白。这是开源时代给多语言开发者带来的巨大优势。
最近,我在研究Go语言。其它几种感兴趣的编程语言,我也有计划钻研一下。
为什么我对新的计算机语言,这么乐此不疲?很简单,时代变革,与时俱进。
对当今的IT领域来说,单一语言包打天下的时间已经一去不返。未来的趋势是,各种语言站住自己的核心应用地盘,相互借鉴、相互竞争,不断拓展、侵蚀到其它语言的应用领域,逐渐发现更好的表达模式和方法。
新的语言,代表着对事物更新的理解和更好的阐述方式。
语言是人类思维的工具。人类之间的语言,与人类对计算机讲的语言,实质都是要表达出思想。人依靠编程语言来指挥计算机运行。不同的语言,代表了对问题领域、对计算机系统不同的理解方式。
催生这些语言并促进其发展的,是背后的环境变革。更新的语言,常常是吸收了上一代语言的优点,再尝试使用新的思想模型、新的方法去解决各种已知、未知的问题。有时候使用者会发现它很有效,很方便,这个语言就容易在一个问题域站稳脚跟了。
我们的开发环境、应用环境,一直在变化。但是人类往往对缓慢的变革熟视无睹,习惯的延续原来的假设和出发点,这就给创新留下了口子,经常可以从这里获取突破性进展。
比如,单机时代,CPU性能弱,存储器速度、容量都很低。那么在这个条件下,作出的各种软件开发决策,都会带上这个默认环境的影响。以至于后面的硬件突飞猛进,原本的假设不成立了,它的影响可能还在延续。原来的计算机网络物理层面不够可靠,所以网络协议设计了很多校验机制,但是后面的光纤时代,这些校验就成了成本和负担,检验并不是越多越好。
从单机转向网络应用,再做移动设备开发,以及和网络的融合,以后再有各种智能硬件设备、万物互联,不同的应用发展,带来了不同的需求和环境。而原本的编程语言,设计者考虑的平衡点可能就不合适了,需要新语言替代它,进行革新。
所谓的“平衡点”是说,设计决策里面对相互冲突的特性,作出的妥协点在哪里。你是要编译式的静态语言,还是动态语言解释型的?重点是编程灵活还是运行速度?考虑多少安全问题?要不要垃圾回收?用什么机制?比如CPU从单核进化成多核,如何在语言设计上充分利用硬件的能力?
如此多的应用需求变化,对各种不同设计思想的计算机语言的产生必然是催化剂。单一语言解决所有问题域,是不可能的了。强行上马,只能让开发者痛苦,大幅降低效率和质量水准。现在还有谁用C++写Web应用?
庆幸的是,在计算机系统架构未得到根本变革之前,绝大部分编程语言都有很相近的语法结构,弄懂学会并不难。计算机算法也是共通的。但是考虑到它创建并依赖的生态环境、设计思想、开发模式和习惯用法,应用自如还是需要耗费很多精力的。