Diary?::2007-02-03

(12:54) ボールペンをワイシャツの胸ポケットに入れたまま洗濯しちまった

けどどうやら大丈夫っぽい。いや、本当久々に死ぬかと思った。

(16:53) 大学時代の後輩のコードとコードレビューの様を見て思ったのだけど

何というか、やっぱプログラミング言語における「意味が通じる」が「処理系が通す」だと思ってる節があるな。んなわけねえだろ、ヴォケ!

まず最初に、処理系が通さないコードってのは自然言語でいうと「sbjだえrhvふぁえるkhy34895uうぇhrふぃtrhjぎおjふぃlj」みたいなわけのわからん文字列と同じだということを認識する必要がある。つまり、正常な構文解析が出来ない文字列だ。これはまあ極端な例で、実際には「てにをは」の間違いとか誤字脱字だろうな。勿論人間は多少ルーズな書き方のされた文章でも適当に解釈できるが、まあプログラミング言語の処理系はその閾値が激烈に高いとでも思えばいい。

次にエラーのあるコードだが、これは「わたしは嘘しかつきません」のような、ナンセンスな文章と同じ。構文解析には成功しても、その内容に踏み込むとおかしくなる。これまた人間は適当に解釈して意味を取るが、まあコンピュータは基本的に字面のまま受け取るものだ。とりあえず、ここまでが明らかに間違ったコード。

そして次ぎに動きはするけど意味不明なコードなのだけど、これはつまり「回りくどかったり」「同じ事を何度も書いたり」「不自然に長ったらしかったり」「意味もなく難しい言葉を使ったり」「中身の無いたとえ話をしたり」、そういったアホな文章と同じだ。これらを実際のアホなコードにあてはめると

回りくどい
抽象化のやり方が間違っていて、 1 ステップで済むことが何ステップにも分かれていたり、条件分岐が意味不明だったりする。
最近見た奴だと、 SQL の書き方を知らないのか本来なら一発で取ってこれるデータをループで回して毎回 SQL 発行とか。これは人間とコンピュータ双方にとって回りくどいケース。
同じ事を何度も書く
関数やクラスの分割を考えていないコード。ていうかこれは十中八九コピペプログラミング。
普通の文章でもたまにあるよね、「あれそれさっき書いてたじゃん」ってのが。
不自然に長ったらしい
文章でいうと、章立てとか段落とかの構成が間違ってるケース。プログラミングだと長すぎる関数。
「意味のある単位でまとめろ」といってそういうコードが出てくると頭を抱えてしまう。あのなあ、それって全ての処理を main 関数に書くのと同じだって。
意味もなく難しい言葉を使う
お前は文学者気取りかと突っ込みたくなるような「自称美文」と同様の事が、プログラミングの世界にも存在する。
例えば過剰に抽象化、一般化してわけわかんなくなるとか (Java なんてそうだよな)、継承や包含の深さが洒落になってないとか。それは美しい設計ではなくて、ワケワカメな設計だ。それともお前はそのワケワカメなコードをずっと保守するとでもいうのか?
中身の無いたとえ話
抽象化のやり方が間違ってるケース。不適切なたとえ話同様、不適切な抽象化ってのが存在する。
覚えたばかりの手法をガンガン使いまくるというケースがこれの主原因で、要するに麻疹みたいなもの (OOP のプログラマーにとっては特に)。特にデザインパターンとかもろにこれになりうるよな。

という感じになるかなあ。処理系の通さないコードはエラーが無くなるまで書き直せば済むし、エラーのあるコードもそれがバグってるということはわかるので直されることだろう。が、意味不明なコードは必ずしも直されるとは限らない。そして直すプロセスが機能する保証もない。もしも未熟な集団でペアプログラミング、コードレビューなどがなされると、間違いに誰も気がつかない、あるいはいったんそういうプロセスを経てしまったせいでダメなコードに自信を持ってしまうかもしれない (これは最悪のケースかもしれないな)。

Written by Kuwata Chikara
Creative Commons