生みの親が語るElixirのこれまでとこれから 「ElixirConfJapan 2017」参加レポート

2017年4月1日、秋葉原コンベンションホールにて「ElixirConfJapan 2017」が開催され、300人を超す参加者が集まり大盛況となりました。その模様をレポートします。

オープニングの模様
オープニングの模様

オープニングキーノートセッション ―José Valim氏

オープニングキーノートはElixirの作者であるJosé Valim氏による講演です。2017年1月で5歳になるElixirの歴史と今後の展望について発表しました。

José Valim氏
José Valim氏

何故Elixirを作ろうとしたのか

2011年、並行処理の重要性が高まりから、その課題解決のアプローチとして、関数プログラミングに注目したとJosé氏は語り始めました。

RubyやPython等のオブジェクト指向プログラミング言語では、複数のスレッド間で並行的にオブジェクトの状態操作を行うのは難しいという問題があります。そこで、関数プログラミングにより状態を明示的に扱い、オブジェクトの状態を変化させるのではなく、状態が変更された新しいオブジェクトを生成するというアプローチを取る事で、平行処理をシンプルに扱う事ができるのだとJosé氏は説明します。

Haskell、Clojure、OCamlなどさまざまな関数型言語を研究し、Erlang/OTPに出会ったとJosé氏は言います。Erlang/OTPは並行処理だけでなく分散環境への対応や耐障害性など、並行処理の先の事まで考慮された言語で、とても気に入り、使い始めたそうです。

