実は関数型由来の仕組みは少ない。学ぶことの取捨選択が大事
Elixirの学習コストが高いと思われがちなもう1つの要素である「関数型」についても、「Elixirは純粋な関数型言語ではない」と、幾田氏は指摘する。
関数型言語の純粋性の条件としては、演算子、例外、IOなどが関数で表現されていることや、副作用を起こさないことなどが挙げられる。Elixirはこれらに当てはまらず、実は関数型由来の仕組みは少ないという。
「Elixirでも、繰り返しや条件分岐、例外処理、入出力などを使ってコードが書ける。ただ、これらを複雑に組み合わせるのはElixirのよさが損なわれるし、慣れるにしたがってシンプルに書けることがわかる」(幾田氏)
続いて幾田氏は、Elixir入門者向けに最適な学習リソースとして次の4点を紹介。
プログラミングElixir
Elixirらしさを学ぶのに最適な、Dave Thomas氏による解説書。Elixirの思想が詰まっている。入門者が読むべき範囲は11~157ページ。
Elixir入門
「gumi TECH Blog」にて公開。解説の順番はElixirの公式サイトと同様。「11:プロセス」「16:プロトコル」「20:ビヘイビア」は上級者向けなので、読み飛ばしてよい。
Elixir School
Elixir初学者用のWebサイト「Elixir School」の日本語訳。はじめは「基本」の章だけ読めばよい。
Phoenix GUIDES
フレームワークPhoenixの解説サイト(英語)。「Up and Running」から読み始める。一般的なWebサービスの用途なら、「Channels」と「Presence」は読み飛ばしてよい。
さらに幾田氏は以上のリソースを読む前に覚えておいてほしい要素として、リスト、Enum、パイプライン、doについて解説した。『プログラミングElixir』では、「プログラミングとはデータを変換することである」と紹介されているが、この4つはまさにデータ変換の道具だ。
リスト
まず、[1 | 2] のようなペアという構造があり、リストとはペアで作ったリンクリスト(連結リスト)であることを理解する。[1] という1つのリストも、右が空リストのペアである [1 | []] と記述できる。3要素のリストは、[1, 2, 3] = [1 | [2 | [3 | []]]] となる。
これを知ると、リストの性質が理解できる。例えば、リストの先頭に要素を追加する場合、末尾よりも先頭に追加するほうが高速なのは、ペアを1つ用意するだけで済むからだとわかる。この構造を前提に、再帰などについても学習していく。
Enum
Enumモジュールの関数は、よく使うものから覚える。mapやfilterのほか、『プログラミングElixir』『Elixir School』で紹介されている関数などを参照。また、_by、_whileなどのサフィックスのルールを覚えておく。
パイプライン
パイプラインの存在意義は可読性が上がることと、関数定義に一貫性が生じること。開発者にとって便利なので、「パイプライン演算子が使えるように関数を定義する」という習慣がつき、結果として予測のしやすい関数ができあがるようになる。
do
doブロックを引数にとるものは、「変数のスコープと値(戻り値)を持つ」という法則を念頭に置くと、さまざまな構文を理解しやすくなる。
「最初は学ぶことを取捨選択するのが大事。そうすることで学習コストは下げられる」と話す幾田氏。まず集中して学習すべきなのは「リストの扱い方」であり、ほかのことは「リスト処理に習熟してからゆっくり学ぶ」スタンスがよいそうだ。
まとめとして幾田氏は、Webシステムの開発に限定すれば、Elixirの学習コストはほどほどで済むうえに、安全性および生産性の高い開発が実現できることをあらためて訴求。
最後に、もっと理解を深めたい人向けに、「gumi TECH Drinkup」というgumi主催の技術交流イベントが度々開催されいてることや、「Erlang & Elixir Fest 2019」が6月1日に永田町 JA共済ビルで開催されることを紹介し、内容盛りだくさんのセッションを終えた。
お問い合わせ
株式会社gumi