José Valim:“Elixir 非常适合用于在套接字之上运行的各种内容”
简介
Evrone 不仅是一家定制化软件开发公司,还与当地和国际社会保持高度联系。 我们承办了年度 Ruby Russia 会议,这是一个由专家级嘉宾参加的大型活动。 这些社会关系为我们带来了竞争优势,并为我们提供了更好的技术专业知识和咨询机会。 我们与世界各地的开发人员进行对话,其中包括创新技术的创始人,我们试着通过采访、会议和交流会等形式来加强联系并回馈社区。 最近,我们对 Elixir 编程语言的创始人 José Valim 进行了采访,并向他询问了该语言的目标以及诞生过程。
采访
Evrone: 你好,José,很高兴你能来到这里! 先介绍一下你的的工作内容吧。 在 Nubank 收购了 Plataformatec 之后,你创办了 Dashbit。 你现在在做什么?
José: 嗨,感谢你们的邀请! 我是 José Valim,Elixir 编程语言的创始人。 今年年初,我成立了一家名叫 Dashbit. 的新公司 。 我们的目标是帮助其他公司在生产环境中采用和运行 Elixir。
Evrone: 很棒! 我们来谈谈语言和技术的流行。 人们对为什么有些技术流行而有些技术不流行会有不同的观点。 其中一种观点认为,许多技术是因为获得了称为“爆款应用”的支持而获得了成功,比如 Ruby 编程语言伟大的 Ruby on Rails 整体框架。 你如何看待“爆款应用”和“爆款演示”的观点? “Phoenix”和“15 分钟克隆一个 Twitter”的演示对于 Elixir 来说有什么重要意义?
José: 我认为它们会有帮助,但不是决定性因素。 如果你有一个爆款应用,能够在短时间内获得大量关注,这显然会有助于技术的采用,但它本身并不是必要条件。 即使你拥有爆款应用,也不能单凭它来支撑整个社区。 我认为 Python 就是一个很好的例子,因为它是一种可以多样化的编程语言。
对于社区而言,除了爆款应用外,还要能够多样化并进入不同的领域,这很重要。 这就是我从一开始对 Elixir 采取的方式。 我自己是 Web 开发出身,所以我非常小心,不让 Elixir 陷入窘境,变成一门只能用于 Web 开发的语言。 我努力扩大这门语言的影响力。 如今,当你审视 Elixir 的应用时,会发现有人在用它进行 Web 开发,但也有人用它来构建分布式系统。 这是我们从 Erlang 那里继承的东西。 还有类似 Nerves 的项目,正在将 Elixir 引入嵌入式设备,这非常令人兴奋。 像 Broadway 和 GenStage 之类的项目都与高效数据处理有关。 我更感兴趣的是实现多元化的发展,而不是试图寻找一个成为主要关注点的爆款应用。
Evrone: 没错,确实是这样。 Python 的多样性赫赫有名。 面对如此众多的编程语言,我们开发人员喜欢给它们贴上标签。 Erlang 的标签是“电信语言”,Clojure 是“现代 LISP”,等等。 如果要为你的 Elixir 语言贴上一个简短的标签,你会选择什么?
José: 如果要给它贴上一个简短的标签,我会说 Elixir 非常适合运行在套接字之上的一切产品,比如 Web 服务器、物联网设备、分布式系统、音频/视频流媒体等。 当进行任何依赖网络的项目时,如果涉及数据进出,使用 Elixir 都会获得出色表现。 所以我想我会为它贴上“通信语言”的标签。
Evrone: 对于软件开发人员来说,这是一个很不错的宣传标语! 语言的受欢迎程度会受到大公司采用的影响。 对于这些公司,Elixir 的卖点是什么? 能和我们分享一个成功案例吗?
José: 一开始,我知道自己必须到处宣传这门语言,参加活动,进行演讲,并编写各种材料。 从那时起,我就开始这样做了。 但说到向企业进行销售时,我觉得没有一个特定的答案。 我们可以采取不同的方式。 我一直感到很幸运能够拥有非常擅长推动销售的联合创始人和合作伙伴。 我会从技术方面考虑,然后我们有精通业务的专家负责业务方面,两者结合就能产生更好的效果。 所以听取大家的意见很重要。 我们从来不想集中化,因为每个人都可以带来不同的观点。
Evrone: 是的。 销售很难,给一件东西命名同样很难。 实际上,我们在 Elixir 论坛上偶然发现了名称来源的问题。 “Elixir”这个名字是怎么来的? 有人提到了 Potion,一个由网名为“_why the lucky stiff”的人设计的语言。 你们见过面吗? 能跟我们透露一下这个 RPG 风格的名字的由来吗?
José: 我只是通过“ _why the lucky stiff 编写的软件知道他的。 我没有见过他本人,他在我之前就已经活跃在 Ruby 中了。 Elixir 这个名称与 Potion 没有关系。 我喜欢 Elixir 这个名字是因为它很短,但又不是特别短。 在编程中没有其他东西叫这个名字。 有书和香水叫这个名字,但技术方面的没有。 另外,它的首字母与 Erlang 相同。 它能在按照字母排序的列表中排在比较靠前的位置。 它很简洁,和 Erlang 一样由六个字母组成。 所以我当时想,好吧,就用这个名字吧。
Evrone: 原来如此。 你会如何衡量想要学习 Elixir 的开发人员的学习曲线? 对于只有一两年经验的初级开发人员来说,这是否是一门合适的语言? 为了充分发挥你创建的语言,新的开发人员需要哪些基础?
José: 这个问题问得很好。 有的人能够高效、快速地掌握概念,有的人则不能。 我个人认为,Elixir 的心智模型比面向对象更容易掌握。 但人们学习和研究事物的方式往往不同。
我总是拿我的朋友 (Hugo Baraúna). 来对比。 我们是在大学里认识的,我俩的学习方法截然不同。 对于一个漆黑的山洞,我会直接进洞探索,看看能否有所收获。 我是没有耐心的学习者。 而 Hugo 则是一个很有条理的人。 如果他要探索一个山洞,他会事先准备专用的灯和所有合适的工具。 他会在采取任何行动之前安排好一切。
我知道有人尝试过将 Elixir 教给没有编程经验的人。 而且他们成功了。 有些人有 JavaScript、Python、Ruby、.net、Java 的基础,他们从中获得了巨大乐趣,并且提高了工作效率。 其他人则疲于应对。 我听说有些人在第一次没有取得实质性进展之后,会尝试第二次或第三次学习 Elixir。 第二次学的时候会好一点。 等到第三次学的时候,所有东西就都开窍了。
好消息是:现在这个阶段,我们能从社区获得大量学习资源。 如果你是一位新手程序员,Elixir 网站的入门指南可能节奏太快且缺乏深度。 但我们有 O'Reilly 出版的 Introducing Elixir, 和 Ryan Bigg 撰写的 Joy of Elixir, 这两本书是初学者的理想选择。 Programming Elixir 对于 Ruby、Python 或 JavaScript 等动态语言出身的人来说是一个很好的资源。
由 Saša Juric 撰写的 Elixir in Action, 是一本从系统的角度讲授 Elixir 的书。 这本书没有将 Elixir 作为一种编程语言,而是将 Elixir 作为了一种构建系统的工具。 还有录屏教学、在线课程等资源。如果你是像我这样的人,没有太多耐心阅读,只想动手尝试,那么也有许多可以进行练习的地方。 既然我们有这么多资源,你可以挑一些试试,看看哪些资源比较适合你。
Evrone: 我们知道 Elixir 的灵感来自 Ruby、Clojure 和 Haskell。 现在回想起来,还有哪些东西给你带来了灵感?
José: 没错。 灵感的三个主要来源是:Ruby、Erlang 和 Clojure。 我们不仅获得了这些语言的特点,还汲取了它们的部分理念。 我们继承了 Erlang 的整个基础架构。 我们有许多类似 Clojure 的处理问题的方法,比如协议。 而 Ruby 则体现在语法、标准库和命名方法上。 我们从这三种主要语言中获得了关于编程语言的特点、理念和整体样貌的构思。 我们还借鉴了许多东西,其中包括 Haskell、Python 和 F#。
Evrone: 采访者经常会问一门语言设计最成功的地方和设计最失败的地方,但是根据采访经验,只问设计的成功之处比较好。 Elixir 设计最成功的地方是什么?
José: 好的,这是一个很好的问题。 当我开始设计 Elixir 的时候,我构建了一个原型,它在很多方面表现都不好。 我有点像那个在漆黑的山洞里迷路的人,试着把东西扔出去,看看在什么地方卡住。 失败之后,我就能想出我希望在这个语言中实现的东西。 我的起点是 Erlang,我想在它的基础上构建 Elixir。
我有两个目标:可扩展性和生产力。 生产力就是专注于拥有真正好的工具。 注重工具和开发经验的还有其他语言(比如 Ruby)。 而最近的一个例子是 Go 语言,它从一开始就非常注重拥有非常好的工具。 可扩展性可以归结为两点。 一个是协议。 协议的问题是多态性的问题。 我研究了不同的语言对这个问题的解决方法。 Clojure 用更适合 Erlang 虚拟机的方式解决了这个问题。 因此我借鉴了这一点。
可扩展性的另一个方面是元编程。 我尝试了在 Elixir 中进行元编程的不同方式。 最初,是基于 Ruby 的模型。 但 Ruby 适用于在运行时动态变化的内容,不适合 Erlang 虚拟机。 编译代码后,我们希望代码是静态的。
然后我尝试了像 Clojure 这样的 LISP 语言,它们有基于抽象语法树 (AST) 的元编程。 从那里获得的经验很受用,但我不想实现 LISP。 这条路已经有人走过了,而且已经有许多人为 Erlang 虚拟机完成了这项工作。 我想做一些不同的事情。 因此,我决定引入一种更高级的语法,具有直接的 AST 表示法,供开发人员进行元编程。 有一段时间,我以为这是我设计的最大成功之处!
不过,后来我才知道,作为 LISP 发明者的 John McCarty 也曾考虑过这一点。 他引入了 SLISP,也就是今天大家所说的 LISP。 而且他还引入了 MLISP,一种更高级的语法。 所以我的想法实际上是一个有 50 年历史的想法,但我认为 Elixir 是少数几个在实践中使用它的语言之一。
因此,我想我们可以说我设计的最大成功之处是博采众家之长,并以最有凝聚力的方式将有意义的东西引入 Erlang 虚拟机。
Evrone: Elixirforum.com 非常受欢迎。 从你的角度来看,这个资源对于 Elixir 社区来说有何独特之处,与其他使用邮件列表、群组、Reddit 和 StackOverflow 的语言和生态系统相比,拥有自己的社区平台会有什么不同吗? 它是怎么创建的? 它对语言的发展有什么重要意义?
José: 我一直想让 Elixir 成为大家共同的努力。 我没有试图对它进行集中化管控,我想给每个人提供发挥的空间或机会,让他们做出自己的贡献,并以他们觉得舒服的任何方式参与其中。 我们几乎没有由 Elixir 团队控制的官方空间。 所以我们一直非常欢迎想要创建自己空间的人。
甚至还有语言上的障碍。 比如,我知道巴西有一个很大的 Elixir Telegram 社区。 因此,更重要的是让这些社区独立发展,并且以符合我们为社区制定的标准和目标的健康方式发展。
对于 Elixir 论坛,情况也差不多。 Aston 创建了这个论坛,拥有一个新的空间真是太好了。 是他推动论坛的发展,才有了今天的成就。 我经常逛这个论坛,看看有没有我能帮忙的地方。 但是,就目前而言,这是其中一个社区,还有很多其他社区。
Evrone: 真了不起。 你会为 Elixir 开发人员推荐哪种 IDE?
José: 我不太关注编辑器。 我大概用了十年的 TextMate 1.0,甚至在它不再维护之后我还在用。 最后因为系统不再支持它我才停止使用。 后来我转到了 Sublime Text,但很多编辑器的功能我都没有用。 我会使用一个格式化代码的热键,仅此而已。 我知道有很多人因为 Elixir 语言服务器而使用 Visual Studio Code。 有很多出色的开发人员正在研究语言服务器,并且每天都在使集成变得越来越好。 因此,这似乎是一种普遍的偏好。
Evrone: 真不错。 接下来是技术问题。 对于新的“异步”范式与“消息传递”,你怎么看? 除了性能和稳定性问题之外,哪个更容易被开发人员理解?
José: 异步/等待在不同的语言中是以不同的方式实现的。 有些语言实现异步/等待是为了提供基于 I/O 的并发。 其他语言则不是,我们需要进行区分。 所以,我们退后一步。
在讨论软件时,你要考虑两种并发类型:基于 CPU 的并发和基于 I/O 的并发。 像 Erlang 和 Go 这样的语言表明,你不需要异步/等待就可以具有基于 I/O 的并发。 完全没有必要。 从这个角度来说,我不喜欢将异步/等待模型用于提供基于 I/O 的并发,因为没有必要。 这会把基于 I/O 的问题推给我的软件,使问题更加复杂,而不是更加容易。 因为这是语言应该解决的问题,而不应该逼着我这个开发人员去解决。 另一方面,Elixir 确实有异步/等待机制,但这只是为了方便,它是基于 CPU 的并发。
我想在这一点上进一步扩展,因为这就是 Erlang 让我感到兴奋的原因。 我爱上 Erlang 的原因是,当其他语言都在试图解决并发问题的时候,Erlang 用同样的抽象来提供并发和分发。 我可以让两个实体运行在不同的机器上,并且它们可以相互通信。 这个同样的抽象也为你提供了一个考虑故障和容错的模型。 当涉及到 I/O 时,你无需编写回调或反转控制流,运行时会为你处理。
这就是 Erlang 真正令人兴奋的地方。 它是参与者模式的扩展。 它是参与者模式外加容错能力。 它封装了许多内容,这对于像我一样的开发人员的意义是,我不用记那么多东西了。 我不用学习适用于某个特定概念的一大堆不同的工具或不同模型。 我有一个抽象来控制这一切,我觉得这非常优雅。
Evrone: Elixir 未来最理想的情况是什么? 如果一切都(非常)顺利的话,你觉得 10 年后这门语言会怎样?
José: 我还真没好好想过这个问题。 设计一门编程语言需要巨大努力,而这些努力大部分都会“失败”。 我知道,从某种意义上来说,这在时间和金钱上是一种巨大投入。 我不想对它抱有很高的期望,因为如果它没有成功,我会想“哦,它失败了,很正常,这在预料之中。” 所以我一开始就是这么做的。 但我还是想尽力而为。 我希望得到一个不依赖于爆款应用,但可以用于不同领域的多样化语言。 而且我希望能有一个温馨的社区。
这些年来,我的长期计划基本还是一样的。 而我还是很希望看到这门语言能够多元化地发展到新的领域。
例如,机器学习 (ML) 领域正在快速发展,如果 Elixir 能够参与其中,那就太棒了。 在 ML 中,当你想识别一个东西是狗还是猫的时候,并不是像“哦,这是一只狗,或者这是一只猫”这样的单一问答。 你会把它分成很多属性。 它是不是有猫的耳朵? 它是不是有狗的鼻子? 因此,你实际上需要做的是分布式学习,希望不同的节点关注特定的特征,最后得出一个特定的结论。
分布式学习,希望不同的节点关注特定的特征,最后得出一个特定的结论。 Elixir 非常擅于处理这类问题。 因为在这种分布式的并发学习中,你必须协调同时发生的许多事情,这门语言在这方面非常擅长。
Evrone: 如果你能回到过去,给刚开始开发 Elixir 时的自己提一条技术上的建议,你会给出什么建议?
José: 老实说,我也不知道。 不是说我没有任何建议,但时间旅行是非常复杂的。 如果我进行了时空旅行,然后给出建议,不小心教年轻的自己把事情搞砸了怎么办? 你怎么能确定改变过去的结果是好还是坏? 也许有些事情不能走捷径。
Evrone: 确实。 你觉得哪些语言是 Elixir 的竞争对手,为什么?
José: 总的来说,我会说是其他动态语言。 但如果我们深入每个使用 Elixir 的特定领域,可能会有不同的竞争对手。 如果我们说的是 Web,那么很明显是 Javascript 和 Ruby。 如果是数据处理,那么竞争对手很可能是 JVM。 但总的来说,我会说是其他动态语言,因为考虑到它们的特性,动态语言给人的感觉往往是相似的。
Evrone: 你为这门语言、生态系统和社区做了很多工作。 是什么帮助你保持工作和生活的平衡,而避免产生倦怠感?
José: 有很多方面。 我的第一条建议是屏蔽一切干扰,就像你的电脑一直处于“请勿打扰”模式一样。 这样你才能专心致志并保持理智。 在家办公的结果是人们越来越疏远,越来越依赖在线交流方式。 我会十分主动地减少需要我关注的事情。 如果有重要信息,它可能会通过其他方式提供给我,没有关系。
例如,过去我在 Twitter 上非常活跃,但是后来我决定放弃 Twitter。 我曾经关注过很多我可以学到知识的人,因为他们会在 Twitter 上介绍新的东西。 我曾经担心,一旦我不再关注这些消息,我将无法获得那些信息,但事实证明没有关系。
我已经远程工作十几年了。 进入 2020 年后,对我来说并没有太大变化。 我手机上也没有装那些东西,因为不然,你真的很容易分心。 你和朋友出去玩,然后通知弹出来,你就会想看一下。 我会尽量远离让我分心和试图吸引我的注意力的东西,那些东西会让我无法把注意力集中在当前应该要做的事情上。
Evrone: 很棒的建议! 很高兴能和你交谈。 谢谢!
总结
我们与 José 进行了一次非常愉快的交流,进一步了解了他构建 Elixir 的方式以及他开发这门语言的经历。 同时,我们也要感谢 Ruby Conf Taiwan 为本文提供的图片。 在 Evrone,我们经常使用 Elixir 来创建满足客户独特需求的定制解决方案。 我们很高兴有机会向技术创始人学习,因为我们可以借此加强我们的专业知识,并获得更多工具来开发具有创新性的新产品。 如果您有项目希望通过 Elixir 获益,请联系我们,我们将竭诚为您服务。 请留下您的联系方式,我们将尽快与您联系,讨论您的构想及其实现方式。