しかし、Unicode対応が無く自分の名前が扱えなかったり(José氏はブラジル出身です⁠⁠、メタプログラミングをする方法が無い等の制限があり、自分自身のプログラミング言語を作成する事にしたそうです。

プロトタイプ言語

最初のプロトタイプの言語は2011年1月から4月までの間に開発されました。このプロトタイプ言語は、現在のElixirとかなり違うものだとJosé氏は言います。

実際、このプロトタイプ言語は、

  • defobjectを使ってオブジェクトを定義
  • JavaScriptのようなプロトタイプオブジェクトモデル
  • メタプログラミングのためにどこでもevalを実行可能
  • 非常に遅い
  • Erlang/OTPのモジュール・関数を呼び出すことはできない

といった特徴を持ち、現行のElixirを普段使用している筆者も、全く別物だと感じます。

ゴールの再定義

こうして出来上がったプロトタイプ言語は、残念ながら満足いくものではなく、José氏はElixirのゴールを以下のように再設定したと続けます。

  • 生産性が高い(mix等の便利な管理ツール)
  • 拡張性が高い(ポリモーフィズムやメタプログラミングのサポート)
  • 互換性が高い(Erlang/OTPのモジュール・関数を呼ぶことができる)

そしてplataformatec社の共同設立者となり、フルタイムでElixirを開発することとなります。

2017年までのElixir開発について

こうして開発が進められたElixirですが、2012年9月にバージョン1.0がリリースされました。当時のコントリビューターは180人で、3冊の書籍が発売され、初めてのElixirカンファレンスが開催されたと紹介がありました。

そして、2017年1月にはバージョン1.4がリリースされ、コントリビューターは520人になり、ElixirとErlang/OTPのライブラリのホスティングサイトのhex.pmには3800ものパッケージが公開され、数多くの書籍やポッドキャスト、オンラインクラスがあります。さらに世界中でElixirカンファレンスが開催されるようになりました。そう、日本でも!

Elixirは何でできているか?

次にElixirの構成要素について話をされました。Elixirを構成する要素は以下の3つであるとJosé氏は説明します。

  • データ(状態を表現する)
  • モジュール(振る舞いを表現する)
  • プロセス(時間変化を表現する)
Elixirを構成する3つの要素
Elixirを構成する3つの要素

ハッシュオブジェクトの操作とプロセスの生成を例に、この3要素を使ってどうElixirが動作するのかの解説が行われました。

2017年以降の展望

最後に、今後Elixirへ導入を検討している言語要素として、

  • UTF-8アトムの対応(対応中)
  • GenHTTP(研究中)
  • データストリームとプロパティテスト(研究中)
  • 型システムの導入(研究中)

の4つが紹介されました。

1つ目は現在導入作業中のUTF-8アトムの対応です。現在のElixirとErlang/OTPでは、UTF-8のアトムを作成することはできませんが、この対応によってUTF-8のアトムが利用可能となります。近いうちに日本語のアトムやテストで日本語が使えるようになり、以下のようなコードが記述可能となるそうです。

test "こんにちは世界" do
  assert :こんにちは世界
end

2つ目はプロセスレベルでHTTP関連の操作を行うGenHTTPの提供、3つ目はデータストリームとプロトタイプテストです。これらはまだ研究段階と説明されていました。

そして4つ目が今回のセッションの一番の目玉となった型システムです。GenHTTPデータストリームとプロトタイプテスト同様に、まだ研究段階とのことでしたが、発表されると「Elixirに静的型チェックが来る!」と筆者もかなりの驚きと期待でいっぱいになりました。

なお型システムに関するアナウンスは、このキーノートセッションが初めてだったそうです。

まとめ

Elixirの今後の展望について述べて終了したキーノートセッションですが、終了後の質疑応答でも型システムに関する質疑が飛び交ったり、懇親会でもJosé氏を交えて型システムについて議論されたりと、かなりの盛り上がりを見せました。

通常セッション発表

通常セッション発表は、Erlang/OTP、Elixirを既にプロダクションに導入済みの6社によって行われました。

ペレス・ダニエル氏
ペレス・ダニエル氏
伊藤友気氏
伊藤友気氏

以上2つのセッションではElixirに関する技術的な解説がありました。

  • Rediscovery of OTP(株式会社gumi 幾田雅仁氏)
幾田雅仁氏
幾田雅仁氏
大原常徳
大原常徳

以上2セッションでは採用理由や教育方法などの、導入に関する紹介を行いました。

  • Phoenix で作るスケーラブルなリアルタイムゲームサーバー(株式会社ミクシィ/XFLAG STUDIO 古城秀隆氏)
古城秀隆氏
古城秀隆氏
原耕司氏
原耕司氏

以上2本のセッションでは本番環境での事例紹介が行われました。

各社共通してテーマになっていたのは「Erlang/OTPとの関係」についてです。たとえElixirを採用をしたとしても、ErlangVMのチューニングやプロセスデザインを行うため、Erlang/OTPの習得がある程度必要だと感じました。

一方Elixirを使う事で、Erlang/OTPの耐障害性や高可用性のメリットを享受できる点が大きな採用モチベーションになっていると説明がありました。

まだ日本では採用事例や導入知見は少ないですので、これらのセッションが導入時の参考になればと思います。

クロージングキーノート ―Voluntas氏

イベントの締めくくりとして、時雨堂のVoluntas氏がなぜErlang/OTPを使い続けるのかというテーマで発表しました。

Voluntas氏はElixirを書いたことは無いそうですが、Erlang/OTPを10年以上利用している日本有数のErlang/OTPプログラマです。

Voluntas氏
Voluntas氏

Elixirの印象

Voluntas氏から見たElixirの印象は、モダンな文法でコードを記述できて素敵、だと語り始めました。ただし、暗号、通信、認証といったミドルウェアが専門なので、特にそこまではElixirの必要性を感じなかったそうです。しかし、お手伝いしている会社のほとんどでElixirを採用しているとVoluntas氏は説明します。

また、前のセッション発表では共通してErlangが辛いとの紹介があり、実際そうなのだろうと思っているそうです。ただVoluntas氏はErlang/OTPに慣れきっているため、使いづらいと感じたことは無いと語られました。

Erlang/OTPはどれくらい使われているか?

実際Voluntas氏の受ける仕事のほとんどがクローズドな仕事なので、なかなか情報を出すことができないと続けます。

情報が公開されている事例としては、

  • WhatsApp
  • LINE
  • Riot

等が有名で、変わりどころだと、ドイツの公共無線LANの認証にも利用されているそうです。クローズドで使われる事例が非常に多いので、あまり表にでてきていないのでは、という印象だそうです。

Golangでだめなのか?

Voluntas氏は「Golangではダメなのか?」と質問されることがよくあり、その回答として「90%はGolangで問題ない、残りの10%でErlangに優位性がある」と回答すると話が続きます。

GolangとErlang/OTPでは求められるものが異なり、Golangは「実行スピード」「とっつきやすさ⁠⁠、Erlang/OTPは「安定性」「信頼性」に優れているので、そもそも用途や目的が異なるそうです。

なのでGolangが扱えない10%の領域、つまり「安定性」「信頼性」が欲しいならErlang/OTPを使い、そうでなければGolangを使うべきだと紹介されました。

Erlang/OTPを使う理由

「ミドルウェアを開発するに当たって」という前提ですが、Erlang/OTPを使う理由は「落ちにくいから」につきるとVoluntas氏は語ります。

また、それ以外にも

  • プロトタイピングのしやすさ
  • スケーリングの容易さ(なんと96コアのARMサーバーで8000%のCPU使用率だそうです)
  • Dialyzerを使って後から型チェックができる
  • パターンマッチが使える(特にバイナリパターンマッチが素晴らしい)
  • E2Eテストが書きやすい

等のErlang/OTPの魅力が紹介されました。

OTPについて

次にOTPについて、少し深い紹介がされました。

Erlang/OTPの軽量プロセスは、linkmonitorを使うことで、クラッシュを検知することができ、簡単に落とすことができます。しかし、Erlang/OTPは遅いので、この軽量プロセスで処理できる処理量には限界があり、高負荷状態で「きれいに」落とすのは非常に難しいそうです。

また、ErlangVMのハマりどころとして、プロセスキューが詰まる事があると言います。ErlangVMの軽量プロセスは内部にキューを持ちますが、このキューに処理速度以上のメッセージが送られると、キューが詰まり破綻する危険性があるとVoluntas氏は続けます。さらに、ErlangVMはメモリが許す限りキューにメッセージを入れる為、再現なくエンキューされるのだそうです。

比較的軽量なecho処理だとしても、1プロセスにつき秒間10万メッセージの処理はとてもできないと解説されました。

次期リリースバージョンについて

続けて、Erlang/OTPの次バージョンの紹介がありました。Erlang/OTPは年1回メジャーバージョンがあがり、2017年6月21日に、次のバージョンのOTP20がリリースが予定されています。

主なトピックとしては、

  • atomのユニコード対応
  • シグナリングハンドリングが可能になりコンテナが使いやすくなる
  • OTPの内部ライブラリが分割されスリムになる
  • その他多数の細かい改善

と紹介されました。

今後のErlang/OTPについて

最後に、Erlang/OTPが今後長期的にどうなっていくか、Voluntas氏から紹介されました。

  • File関連、ネットワーク関連のモジュールは書き直される
  • 100ノード以上の分散機能に対応する
  • コンテナ、マイクロサービスで使いやすいようにしていく
  • JITコンパイラ対応

まとめ

最後に「Elixirの裏にはErlangがある」という言葉でしめくくり、発表は終わりました。

イベントを通して

筆者はElixirConfJapanのイベント企画から運用まで携わってきたのですが、無事開催できた事はもちろん、300人を超す方達(とニコニコ生放送の視聴者)に参加いただいて、非常に嬉しく思っています。

来年も、ElixirConfJapan2018を予定しています。もし本記事を読んでElixirやErlang/OTPに興味をもった読者の皆様は、次回参加してみてはいかがでしょうか?

おすすめ記事

記事・ニュース一覧