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

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

より簡単な手法にさせてもらえない 4

何で統計の知識で簡単にプログラミングが出来ないのか?

同じレベルだからだと思います。統計の知識で啓蒙してやろうとやって来ても、争いしか起きません。

レベルとは

統計の知識で目にみえる成果が出るのは、

  • バラバラなデータをカーブフィッテングなどで理論化する

場合だと思います。プログラミングも、

  • バラバラなデータの意味を技術的に実現可能な風に、点にそれにふさわしい滑らかな曲線を描く

ので、目にみえる成果が出る場合には、問題に対して「引いた」視座となっているのに対し、統計はプログラミングという問題に対し引いていない、争いしか起きない位置にあるのだと思います。

結論

これからも「より簡単な手法にさせてもらえない」事でプログラミングが嫌いになる人は存在し続けることでしょう。

 

COBOL言語である 5

何でコボラーなどになってしまったのか?

私はコボラーとしてはかなり後になったと思います。

のでなったのですが、

それには理由が有りました。今後、その様な陥穽に陥る事が無い事を願い、以下に書きます。

別の言語で学んだ事がハマった

大学に入ってから、MZ-80CのSP-4010(シャープPascal)言語ばかりいじっていました。この言語はかなりTinyで、

  • 関数が無い
  • ループ(repeat until 終わるまで)の途中脱出が無い
  • gotoは有ったかも知れないが(記憶していない)、ダイクストラ大先生(エドガー・ダイクストラ Wikipedia 日本語版)のgoto禁止(その当時の私の感想)に感化されて、禁止としていた。

と言う縛りが有り、

  • 前処理→主処理(繰り返し)→後処理(関連:スパゲティプログラム Wikipedia 日本語版)

と言うパターンを忠実に守る以外に、実用的なプログラムを書く手段が完全に有りませんでした。

COBOLのプログラムは

ビルドの単位(javaで言うプロジェクト)など無く、1つのプログラム(前処理→主処理(繰り返し)→後処理)それぞれを1つ1つ独立してコンパイル出来る事が必須条件でした。

さらに、同じ意味のハズの変数でも、別のプログラムでは別の操作的意味になる事も、稀では無く、一々調査が必要でした。

また、私が就職した頃にはCOBOLシステムでは「構造化プログラミング(Wikipedia 日本語版)」が流行っていて、

それら諸々が、TinyなシャープPascalと符合してしまったのです。
(repeat until 終わるまで、では無く、PERFORM UNTIL 終わるまで、ですが、、)

逆に言うとCOBOLというのは、その程度だった、という事が言えます。(私の感想です。)

現在では、

現在では、SQL言語を埋め込む事で、COBOLの1つのプログラム相当の機能を、javaなどのプログラムの内部機能として活用出来ているので、COBOLはお役御免だと思います。

結論

これからも「COBOL言語である」事でプログラミングが嫌いになる人は存在し続ける事でしょう。

 

 

まともな名前をつけさせてくれず、意味がわからない 2

プログラミングの技術的制約とは何に起因するのか

私は昔からプログラミングについて、因果推論により「確率から因果に」変換すると言う理論が役に立つのでは無いかと思っていました。*1

確率とは要求であり、因果とはプログラミングです。

 

もちろんプログラミングと統計学は、恐ろしく相性が悪いので、(統計的因果推論の様に)因果推論の際に統計学の力を借りて大局的に調査をするのはしずらいと思いますが、非巡回有向グラフ(DAG)と言う因果推論の1つの道具は、非常に有効だと思います。

 

何十年も前から「ペトリネットWikipedia 日本語版)」と言う表記方法も有りました。これは離散分散システムの記述だと言う触れ込みですが、

そもそもDBを使ったWeb画面による入力システム自体が、複数の場所(ブラウザー)から合い互いに示し合わせたりせずに入力する訳ですから、これだけでも離散分散システムです。

 

端的に言って何に起因するのか?

  • 計算に必要な値が揃わないと計算出来ない
  • 計算に必要な値は常に手に入る訳ではない
  • 後から使いたければ、手に入る内に別に記憶しておく必要があるが、記憶域は無限ではない

