プログラミングの視点から環境をモデル化する必要性について

Posted on November 12, 2014

命令型プログラミングや関数型プログラミングでは、プログラムを実行する「環境」というものをあまり考えないことにしているように見える。しかし、プログラムが意味を為すのは環境に対して何らかの作用があるからだ。

命令型プログラミングでは、環境に対する対話(環境からの入力や環境に対する出力)を暗黙的に許容しているが、それ自体が環境に対して何ら制約を持たないため、APIやシステムコールを通して、基本的には何でもやりたい放題である。簡単なプログラムならそれでいいが、プログラムが複雑になると一貫性や同期性の問題が出てくる。

一方、関数型プログラミングでは、プログラムを入力から出力への関数であると定式化することで作用を外部化しているが、これも環境に対する対話は無視されている。IOモナドで表面的に関数的にしても起こっていることは命令型プログラミング言語の場合と同じで、何も解決になっていない。

プログラムが何であるか、という問題は実はそんなに単純ではない。実行することで何らかの成果を得るもの、と考えれば単純であるが、実際のプログラム(例えばWebアプリケーションやRDBMS)は、明示的な開始点と終了点を持たない。実態に合ったより一般的な表現は次のようになるだろう。つまり、プログラムとは環境と対話して逐次的に何らかの成果を生み出すものである。

どうプログラムするか、という問題は頻繁に議論されるが、果たしてそれほど重要で本質的なのだろうか。経験的には、皆が口喧しく議論する問題の大半は、論点が始めから間違っているか、答えのない問題である。それより今はプログラム外の世界(環境)をどのようにモデル化するかのほうが重要に思える。コンピュータが小型化され分散化されていく世界が到来しているならなおさらである。

環境のモデル化は、分散技術の視点からは昔から熱心に研究されており、あまり詳しくないが素晴しい成果を上げているように思う。しかし、プログラミングの視点で見たときに現状ではいくつか問題点があるように見える。

一つは、プログラミングのパラダイムとして分散技術があまり結び付いてないように見える点。Erlangの登場により、プログラマから見た時の分散処理がより身近になった印象はあるが、Erlangの分散モデルは単なるアクターモデルであるから、一般のプログラミングに適しているとは言いにくいのではないだろうか。個人的にはトランザクションや同期がプリミティブとして搭載された、より適切な分散モデルが欲しいと感じる。

もう一つは、プログラミングの文脈において分散処理の難しさが過少評価されているように見える点。The Reactive Manifestoはただのアクターモデルを銀の弾丸のごとく持ち出して人々を間違った方向へ誘導しているし、Martin FowlerのMicroservicesは過度に単純化した、もはや分散モデルと呼ぶのも恥ずかしいモデルを、何か素晴しいものかのように吹聴している。おそらく枚挙にいとまがないだろうが、このようなプロパガンダが真に行なっているのは徹頭徹尾、複雑さの隠蔽である。本当にやるべきことは、いかにして環境をモデル化するかであって、独善的な(そして間違った)世界観を環境に押し付けることではない。

この問題に対してプログラミングの視点から何らかの答えを見出そうとしているのは、個人的に知り得る中では、リアクティブプログラミングに関する研究だけである。時間という概念を導入する以上、(部分的にではあるが)自然に分散の問題に行き着くのである。もちろんリアクティブプログラミングが正解だとは思わないし、このような考え方がリアクティブプログラミングの本旨だとも思わないが、きっともっとよいモデル化ができるだろうと考えている。