こんにちは、@Joe_nohです。カラーミーショップでエンジニアをしています。この度、話題の「プログラミングElixir」をご恵贈いただきました。お礼の意味も込めまして、ペパボでは一番Elixirを触っているであろう私が、この場に感想などをしたためてさせて頂きます。
私とElixirについてちょっと説明しておきますと、私は以前はRubyをメインに使っていました。Rubyは今でも好きな言語なのですが、いわゆるオブジェクト指向言語だけでなく、関数型言語というものも触ってみたいなと考えていたときに、Elixirに出会いました。最初に触ったのはv0.12前後だったと記憶しています。それ以来、Elixirの魅力や楽しさを広めるため、社内Elixir勉強会や外部でLTなどを行っています。そのときのブログエントリがこちらで、その他のスライドも私のSlideShareに置いてあります。
話を戻して、まずは待望の日本語によるElixir解説書の出版、ありがとうございます。Elixirは非常に新しい言語であったにも関わらず、以下の様な学習資料が早い段階から公開されていました。
ただしそれらはほぼ全て英語の資料であったため、ちょっと興味はあるけれどなかなか手が出ないという方もいらっしゃったのではないでしょうか。この度のお二人の翻訳によって、その障壁は大きく下がったと思います。さらに言えば、まずはこれを読むべし、というはっきりとした入り口ができたと言えます。改めて、訳者の笹田さん、鳥井さん、そして出版に関わった皆様には本当に感謝するばかりです。
「プログラミングElixir」の良いところ
これからElixirを勉強したいという人には、本書はぜひとも読んでいただきたい入門書です。特に、「1章から3章まで」と「第II部」はよく書かれていると思います。
第1章から第3章まで
Elixirは関数型言語の1つに分類されますが、「プログラミングElixir」を読むために関数型言語の特別な知識は求められません。オブジェクト指向に慣れ親しんだ人でも読みやすく書かれています。第4章からElixirの基本的な文法が紹介されていますが、その前の第1章から第3章で、Elixirを学ぶ上で重要となる考え方を示してくれます。具体的には、プログラミングとはすなわちデータの変換であること、パターンマッチの利便性、データが不変であることの意味を解説してくれます。この解説があることで、いきなり未知の世界に放り出されるのではなく、関数型言語に初めて触れる人、ElixirやErlangに初めて触れる人が円滑に学習していける構成になっていると思います。第1章から第3章はコンパクトにまとまっているので、まずはここだけでも読む価値があります。
第II部
軽量プロセスを用いた並行処理は、Elixir/Erlangの醍醐味の1つです。個人的には関数型のパラダイムよりも、軽量プロセスをどのように使ってプログラミングしていくかという考え方の方が難易度が高いのではないかと思います。本書の第II部は、主にこの領域をカバーしており、プロセスを使った並行処理、分散処理について学ぶことができます。また、よりErlangの力を借りるためにはOTP(Erlangのフレームワーク、ライブラリ群)の理解が欠かせませんが、これについても非常に丁寧な解説と練習問題が用意されています。
もちろん他も
ここでは「第1章から第3章まで」と「第II部」を挙げましたが、それ以外も注目すべきです。第I部の最後には、GitHubから取得したissueの情報をテーブル形式に整形して表示するコードが示されていますが、このコードにはElixirの文法の美しさが現れていて、上から下、左から右へ流れるように読むことができます。
def process(user, project, count) do
Issues.GithubIssues.fetch(user, project)
|> decode_response
|> convert_to_list_of_maps
|> sort_into_ascending_order
|> Enum.take(count)
|> print_table_for_columns(["number", "created_at", "title"])
end
他にもExUnitによるテストやマクロの仕組みなど、Elixirでアプリケーションを書くなら知っておくべき内容が詰まっています。付録ではDialyzerによる静的型解析にも触れられています。Dialyzerについての日本語の解説はあまり見かけませんが、とても強力な解析ツールですので一読の価値ありです。
なお、この本ではElixir v1.2を対象としています。今日の時点でのElixirの最新バージョンは1.3.2なので、本の内容は既に古くなっているのではと思われるかもしれませんが、そんなことはないと思います。本文を全てチェックしたわけではありませんが、v1.3.2で通用しないような記述は見当たりませんでした。
Rubyへの還元
Elixirの仕様は様々な言語から影響を受けていますが、文法においてはRubyから強い影響を受けています。Erlangの文法も慣れてしまえば問題ありませんが、やはり少々癖があるように見られることが多いため、Ruby由来の文法もElixirの魅力の1つと言えるでしょう。そして今回、Rubyの処理系を実装されている方がProgramming Elixirの翻訳をされたということは、逆にElixirからRubyへ、何かしらのフィードバックがあるのではということが想像できます。とくに高速化については、3x3をキーワードにRubyのカンファレンス等でもよく言及されていますので、Elixir/Erlangの軽量プロセスベースの並行処理が何かしらのヒントになるのではと期待されます。またパターンマッチについても、良い実装があればRubyに導入されるという噂も聞こえてきていますので、Rubyでもパターンマッチが使える日は近いのではないでしょうか。
むすび
繰り返しますが、この度の翻訳をされた笹田さん、鳥井さんには重ねてお礼申し上げます。日本語書籍の発売によって、国内のElixirコミュニティがより活発になっていくと確信していますし、自分としても社内への布教がやりやすくなって嬉しいことだらけです。本当にありがとうございました。