からだと思います。

それをややこしく表現するとペトリネットの様な、因果推論の様な世界になると言う訳です。

プログラミング開始時点では計算結果が50だろうと100だろうと50歩100歩であり、計算に必要な値を揃えるのこそが大変で、大変さの克服の結果、プログラムに人間が自然だと思う「意味」とのズレが生じるのです。

 

なぜUMLのパッケージだと、まともな名前に近づくと考えるのか?

javaのパッケージやjavascriptのパッケージャは、1カタマリの機能を読み込む単位です。それに対し、UMLのパッケージは、

  • 何の制限もなく、(典型的にはクラスといった)モデル要素を集めるだけ

です。これはクラス数が少ない、お試しで作った様なシステムでは完全な役立たずに見えますが、クラス数が50を超える様な実用的なシステムでは必須の位置付けになります。

極論するなら、

  • javaパッケージの内部の似たようなクラスを集めて、1つのパッケージとしても良い(別にjavaのパッケージの制限をUMLのパッケージは受けません。)

訳ですし

  • 別の側面から別の分類でパッケージ分けした、別のUML図を作っても良い(命名規約で頭に分類の名前をつけてしまうと、これが出来ません。)

訳です。

UMLのパッケージはクラス(など)に対して、

  • 問題からの角度はそのままで、
  • 遠ざかり、解像度が落ちる

視座にあると言う位置付けだと思います。プログラム内部の事情から離れて、人間が付けたい名前に寄せたいと思うなら、値を手にいれると言うレベルからは遠ざかるしかないのだと思います。

 

値を手に入れると言う機能を無視すれば良いのでは無いか?

否だと思います。万能な、値を即時に手に入れてくれる何かがあるとは思えません。
値を手に入れる手間もプログラミングの内です。

  • それも含めた上で、
  • それが見えないレベルまで視座を引いたもの

UMLのパッケージだと思います。

 

結論

UMLのパッケージは後知恵となり、かなりクラス等が出来上がってからの話になると思います。「(せめて)名前をつけたい」と願う素人の出番は有りません。

ですので、これからも「まともな名前をつけさせてくれず、意味がわからない」事でプログラミングが嫌いになる人は存在し続けることでしょう。

 

*1:ジューディア・パール,ダナ・マッケンジー. 因果推論の科学 「なぜ?」の問いにどう答えるか (Japanese Edition)

まともな名前をつけさせてくれず、意味がわからない 1

どの様な話?

名前の付け方や、第一級の括りの意味を知る事は、オブジェクト志向だからどうだと言う、独自の考えは無いと思います。

逆に、名前の付け方や、第一級の括りの意味について「虫が良すぎる」(長期間の真剣な研究開発でも解が無い)仮説が有ったとしても、それによってオブジェクト志向の価値が下がってはならないと思います。

その様なこだわりはオブジェクト志向とは分けて考えるべきだと思います。

名前?意味?

名前は点だと思います。そして実装(意味)はそれに相応しい滑らかな曲線となり、プログラミングの技術的制約によって、実装は人間が欲しい意味との乖離が発生します。

それが発生したからと言って、即負債だとするのは短兵急が過ぎます。

単一責任の原則

単一責任の原則(「変更するための理由が、一つのクラスに対して一つ以上あってはならない」 SOLID Wikipedia日本語版より)と言う原則が有り、

なかなかに実現するのに困難だと思います。

理由の方をコンピュータの技術的な都合に近づける(名前をまともでは無くし、説明的でわざとらしい名前にする、意味は分かり難くなる。)と実現しやすくなると思います。

要求仕様との乖離に対処するには?

  • 単体のクラスでは無く、『複数のクラスを人間が欲しい意味に合う様に集めたもの(UMLのパッケージとか)』

に対してなら、「人間の理解し易い理由版」単一責任の原則も成立する様に思います。

「クラスがダメだから関数」とかの単純に向く方向性で無く、UMLのパッケージの様な、複雑に向く方向性の方がまだ芽が有る様に思います。

結論

これからも「まともな名前をつけさせてくれず、意味がわからない」事でプログラミングが嫌いになる人は存在し続けることでしょう。