学习 Elixir 如何让我成为更好的程序员
想看更多类似的精彩内容吗?订阅我的新闻邮件,请访问:alec.coffee/signup
在熟悉了几种编程技术之后,开发人员通常会就此止步;你的工作和你维护的系统可能都只使用一两种语言。你会开始一遍又一遍地使用类似的模式来解决相同的问题。Elixir,一种相对较新的编程语言,让我见识了打破这种停滞思维的新技术。学习一门新的编程语言可以让你接触到使用现有技术永远无法接触到的技术。它扩展了你设计新系统的工具箱。想象一下,一个木匠多年来一直使用一套特定的工具,他们能建造的东西将受到限制。在学习了多年的编程语言(学校、合同工、合作社等)之后,摆脱那种专注于尽快完成任务的思维模式,感觉很新鲜。没有时间表告诉你要以什么样的速度学习,也没有同事指望你完成你正在做的事情。我发现在这种轻松的环境中,更容易消化更大的认知负荷。
![]() |
TLDR 简介
-
Elixir 只是 Erlang 之上的语法,Erlang 是建立在 BEAM VM 之上的经过实践检验的语言
-
语法与 Ruby 类似,因此学习语法简单快捷,特别是对于熟悉它的开发人员来说
-
我有没有提过它是函数式的?(在我看来,纯粹的函数式编程在认知上是值得投入的,点击这个链接看看 Elixir 是如何利用它的)
学习一门新近诞生的编程语言的好处之一是,它建立在现有的最佳实践之上。这源于其创始人花时间思考其他开发者经常遇到的问题。“状态管理很难”、“新代码很难做到零时部署”、“我的系统很难维护”,这些都是每个开发者都会想到的问题。Elixir 希望让这些问题变得简单,它采用了函数式方法,并封装在虚拟机中,将分布式/并发编程置于优先地位。
例如,Elixir 的开发者们看到了 Ruby 语法的高效性、函数式编程的可维护性以及 Erlang 的可扩展性。正如上面模式匹配示例所示,该语言的这些特性使其成为一门新近诞生的语言的有力证明。
例如,Elixir 是由那些看到了 Ruby 语法的生产力、函数式编程的可维护性和 Erlang 的可扩展性的开发人员构建的。
电线与电线连接
![]() |
Elixir 坚如磐石的基础建立在一个名为OTP的库之上。OTP 是一种优雅的方法,可以处理分布式编程中出现的所有问题,例如跨节点工作、处理异步消息等等。它不仅是一个函数库,更是一个工作范例。这使得跨系统和大型团队保持一致。Elixir 应用并非由单个进程(例如 Node.js)处理整个应用程序,而是由许多独立的进程组成。这些进程使用消息相互通信。这解锁了许多很酷的功能,由于消息只能是不可变的,不允许使用指针,因此进程现在可以跨机器运行。
你内心的批评者可能会说,使用这种新语言的潜在弊端在于它未经实战检验。通常情况下,这种批评是合理的,但 Elixir 的情况并非如此。它所基于的虚拟机 Elixir 已经非常老旧了。Erlang 的第一个开源版本发布于 1998 年,在此之前,爱立信内部已经长期使用它。这些服务在电信网络中至关重要,不容宕机。例如,非常酷的热代码发布功能就是这样诞生的,它使开发人员能够在不关闭服务器的情况下发布新的 Erlang/Elixir 代码。
我的经历
![]() |
去年,一位同事邀请我加入他的读书俱乐部。“我们来学习这门新语言吧。”我听说这门语言最近很火,就答应了。我们每个月都会花几个小时一起学习《Elixir in Action 》这本书中的一章。起初,加入这个俱乐部让我感到有些忐忑,因为我比小组其他成员资历浅得多,但最终我还是尝试了一下。接下来的讨论非常精彩,我学到了很多以前从未涉足过的领域的见解。我很感激以前的自己同意加入,因为我不仅学到了很多东西,还与公司里原本可能永远无法联系上的同事建立了联系。它帮助我适应了Flipp对事件驱动系统(比如Kafka)的采用,让我接触到了管理进程间状态的良好实践。保持进程精简、纯粹和功能化是良好的工程实践,也是Elixir运作方式的支柱。我不需要立即构建任何东西或完成作业,我学习是为了享受学习的乐趣,并从中受益匪浅。
常见评论和问题
![]() |
我的团队不会高兴,因为在过去一周学习了 3 个 Javascript 框架之后,他们还要学习这个。
一旦你开始构建需要扩展或处理数百万个请求的东西,你的待命工单就会增加。这通常是因为你无法预测这种规模的流量,新功能推送通知后每个人都会开始访问你的 API。你现在如何处理这个问题,用 Node 或 Ruby 之类的工具?你只需增加盒子数量,然后在加载完成后减少它们。这会变得昂贵,开发人员不应该只是为了解决问题而花钱。Erlang VM 进程(与传统进程不同)是固定大小的,这是兆级的。在某种程度上,这基本上解决了这个问题。知道进程有多少内存,会给你带来神一般的能力。虚拟机可以准确地告诉服务器它可能使用多少内存。你不必崩溃并重新启动盒子,而是可以使用 HTTP 状态代码 429 来响应客户端。凌晨 1 点再也不会有意外的内存负载吵醒开发人员了!
好的,这很棒,错误是如何处理?
错误是 Elixir 中的一等公民。进程很小且相互隔离,因此当抛出错误时,只需转储被隔离的进程,无需转储整个应用进程的堆栈。由于进程代码量很小(这是 Elixir 的惯例),错误发生时也更容易调试。进程非常小,以至于每个进程都会有一个监视器(OTP 的另一个优势),它可以在进程终止时运行一些代码。例如,一个监视器可以重启进程,以便它能够接收更多消息。
![]() |
另外,Javascipt 中有一个关于模式匹配的提案,真是太棒了。这显然表明大家都在喝……等等…… Elixir。
![]() |
前进的道路
我希望这篇介绍能让你了解 Elixir 的一些强大功能,并鼓励你进一步学习。我只是粗略地介绍了 BEAM VM 的功能。最后附上一张图表,展示了 Elixir 在 Stackoverflow 上与其他流行语言的受欢迎程度对比:
![]() |
这种趋势是向上的,但要成为主流还有很长的路要走。
接下来,我的计划就是多写一些 Elixir 代码,熟悉它。HackerRank 有 Elixir 环境,所以它是练习语法的绝佳资源。接下来我想做的一件事就是开始用Phoenix写一些东西。
我在学习过程中使用的另一个资源是Meetup 上的 Elixir Toronto Meetup Group。
阅读资源
我们在读书俱乐部读的书是《Elixir In Action》。这是一本非常棒的书,详细介绍了整个语言及其特性。一开始节奏比较慢,但当你开始理解语法时,很快就会变得非常有趣。
![]() |
这是我开始读的另一本更容易理解的书。这本书很有趣,它介绍了 Elixir 成为一门引人注目的语言的主要特性。这本书令人心潮澎湃,因为它只是触及皮毛。
![]() |
文章来源:https://dev.to/aleccool213/how-learning-elixir-made-me-a-better-programmer--57jg最初发表在我的博客上。
喜欢这篇文章吗?不妨请我喝杯咖啡,支持我继续写下去。
想接收季度更新邮件吗?订阅我的新闻通讯