この記事は#NervesJP Advent Calendar 2020の14日目です。
13日目はわたくしの「mix upload.hotswap
(kentaro/mix_tasks_upload_hotswap)の裏側」でした。2日連続の登場です。
『プログラミングElixir 第2版』をご恵贈いただきました。ありがとうございます。ちょうどElixirについて学び始めたタイミングでの刊行で個人的にとてもタイムリーなこの本について、本記事で簡単に紹介します。結論だけ先にいうと、プログラミング言語についての本としても読み物としてもとても面白いので、ぜひ広く読まれたいと思います。

Elixirとわたくし
前述の通り、この記事は#NervesJP Advent Calendar 2020向けに書かれるものです。Elixir本の紹介記事なのでNervesのカレンダーに書くのはカテゴリエラーのようですが、自分自身にとってはElixirとNervesとは切っても切り離せないものなので、こちらに書いています。
Elixirの存在自体は(わたくしはRubyistでもあるので)2012年のリリースの頃から知ってはいたものの、それ以上深入りすることなく2020年秋まできてしまいました。2020年11月13日に行われた「第7回WebSystemArchitecture研究会」でNervesというものについて語られており、それはわたくしの関心に近いものである旨を、参加した研究所の同僚から教えてもらいました。それを見た瞬間「求めていたのはこれじゃん!」とピンときて、その週末は連日明け方まで調べたりコードを書いたりデバイスをいじったりしました。公開されたその時のお話のスライド(@zacky1972先生による「Nerves on Cloud (Japanese edition) 」と、@kikuzokikuzoさんによる「Elixir/NervesHubによるエッジコンピューティング環境実現に関する検討」)も素晴らしく、それからはすっかりElixir漬けの毎日で、急速に夢中になりました。何がそこまでわたくしを夢中にさせたのでしょうか?
Elixirとこれからの世界
インターネットサービスのエンジニアをやってきた中で、わたくしが関心を持ってきたことのひとつに、いかにシステムを更新し続ければいいのかということがあります。特にOSSに強く依存する昨今のシステム開発においては、エコシステムと歩調を合わせていくことが求められます。さらには、IoTのようにシステムが現実世界にはみ出していくようになると、エコシステムとの共存にはまた別の難しさが現れてくるでしょう(そもそもアップデート自体が大変だし、一様なサーバ群とは異なる多様なデバイスが存在することになるから等の理由)。4月から通っている大学院では、そのあたりを研究したいと思っているところです。
そういう関心からしても、ElixirやNervesには興味深いことがたくさんあります。NervesHubという仕組みによるOTA(Over The Air)アップデートを可能にする仕組みがあります。また、Elixir(とErlang)という言語のあり方そのものに対して、温故知新的に(?)まさにいま求められているものじゃないかという気づきを得たりもしました。すなわち、@takasehideki先生による以下の図の通りです。

