「Elixir実践入門」の所感（第1章〜第6章まで）

日本国内のElixir界隈で活躍されている方々の共著として出版された「[Elixir実践入門](https://gihyo.jp/book/2024/978-4-297-14014-4)」が届いたので、読み進めています。

https://gihyo.jp/book/2024/978-4-297-14014-4

取り急ぎ、第1章から第6章まで読み進めたので、それぞれの章について所感を書いてみます。

なお、自分はElixirを取り扱った技術同人誌を書いてたりもするので、自分の書いた内容との比較もしてたりしますが、それは、読者視点の他に（レベルは違えど）"書き手"という観点での考えもあり記載しています。

## 第1章 : Elixir小史

必読すべき章。Elixirの歴史からその特徴、知っておくべきキーワードがコンパクトにまとまっています。
ElixirはErlangVM上で動作するプログラミング言語であるが、なぜElrlangなのか、ErlangVMであることで何が良いのか、が書かれています。
また、Elixirの持つポテンシャルを、ネットワークアプリケション、Webアプリケーション、機械学習、IoTデバイスに分けて、端的に説明しており、詳細の書かれている各章への誘導が行われていました。

ものすごい余談ですが、主要なBEAM言語に自分の"推し言語"の一つ「[Gleam](https://gleam.run/)」が含まれていたのは好感が持てた（笑

## 第2章: Elixirの基礎

文字通り、基礎的な記述方法の説明。
パイプ演算子は、もう少しページをさいてもよかったかな、という印象。
4章でもう一回パイプ演算子が出てくるが、記述量は多くない。
4章で「パイプ演算子との併用がElixirでプログラミングの大きな魅力、楽しさ」と謳っているので、それを体験させる部分があってもいいのかな、とは感じました。
とはいえ、パイプ演算子にどれだけページを割けるか、という見方もあるのですが。

そういえば、自分の書いた本を見直してみたが、パイプ演算子については自分も深く触れていなかった。まぁ、ここは紙面（ページ）数も関係してくる問題なのかもしれないですが。

## 第3章: 基本的な型とパターンマッチング

Elixirの多彩な"型"について触れられている章。
Elixirでコードを書いているときに、忘れた時に読み返すことが多いと思われる。
文字列と文字リストはElixirでは是非とも覚えておきたい特徴。
また、具体的なシジルの例が載っているのは良かったと思いました。

「[プログラミングElixir](https://www.ohmsha.co.jp/book/9784274226373/)」では、パターンマッチング、各種の型（マップ型やキーワード型など、）、ヘッダとテイルなどは各々の章を用意されていたが、こちらではこの章にまとまっている。
ここは一長一短という印象もある。一長に当たる「1箇所にまとまっている」は、見直すときにこの章だけを見ればいいので、楽かもしれない。

個人的には、「`キーを持たない空のマップは全てのマップのサブセットとみなせるので、全てのマップにマッチします`」の一文は重要に思えた。これ、知らないと絶対にハマるやつ（笑

## 第4章:モジュール

タイトル通り、モジュールの説明。
自分で作成するモジュールの構成、およびElixirで用意されている"標準モジュール"についての説明が書かれています。
3章同様に、ここを見直すことが多くなりそう。
StringやMap、あとはExUnitのモジュールは利用頻度が高いので、見直すことも多いでしょう。

個人的には、キャプチャ演算子と関数キャプチャの説明が好きです。
関数の戻り値ではなく関数自体をバインドしていることが伝わるし、無名関数の作成に関しての説明もわかりやすい、と思っています。

あとは、EnumとStreamがこの章に含まれています。
この2つ、確かにモジュールではあるが、この章に収まってしまうのは少し勿体無い気もした。
プログラミングElixir同様に、この二つの章を個別に設けても良かったのでは、とも感じました。

## 第5章:Mixを誓ったElixirプロジェクトの開発

プロジェクトの作成、コンパイル、テスト、依存関係の管理などを提供するMixコマンドについての解説。
mix.exsファイルの記述の説明や、mix releaseコマンドによるアプリケーションのリリースについても触れられているので、ここは入門者にはためになる記述だと感じました。
欲を言えば、各mixコマンドの詳細についてはヘルプを参照となっているが、ここを利用頻度の高いオプションを使った説明があったりすると、より満足度が得られたかもしれないなとは思いました。

dbg/2についても触れていたのが、個人的にはgoodポイント。
ただし、さらっと書いてあったな感も。dbg/2は比較的新しい機能（Elixir 1.14から）であったので、もう少し詳しく説明があっても良かったのかな、という印象も受けた。
そういえば、拙著「[錬金術師見習いエリィと歩むたのしいElixir](https://mzryuka.booth.pm/items/2343031)」では、一つの章を使って説明していました。この手のデバッグ周りって、どう見る／どう使う、というのはシニアエンジニアとジュニアエンジニアの違いって出てくる箇所だとは感じているので、実際にElixirで開発している人たちがどういうふうにして利用しているのか、とかの点で書いてあったらより"実践"という印象も受けたのではと感じました。

# 第6章:並行プログラミング

本書の目玉の一つとも言える章。
Elixirの利点の一つ、並行プログラミングに関する説明がされているので、ぜひ読んで理解しておきたい箇所。ここの内容を把握していると、Elixirわかっている感が出てくる。

「アクターモデル」「Elixir（やErlang）のプロセス」「プロセスの監視（"リンク:spawn_link/3"と"モニタ:spawn_monitor/3"）」「バッググラウンド処理をするTask（Task.async/1とTask.await/2）」「"状態"を持ったAgent（Agent.start_link/2やAgent.update/3など）」の説明が図で説明されているので、より理解しやすくなっていると感じます。
そして、これらの挙動を踏まえた上で、Elixirで用意されているビヘイビアのGenServer（状態を持ったサーバーの振る舞いをするビヘイビア）とSupervisor（プロセスの監視と再起動制御）の具体的な利用の仕方についても触れらているので、よりイメージしやすい記述となっています。
※先に記述されているアクターモデル／プロセス／監視／バックグラウンド処理／状態保持の組み合わせが、後続のGenServerやSupervisorの挙動になっていることがわかります。

GenServerやSupervisorは、後の章でも出てくるNervesでのプログラムに利用するケースが多いです。
なので、この二つの仕組みを理解した上でNervesの章は読んでおきたい。
もちろん、これらはNervesの魅力とは内容がずれているので、ここを理解しきれていなくても、Nervesの魅力が衰えることはないでしょうが。


## まとめ

第1章から第6章は、いわゆるフレームワークなどが関係しない部分での"Elixir"に関しての内容となっていました。
言ってみれば、「[プログラミングElixir](https://www.ohmsha.co.jp/book/9784274226373/)」の内容を濃縮してかなりポイントを絞って且つ（初学者にも）わかりやすく記載してくれているという印象を持ちました。

さて、第7章以降は、「Phoenix」「Nx / Axon」「Nerves」と各領域でのフレームワークが出てくる章となります。それはすなわち、アプリケーションを作る上では、より具体的かつ実務的な点の記述が望まれる領域になっていると思います。ですが、執筆者の方々は、その領域の第一線で活躍されている方々ですので、有益な情報が記載されていることでしょう。早く続きを読み進めていきたいです。

※ 「Phoenix」にあたる7章から11章について、所感を書きました。

https://qiita.com/MzRyuKa/items/90f200aa1d43eb3e3278