如果您关注我的博客,您可能已经注意到我的文章通常围绕一些深层次的技术问题以及如何使用令人惊叹的 Elixir 编程语言来解决这些问题。这些帖子通常讨论围绕 Elixir 和 Erlang 虚拟机的技术优点,但很少涉及 Elixir 的“人性”方面。今天这篇文章的目标是解决 Elixir 编程语言的一些非技术方面,并讨论它们对您的工程师和您的业务可能产生的深远影响。我将首先解决我在 Elixir 中遇到的最常见问题之一——“很难找到 Elixir 开发者”。这篇文章由数字产品咨询公司 DockYard 赞助,以支持 Elixir 社区并鼓励其成员分享他们的故事。为了证实我将要提出的主张,我将依靠我过去的一些行业经验,并将与您分享一些真实世界的故事(为了保密,当然省略了名字)。举个例子,我已经专业地使用 Elixir 五年多了,虽然我在第一份 Elixir 工作时不是初级工程师,但当谈到 Elixir 编程语言时,我仍然是新手。事实上,正是在阅读了 Saša Jurić 的 Elixir in Action 之后,我才积极寻找一份工作,以 Elixir 为我开发的主要语言。你没看错——Elixir 语言和 Erlang 虚拟机给我留下了如此深刻的印象,我发现有必要找一份工作,其中 Elixir 占据了我一天的大部分时间。一开始我以为这个故事对我来说是独一无二的,但随着我越来越沉浸在 Elixir 社区和生态系统中,我发现这种经历其实很普遍。与我共事的许多工程师都积极寻找 Elixir 特定的机会,因为他们非常喜欢这种语言和运行时间(我将在稍后的帖子中详细说明原因😉)。最近的 StackOverflow 开发人员调查也支持这一点,其中 68.2% 的使用 Elixir 的人希望继续使用 Elixir。在一些比较中,Go 获得了 67.9% 的评分,而 Javascript 获得了 66.8% 的评分。当我在一家公司面试工程候选人时,情况也是如此。人们对这种语言感到非常兴奋,并特别寻找使用 Elixir 的公司,以便他们可以继续使用一种让他们感到高兴的语言。更不用说每当我参加工程职位的面试循环时,我们总是有大量优质候选人可供选择。正如 Renan Ranelli 在 2017 年 ElxirConf 演讲中所描述的那样,这种观点已得到其他人的证实。这向我表明 Elixir 编程语言具有很高的保留率,工程师们热衷于使用它。此外,考虑到 Elixir 社区对使用该语言非常活跃和兴奋,它消除了选择 Elixir 进行项目的风险,因为担心没有人可以维护该项目。在我看来,采用 Erlang、Elixir 和其他 BEAM 语言的大公司也反映了这一点(一些案例研究请参见此处、此处和此处,并确保注意列表中的一些大牌)。一般来说,较大的公司往往会走在技术的老路上,很少采用已经感知到风险的东西。跨越鸿沟,但要考虑技术而不是产品。随着一些科技巨头现在采用 Elixir,我想说这种语言已经很清楚了,正在走向更广泛的采用。
鉴于 Elixir 社区比 Javascript 或 GoLang 社区小,您可能会好奇到哪里寻找工程候选人。根据我的经验,寻找 Elixir 特定工程师的最佳地点是: 另一种选择是寻找专门从事 Elixir 的咨询公司。那里有很多,所以一定要环顾四周,看看谁的产品最符合你的需求。如果您找不到 Elixir 工程师或没有预算聘请任何额外的工程师,但您仍想从 Elixir 社区/语言中获益并为您的公司定位,该怎么办?幸运的是,学习 Elixir(即使作为您的第一语言)比您想象的要容易。注册邮件列表并在新博客发布时通过电子邮件收到通知。我最喜欢 Elixir 的一个方面是语言本身非常小但非常强大。换句话说,没有很多关键字或结构需要内化才能使语言高效(至少在最初)。这反过来又会产生两个重要的影响: 新的团队成员可以相对快速地使用新的代码库提高工作效率(请阅读本文以获取更具体的示例)。不熟悉该语言的团队成员可以相当快地掌握它并在创纪录的时间内提高工作效率。
事实上,当我指导团队的新人和 Elixir 新人时,他们通常只需要几天时间就可以完成 Elixir 学校课程和 Elixir 入门指南。之后,他们准备接受功能票并为该项目做出贡献。鉴于很多 Elixir 代码都是基本模块和功能,人们很乐意扩展现有项目并添加新功能。该语言的功能方面还帮助人们快速加入新项目,因为他们不必太担心改变对象状态和整个系统可能产生的涓滴效应。它主要是关于组装所需数据(有时在结构中),通过一系列纯函数传递数据,并在最后处理/保留结果。在我看来,这种模式允许团队的新成员专注于手头的业务问题,而不是担心编程语言或运行时的细微差别。他们不必担心引用传递、值传递或下游函数是否纯。听到您和您的团队可以从这种“模块和功能”模式中获得多少成就,您会感到惊讶。幸运的是,Elixir 语言和 BEAM 运行时间的上限要高得多,并且有可供学习的资源生态系统中一些更复杂的方面,例如多节点应用程序、有状态进程、宏和通过参与者模型进行的应用程序设计。幸运的是,Manning 和 The Pragmatic Bookshelf 这个部门有一些非常棒的书。在学习 Elixir 时要考虑的另一个重要方面是它提供的惊人的开发人员体验以及它如何帮助生态系统的新成员。对于 Elixir 老手和新人来说,需要考虑的一件重要事情是开发人员的体验是一流的。这直接影响人们掌握语言和生态系统库的速度。例如,HexDocs 托管发布到 Hex.pm 的所有库的所有文档,这反过来又为您提供了一种一致的方法来查找所有项目依赖项的文档。让所有库都使用相同的一致文档工具,让开发人员更容易知道在哪里可以找到问题的答案。 Elixir 非常重视文档,以至于它确实是一等公民。也可以在 REPL 中提取相同的文档,因此您可以在尝试解决问题时实时查看相同的文档。说到 REPL,能够在开发过程中通过 REPL 与实时应用程序进行交互和调试真的是一种了不起的体验。这使您能够实现 REPL 驱动开发的好处,因为即使在新功能完全连接到外部可使用的接口(例如 HTTP API)之前,您也可以快速验证它是否按预期工作。关于开发人员体验,我将涉及的最后一项(因为我真的可以继续哈哈)是 ExUnit,第一方 Elixir 测试框架。 ExUnit 作为一个测试框架,确实让工程师可以轻松地验证他们的代码是否符合他们的预期。这种易用性从初级一直延伸到高级工程师。无论您是简单地测试纯函数、验证访问数据库的整个 HTTP API 调用,还是验证 GenServer 是否正确启动/终止,ExUnit 和 BEAM 都提供了所有必要的工具来验证您的断言。我经常从人们那里听到的一件事是在 Elixir 中编写测试是多么容易和愉快。为了稍微说明这些要点,我从之前的工作中讲了一些轶事,我和我的团队帮助初级和高级工程师第一次学习 Elixir。这两个人都和我在同一个团队中,在某种程度上,我(以及其他团队成员)帮助他们在我们的代码库中提高了速度和生产力。
这个人最近刚从一个编码训练营毕业,在那里使用的唯一编程语言是 Javascript。结果,这个人对学习一门新语言的前景有些不知所措。在完成了 Elixir School 课程和 Elixir 入门指南之后,他们准备处理他们的第一张票。经过一些结对编程后,这个人能够在我们的应用程序中复制已建立的模式,并开始通过我们的 Absinthe GraphQL 公开新功能应用程序接口。对于刚接触编程的人来说,这个人完成功能的速度如此之快,以及在 PR 阶段需要做的打磨工作如此之少,给我留下了深刻的印象。我认为这在很大程度上与前面提到的项目有关。语言本身相对较小,因此工程师能够专注于业务逻辑,而不是沉迷于创建新对象、继承、可变状态或运行时细微差别,如全局解释器锁或事件循环。经过几次 Zoomcalls 和一些结对编程后,工程师偶然发现的概念很容易解决。其中一些概念包括模式匹配和宏。对于模式匹配,我发现最好在我的编辑器中浏览一堆示例,并向它们展示您可能经常看到模式匹配表达式的位置,以及如何确定将执行的内容和时间。例如,我们通过几个函数头模式匹配示例,在我的解释结束时,他们了解到 Elixir 中的模式匹配有点像 Javascript 的赋值破坏,但功能更强大,对应用程序控制流也很有用。在解释 Elixir 的宏时,主要是向工程师指出该特定库的文档,并解释虽然这些语句看起来像是内置于 Elixir 关键字中,但它们实际上是由库实现的。在这种特殊情况下,由于他们主要使用 Absinthe,因此需要向他们展示 Absinthe 文档并解释在幕后,Absinthe 正在生成一堆他们无需担心的代码。他们需要关注的只是宏的使用(由文档 https://hexdocs.pm/absinthe/our-first-query.html#content 概述)以及学习编写自己的宏(应该仅在实际需要时完成)随着时间的推移对语言的熟悉程度增加。在重组后,这个人实际上继续帮助另一个团队使用 Node 微服务,并且经常给我发一条消息,告诉我他们多么想念使用 Elixir 的工作,以及生产 Javascript 和 Node 有多复杂。我提到这一点并不是为了给 Node 或 Javascript 蒙上阴影,而是要说明即使某些东西可能无处不在,但它并不容易学习或理解。对于第一次学习 Elixir 的高级工程师来说,大部分的学习障碍都与更高层次的概念有关。这个人在这个时候已经在这个行业工作了一段时间,并且使用了各种不同的语言,包括一些函数式语言。通过 Elixir School 课程和 Elixir Getting StartedGuide 仍然是很好的起点,但是当真正了解 GenServer 到底是什么或如何使用 actor 模型来构建解决方案时,需要额外的解释。虽然许多编程语言将actor 模型实现作为第 3 方库,但 BEAM 语言(包括 Elixir)将其作为运行时的一等公民。在解释什么是 GenServer 时,我发现一些结对编程和一些 REPL 实验确实有助于推动它们只是 Erlang 虚拟机上的进程,可以用于封装状态或异步执行任务。显示 GenServer 的生命周期以及何时调用某些回调也很容易。当一个 GenServer 变成数千个 GenServer 以及如何最好地协调和管理它们时,事情变得有点困难。这引发了关于监督树、流程注册以及如何将所有部分联系在一起的讨论。这些讨论集中在如何构建系统以及 Elixir 和 BEAM 提供给您的原语如何真正让您构建健壮且容错的系统。这些讨论的一些要点包括 BEAM 如何真正为您提供很多开箱即用的功能(例如节点间通信),并且它推迟了对 Redis 等外部系统依赖项的需求。总而言之,这个人能够在很短的时间内非常高效,并且能够看到 Elixir 的优点,不仅在语言方面,而且在运行时方面。
虽然有时事情可能并不全是蝴蝶和彩虹,但如果您需要帮助,有很多地方可以查看。根据我的经验,寻求帮助的最佳地点是 Elixir Slack 和 ElixirForums。虽然 StackOverflow 上偶尔会有一个问题的答案,但我发现我的大部分问题在上述两个平台上得到了更频繁的回答。 BEAM Book 当我需要了解 Erlang 虚拟机的内部工作原理时。干得好,感谢你坚持到最后!我们涵盖了很多领域,希望您在此过程中学到了一些很酷的技巧和窍门。回顾一下,我们讨论了在当前工程市场中聘请 Elixir 工程师的能力以及一些寻找优质候选人的好地方。我们还讨论了 Elixir 中的开发人员体验,以及这对于不考虑资历的新人来说如何转化为温和的学习曲线。最后,我们讨论了一些额外的资源,以帮助您完成学习之旅。随意留下评论或反馈,甚至是您希望在下一篇文章中看到的内容。直到下一次!注册邮件列表并在新博客发布时通过电子邮件收到通知。由 Disqus 提供支持的评论