在IT届,一谈起编程语言之间的优劣,可以掀起一场世界大战。即使已经封神的Torvalds也不能免俗,对C++数度开火,更别人说其他语言,压根就不在火力范围内。就我个人而言,启蒙是C语言,用的多是C++,工作范围主要网络、应用系统底层框架、高性能低延迟的应用,所以即使是写C++代码,感觉也类似C语言,很少用高级特性。java、python、lua、php等都用过,因为要做的工作不多,所以多数都是浅尝辄止。
这些争议的根源,我认为,在于这些争议者忽略了编程语言和领域场景的适配程度。多数人在争议编程语言的优劣的时候,少有人提及在某些场景。谈及写网页,几乎没有人会想到用C/C++语言,除非在于一些资源紧张的嵌入式系统。说到写操作系统,不会有人说要用Java,甚至C++都用得少,因为C是被证明过的解决方案。
而会被争论的场景是处于操作系统和网页之间的中间地带,主要是场景多样的应用系统,也包括一些历史原因遗留的。这些系统包括GUI界面,应用容器、商业逻辑的实现、中间件的实现。在一些公认的成熟领域,比如网关、数据库普遍选择C作为开发语言,诸如apache、nginx、mysql、postgrep等。而近年来兴起的消息中间件kafka、rocketmq和rabbitmq;以及hadoop族的诸多系统,再加上python族的openstack和人工智能和刚流行的交易策略编程;还要再加上谷歌的go族系统,如k8s和docker。
深入研究这些现象,一个理性选型的根本目在于确保系统成功,一般都要包含这个过程:
1、系统场景的需要哪些特性,安全、性能、用户体验还是其他,这是系统成功的要素;
2、现有的开发资源和允许开发时间,一般这些都是紧俏因素,能少尽量少,这和实验室是不同的。
3、开发人员的技能熟悉程度,如果让开发人员去熟悉一个全新的语言和功能,这个成本也要考虑;
4、编程语言是否符合场景,以及他本身的框架对新系统的支持程度,成熟的框架肯定优先考虑。
5、编程语言的周边系统,是否已经足够成熟的组件或者社区或者技术支持,来支撑该选型。
对于一家实业公司来说,撇开本身的资源和系统场景,去讨论编程语言的选型是一个不负责的做法。最核心的依然是成本和时间的考虑,能否用最少时间并且最低成本实现一个系统,往往能够决定一个系统能否在市场上成功。一个有趣的案例是hadoop,最早是用java实现的,在市场引起强烈反响,获得巨大成功,而之后因为本身的问题,不断加入辅助系统为不断发展的业务需求提供支撑。但最终却是c语言编写的ceph成为了linux下的分布式文件系统选型而不是流行的hadoop的底层存储hdfs。
ceph的案例是一个反例,他选用c语言作为编程语言,显然违背了成本和时间的原则。我们深入考虑ceph开发时的市场背景,不然发现,hadoop在此时已经有众多的应用场景和周边支撑,还有大公司的支持,唯一的突破点,就是他本身固有的缺点,比如可扩展性、性能等。ceph作为后入者,专注于底层存储,与HDFS竞争,比如在用户体验上更胜一筹,那么选型c显然要优于java,其他反而不重要。于此相似的是阿里的rocketmq,他没有用scala语言改进kafka,而是用java重写了类似的系统。
对于一家实业公司来说,即使是要和成熟产品竞争,会在成本和时间上做出妥协,但最终也会回归到这两点,不可能无限投入和延时。我们考察下最流行的java,可以发现java的库范围覆盖之广,令人发指,只要你能想到基本都有,这当然和java语言设计有关系,容易开发,方便管理,才促进了java库的繁荣,又反过来推进java的发展。C/C++发展了几十年了,项目同样不少,但问题在于每个项目都各有自己的风格,你要在自己项目中引入其他项目,简直要痛不欲生,除了几个经典项目。
python在早期多数被限制在运维管理项目,直到最近人工智能的流行,大神吴恩达亲自出面推介,再倒最近的交易策略编程也流行用python,之前多用VBS。想想也不奇怪,人工智能和交易策略从业人员要么数学或者金融专业出身,让他们学习计算机知识显然浪费时间;其次原来面向运维人员的Python,学习曲线就平滑得多;再次,数学库的丰富,谷歌神器tensorflow都支持python了;最后,解释性语言可以边写边看结果,特别适合要算法研究工作,毕竟每改一次都要编译半天的编译语言太浪费时间了。
之上所说的一切都在于表明,每一个领域场景都会有对应的,符合理性选型的,一个或者多个编程语言。在符合领域场景特性下,成本和时间会成为关键的选型要素。领域语言比通用性语言的优势在于他更符合领域场景特性,摈弃不需要的特性。有适合场景的系统库支撑,如python的数学库;也有适合开发人员的语法和使用习惯。领域语言的优势在于用户体验,缩短系统成型时间,也同样降低了研发成本。
领域语言劣势在于,需要对应的编程环境,因为领域多样,语言也多样,特性也多样,所以要支撑这种多样性,显然是困难的。而一个有竞争性解决方案,就是一个同样编程语言上,比如python上提供领域库,可以是系统库对应于运维系统,可以是数学库对应于人工智能和交易策略。
数据亲和架构将系统研发限定在数据处理,以及对应的业务处理逻辑,开发者在使用这种架构时,需要考虑的因素有限,因此,更容易实现领域语言,更有助于提高开发效率,缩短开发时间,降低开发成本。