编程语言成功的几大要素
最近,有人在推特上讨论编程语言如何才能取得成功。有人提到了社区、营销、低成本的开发人员等等。
然而,我认为这些因素与编程语言的成功并没有太大关联。20 多年来,我使用过很多编程语言,也反思过它们的优缺点。在本文中,我想总结一些常见的模式,说明为什么有些语言取得了成功,而有些语言则失败了。
解决痛点
如果编程语言没有解决任何实际的开发人员问题,那么也走不长远。成功的语言都会解决困扰开发人员的问题。在早期,性能是一个主要问题,因为那时的计算机真的很慢。C 编程语言之所以流行起来,很大程度上是因为人们可以利用 C 编写速度非常快的代码。相比之下,LISP 和 Smalltalk 由于性能低下,其发展就非常有限。
C++ 流行是因为它解决了很多 C 代码中的问题,而 Java 是因为它解决了许多 C++ 的问题。就像 Swift 解决了许多 Objective-C 的问题一样。Perl(虽然现在不怎么流行了)变得非常流行,是因为它极大地简化了 shell 编程。
从很多方面来说,Python 之所以流行,是因为它针对 Perl 带来的混乱提供了一种解决方案。而Ruby 也因同样的原因广受欢迎。从某种程度上说,它们通过不同的方式解决了 Perl 的痛点,同时又没有放弃许多 Perl 的优点。说到这里,我们不得不提兼容性和熟悉度。
熟悉度与兼容性
许多语言都利用 C 来解决问题。最有名的例子就是 C++。它使用的语法与 C 非常相似,甚至可以与 C 的代码兼容,因此你可以将已有的 C 代码与新的 C++ 代码混合起来使用。这样采用 C++ 的门槛就会降低。
Java虽然没有提供源代码兼容性,但它提供了熟悉度。它大量借用了许多人熟悉的 C/C++ 语法,同时简化了许多概念。Java 诞生之时,面向对象非常流行,它借助了面向对象的热潮,并宣称Java 甚至不允许编写自由函数。一切都必须是方法;这是面向对象的Java!虽然这是个有点愚蠢的噱头,但从营销的角度来看,效果非常好。这种说法很容易被人们接受,即便逻辑有问题。
JavaScript的创建者注意到了 Java 的广泛流行,并采纳了 Java 风格的语法。因此,JavaScript 通过熟悉的语法推动了采用。即便语义上完全不同也不重要。人们是肤浅的,如果语法看起来很熟悉,人们就会觉得这门语言很容易学习。
而Perl、Ruby 和 Python 像是存在于平行宇宙中。Unix 不仅带来了 C 编程,还带来了shell 脚本。对于简单的任务和自动化,shell 脚本明显比 C 程序更有优势。人们纷纷开始编写大型 shell 脚本,然而 shell 语法不太适合大型脚本。于是,救星 Perl 出现了。它是一种更合适的语言,而且对于熟悉shell 脚本的人来说,Perl 的语法非常熟悉。因此,任何习惯使用 Bash shell 的人都可以轻松掌握 Perl。
于是,Perl 成为了文本处理界的“瑞士军刀”。它有正则表达式,你可以与之交互。它与C、C++ 和 Java 有着不同的市场。
Python和Ruby 的成功也借鉴了这类经验。它们也是可以在 Unix shell 中轻松运行的 shell 语言。虽然二者在 Bash 之外也有很多用途,但它们的语法让 Perl 程序员倍感亲切。它们吸引了熟悉非脚本语言(比如 Java)的程序员,同时对 shell 也很友好。
因此,它们也建立在熟悉的基础之上,尽管源代码不兼容。
垄断
令人惊讶的是,通过垄断的方式将某种语言推向顶峰的做法也很常见。例如,作为 Web 语言,JavaScript 设计得相当随便。但由于它成为了网页的标准,因此垄断了客户端 Web 开发。随着 Web 越来越流行,JavaScript 的普及度也水涨船高。
Objective-C和Swift 的情况也完全相同。在 iPhone 大受欢迎、人们爱上智能手机应用之前,Objective-C 是一种相对难懂的语言,几乎只有苹果生态系统使用。我是早期的粉丝之一。事实上,在 Objective-C 被纳入苹果之前,我就是它的粉丝,该语言来自 NeXT 公司,是乔布斯在 80 年代被踢出苹果公司后创办的。
对于我来说,Objective-C 的吸引力在于它结合了 C 的性能与 Smalltalk 优雅的对象模型。当然,这种只有技术宅男才会关注的点并没有对大众带来太多吸引力。真正让 Objective-C 得到发展的是iPhone。Mac OS X 基于 NeXTSTEP,而 iPhone OS 基于 Mac OS X。在 NeXT 和 OS X 的世界中,Objective-C的地位如同 Unix 系统中的 C 一样,完全主宰一切。
事实上,我们可以说 C 流行起来的原因也大抵相同。就像 iPhone 的流行成全了 Objective-C 一样,Unix 的流行也将 C 推向了巅峰。Unix 中所有重要的功能都是用 C 编写的,因此如果你想攻克 Unix,首先必须学习 C。这就是 70 年代人们纷纷开始C 的原因。
Swift的发展思路也大致相同。苹果宣布 Swift 是未来,它将取代 Objective-C。这就等于保证了该语言的巨大市场份额。
杀手级应用
虽然上述因素可以让编程语言达到一定的流行度,但可能还不足以解释为什么这些语言会如此流行。通常,这些语言中的某些功能可以构建某款杀手级的应用。
例如,Ruby 具有强大的元编程功能。因此,有人构建了 Ruby on Rails,而这反过来又推动了 Ruby 的发展。
对于Objective-C 和 Swift,我猜你会说杀手级应用是iPhone 应用。
对于JavaScript,我们很难得出相同的结论,因为其在 Web 的垄断始终可以确保主导地位。然而我认为,可以说 Node.js 的开发巩固了 JavaScript 的地位。
虽然长期以来 Python 一直很受欢迎,但真正让它走红的是数据科学与机器学习的兴起。这些领域需要交互式解决方案。编译语言不太适合。Python 拥有 NumPy 以及其他解决方案,并且没有面临太多竞争。JavaScript 被锁到了 Web 上。Perl 是一种非常难读懂的语言。Matlab 走的是商业路线,而且年头太久远。并且二者都没有提供面向对象编程或函数式编程,只是简单的过程式编程。Lua 主要适用于嵌入,没有丰富的库生态系统。R 有古怪的语法和混乱的生态系统,对程序员没有吸引力。
然而, R 相对发展得还不错,部分原因是数据分析的兴起,以及软件行业对大数据的痴迷。
易于学习和使用
一门编程语言可以解决很多痛点,并提供很大的优势,但如果不易于使用和学习,也走不长远。请注意,易学和易用并不一定是一回事。举个例子,C++ 是一种极其复杂的语言,而且使用也很不方便。那么,它是如何变得如此受欢迎的呢?
因为它借助了 C 的成功。对于有 C 经验的人来说,学习 C++ 不会特别难。而且当初 C++ 流行起来的时候,它远比如今简单得多。此处,我们还要提一下临界质量和社区的概念。一个成功会推动另一个成功。某种语言一旦拥有庞大的社区、教程、大量用它编写的软件、愿意招聘的公司,那么无论该语言存在何种缺陷,都会得到发展。但是也不能将 C++ 的成功完全归功于社区,因为这并不能解释最初它是如何俘获社区的。
还有一点也很重要,易用性往往是表面上的。例如,Objective-C 是一种比 C++ 简单得多的语言。然而人们通常会认为 C++ 更容易学习,因为它的语法看起来更熟悉。熟悉感是强大的驱动力。
如今的 Java 可能并不是一种简单的语言,但在它刚出现时,很多改进都超过了 C++。开发人员不必了解引用、指针、指向指针的指针、地址运算符以及各种导致 C++ 开发复杂化的底层概念。
在这方面,90 年代的 Go 编程语言也有类似的感觉。它是一种非常简单的小型语言,但是没有像 Java 那样受到面向对象 炒作的影响。相反,它努力遵循 C 的理念。我记得当初 Go 刚问世不久我就尝试了一下。当时我是一名 C++ 开发人员,但我用 Python 编写了一些小型命令行工具,来简化我的工作流程。
我记得,我只用了短短几天就学会了 Go。我很惊讶它的速度竟然如此之快。对于接触过 C 和 Python 编程的人来说,Go 的库和语法似乎都很熟悉。几乎有点像使用脚本语言。我记得,很快 Go 就取代 Python,成为我编写小工具的首选语言。静态类型检查有助于发现 bug,而不会像 C++ 那样扼杀生产力。当时在我看来,Go 必然会成功。它不仅易学、熟悉、而且性能良好,并解决了真正的痛点,比如并发等。
那时,我实际上并不关心并发。我只是在比较 Julia、C#、Java、Erlang 和 Swift 的并发系统时尝试了 Go 并发。那时我才意识到 Go 的提升有多明显。
然而,我认为 Python、Ruby 和JavaScript 的兴起,很大程度上也要归功于学习这些语言的简单性。
未能成功的语言
说起未能成功的语言,我不禁会想起 Haskell、Standard ML、OCaml、F#、LISP、Scheme、D 和 Smalltalk。这些语言都很棒,可以解决实际问题。然而,尽管经过了多年的努力,它们始终未能取得任何进展。为什么呢?
Haskell是一种面向各种编程极客的语言。从很多方面来看,我都像是会写大量夸赞 Haskell 有多么了不起的文章,并再三预言 Haskell 革命即将来临。然而,我几乎从未写过关于 Haskell 的文章。为什么?
也许是因为我也是 UX 的忠实粉丝,有时会写一些有关易用性和用户界面设计的文章。从某种数学和技术的角度来看,Haskell 看起来像是天才的杰作。然而,从易用性的角度来看,我觉得它不及格。
没错,它具有数学优雅和简单性,完全不同于 C++ 的混乱。然而,高级抽象数学,无论多么优雅,都不是普通人可以轻松掌握的。相反,尽管英语十分混乱,人们还是可以学习英语。很多英语的拼写毫无逻辑,缺乏一致性。然而,人们可以容忍这些问题。尽管微积分在概念上更简单,但普通人却完全掌握不了。
这就是这些语言失败的地方。通常,它们都具有数学之美,但它们的构建方式并不适合我们愚钝的大脑。这些语言的知音人可能会觉得意难平。看似极乐世界尽在掌握,只可惜有些人就是不开窍。有时,可能只是你太聪明了,无法理解普通人的难处。
我个人认为 LISP、Scheme 和 Smalltalk 曾有过机会。对于这些语言,我认为问题不在学习有困难,而是缺乏熟悉度。与编程世界已经习惯的语法相比,它们都包含一些奇怪的语法。另一个原因是生不逢时。它们根本无法达到当时所需的性能。这些都是开源项目和互联网出现之前的时代。这导致这些语言出现了许多变种,阻碍了其发展。
尽管Smalltalk 有一个漂亮的开发模型,但它太另类了。开发基于修改镜像而不是源代码文件。它类似于直接操纵真实的数据库。这与人们习惯的方式完全不同。无论有多么优异都不重要,人们还是会选择熟悉的语言。
参考链接:https://medium.com/geekculture/what-makes-a-programming-language-succeed-de7c0d15b7f9