声明:本文来自于微信公众号CSDN(ID:CSDNnews),作者: Fred T-H,授权tag知识库转载发布。
译者 | 苏本如
1998 年开源发布的 Erlang 项目,在全球范围内只是个小众编程语言。
根据 TIOBE 最新发布的语言排行榜,Erlang 仅排名在第 65 位,市场份额占有小于 0.1%。但是作为一门函数编程语言,它拥有着强大的并行处理能力和容错机制,简单好用且易学。最开始,Erlang 之父 Joe Armstrong 编写的初衷针对的是类似于电话交换机那样的高可用性、高可靠性系统,但后来却成就了可靠性达到 99.9999999% 的目前世界上最复杂的 ATM 交换机!
须臾二十载,如今的 Erlang 项目仍然焕发着生机,并在技术淘汰中稳稳站住了脚跟。那么 Erlang 在这些年中经历了哪些发展阶段?Erlang 语言的知识阶梯如何影响了对它的采用?Erlang 及其社区未来的发展方向是怎样的?......下面就让我们一探究竟。
声明:本文已获作者 Fred T-H 翻译授权。
以下为译文:
大约在 10 年前,我加入了Erlang社区,当时正值Erlang语言的第一个炒作阶段。我们都被告知,Erlang语言代表着并发性和并行性开发的未来,因为它能够以最轻松和最快速的方式完成开发。你还可以得到免费的Erlang分发包,因为它已经变成了一个开源软件。在那个年代,一切都开始变得不可思议。虚拟机也刚刚获得了SMP支持,而在此之前,要想真正利用同一台计算机上的所有CPU,你必须在那台机器运行多个虚拟机。
在这篇文章中,我想先花点时间对这十年的大部分时间作个反思。然后我会介绍一些这期间发生在Erlang上的事情,例如炒作阶段对Erlang的影响?Erlang语言的知识阶梯如何影响了对它的采用?以及我在Erlang社区的十年中自身发生了什么变化?最后,我将探讨一下我认为Erlang及其社区的发展方向。
炒作阶段
炒作周期(或技术成熟度曲线)在一个产品或技术的生命周期中引入了“阶段”这个概念。这是一个营销概念,而不是一个科学概念,但是用它来描述事情的发展往往会很有用。而我最感兴趣的部分是“炒作阶段”,它就像一股发生在编程社区的淘金热。你可能见过一个或多个这样的炒作阶段,通常他们似乎都依附于某个杀手级应用程序,吸引着每个人蜂拥而至。
我能想到的“炒作”的例子有:炒作Ruby on Rails的“如何在 15 分钟内构建一个博客引擎”的视频(https://www.youtube.com/embed/Gzj723LkRJY,其中的“看看我没有做的所有事情!”仍然是一句有趣的话),炒作Kubernetes 的“在Kubernetes下使用Go语言”的文章(Kubernetes在此以前已经有了大量使用,但在那之后确实进入了一个爆发期)。在某种程度上,对Elixir和Phoenix的炒作或许也可以列入这个名单。
在这样的一个炒作阶段,大量的新来者蜂拥而至,都想来看看能捞点什么好处。有些人会留下,但多数人会很快离开。大多数人的停留时间可能只是几个月或几年,能真正地安顿下来并且坚持几十年的人非常少见。绝大多数人都是一些络绎不绝的先期采用者,他们从一个技术冲浪到另一个技术,嗅探最佳的机会,希望先行采用某种框架、语言或工具包,来获取一定的竞争优势。
所以通常的想法是,首先你要拥有一个真正的杀手级应用程序,然后人们就会涌入你的生态系统。杀手级应用程序会驱动这股人潮,只要你把它构造出来,人们就会蜂拥而至。如果你能留住他们中的小部分并保持他们的活跃度,那么在可以预见的未来,你将会拥有一个活跃的社区。这用一种奇怪的方式,让我想起了“雨随犁至”这个理论:
上帝加快犁地的速度。……这是奇妙的“人类主宰自然”的理论假定,天上的云会分配取之不尽的雨水…而[犁]是让野蛮变成文明的工具;能把沙漠变成农场或花园。……或者更简洁的表达,就是“雨随犁至”。
这一理论的基本前提是,通过人类的定居和农业活动可以影响干旱和半干旱地区气候的永久变化,使这些地区更加湿润。这一理论在 19 世纪 70 年代被广泛推广,作为美国大平原(曾被称为“美国大沙漠”)开垦定居的理由。这也被用来证明南澳大利亚在同一时期的边界土地上小麦种植的扩张是合理的。
如果我们能让一个大项目一直进行,开发人员就会出现,然后它就会自我维系下去。我认为这种观点显然是错误的,因为尽管Erlang在其最热的炒作阶段拥有了数十个杀手级应用程序,但是,它的社区仍然维持在很小的规模。下面,就让我们看看在那个时代,Erlang都有哪些杀手级应用程序:
ejabberd(诞生于 2002 年,第一个稳定版本发布于 2005 年):它是迄今为止最具可扩展性的主机聊天服务器之一(即使不是之最)。Ejabberd曾经是一个巨大的成功,在某种程度上来说现在仍然是。到目前为止,在StackOverflow上仍然能看到关于它的模块的提问。在 2011 年左右,它衍生出了MongooseIM分支,现在这两个解决方案仍然处在维护中。
CouchDB(2005):是根据CAP定理,用Erlang编写的第一个流行数据库,也是当时新潮的多主文档存储解决方案之一。虽然现在MongoDB是该领域的王者,但CouchDB在存储引擎方面仍然有其精神继承者,最出名的是BarrelDB,它现在还在维护中。
RabbitMQ(2007):几乎占据整个AMQP市场的一个消息队列软件,它现在仍在用并且很有价值。在流式工作负载方面,它经常被和Kafka一起讨论,尽管它们具有明显不同的特性和用例。
Facebook Chat(2008):Facebook Chat的初始版本是用Erlang编写的。由于许多内部因素,如系统稳定性的考虑,和内部C++工程师的强势地位,以及已经有了C++实现的一套解决方案等等,后来它用C++全部改写。
WhatsApp( 2009 年, 2014 年被收购):在Facebook的聊天系统摆脱了Erlang语言后,他们最终购买了WhatsApp这个众所周知的只用了 50 个工程师开发的服务于 9 亿用户的跨平台应用程序。它今天仍在使用,事实上,WhatsApp的开发者决定比以前更加深入地参与Erlang和Elixir社区中。
Riak(2009):是分布式系统世界展现自己优势的最佳例子之一。Riak是一个真正可靠的分布式键值数据库店,它是Basho Technology公司开发的一个当前仍在医疗保健系统和其他关键基础设施中运行的NoSQL数据库产品。在Basho Technology遭遇财务危机并被迫破产时(这在很大程度上是因为公司违反了信托责任,迅速走向了败亡),Bet365 买下了它的所有知识产权,并优雅地将其开放源代码,现在Riak数据库仍然在开源世界中运行,尽管它的支持力度和过去最好的时期比稍稍不如。
以上提到的杀手级应该程序,很多都是在乔·阿姆斯特朗的《Erlang编程》一书问世的时候出现的。它们制造了一场对Erlang大量采用的完美风暴,同时也为Erlang吸引了大量的旁观者,甚至对黑客新闻网站都产生了明显的影响,以至于它强制要求在某一天所有讨论都必须是关于Erlang的内部机制。
然而,喧嚣之后,留下来的人很少。
我认为,现在的杀手级应用程序的出现和过去相反,它是出于人们想在最初的炒作阶段分一杯羹的贪婪。任何应用程序,总有一个弱小的、早期的阶段,有人嗅出了它技术的有趣之处,决定喜欢它,并且将它构建出来,如果碰巧它成了一个杀手级的应用程序,那么就会进入一个更大的炒作阶段。人人都盼望从天上掉馅饼,一个成功的故事会培养更多的模仿者。另一个常见的现象是“重塑世界”阶段,每个人都花时间重新实现现有的一切,所以你会看到很多很多“与语言无关”的公告。
但是杀手级的应用程序本身从来就不能够实现开源语言的自我维系。其中一个有趣的结果是,像RabbitMQ和Ejabberd这样的产品,尽管很受欢迎,但其用户社区比贡献者社区要大得多。成千上万的公司使用他们的产品,但他们不一定会参与到Erlang社区中来。
毫无疑问,部分原因在于Erlang的大多数杀手级应用程序都在专门的基础设施中:你创建了一个其他人都可以使用的高可靠性黑盒组件,如果它工作得足够好,他们就不需要查看盒子内部。现在好了,几十个开发人员已经为数千种其他产品和服务提供了基础设施。而按照定义,专业化的基础设施是一个不需要大量人员就能产生巨大影响的地方。所以它们的贡献者群体和社区总是比靠近最终产品的群体和社区要小得多。例如,拥有数不清的网页开发人员的Web开发框架,或者更通用的基础设施,都可以把它们用到小规模的部署项目上,因为任何企业都可能找到它们的用途。
但是,即使没有这些因素,也很容易让人觉得,Erlang错过了一个巨大的机会,那就是它在炒作阶段没有获得更大的蛋糕份额。
知识阶梯
我不想用诸如“过去可以发生或者应该发生”这样的描述来做反事实推理。相反,我想挖掘我在Erlang社区多年的教学和写作中所看到的常见学习模式。这些也是我现在正在Elixir社区中看到的模式,我觉得这可能是预示着Elixir可能有着相似未来的一种迹象。
我最钟爱的一个理论是,像编程语言(及其生态系统)这样的技术主题具有多层复杂性,需要学习和发现各种概念。我第一次开始表达这种理论是在Learn You Some Erlang的网站上,用一个我称之为Erlang第九圈的图表。
我认为学习一项技术并不是无休止的痛苦(至少,它不应该如此),这话是不是说得有点假心假意,我只是喜欢双关语。但简单地说,对任何新技术的学习,通常有一个更“核心”的主题路径或次序,这样就有了“知识阶梯”这样的东西,在这个知识阶梯上,越有价值的知识/概念被放得越高,也越难到达,所以实际情况是,到达越高的地方的人会越来越少。
对Erlang来说, 我认为它的“知识阶梯”可能是这样的:
函数式编程;
隔离进程和并发性;
可靠的并发性(links, monitors, timeouts);
OTP行为模式和其他系统抽象;
如何构建OTP系统;
如何构建发布版本并处理其生命周期;
如何保持系统始终在线,以及如何运作。
如果你是第一次接触Erlang,并且从一本初学者的书开始学习,你可能会在第一级阶梯上花费大量的时间:与函数式编程、不可变性、递归和类似的概念交朋友。迟早,你会接触到并发性和并行性、进程和消息传递。在那之后,你开始学习links和monitors进程监控,错误处理,以及Erlang的内部机制。在Erlang的大炒作阶段,第二级和第三级阶梯成了最让旁观者惊叹的卖点。如果你必须学会一些在未来的项目中必备之知识,那就是其中之一。
其他的梯级会在稍后跟进,尤其是OTP(第 4 级阶梯),但前提是你坚持完成编程这一阶梯。OTP被视为Erlang的真正价值所在——并发性和函数式编程确实不错,但是OTP代表的一般开发框架是你必须坚持和使用的真正独特的东西。很多人愿意使用这些框架,了解它们所做的美好的抽象,但是对于如何正确地构建每件事情可能会感到有点困惑。
事实上,像Ejabberd这样的应用程序的大部分开发几乎没有突破第四级阶梯。当时的生态系统有点像蛮荒的西部,对于爱立信的员工和最有动力的自学者来说, OTP知识也就是那么一回事。大多数人只有在有值得投入生产的东西出现问题、并且想寻找更好的解决方法时,才有可能到达第五级。直到 2015 年或 2016 年,当Relx的出现开始让整个发行体验变得更容易时,第 6 级才被重视。第 7 级几乎从未到达,事实上,很多人都觉得不应该热升级一个节点,理想情况下,你也不会在生产环境中使用SSH命令行进行调试操作。
在实践中,并非每个人都会按照相同的顺序来学习所有这些知识,有些书会调换它们的次序(这让我想到了Erlang and OTP in Action这本书)。我觉得这些次序都不是问题,“阶梯”用在这里只是为了说明问题。
社区波浪式向前发展。炒作阶段会使一个社区的规模增加十倍甚至百倍,大多数人会好奇地看一眼然后离开,所以一个社区中的大多数用户倾向于停留在第一个梯级。少部分人会到达高一级阶梯,更少部分的人会到达更高一级,依此类推,直到你拥有到达最高阶梯的内部专家圈为止。
对于Erlang来说,我认为前三个梯级可能是最容易到达的。第四个阶梯花了几年的时间来开发,最终被认为是有价值的。第五个阶梯非常复杂。Erlang缺乏工具和生态系统,Erlang社区留下来的都是自己选择的,愿意忍受这种贫瘠环境的人,因此对新来者的困境不敏感。为了保持这篇文章简短(好吧,长而不是荒谬的长),我就不在此赘述了。
在任何情况下,如果你是一个Elixir的用户,你可能会看到你在这个硬性定义的阶梯上的位置,你可以感觉到一个社区中的派系通常都在那里。很多人,可能他们只是在Phoenix上做得很好,很少能突破第四阶梯,而且在可预见的将来,他们中的许多会一直停留在第三阶梯或以下。在许多情况下,这些情形都是对的。这里我们只是观察,不作评判。作为一个通过了很多知识阶梯的人(可能在这种环境中,我的头上还有一些知识阶梯,比如“修补虚拟机”之类的),他们似乎错过了很多知识阶梯,但坦率地说,那些东西对他们可能永远不会有用。
但所有这些都是说:作为一个社区,我们可能会让人们很难超越基本水平,从而使我们自己陷入困境。经验教训的学习是不可以一蹴而就的,在某种程度上,Erlang社区是盲人在引导盲人,因为它实在太小了,没有足够的人来分享所有需要的经验。今天的情况比较容易,如果你在一个炒作的周期之外,你很可能会找到好的帮助,因为很少有人同时要求所有的帮助。
我想表达的是,如果明天Erlang有第二个炒作阶段,我们会比上一个炒作阶段表现得更好。希望这些经验,加上Erlang和Elixir社区之间更好的合作,让我们能够接触到更多的受众,让我们成功的机会加倍。
文章评论 本文章有个评论