嫌われプログラミングの代弁者

「何で頭ごなしに嫌う人間が居るのか」を色々考える

関数型プログラミングである 2

何で20年間以上も粘着するのか?

主に2つ有ります。

  1. 嘘の手法が持ち上げられると、そうで無い手法を使っている専門家の価値が有意に下げられる。(チャレンジしていないとか)
    プログラミング技術は、レガシーと次世代という括りで考えるのが一般なので、これは冗談の話では無い。完全な事実である。
    これは私のみに限った事では無く、誰でもそうなる。
  2. 嘘の手法を期成した人の職業人生が危うくなる。専門家の知見が必要になる中堅以降、使い物にならなくなる。大人にはキツすぎるリスキリングを強いる事になる。
    これは私には関係無いが、誰でもそうなる。

結論

これからも「関数型プログラミングである」事を知る事でプログラミングが嫌いになる人は多数増え続ける事でしょう。

 

関数型プログラミングである 1

どの様な話?

私の勤めているソフトウェア会社で、評価面談があり、その際に、

  • お前はチャレンジしていない

と評されました。話をうかがうと、

という風に聞こえました。その頃、関数型は次世代技術として大流行りでしたし、次世代プログラミングに期成するだけの人も居た様に思います。

いくら何でもと思い、その上の管理職に文句を言うと、

  • ビジネスはファクトに基づいている
  • 関数型プログラミングは学術的評価を受けているが、お前の言っているのは、感想に過ぎない

と言われました。ファクトを得るため20年待ちました。

 

20年が経過し、現在時点で動作するプログラミングの観点からは、

現在時点で動作するプログラミングの観点からは、関数型プログラミングと言われている物の実例が見当たりません。
関数型プログラミング言語と主張する物はありますが、それの事例集を見ても普通のプログラミングとなんら変わりの無い物です。

そこから推察される事は、

  • 当たり前のプログラミングに関数型という次世代の手法という名前をつける
  • 関数型を標榜する人間がその源流となり、決定権を得る

という意図だと思います。他に解釈のしようがありません。
そのような党派的な議論を技術的な場所ですべきでは無いのかもしれませんが、最高に好意的に解釈してもそうとしか思えないのです。

 

20年が経過し、現在時点で純理論的なプログラミングの観点からは、

現在時点で純理論的なプログラミングの観点(実際に動かないとしても、理論的に良い見通しを得られるモデルが得られればヨシとする観点)からは、「制御の逆転」という主張があります。

その主張とは、

  • 普通のプログラムでいう制御側(適時に値を得て渡す側)と、関数側(値を得て処理をする側)の重みを逆転させる(普通のプログラムでいう制御側を固定し軽視する)事で、
  • テストがしやすくなると主張している

と、私は理解しています。

それは問題に対して、「横目いっぱいの視座から見て、問題が簡単になった(様に見える)」と言っているだけだと思います。

スリードを誘っているだけとしか私には思えません。また、当たり前の話ですが、関数を基礎としなければ、純理論的な議論が出来ない訳でも有りません。オブジェクトを基礎としたモナ何ちゃらだって成立するはずです。

 

もちろん今でも

もちろん今でも自分の言っている事は感想に過ぎないのかも知れません。死ぬまでにファクトにたどり着けないのかも知れません。

しかし、学術的評価を受けていた事も、のちに(訂正開始 2023/3/7 PM6) 嘘になる 解無しと分かる事はあり得ます。
嘘を  解が無いのに解の存在を証明せずに解が有るかの様に議論し 金を取る 様な振る舞いを (訂正終了)
ファクトを重んじる実業の世界に持ち込んだら契約不適合責任が生まれると思います。
(訂正)「嘘」と決め付けるのは悪い行いなので、訂正しました。なお、「解の存在証明」というのはテストの事かも知れません。

その線から一歩一歩突き詰めて行くより無いのでしょう。

 

結論

これからも少なくとも約1名は「関数型プログラミングである」事でプログラミング(の一側面)が嫌いになる人は存在し続ける事でしょう。

 

COBOL言語である 4

COBOL言語でない(さらに別案)

宣言型プログラミングというものがあるそうで、オブジェクト指向プログラミングの「次世代」として、関数型と双璧を成していました。

これは、

  • プログラムを固定して、動作を変化させるデータ(プロパティとか設定情報とかいう言い方で知られている)を大量に送り込む事で処理を進める

やり方との事です。

コボラーの視点から見ると

コボラーの視点から見ると、これは、

  • ごく少量のメモリでの動作

