「関数型プログラミングはオブジェクト指向の正当な後継である」がわからない理由

#ちょっと何言ってんのかわかない

前の記事
[「関数型プログラミングはオブジェクト指向の正当な後継である」]
(http://qiita.com/retemo/items/d251f0b558a3ebf1d720)

前の記事を投稿してから２ヶ月ほど経ちました。その間に多くの方に読んでいただききましたが、twitterやブログでの反応を見ていると程度の差こそあれ「わからない所がある」という趣旨の記述をよく目にします。檜山さんの「キマイラ飼育記」はその代表です。


[檜山正幸のキマイラ飼育記
「関数型プログラミングはオブジェクト指向の正当な後継なの？」]
(http://d.hatena.ne.jp/m-hiyama/20160913/1473734011)

先の記事を取り上げていただいた上に、私が説明しきれなかったり、サボって書かなかった疑似コード等をつけて、丁寧に解説していただいています。
全くもってありがたい話ですが、残念ながら私の記事の後半について「ちょっと何言ってんのかわかない」と評されしまいました。

耳の痛い話ですが、まあ、私自身も万人に理解できるものが書けたとは思っていません。
そこで、今回はわかりにくそうな箇所を私なりに解説していこうと思います。

と、本題に入る前にことわっておきますが、本文では「ですます調」をやめて「である調」で書いています。語調を「ですます」に変えるといつものような論理思考ができなくなるので「である調」で書いたのですが、語調をすべて直すのも難儀な話です。というわけで前とは違う読みにくさがあると思いますがご容赦ください。

#わからない理由

先の記事のつまづきポイントを
影響度が大きそうなものから順に解説してみる。

##まとめに結論が書かれていない
多分このせいでモヤモヤした感じで読み終えた方も多いことだろう。
わかる人はわかっていると思うが、テーマである「関数型プログラミングとオブジェクト指向の関係」についての「結論」というか「私の所感」はタイトルにすでに書かれている。そう、あれが全てだ！

ただ、この「私の所感」は多分に直観的であり、論理的な考察に基づくものではないため、自分自身の認識を一から分析する必要があった。（まあ、自己分析を一度やってみたいという願望は元からあったから「...の正当な後継である」は単なるキッカケと言えなくもない。ともかく）その分析の過程が先の記事の本文だと言っていい。

ただし、先の記事にはもう一つの「対象読者に対するメッセージ」という文脈がある。
それは本文の冒頭から存在しており、「まとめ」はそちらと呼応する形になっている。

文章コンサルタントのような人々に言わせると、このように１つの文章に２つの文脈が存在するとわかりにくくなるのだそうで、つまりは先の文章がわかりにくい一番の原因は、私の文書構成にあるらしい。顧みるに、そもそも話の中心はタイトルから連なる文脈にあり、その文脈で話をまとめるべきだった。対象読者を明確にする必要はあるが、それに引きずられ過ぎてはいけないということだろう。

というわけで再度ダイジェスト版を書こうとチャレンジしてみたのだが、面白くなくて結局辞めてしまった。面白くない理由は幾つかあったが、少なくとも「対象読者」が元のまま（つまりオブジェクト指向系のシニア・エンジニア）では書き直すことに意義を感じられなかった。たぶんあの記事の実際の読者のほとんどは想定した読者に当てはまらないだろう。
で、代わりに書いているのがこの記事である。

というわけで「オブジェクト指向系のシニア・エンジニア」に対するメッセージのことは一旦忘れてほしい。
この記事自体が、前の記事のまとめの代わりだ。

##パラダイム・シフトの話だと気づかない
「マルチ・パラダイム」という言葉をよく見かけるので、パラダイムの意味はなんとなく分かると思うし、これがパラダイムの話だとわからない人は少ないと思う。ただ、この前提が崩れるとそもそも話が成り立たない。「関数型プログラミング」や「オブジェクト指向」というのはパラダイムのことを指している。というかこの手の比較は大抵がパラダイム間の比較である。

先のタイトルを言い換えれば
「モナドを含むモダンな関数型プログラミング・パラダイムはオブジェクト指向パラダイムの正当な後継パラダイムである」
となる。（長ッ！）

補足しておくと「モナドを含む…」というのが重要なポイントで、それを含まない「古典的な関数型プログラミング」は後継パラダイムに含めるべきではないと思う。（これは前の記事にも書いておくべきだった。）

で、ここからが本題。
直系ではない両者を比較して「後継パラダイム」と言っているのは、
つまりは「パラダイム・シフトが起きている」と暗に言っているのだ。
「そんなもの起きてないだろうが！」と思っている人は以下の観点で関連情報を見直してほしい。

- C++11、Java8、Swift等のFunctional Programing 化はどれほど進んでいるか？
- 過去のソフトウエア工学のパラダイム・シフトはどうやって起きたか？
- エンジニアはパラダイム・シフトでどういう役割を果たすのか？

あなたの周りの船の進路は変わっていないかもしれないが、業界的にはすでに舵が切られている。
本当はここで上記の関連情報やパラダイム・シフトについて詳しく解説したほうがいいのだろうが、その労力は他のことに使いたいので、気になる人は悪いが他を当たって欲しい。（読者も取材能力が高い人が書いた記事を読みたいだろうし。）

##なぜ「正当」と言っているのかわからない
タイトルを読んで最初にこの疑問が浮かんで、そのまま迷子になった人も多いのではないだろうか？
これについては用語の確認から始めよう。

ふつうなら「…せいとうな後継...」という文脈では「正統」と表記するところを、私は「正当」という文字を意図的に当てている。
これを解説していないのだから我ながら意地悪だと思うが要はダブルミーニングである。

辞書を引くと
「正当：道理にあっている...」
「正統：世間に正しいと認められている...」
とある。

「道理にあっている」かどうかについては頑張って説明しようとしたのだが、それでもわからないというなら私の力不足だ。申し訳ない。できれば今後に期待していただきたい。

一方で「世間に正しいと認められている」かどうかについては先の記事ではほとんど触れていない。で、実際のところはどうかというと未だ駆け出しで「認められ始めた」段階にある。だからこそあえて「正統」という文字を使わなかったのだが、少なくとも私自身はモナドを含む現在の関数型プログラミング（パラダイム）を「オブジェクト指向の正統な後継パラダイム」とみなしている。

社会学的なパラダイムというのは「主権者の選択の集大成」だと私は考えているが、主権者（この場合は個々のエンジニア）の選択は業界の雄（例えばAppleのような巨大ベンチャーだったりスターエンジニアだったり）の影響を大いに受ける。そして関数型へのパラダイムシフトはすでに業界の雄の選択の段階を過ぎて、個々の主権者の選択が進行している段階にある。社会学者の追認までは到達していないから社会的には「正統」とは言えないだろうが、すでに選択を行った「いち主権者」としては「とうに正統な流れに乗っている」としか言いようがない。

こうした背景があって、ああいう表現になっている。

##マルチ・パラダイムではダメなの？
おそらくその表現が許されるのは過渡期だけだろう。

確かに「マルチパラダイム言語」という言葉は広く使われているし、現代を代表するプログラミング言語には単一のパラダイムで構成されるものは存在しないから、正しい認識かつ平和的で良いように思える。

ただし実際にはこの呼ばれ方には不均衡が存在する。
マルチパラダイム言語と呼ばれているのはオブジェクト指向から発展した言語で、関数型プログラミング由来の言語がマルチパラダイム言語と呼ばれることは稀だ。例えば産業応用されている関数型言語の代表であるErlangは作者自ら「Erlangはオブジェクト指向言語である」と追認しているにも関わらず大抵はマルチパラダイム言語ではなく関数型言語に分類される。

こうした不均衡はどこから来るのだろうか？
少なくとも「関数型主義者は排他的で、オブジェクト指向主義者の方が平和的だから」という理由ではないことは、オブジェクト指向主義者たちが内外のパラダイムに対して取ってきた「我こそは主流」という態度を考えれば明らかだろう。
では、なぜ不均衡になるのか？

答え合わせは当事者に質問してもらうとして話を戻そう。
代表格のパラダイムを選出することを、言語の背景にあるパラダイムを特定することと混同してはいけない。
そこを間違えると未来永劫全てのプログラミング言語がマルチパラダイム言語になってしまう。そんなものは分類とは呼べない。

##型システムの話で何を言っているのかわからない
全くもって申し訳ない。

これについては先の檜山さんも一番わからなかったと言っており、ほとんどの方が苦戦したと思う。きっと「単にHaskellとオブジェクト指向の型関連の比較をすればいいのに、わざわざ分かりにくい独自解釈をぶっこんでくるとは何事だ！」と呆れられたり、憤慨されたりしていることだろう。

その理由は先にも書いたように自分の認識を分析するためだ。
型システムは馴染み深い存在にもかかわらず、我々はその仕組みを深くは知らない。古くて新しい分野で、その範囲は広がり続けており、これを簡潔に表現したモデルを私は未だに見たことがない。それどころかまともな解説記事すら日本語ではほとんど見かけない。私が情報科学や数理科学を専門にしていないからその手の論文や専門書を読まないというのもあるが、エンジニアが書いたブログだと深掘りすることなくそのまま洋書（なぜかガウディ本とか）へのリンクで飛ばされて終わる。じゃあ、その洋書を読めばスッキリわかるかといえばそんなことはなく、大抵の人は挫折するか、何となくわかった気になって終わる。かくいう私もご多分に漏れない。

「様々な型システムを網羅して欲しいんじゃない、
新しいパラダイムが欲しいわけでもない、
型チェックや型推論の仕組みが知りたいわけでもない、
まずは日頃使っている道具を俯瞰したいんだ！！」

私のこの要望は未だ満たされたことがない。
だからこそ独自解釈をアウトプットする必要が（少なくとも私には）あったのだ。
とはいえ、あのままでは不親切極まりないのも事実なのでこれについては別途、詳細記事を執筆中である。
話が大きすぎてなかなか完成しないが、気長に待ってもらえるとありがたい。

##オブジェクトの基本６ロールとか４大技術トピックとかがよく分からない
まあ、この辺りはあまり気にしなくても大丈夫。

たまたま私のプログラミング人生がこれらと一緒にあって、自己分析するのに引っ張り出さざるをえなかっただけだから。
先の記事の対象読者もこれらを知ってそうな人々を選んだというだけで、本音を言えばもっと広い読者に読んで欲しいので、これらに縛られるのは良くないことだと思う。

少なくともパラダイムシフトを語る上ではこれらはオブジェクト指向から関数型プログラミング（というかモナド型プログラミングw）に持ち越せる資産の代表例に過ぎない。しかもメタ的な概念なので知らなくてもソフトウェア開発を行うことはできる。将来、設計の根拠が欲しくなったら調べればいい。

現状では高水準のオブジェクト指向設計は学ぶのにとても時間がかかる。モナドの背景にある圏論も難物だが、それに負けず劣らず学習コストが高い。この状況は変えたいので私もいずれ何か書きたいけど今はその余力がない。

##対象読者の人物像がわからない
これがわからない人は恐らく若い方だろう。
先述の理由によりこれもあまり気にしなくていいのだが、とはいえ「第二の文脈」だったのだから簡単な説明だけはしておこう。

人間、誰でも年をとると保守的になる。これまでの知識を捨てて新しいことを覚えるのが大変になるということもあるが、それ以上に責任が増すから下手なことはできなくなる。これは当然の反応だし、保守的になることで安定感が増すからそれ自体は良いことだ。
ただし変化を受け入れることが必要なこともある。問題は保守的だと「受け入れる必要がある変化かどうか？」を判断するための情報すら受け付けなくなる傾向にあることだ。残念なことにオブジェクト指向のエキスパートはそういう立ち位置に成りつつある。

気持ちはよくわかる。
「せっかくオブジェクト指向設計を頑張って体得してきたのに、それを捨てて、モナドとか圏論とか学んで、新しい設計手法を身につけなきゃいけないのかよ」
そう考えると気が滅入るし、そもそも日々の業務が回せなくなるリスクが大きい。

そういう感じの「オブジェクト指向エキスパート」がいたら、先の記事の話題を振ってみてほしい。こうした人々の理解を得ることがソフトウェア産業の発展に必要不可欠なのは確かなのだから。

##比較対象がわからない
件（くだん）の記事は他の人が書いた「関数型プログラミングとオブジェクト指向の関係」に納得できなかったから書いた。
ということは比較対象が存在することになるが、それについては前の記事では触れていない。

ただ、もしこれらについての前知識がないのならそれは幸せなことかもしれない。

2016年10月現在はググっても酷い記事はさほど見かけないが、2014年頃はとにかく酷かった。Qiitaで宗派闘争（つまり関数型信者間の内紛）が起きていたり、マイクロソフトがF#の解説記事でオブジェクト指向を手続き型の代表として扱っていたり（あの記事どこにあったんだろ？）、信頼できる情報源を探すだけでも大変で、少なくとも関数型プログラミングを学び始めるには向かない時期だった。

関数型プログラミングについてひと段落した後はモナドの解説記事を巡業する日々が待っていた。「モナドは圏論由来」とだけわかるような袋小路がごとき記事に道を遮られたり「例え話に混乱させられた」という記事を延々と巡らされたりした。モナドの語源ですら知ったのはごく最近だし、モナドの使用感は結局Swiftで実際に使い込むまではわからなかった。

つまり、特定の記事が気に入らなかったとかというレベルの話ではないのだ。
そうした記事たちに煩わされることがなかったのならそれは幸せなことだ。
例え、私の件の記事に惑わされていたとしても。（一応謝っておこう。ごめんなさい。）

#終わりに
さて、ここからは「ですます調」に戻します。

皆さんの疑問は多少なりとも解消されたでしょうか？
型システムや技術トピックの詳細を期待した人、パラダイムシフトの状況について知りたかった人には肩透かしだったかもしれませんが、それらはまたの機会にいたしましょう。
それ以外について、わからない点があればコメントしてもらえると幸いです。

##追伸
読み返してみると「正当」とか「後継」について解説しているこっちの記事の方が「関数型プログラミングはオブジェクト指向の正当な後継である」というタイトルがふさわしい気がしてきた。

前の記事は
「モナド・ブームはパラダイム・シフトを起こせるか？」
「おっさんエンジニアよ！次の時代に進もう！」
とかいうタイトルの方が良いのかも？

まあ、いまさら変えませんけどね。