角落里的 ElixirElixir 编程

角落里的长生不老药 前言

2022-08-08  本文已影响0人  桂叶圣

角落里的长生不老药

欢迎 GitHub 点赞.

学习 Elixir 为什么那么难

Elixir 是一个非常优秀的编程语言. 一方面, 非常容易就能对这个语言有一个基本的理解;
但是另一方面, 用它来完成实际的工作的时候, 却又总时时感到手不应心, 磕磕巴巴.

我想这应该不是我一个人的感觉. 大概很多人和我一样, 感觉 Elixir 的知识琐碎,
难以对其有系统性的把握.

C++ 以语法丰富而著称, 虽然我不敢自信满满的说自己对 C++ 的所有语法都掌握,
但是掌握了最基本的语法, 就可以完成绝大部分的编程工作了. Elixir 的情况不同,
即使我读完三四本 Elixir 教程后, 写 Elixir 的代码, 还是感觉茫然不知所措.

所以会如此, 首先是因为 Elixir 的文档还不够完善. Elixir 这个语言, 背后没有大公司的支持,
现在的官方学习教程, 只介绍了这个语言最重要的概念, 距离作为全面的教程还差很远.
这一点和 Java 的官方教程对比的话就非常的清楚.

其次, 和 Elixir 的血统相关. Elixir 主要从 Erlang 和 Ruby 获自己的设计灵感.
当前 Elixir 社区的主要参与者, 也同时是这两个社区的活跃者,
所以 Elixir 社区的文档中, 存在大量的关于 Erlang 或者 Ruby 的隐形知识,
这进一步的加大了学习 Elixir 的难度.

从语言基因来说, 虽然 Elixir 是 Erlang 和 Ruby 的孩子, 但它毕竟是一个独立的语言.
我的很多困惑, 其实就是因为拿 Elixir 的特性与 Erlang 或 Ruby 硬类比而产生的.
还有一些是则是对 Elixir 特性来源的错误的识别, 比如本来来自 Ruby 的语法概念,
却错误认作了 Erlang 的, 或者反过来.
第三种是错误的预期, 比如 Erlang 或 Ruby 的特色语法, 却认为 Elixir 中也一样工作.
这些错误, 不是因为知道的少, 而是因为知道的多而引发的概念混乱.

这种情况, 在学习别的语言的时候, 或多或少都会有所表现.
但在学习 Elixir 的时候所以特别明显, 可能和我原来的知识背景有关.
我最熟悉的编程语言, 都来自同一个语言家族(也就是 C 语言家族),
其中的语法变异比较小. 但是无论是 Erlang 还是 Ruby,
与 C 语言家族之间的语法的差距都相当大.
而且, Erlang 和 Ruby 之间的差异也非常大.
这使得学习 Elixir 的时候新概念的密度非常高.

再次, Elixir 社区中, 对专业词汇的选择独具风格. 这种风格, 有些是受语言基因的影响,
比如应用程序, 客户端, 服务器等等概念, 在 Erlang 中的所指, 本来就和其他语言中的不同.
这种不同使得阅读相关文档后, 不能第一时间吸收, 把握其本质.
还有一些不是来源于概念的继承, 只能归结为社区的风格.
比如 Socket 在 Phoenix 中所指就和其他领域所指不同, 当然这些相对来说容易克服.

最后, 文档不完善, 概念的密集高, 语汇选择的独特, 所有这些因素综合在一起,
其结果就是各种概念的相关资料分散在不同的地方. 学习的材料来源的分散,
使得学习相关特性时, 自然就是零散而不是系统的.
这进一步的加剧了, 学习 Elixir 不系统的感觉.

本书的缘起

我喜欢 Elixir, 不但因为 OTP 平台提供的程序自愈功能, 还因为 Elixir 语法的优雅与务实:
作为一个函数式编程语言, 第一不关心范畴论, 第二不强调 Point-free style[1].
而这些是我以往以其他语言为工具, 学习函数式编程的过程中, 遇到的最大障碍.

范畴论固然让我迷惘, 我总是记不得各种函子到底有什么对应的函数,
这还可以归结为自己没有用心记忆; 但更让我沮丧的是 Point-free style.
Point-free style 让我感觉惊艳, 在学习函数式编程之前,
从来没想过代码可以这样的若合符节.
这样的代码, 在我的智力理解范围之内, 因此总感觉自己也可以做到.
幻想使用这样的编码方式, 应该容易让人进入心流状态.

但现实是, 我写的代码基本上做不到 Point-free.
因为在写函数的时候, 不能预期使用者会如何调用我的代码.
所以当我试图让自己的写的函数也可以做到 Point-free 的时候,
非但没有体会到心流, 感受的反而是沮丧和无力.
答案就在哪里, 似乎就在眼前, 已经看到它的脚步, 甚至嗅到了它的味道,
但是就是不能把它抓住. 因此, 我总是怀疑自己理解和掌握不了函数式编程.

学习 Elixir, 让我感觉不到那么多的压力. 大部分时间, 感觉不到自己在函数式编程.
但是使用 Elixir 的时候, 我也遇到了很多困惑的地方,
有些是因为函数式编程范式的限制, 有些是 Elixir 语言设计的原因,
或者说是自己对 Elixir 语言的理解的问题.
所以这本书, 首先是写给我自己的, 是我自己使用 Elixir 的心智调适笔记.

有些编程的任务, 使用非函数的式的语言来处理,
解决方案简单直接, 非常明了. 但是如何把对应的方案迁移到 Elixir,
却需要仔细的思考如何来做.
写这本书, 就是希望它能帮助我, 让我能够对 Elixir 有系统性的把握,
从而帮助我, 在使用 Elixir 的时候, 可以像使用其他的非函数式编程语言那样,
能快速的找到相应的解决方案, 或者至少缩短这种思考的时间.

当然, 也希望这本书, 可以帮助正在适应 Elixir 的读者.

版本说明

Elixir 的发展很快, 我写作的时候, 使用的是 Elixir 的 1.13.1 版本.
如果后续的 Elixir 版本有更新, 本书讨论的情形依旧发生改变, 本书的后续版本也会相应的更新.


  1. Point-free Style 是说通过组合新函数, 不涉及到函数参数的情况下, 完成新函数的定义.

上一篇下一篇

猜你喜欢

热点阅读