増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などの集計一発で済む場合に「前処理→主処理(終わるまで繰り返す)→後処理」を持ち出されては鼻白まれるかも知れませんが、何度も言いますが大は小を兼ねるの考え方をすると、慌てているときの一種のワンパターンとして支えになると、筆者は強く信じます。
まぁ、今回はこんなところです。
●コラムのコメント欄の方針
コメントに対し、当意即妙の回答を、それなりのタイミングでする自信がありません。
ですので、このコラムで、
- わたしは基本的にコメントに答えない
- コメントを書く人は、回答がない前提で議論を進めていただく
とさせていただきます。
コメント
くわぢ
もしかすると「文脈自由言語」でなく、「文脈依存言語」の方が妥当だったかも知れません。
もし本当に「文脈自由言語」なら「insert ~ select」の書き方が最適で、あえて
「前処理→主処理(終わるまで繰り返す)→後処理」のぐるぐる回しを書く必要がないから
です。