明らかに状況が変わってきている今日のプログラミングとは?

増13補足.「慌てろ」といわれても……

»

●今回の発端

 「増13.『プログラミングのメンタルモデル』についての一考察」で、「プログラミングは慌てないとできないのではないか?」と書きました。それなりに時間を置いて見てみても、筆者はそれが正しいと思っています。

 しかしながら、言葉足らずだったことは否めないとも思うようになりました。ですので、補足をしたいと思います。自分にとっての「プログラミング時の定言命法」ともいえるものを紹介します。つまり、「慌てるとはいえ、取りあえず習慣的に行っている規則のようなもの」です。もちろん、事務計算の応用プログラマの言っていることですので、その背景や限界はお察しください。

  • n個を目指せ
  • あえて計算を軽んじ、制御を重んじよ

●1個でも2個でもなく

 事務計算の応用プログラムは、

  • 扱う量が多い(100万件なんて少ない方、もちろん今はやりのbigdataなんかと比べれば小さい)
  • 個々のレコードは均一(というより、均一でないとやっていられなかったので、無理にでも均一にしたというのが現状)

です。

 1個でも2個でも100個でも1000個でも2GBに収まる個数でもなく、n個を目指す必要があります。

 n個を目指す具体的なやり方としては、レコードの集まり(レコードセットとかデータテーブルとかいわれているようなもの)を文脈自由言語と見なし、それを受理できる(最小の)ロジックを書く方法があります(文脈自由言語はn個を扱うのに適しています)。具体的には「前処理→主処理(終わるまで繰り返す)→後処理」です。もちろん入力が1個や2個の場合、あまりにオーバースキル的なロジックになってしまいますが、そこは大は小を兼ねるです。

 さらに、n個を目指すためには、逆に記憶領域(一時、永続問わず)に持つ状態は定数個になるようにする必要があります。ここを「可変」個にすると、その物理的な限界によりパンクするからです。

●もっと制御を!

 もう1つの規則ですが、

  • たとえその計算が作ろうとしているシステム全体の99.9999%を占めるものだとしても、あえて軽んじて脇に寄せ、その計算を滑らかに呼び出すためのロジック(制御ロジック)を重んじて正面に出す。

という意味です。

 これも、計算対象が1回や2回の場合、オーバースキルになりますが、たとえ本番実行が1回2回とはいえ、テストはその回数では済まないわけで、決して“オーバー”ではないと思います。さらに「脇に寄せる」ということは、関数化やインスタンス化にもつながり、形式的に軽んじているだけで、決して“脇に寄せる=心の底から軽んじる”ではありません。

 さらに、制御を重んじることは、処理にシミュレーション的な要素がある場合、非常に重要になります。一般にレコードの集まりは事実を表します。事実のみから事実でないこと(未来の予測とか)を創り出すのは非常に困難で、どうしても「前処理→主処理(終わるまで繰り返す)→後処理」のループ処理が必要となります。シミュレーション的な要素がない場合でも、あると思ってプログラミングをすると、(虚数まで考えると見通しが良くなるように)見通しが良くなる場合が多々あります。

●この規則の使える範囲

 バッチ処理なら使えると思います。もちろんそれだけでなく、Webブラウザ上のJavaScriptの複雑な処理でも結局同様の規則で済んだこともありました。もちろんSelect文のSumやMinなどの集計一発で済む場合に「前処理→主処理(終わるまで繰り返す)→後処理」を持ち出されては鼻白まれるかも知れませんが、何度も言いますが大は小を兼ねるの考え方をすると、慌てているときの一種のワンパターンとして支えになると、筆者は強く信じます。

 まぁ、今回はこんなところです。

●コラムのコメント欄の方針

 コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。

ですので、このコラムで、

  • わたしは基本的にコメントに答えない
  • コメントを書く人は、回答がない前提で議論を進めていただく

とさせていただきます。

Comment(1)

コメント

くわぢ

もしかすると「文脈自由言語」でなく、「文脈依存言語」の方が妥当だったかも知れません。
もし本当に「文脈自由言語」なら「insert ~ select」の書き方が最適で、あえて
「前処理→主処理(終わるまで繰り返す)→後処理」のぐるぐる回しを書く必要がないから
です。

コメントを投稿する