を成立させるために、常套手段として用いていた手法でした。もちろん、

  • 出来る問題は限定されます

万能ではありません。

どういう事情だったのか?

メモリは千バイト程度しか使えなかったのですが、

  • MT(磁気テープ)上に記憶を持ったり
  • ハードディスク(DASD)上にMTを模した記憶を持ったり

は出来ました。

そして、メモリではまな板よろしく、
「動作を変化させるデータ」1個分(1つ前のデータとの差分が必要な場合は2個分)だけ用意し、MTやDASDから「動作を変化させるデータ」をどんどん流し込んで、結果をまた「動作を変化させるデータ」としてMTやDASDに吐き出す、

というやり方で、何百万件、何千万件、それ以上、の処理が可能でした。

いわゆるバッチ処理です。そしてこれは宣言型プログラミングに通じると思います。

それなら、コボラー的に見ると、プルーブンな手法だと理解出来ます。

例えば

例えば、MS Accessで何百万件のデータをクエリを使ってJOINさせる事は不可能です。
多分ですが、

  • クエリをする際には、データすべてを仮想記憶に置いて
  • 非常に早いJOINが出来る様にしている

動作だと想像され、仮想記憶の限界の4GBのまな板を超えてしまうと、進まなくなってしまうのも納得です。

それをやれという課題が出たことが有り、テーブルをMTに見立てて、マッチング処理をやって切り抜けた事が有りました。
何万件で、Accessのクエリだとかろうじて仮想記憶の限界内だった場合に、何百万時間(途中までやった時の処理件数と、全体件数から推定)かかるはずの処理が、数分で終わったりしました。

まさに、

  • 出来る問題を限定する代わりに、簡便で見通しの良い記述が可能

な手法の白眉です。皆さんもどんどんお使い下さい。

結論

どちらにせよCOBOLの問題とは無関係で、これからも「COBOL言語である」事でプログラミングが嫌いになる人は存在し続ける事でしょう。

COBOL言語である 3

COBOL言語でない(別案)

関数型プログラミングというものがあるそうで、変数に関数を代入出来、機能をプラガブルに変更出来るそうです。

これを私が耳にしたのは、オブジェクト指向プログラミング真っ盛りの頃で、次世代のプログラミング手法ということで、沢山の人から関心を集めていました。

オブジェクト指向真っ盛りの頃の「次世代」という事で、当然オブジェクト指向プログラミングを凌駕するものだと認識していましたが、
次世代たる実例がいくら待っても出て来ませんでした。

 

少し違和感が有った

「変数に関数を代入出来る」と聞くと、1つ気になる事が有ります。

  • 変数にインスタンスを代入出来、機能をプラガブルに変更出来る手法が有った様な

気です。

 

コボラーの視点から見ると

いくら「コボラー○ね」とか言われても、口答え出来なかったのは、COBOLの文法が変な所(ごく少量のメモリでの動作)に重点を置いていて、オブジェクト指向に対して自分の問題ににおいて、優位性を言うことが出来なかったからです。

ところで、
関数といえば、

  • インターフェースは1つで「公開」

であり、

  • インターフェースに内部のメソッドがある
  • インターフェースにメソッドを複数持てる

オブジェクト指向プログラミングよりは、COBOLに近い、インターフェースの構造から言うと、焼き直しと言っても良いものです。

もちろん、陰関数に言及すれば別かも知れませんが、それだと最も普通の手続き型言語となってしまいますし、関数型プログラミングを推す方達から、陰関数の言及は知る限り皆無でした。

 

そりゃあ、逆転の糸口だって有って良いはずだが

プログラミングの手法で、

  • 出来る問題を限定する代わりに、簡便で見通しの良い記述が可能

な手法は作れると思います。関数型プログラミングもその辺を狙ったのかも知れません。

しかし年々歳々歳々年々コケにされ続け、逆転の糸口を願い続けて来たコボラーでもその様な「問題の限定」は全く見つからなかったのに、

プログラムの構造が焼き直しの関数型プログラミングその余地がある様には、コボラーの視点から思えないのです。

 

それに、

オブジェクト指向言語で、『インターフェースは1つで「公開」』にしたければ、パブリックのメソッドを1つだけにすれば同等だし、

環境変数よろしく、外部とのやり取りを引数以外からしたければ、『パブリックのインスタンス変数』を作ればいいだけで、

関数型はオブジェクト型に含まれている(逆転の糸口がない)様に見えます。

 

結論

どちらにせよCOBOLの問題とは無関係で、これからも「COBOL言語である」事でプログラミングが嫌いになる人は存在し続ける事でしょう。