Elixir/Phoenix

Elixir

私たちは2020年代に関数型言語ElixirがWebアプリケーション開発の世界で主流になると予測しています。

なぜ「関数型言語」なのでしょうか。なぜElixirなのでしょうか。

それは、Webアプリケーションを取り巻く環境が急速に複雑化しているからです。私たちは多数のコアと巨大なメモリを持つコンピュータを手軽に扱えるようになりました。その結果、好むと好まざるとに関わらず私たちはさらに複雑なWebアプリケーションを作り続けることになります。

複雑なシステムを正常に機能させるために大切なのは、システムを単純な部品の集合に分解することです。可能であれば、それらの部品群は互いに独立して自律的・並列的に動くことが望ましいです。関数型言語はそのようなシステムを構築するのに向いています。

関数型言語の種類は多いのですが、私たちは特にElixirに期待しています。Elixirの文法は、Python、PHP、Ruby、PerlなどのWeb開発で人気のある言語の文法に似ており、移行のハードルはとても低いです。また、パターンマッチングやパイプライン演算子などプログラマーの心をくすぐる面白い特徴も有しています。

Elixirは2012年に誕生した新しい言語です。2019年現在、それはテクノロジーライフサイクルの最初のフェーズ(Innovators)にいると考えられますが1、私たちは2020年代のどこかでEarly AdoptersフェーズからEarly Majorityフェーズへと進んでいくだろうと予測しています。

  1. 1 Programming Languages InfoQ Trends Report - October 2019

関数型言語の特徴

たいていのプログラミング言語には、「関数」という概念が存在します。言語によっては、それをサブルーチン、メソッド、あるいはプロシージャと呼ぶかもしれませんが、本質的には同じものです。

そのため、初めて「関数型言語」という言葉を聞いた人は違和感を持ちます。それがプログラミング言語全般を指す言葉のように聞こえるからです。でも、そうじゃないのです。

実は、「関数型言語」という用語には広く受け入れられた明確な定義がありません。そこで、2つの具体的な言語、RubyとElixirを比較することで「関数型言語」の特徴(の一端)について解説します。

RubyでもElixirでもプログラムの実行に必要な各種データ(整数、文字列、時刻、など)に名前を付けて扱います。この名前を「変数」と呼びます。例として、変数 s がある文字列を指していて、この文字列の長さが3以下のときに末尾に "!" を追加する処理を考えましょう。

いま s が文字列 "abc" を指しています。この文字列はメモリのある場所に格納されています。Rubyではこのデータを直接 "abc!" に変更することが可能です。しかし、Elixirではデータそれ自体を変更することはできません。その代わりに、データを別のデータに変換します。具体的には "abc""!" を連結して "abc!" という文字列を作り、改めてそれを変数 s と結びつけます。

些細な違いのように見えますが、実は決定的な意味を持ちます。もし、同一のコンピュータ上で2つのプログラム XY が並列的に動いていて、両者の変数 s がメモリ上の同一の場所に格納されている文字列 "abc" を参照している状態において2つのプログラムが上記の処理をほぼ同時に実行したらどうなるでしょうか。

Rubyの場合、タイミングによってはまずいことが起こります。X が変数 s の指す文字列の長さが3であることを確認した直後に、Y が同じ文字列に "!" を加えたとすると、その後に X"!" を加えるため、最終的に変数 s の指す文字列は "abc!!" に変更されてしまいます。

しかし、Elixirではこのようなことは起きません。なぜなら、元となるデータはそのまま手付かずに取っておいて別のデータを新たに生み出すからです。つまり、Elixirではデータを変更せずに変換しているのです。

このように、変更と変換の間には大きな違いがあります。関数型言語Elixirの最大の特徴は、データの変更ができないことです。Elixirで書かれたプログラムはデータ変換の連鎖を通じて処理が進んでいきます。このデータ変換が、数学用語の「関数」と類似しているためElixirのような言語は「関数型」と呼ばれるのです。

もちろん、Rubyでも注意深くプログラミングをすれば上記のような問題は起きません。しかし、人間はミスを犯すものです。並列処理が関わるような場面ではElixirの方が安全なのです。

Phoenix Framework

Phoenix Framework(以下、Phoenix)は、Elixirで書かれたWebアプリケーション開発フレームワークです。Ruby on Railsから大きな影響を受けています。特に、ルーティングの設定方法、コントローラやHTMLテンプレートの書き方はとてもよく似ています。データベースを扱う部分になると少し雰囲気が異なってきますが、根本的な発想は共通しています。

Phoenixに関して私たちが特に気に入っているのは、とても簡単にWebSocketを扱える点です。WebSocketとは、Webアプリケーションにおいて双方向通信を実現するための技術規格です。WebSocketを利用するとSingle Page Application (SPA)の開発がとても楽になります。

WebSocket関連ではPhoenix LiveViewにも注目すべきです。これは、サーバー側でHTMLデータを組み立てて、その差分をWebSocketでブラウザ側に送り、DOMを書き換えるという方法でブラウザの画面を更新します。

LiveViewを利用すれば、これまでJavaScriptで記述していたコードをElixirで書けるようになります。そのことには2つの利点があります。ひとつは、バリデーション処理などを2つの言語で書く必要がなくなるということです。もうひとつは、ほとんどの処理がサーバー上で実行されるため、秘密漏洩や不正アクセスの危険性が減るということです。

Elixir/PhoenixによるTeamgenikの開発

私たちは、2016年にElixir/PhoenixによるWeb開発の可能性を発見し、試験的なアプリケーション開発を通じて、ノウハウを獲得していきました。

2018年夏、私たちはElixir/Phoenixを利用して新たな挑戦を開始しました。それが、Teamgenik(チームジェニック)です。

Teamgenikはユーザーに「ミニSNS」のオーナーになる体験を与えるサービスですが、ブラウザ上で「ミニアプリ」を作って「ミニSNS」に機能を加えることができる点に特徴があります。私たちは、この「ミニアプリ」の効率的な実装にElixir/Phoenix(特にPhoenix LiveView)を活用できることを見抜きました。

現在、私たちはTeamgenikの開発を日夜続けていいます。2019年12月上旬にプレビュー版を公開する予定です。そして、バージョン1.0を2020年春に公開することを計画しています。