在线版本: https://livebook.manning.com/book/elixir-in-action-third-edition/
第二版赞誉
本书对 Elixir 和 Erlang/OTP 进行了权威的介绍,内容广博精深,令人印象深刻。
——Eoghan O’Donnell,Trellis Energy
本书由 Elixir/OTP 平台的权威专家之一撰写,文笔流畅,带您探索和重新认识 Elixir/OTP。
——Mafinar Khan,Tread
本书是一本温和、清晰且引人入胜的 Elixir 指南,充满了实用建议。
——George Thomas,Manhattan Associates
Saša 以通俗易懂、引人入胜的方式,阐述了 Elixir 最强大的功能。
——Frederick Schiller,Swift Labs
我最初对 Elixir 的了解非常有限,但几周后,我就能编写出一个高度可扩展且
弹性良好的生产系统。
——Ashad Dean,Cytracom
这是我见过的对 Elixir 和 OTP 最出色、最易懂的入门读物。
——Mathias Polligkeit,grandcentrix
这是对 Elixir 这门语言独特概念的最佳入门介绍,强烈推荐。
——Daniel Couper,SoPost
序言
成功的编程语言是为了解决现有语言和工具无法很好地解决的问题而发明的。当我问 José Valim 创建 Elixir 时想要解决什么问题时,他回答说,他想把 Erlang 和 BEAM 的强大功能带给其他程序员群体。他首先通过 Phoenix 框架进军 Web 领域,随后成功地将 Elixir 引入嵌入式和机器学习领域。“你们当时想解决什么问题?”这个问题我问过几十位语言发明者,他们的回答各不相同。José 是第一个这样回答的,他表示,他的重点在于借鉴 Erlang 的思想、语义和运行时环境。Erlang 是另一种极其强大的语言。他通过不同的语法、工具和开发方法解决了这个问题。
Erlang 的共同发明者 Joe Armstrong、Robert Virding 和 Mike Williams 又想解决什么问题呢?他们致力于探索如何更好地、更高效地构建和维护可扩展、容错的系统。这些系统在 20 世纪 90 年代初期通常与电信交换机相关,但很快,它们就适用于任何连接到互联网的软件。他们的解决方案恰好是一种编程语言,即使他们最初并没有打算发明一种语言。
Erlang 最终被用于思科、爱立信、Klarna、高盛、T-Mobile、WhatsApp 和亚马逊等众多顶级公司的主要基础设施项目中。
随着更多编程语言被添加到 BEAM 中,Erlang 及其运行时环境发展成为一个语言生态系统,如今被称为 Erlang 生态系统。
毫无疑问,Elixir 是这些语言中最流行的。
那么,这一切与你即将阅读的这本书有什么关系呢?很简单。要真正理解并掌握 Elixir 的强大功能,你需要同时理解Erlang 和 OTP。我并不是建议你去学习这些语言,而是建议你向一位在Erlang专业领域工作多年,之后才转而使用Elixir的人学习。Saša Jurić通过解释Erlang的独特之处,向你展示如何高效地使用Elixir。解释Erlang的工作原理,让你了解Elixir的本质和实现方式。这正是《Elixir实战》与其他同类书籍的不同之处。我希望你也能像我一样享受学习的过程,不仅学习一门编程语言,更了解整个生态系统的理念。
祝你编程愉快!
——FRANCESCO CESARINI
ERLANG SOLUTIONS创始人;
OTP R1版本开发团队成员;
《ERLANG编程》和《使用ERLANG/OTP进行可扩展性设计》合著者;
ERLANG生态系统基金会创始成员;
牛津大学高级讲师
前言
2010年,我受命开发一个系统,用于向几千个联网用户近乎实时地传输频繁更新。当时我的公司主要使用 Ruby on Rails,但我需要更适合这种高并发挑战的方案。在首席技术官的建议下,我研究了 Erlang,阅读了一些资料,制作了一个原型,并进行了负载测试。我对初步结果印象深刻,于是决定用 Erlang 实现整个系统。几个月后,系统上线,并且一直稳定运行至今。
随着时间的推移,我越来越欣赏 Erlang 以及它帮助我管理如此复杂系统的方式。渐渐地,我开始更喜欢 Erlang 而不是我以前使用过的技术。我开始推广这门语言,首先是在公司内部,然后是在一些本地活动中。最终,在 2012 年底,我创办了博客 The Erlangelist( https://www.theerlangelist.com/ ),旨在向具有面向对象编程背景的程序员展示 Erlang 的优势。
由于 Erlang 是一门独特的语言,我开始尝试 Elixir,希望它能帮助我以一种能引起面向对象程序员共鸣的方式来阐释 Erlang 的魅力。
尽管 Elixir 当时还处于早期开发阶段(版本为 0.8),但我立刻被它的成熟度以及与 Erlang 的集成方式所折服。
很快,我就开始使用 Elixir 为我的基于 Erlang 的系统开发新功能。
几个月后,Manning 出版社的 Michael Stephens 联系了我,
他问我是否有兴趣撰写一本关于 Elixir 的书。当时,已经有两本 Elixir 书籍正在编写中。
经过一番考虑,我决定再写一本书,从不同的角度探讨这个主题,重点关注 Elixir 并发和 OTP 的思维方式。
写作这本书耗费了我大量心血,但却是一次非常有意义的经历。
这是本书的第三版,与第一版和第二版并没有本质区别。
主要内容是更新 Elixir 和 Erlang 的最新发展,例如,应用程序配置和 OTP 发布的新方法。
至此,《Elixir in Action》再次全面更新,教你使用 Elixir 构建软件系统的最新技术。
希望你喜欢阅读本书,从中获益良多,并有机会将新知识应用到你的工作中!
致谢
撰写本书耗费了我大量时间,因此,首先我要感谢我的妻子雷纳塔,感谢她在那些漫长的工作日和忙碌的周末里给予我的无尽支持和耐心。
我要感谢曼宁出版社促成本书的出版。特别感谢迈克尔·斯蒂芬斯,感谢他最初的联系;玛扬·巴切,感谢他给予我写作本书的机会;伯特·贝茨,感谢他为我指明了方向;凯伦·米勒和丽贝卡·约翰逊,感谢她督促我按计划进行;亚历山大·德拉戈萨夫列维奇和杜尼亚·尼基托维奇,感谢他们管理审稿流程;凯文·沙利文和文森特·诺德豪斯,感谢他们监督制作;蒂芙尼·泰勒、安迪·卡罗尔和克里斯蒂安·伯克,
感谢他们将我的“英语”润色成规范的英语;以及坎迪斯·吉尔胡利、安娜·罗马克、克里斯托弗考夫曼和拉德米拉·埃尔塞戈瓦茨,感谢他们对本书的宣传推广。
本书内容得益于审稿人和早期读者的宝贵反馈而得到显著改进。
尤其要感谢 Andrew Gibson,他提供了许多有益的反馈和深刻的见解,并在我遇到最后难关时伸出援手。
我还要感谢 Oleksii Sholik、Peter Minten 和 Marius Butuc,他们在写作过程中提供了非常及时的技术反馈。
非常感谢所有技术审阅者:Al Rahimi、Alan Lenton、Alessandro 坎佩斯、亚历山大·曾格、阿列克谢·加柳林、安德鲁·考特、阿里尔·奥蒂利比利、阿伦·库马尔、阿沙德·迪恩、克里斯托弗·芬克、克里斯托弗·贝利、克里斯托弗·豪普特、克莱夫·哈伯、丹尼尔·库珀、伊奥根·奥唐纳、弗雷德里克·席勒、加博尔·拉斯洛哈吉巴、乔治·托马斯、希瑟·坎贝尔、伊奥尼斯·波利索斯、杰罗恩·本克惠森、吉姆·阿姆莱因、约翰·马蒂森、豪尔赫·德夫隆、何塞·瓦利姆、科斯马斯·查兹米查利斯、拉斯洛·赫吉杜斯、马菲纳尔·汗、马克·瑞尔、马蒂亚斯·波利格凯特、迈克尔·皮斯卡特洛、莫森·莫斯塔法·乔卡、拉胡尔·辛哈、里扎·法赫米、西蒙·休伊特、西蒙妮Sguazza、Tijl Vercaemer、Tom Geudens、Tomer Elmalem、Ved Antani 和 Yurii Bodarev。
我还要感谢所有购买并阅读 Manning Early Access Program (MEAP) 版本并提供宝贵意见的读者。感谢你们抽出时间阅读我的絮叨,并提供富有洞见的反馈。
特别感谢 Elixir 和 Erlang 的创造者,包括最初的发明者、核心团队成员和贡献者。感谢你们创造了如此优秀的产品,让我的工作更轻松、更有趣。感谢 Francesco Cesarini 为本书撰写的精彩序言。
最后,特别感谢 Elixir 社区的所有成员;这是我所见过的最友善、最友好的开发者社区!
关于本书
Elixir 是一种现代函数式编程语言,用于构建大规模、分布式、容错且可扩展的系统,适用于 Erlang 虚拟机 (VM)。虽然该语言本身就极具吸引力,但可以说,它最大的优势在于它面向Erlang 平台。
Erlang 的设计初衷是为了帮助开发者应对高可用性的挑战。最初,该产品旨在用于开发电信系统,但如今,它已被应用于各种领域,例如协作工具、在线支付系统、实时竞价系统、数据库服务器和多人在线游戏等等。
如果您正在开发一个必须为全球众多用户提供服务的系统,您肯定希望该系统能够持续运行,不会出现明显的停机时间,无论运行时出现任何软件或硬件问题。否则,频繁且严重的故障会让最终用户感到不满,他们最终可能会寻求其他解决方案。频繁宕机的系统不可靠且无法使用,因此无法实现其预期用途。因此,高可用性变得越来越重要——而 Erlang 可以帮助您实现这一点。
Elixir 旨在现代化并改善基于 Erlang 的系统开发体验。该语言融合了 Erlang、Clojure 和 Ruby 等多种其他语言的特性。
此外,Elixir 还附带一套工具集,可简化项目管理、测试、打包和文档构建。可以说,Elixir 降低了进入 Erlang 世界的门槛,并提高了开发人员的效率。
以 Erlang 运行时作为目标平台意味着基于 Elixir 的系统能够使用 Erlang 生态系统中的所有库,包括 Erlang 自带的久经考验的 OTP 框架。
谁应该读这本书?
本书是一本教程,教你如何构建可用于生产环境的基于 Elixir 的系统。它并非 Elixir 和 Erlang 的完整参考手册——它并未涵盖语言的每一个细微差别,也未涉及底层 Erlang 虚拟机的每一个方面。它对许多主题进行了简要概述或略过,例如浮点精度、Unicode 细节、文件 I/O、单元测试等等。虽然这些主题很重要,但它们并非本书的主要关注点,你可以根据需要自行研究。省略或快速处理这些常规主题,让我们有空间更详细地探讨更有趣、更不寻常的领域。并发编程及其如何帮助系统实现可扩展性、容错性、分布式和高可用性,是本书的核心主题。
本书涵盖的一些技术并未进行详细讨论。为了简洁和聚焦,我省略了一些细节。我的目标并非提供全面的讲解,而是教你理解其基本原理,以及每个部分如何融入整体框架。读完本书后,你应该能够轻松地自行研究和理解剩余的细节。为了为你指明正确的方向,本书中穿插提及并提供了更多相关主题的链接。
由于本书涉及中高级主题,在阅读之前,你需要具备一些先决条件。我假设你是一位拥有几年经验的专业软件开发人员。你精通的具体技术并不重要:可以是 Java、C#、Ruby、C++ 或其他通用编程语言。任何后端(服务器端)系统开发经验都会有所帮助。
你无需了解 Erlang、Elixir 或其他并发平台。尤其需要注意的是,你无需了解函数式编程。Elixir 是一种函数式语言,如果你之前接触过面向对象编程,可能会有点害怕。作为一名资深的面向对象程序员,我可以真诚地告诉你,不必担心。Elixir 中函数式编程的基本概念相对简单,应该很容易理解。当然,函数式编程与你之前接触过的典型面向对象语言有很大的不同,需要一些时间来适应。但这并非难事,如果你是一位经验丰富的开发者,理解这些概念应该不成问题。
本书结构概述:路线图
本书分为三个部分。第一部分介绍 Elixir 语言,呈现并描述其基本构建模块,然后更详细地讲解常见的函数式编程惯用法:
■ 第 1 章概述了 Erlang 和 Elixir,并解释了这些技术的用途以及它们与其他语言和平台的区别。
■ 第 2 章介绍 Elixir 的主要构建模块,例如模块、函数和类型系统。
■ 第 3 章详细解释了模式匹配及其在处理流程控制中的应用。
■ 第 4 章解释了如何在不可变数据结构之上构建更高级别的抽象。
第二部分在此基础上,重点介绍 Erlang 并发模型及其诸多优势,例如可扩展性和容错性:
■ 第 5 章解释了 Erlang 并发模型,并介绍了基本的并发原语。
■ 第 6 章讨论通用服务器进程——构建高并发 Elixir 和 Erlang 系统的基本模块。
■ 第 7 章演示如何构建更复杂的并发系统。
■ 第 8 章介绍错误处理的惯用法,重点关注并发系统中的错误和故障。
■ 第 9 章深入探讨如何隔离各种错误,并最大限度地减少其在生产环境中的影响。
■ 第 10 章讨论通用服务器进程的几种替代方案,这些方案有时更适合实现系统的某些部分。
第三部分讨论生产环境中的系统:
■ 第 11 章解释 OTP 应用程序,它们用于打包可重用的组件。
■ 第 12 章讨论分布式系统,它可以帮助您提高容错性和可扩展性。
■ 第 13 章介绍将基于 Elixir 的系统部署到生产环境的各种方法,尤其关注 OTP 发布。
关于代码
本书包含大量源代码示例,既有编号列表,也有与正文并列的文本。无论哪种情况,源代码都采用等宽字体排版,以便与普通文本区分开来。
在某些情况下,我们对原始源代码进行了重新格式化;我们添加了换行符,并调整了缩进,以适应本书的可用页面空间。此外,当代码在正文中有所描述时,我们已从列表中删除了源代码中的注释。许多列表都附有代码注释,突出显示了重要的概念。
您可以从本书的 liveBook(在线)版本获取可执行的代码片段,网址为:https://livebook.manning.com/book/elixir-in-action-third-edition/ 。本书示例的完整代码可从 Manning 网站下载,网址为 https://www.manning.com/books/elixir-in-action-third-edition ,也可从GitHub 下载,网址为 https://github.com/sasa1977/elixir-in-action/tree/3rd-edition 。
曼宁出版社致力于为读者提供一个平台,让读者之间以及读者与作者之间能够进行有意义的对话。这并不意味着作者必须参与论坛讨论,作者对论坛的贡献完全出于自愿(且无偿)。我们建议您尝试向作者提出一些具有挑战性的问题,以免他们失去兴趣!只要本书仍在印刷发行,您就可以通过出版社的网站访问论坛以及以往讨论的存档。
关于作者
SAŠA JURIĆ 是一位经验丰富的开发人员,擅长使用多种编程语言(例如 C#、Ruby 和 JavaScript)实现高流量、并发的服务器端系统,包括桌面和自助服务终端应用程序。在过去的 14 年里,他的主要职业方向是 BEAM 语言,尤其是 Elixir。近年来,他一直担任 Elixir 导师,帮助团队采用 Elixir 并将其应用于生产环境。他偶尔会在 https://www.theerlangelist.com/ 上发表关于 Elixir 和 Erlang 的博客文章。
关于封面插图
《Elixir in Action》第三版封面上的“俄罗斯女孩”形象取自托马斯·杰弗里斯(Thomas Jefferys)于1757年至1772年间出版的一本书。
在过去那个时代,人们很容易通过穿着来判断居住地、职业或社会地位。曼宁(Manning)以几个世纪前丰富多彩的地域文化为灵感,创作了一系列书籍封面,以此来颂扬计算机行业的创造力和进取精神。这些封面通过类似本书中的图片,重现了当时的景象。