昨今は、microservicesだとかなんとかで、ひとつのホストという制約を超えたコンピューティングが、これまでとはまた別のあり方で発展しつつあるように思われます。上図などはまさにそういうことを表しているのでしょうし、自分の関心的にも取り組んでいきたい領域です。そういう関連もあって「mix upload.hotswap
(kentaro/mix_tasks_upload_hotswap)の裏側」という記事にも書いた通り、デバイスの開発効率向上という観点からのHot Code Swappingの応用についてもやってみたりしているところです。
そんなわけで、自らの関心に基づくやりたいことに対しての助けになりそうなNervesからElixirに入ったのですが、Elixir(とErlang)そのものにももちろん強い関心を持っています。それで各種ドキュメントを読んでいたところ、本書がちょうど刊行され、しかもいただけるという光栄に浴すことになったわけです。みなさま、本当にありがとうございます。ご縁ですね。
著者について
著者のデイブ・トーマスさんはThe Pragmatic Programmers, LLC.(PragProg)の共同創業者。これまで刊行された著名の書籍をあげるだけでも、綺羅星のような名著ぞろいというすごい人です。多くのプログラマが「この1冊」に挙げる『達人プログラマー』、原著第1版は1999年に刊行された浩瀚な『プログラミングRuby』、いまも版を重ねるAgile Web Development with Rails(邦訳はもはや追いついてないので原著へのリンク)といった書籍や、アジャイルソフトウェア開発宣言への署名者としてアジャイル開発プロセスの推進者としての活動を通じて、この20年以上の我々の業界でいまや当たり前になったプラクティスを作ってきたひとりです。その彼が2014年に刊行したのが本書の第1版で、それを著者が2018年にアップデートしたのが本書の原著です。
そういうひとが書いた本ですので、一筋縄ではいきません。著者も「はじめに」で書いている通り、あの巨大な『プログラミングRuby』とは明確に異なるアプローチで、Elixirという言語の良さが、時には著者の個人的な好みも色濃く織り交ぜながら書かれています。そんなわけで、本書はプログラミングそのものが初めてのひとよりは、なんらかの言語による経験がそれなりにあるひとの方が楽しめるだろうと思います。そういうひとにとっては、達意のプログラマによる目を開かされるような創見が豊富な本書のような本を、他の言語との比較において楽しめるだろうからです。
赤いカプセルをとれ
「純粋で正確」な関数型言語を検討はしたものの魅力を感じなかったという著者は、Elixirに「不完全な世界」を容れる包容力がありながら純粋な関数型言語とは異なる「実用的なクオリティ」を見出し(本書386〜387ページ)、この本をのっけからこんな感じで始めます。
赤いカプセルをとれ
本書1ページ
これは、もちろん映画「マトリックス」を踏まえたフレーズです。つまり、Elixirを学ぶというのは「世界に対する見かた」を根本的に変えるということなのです。オブジェクトの持つ状態を更新することが眼目となるオブジェクト指向言語の前提とする世界に対して以下のように宣言します。
でも、これは現実の世界ではない。現実の世界では、抽象的な階層構造をモデル化したいわけではない(なぜなら、実際には、真の階層構造なんてそう多くはないからだ)。私たちは仕事を済ませてしまいたいのであって、状態を維持したいわけではない。
(中略)
あなたの世界へのまなざしも、オブジェクト指向におけるクラスの責任について考えるのをやめて、仕事を終らせる、という観点で考え始めるように、変化していくだろう。そして、たいていみんな、それは面白いって認めてくれるはずだ。
本書1ページ、3ページ
こうしてレッドピルを選び取った我々は、「ネオ」のように世界の実相(?)をデイブ・トーマス御大の語り口に導かれて、次々に見ていくことになります。
本書の特色
本書の文法事項の説明を開始する第2章は、こんな文章でまとめられます。
ErlangのクリエータであるJoe Armstrongは、Erlangでの等号記号を、代数での等号記号の使われ方にたとえる。
(中略)
彼のいいたいことはこうだ。はじめに手続き型プログラミング言語の代入と出会ったとき、代数的な
本書20ページ=
の意味を忘れなければならなかった。今はそれをさらに忘れるときだ。
よくあるプログラミング言語が文法解説が変数や代入文のような基本的な事柄から始まるのに対して、本書はパターンマッチから始まります。Elixirの=
はその見かけに反して代入文ではなく、関数型言語では広く見られるパターンマッチを意味します。それは、x = 1
みたいなよくある代入に見えるようなパターンマッチにもなりますし、タプルやリストのようなより複雑な構造をマッチさせたり、さらには関数の引数をパターンマッチさせることで、引数に応じた同名の関数宣言を複数書くことだってできます。
ただまあ、そこまでだとオブエジェクト指向言語ではなく関数型言語がいいよという話に過ぎないようにも思えます。そういう話ならもう聞き飽きたというひともおおいでしょう(とはいえ、それはそれで面白い話題がたくさんあるのですが)。やっぱりElixirが面白いのは、そういう話はもとより、Erlang由来のプロセスやOTPだろうと思います。というわけで、文法事項の説明は400ページほどあるこの本の半分で早々にまとめられ、その後はErlang VMのパワーを存分に活用するためのあれこれに話題が移ります。
Elixir(もちろんErlangでも)では、とにかくいろんなことにプロセスが使われます。本書では、フィボナッチ数列を計算するプログラムだって、プロセスを使って実装します。この、「プロセスで考える」ということこそが、本書がわたくしたちの世界への見かたに対して大きく変更を迫る本質的なポイントであるように思えます。
ほとんどのまともなElixirプログラムは、本当にたくさんのプロセスを使う。そして、だいたいにおいて、プロセスの生成と管理を、オブジェクト指向プログラミングでオブジェクトを生成・管理するのと同じ具あり気楽に行う。でも、この考え方を学ぶには、もうしばらくかかるだろう。粘り強く行こう。
本書216〜217ページ
このように幅広く、気軽に使われる大量のプロセスを用いて、いかにして現実の要求を満たす堅牢なシステムを構成していくのかという話題について、しばらく話が進みます。すなわち、GenServerによるOTPサーバ、スーパーバイザ、OTPアプリケーションなどです。それらが何なのかについてはここでは説明しないので、ぜひ本書を買って読んでみてください。これらこそが、先に書いた通り、これからのインターネットのシステムアーキテクチャにとって「これじゃん!」となっていくポイントなんじゃないかと思います(そこではNervesが大きな役割を果たすことになるでしょう)。Erlangって1986年に作られた言語なんですよね。そんな歴史のある言語が、いまこそ未来を指し示しているように見えて、ドキドキします。
本書の記述はさらに続いていくわけですが、個人的に特によかったのはプロトコルや型仕様についての説明です。ドキュメントを一読しただけだと全然理解できなかったのが、スッと入ってきました。また、付録Dの日本語版の特典「Elixir 1.6以降の状況と開発運用の実際」も素晴らしいです。本書はElixirがバージョン1.6の時の本なのですが、そこからキャッチアップできる情報が簡潔にまとめられています。とはいえ、かといって本文の方が古いかというとまったくそんなことはないので、ご心配なく。
翻訳もとても練られており、考え尽くされた様子が目に見えるようで、非常に素晴らしいです。第25章の原題はMore Cool Stuffというのですが、それが「かっこいい機能いろいろ」とそれこそCoolに端的に訳されていることに象徴される通り、読みやすさと理解しやすさに繊細に気を配っていることが察せられます。よい翻訳者を得た幸せな本ですね。
おわりに
最初に書いた通り、最近はとにかくElixirにハマりきっているのであれこれと書きたいことはあるのですが、既にこの記事もだいぶ長くなってしまっているので、このへんで終わりにしようと思います。
デイブ・トーマスさんについて「この20年以上の我々の業界でいまや当たり前になったプラクティスを作ってきたひとりです」と紹介しましたが、ことElixirについては、まだそこまでの事態になっているようには思われません。いずれそういうときも来るのでしょうか。みなさんもこの機会にElixirを始め、「赤いカプセル」を選択して、世界の真相を探す旅にでましょう。

#NervesJP Advent Calendar 2020の15日目は、@torifukukaiouさんの「グラフうねうね (動かし方 編) (Elixir/Phoenix) 」です。続けてお楽しみください。