コーディングは自由度が高い。自由度が高いゆえに、同じことをいろいろなやり方でできてしまう。
There should be one-- and preferably only one --obvious way to do it.
とZen of Pythonにあるように冴えたやり方はたった1つだ。しかしながら、イマイチなやり方は無数にある。
無数にあるイマイチなやり方で、最もやめてほしいのは「凝った」ことをすることだ。凝ったコードというのは、クソコードを遠回しに言っているだけである。「凝ったことしているなあ」と言っていたら、「うわ、なんだこのクソコードは」と本当は言いたいのである。クソコードというとコードそのものを批判するのではなくて、書いた人を批判しているみたいになるので、婉曲的に言っているだけだ。
凝ったことをするというのは、意味もなく難しくしようとしていることである。素直に書けばよいものを、余計なことを考えて難しくする。そして、その余計なことの意図がコードに現れていなくて意味不明、あるいは成功していない。
やりたくなる気持ちはよくわかる。私もしているに違いない。凝ったコードを見ると、怒りとともに、私も似たようなことをしているのだろうという嫌悪を感じる。
新しいやり方を覚えたら使いたくなる。手段が目的より前に出ている状態ではあるが、目的は自由に選べない身分からしたら、手段しか工夫するところがないのだ。「手段のために目的は選ばない男」*1ではないが、目的なんて関係なく、いろいろなやり方を試したくなるものだ。その結果、工夫が明後日の方向に向かうこともあるでしょう。
意味もなく関数の再帰呼出ししたり、意味もなく継承をしてみたり、意味もなくラムダ式を使ってみたり、意味もなく抽象クラスを作ったり、意味もなくデザインパターンを使ったり、etc.
気持ちはわかるがやめてほしい。分かってないのに、分かった振りしているのは、余計に物事を複雑にする。難しいことを知っていて・使いこなせる達人なんだと思いたいのは分かるが、そういうことをする人が最も素人くさい。それはキャリアが何年あろうが同じことだ。分かってないのに難しいことをしようとする奴は素人だ。
それでも、使わなければ覚えないじゃないかという問題がある。新しいやり方を覚えること自体は善だ。新しいやり方を絶えず習得し続けなければ、静かに死んでいく。
本当に有効ならば、新しく覚えたやり方を使ってもいい。基準は、そのやり方を使った方が明らかに問題が簡単になっているかどうかだ。複雑さが隠蔽されて見かけ上問題が簡単になるならば、使うべきだ。シンプルさに寄与するならば正しい。シンプルになるなら、凝ったことをしているなんて誰も言わない。
さて、困るのはシンプルの基準というのはパラダイムの問題だということだ。パラダイムとは、物の味方や思考の枠組みのことだ。
自分の持つパラダイムにないことは理解できない。バイトコードを読むような人からしたら、サブルーチンを呼び出したり、スタックに変数を割り当てるのは、複雑なことで理解できない。手続き型が染み付いている人からしたら、関数ポインタを駆使するオブジェクト指向なんて複雑怪奇で理解できるわけがない。オブジェクト指向なんて難しいことをするなとなるわけだ。よく出てくるキラーワードが性能だったりする。
いわゆるバカの壁に阻まれている状態だが(お互いに)、これをどうしたらいいのかは今のところ答えがない。