直交性と正規化

いきなりでかい話をする。
時間をt、空間成分をx,y,zとして、宇宙全体を現すような式を考える。
f = f(t,x,y,z)
これだと、時間と空間がどう絡んでいるかわかりづらいので、「とりあえず、時間成分と空間成分は直交している」と仮定する、つまり
f = f1(t)*f2(x,y,z)
という[時間だけの式]×[空間だけの式]と分けれると考えてみよう。


とか言うのは、大学の頃の大センセイに仕込まれた大切な概念である。なんでそうするか?答えは簡単。複雑な事象はそれぞれが直交関係にあるような単純な事象の組み合わせと考えたほうがわかりやすくなるからだ。



これはUnixのフィルタにも同じようなことが言えて、

ディレクトリ内のjpegをサイズの大きい順にTOP10を知りたい場合
du -k *.jpeg | sort -n | head -10
とかやるだろう。jpegじゃなくてこれをwavのサイズの小さい順から3つ表示したいという場合は同じような形で
du -k *.wav | sort -nr | head -3
と表示できる。複雑な要求を満たすためには互いに直交した(独立して動作する)フィルタの組み合わせを考えるだけでよい。
また、duの引数を変えたぐらいで最後のheadでエラーを起こすことはない、なぜならば、それらは互いに直交関係(独立関係)にあるからである。


これが幸か不幸かソフトウェア開発の設計時に生かされることが多くて、例えばデータベースから値を読んで表示を変えるWebアプリなんかを考える場合、データベース上のデータモデルとブラウザ上で見えるビューについては「直交している」ように(コントローラを)作らねばならない。というのはよくある例。


MVCに限らず、直交性を意識すると確認がしやすくなる、というのは互いに従属関係がないことがわかっていれば、確認する範囲を絞ることができるようになるからだ。


つまり、直交性を意識して設計すれば、テスト工数が減る。


ただ、残念なことに(?)情報産業では「依存関係」という言葉で従属関係についてはうるさく言うものの、直交性に注目したドキュメントにはなかなかお目にかかることができない。せいぜい「オブジェクト同士の連携は密になりすぎないほうがいい」とか、直交性という概念を理解してるのか、知らないのか歯がゆい解説が多かったりする。KISSの原則とかも、直交性に触れているのか微妙な線だと思う。疎結合とかヘンな言葉まであるし。(そんななか、直交性を説明しているピアソンの「達人プログラマー」はやはり白眉だ、達人を名乗るだけはある)


そう考えると物理というのはフトコロの深い学問なんだなぁと感心したり。


ちなみに正規化が役に立つケースは直交性に比べるとかなり限られる。
これについては、また、ネタが尽きたら書こうと思う。