Tagbangers Blog

Notes on Reactive Programming Part I: The Reactive Landscape - DAVE SYER氏のSpringブログ(日本語超訳) 途中

またSpring blogの超訳を載せたいと思います。今回はDave Syerさんの6月7日の記事です。オリジナルはこちらです。


Reactiveプログラミングというのはとてもおもしろく、今のところ色々いわれているようですが、部外者や筆者のようなエンタプライズJava開発者からするとすべての概念がわかりやすいとはいえません。
本記事によって「何がそんなに盛り上がってるか」について、みなさんの理解がクリアになればと思います。
アプローチとしてはできるだけ具体的なことを書くようにします。もっと学術的なアプローチやHaskellで書かれた大量のコードサンプルを探しているのであれば別のサイトをググッてねといいたいところですが、この記事を読んでいる理由はきっと違いますよね。

Reactiveプログラミングについては並行プログラミングとハイパフォーマンス性がごちゃまぜにされた形で書かれることが多いのですが、本当は各々の原理は全く違います。これが混乱の元なんです。Reactiveプログラミングは関数型Reactiveプログラミング(Functional Reactive Programming, FRP)と同一視されたりします。「Reactiveは全然新しくない技術だ。いつもやってることじゃないか」という人たちもいます(特にJavascriptを使っている人たちがそういいます)。「Microsoftからの贈り物や」と考えてるような人もいます(ちょっと前にc#の拡張がリリースされたときに盛り上がってたような人たち)。エンタプライズJava界では、最近では急速に話題になっています。(Reactive Streams initiative参照)。
新しい事象が出てくるとよくありがちですが、「いつ、どこで、これは使えるのか?」ということに関して、そこにはちょっとした認識違いが数多くあります。

What is it?

Reactiveプログラミングはざっくりいうと、「挙動の変化に注目した、ルーティングとイベントに関わるマイクロアーキテクチャ」のことです。他のサイトで定義している内容も結構大雑把に書いてあります。ですが開発者である我々は、Reactiveであるということがどういう意味をもち、今後なぜ重要になりそうなのかについて、もう少し具体的に考えてみましょう。

Reactiveプログラミングの起源はおよそ1970年弱ぐらいにさかのぼれます。なので全然新しい考え方ではないですね。しかし現代のエンタプライズ向けシステムにとってはとてもしっくりくるアイディアなのです。マイクロサービスが台頭し、マルチコア・プロセッサがどこでも使える状態になった頃から、このアイディアは意味のあるものになってきました。

以下は他のソースからひっぱってきた、わかりやすい定義です。

このReactiveプログラミングの裏にある基本的なアイディアは「時によって変化する」値を表現したデータ型があるということだ。
その場合、それを処理する側も同じく、「時によって変化する」値をもつだろう。

and..

Reactiveプログラミングが何かについて、直観的でわかりやすい考え方としては、自分の書いたプログラムがスプレッドシートで、変数がセルに入っているというところを想像してみればよいでしょう。スプレッドシートのセルが変化すれば、それを参照している別のセルもまた変更されます。これがFRPと全く同じことなんです。ではセルが自分で変化する(もしくは外部世界によって変更される)ということを想像してみましょう。たとえばGUIでいえばマウスの位置みたいなのはよい例ですね。

(参考:Terminology Question on Stackoverflow)

FRPはハイパフォーマンス、並行性、非同期、ノンブロッキングIOなどと強い親和性を持っているものです。しかし、まずは「FRPはそういったこととは関係ない」と考えるところから始めたほうがわかりやすいのかもしれません。確かにReactiveモデルを使うと、これらを自然にハンドリングできるケースもあります。しかし「効果的・効率的にハンドリングする」という観点でいうと、実際に恩恵を受けるかどうかは完全に実装の仕方によるのです。もちろん全く正常で使いやすいFRPフレームワークを同期的でシングルスレッドの形で実装したってかまいませんが、新しいツールやライブラリを使おうとするときは役にたたないと思います。

Reactive Use Cases

はじめて学ぶ状態で1番難しい質問としては、「で、何がいいの?」ということだと思います。
以下に一般的なユースケースを説明するエンタプライズ向けな例を挙げてみましょう。

(訳注:以下からだいぶざっくり書きます)
* 外部サービスを呼ぶこと
* 並行性のとても高いメッセージConsumers
* スプレッドシート
* (非)同期処理の抽象化

比較

だいぶ長いので時間があるときにまたまとめられればと思います。。
To be continued...