なにかの機能を実現するためにコードを書いているというのに、そこから脱線して意味不明なコードを書く人たちがいる。汎用性は高いつもりらしいけど無意味に難しいものを作りたがったり、必要がないのに「念のため」に既存の機能を残したがったりする人たちがいる。どうやら柔軟性あるいは汎用性が至上の価値であって、その価値に反するものはなんであれよくないものだと思っている人たちがいるようだ。
そういう考え方は間違っていると思う。
ある機能を実現するにはいろいろな方法がある。プログラマはそのうち一つの方法を選んでそれを実装しなければいけない。機能を実装する前は無限の可能性がありえたが、機能を実装したあとは具体的に実装したこと以外のことはできない。芸術家が大きな大理石のブロックから一つの彫刻を削りだすように、具体化することによってそれ以外のありえた形というのがなくなってしまうが、それは避けられないことだ。全部の可能性を留保しつつ、なんらかの具体的なコードを書くということはできない。
無理に両立させようとすると、おかしなことになる。
無限の可能性を担保しようと思うと、究極的には何らかのインタープリタを実装してその上で機能を実装することになる。でもそれ自身ではなにも機能を実現していることにならない。
難しいコードを書いてしまうある種の人たちは、適切なレベルの具体的さで書かれたコードよりも、インタープリタに近いコードがよいと思ってしまう人たちであるようだ。いま現在特に必要性もないのに、データを解釈して動作を変えるようにしようとか、設定ファイルで動作を不必要にカスタマイズできるようにしようとか、そういうことをやりだすとインタープリタみたいになってしまう。そういうのはわかりにくいだけだ。
コードを書くというのは、ある形に向かって特殊化していくということである。
コードを書くにあたって、このやり方だと別の(仮想的な)ケースだとカバーできないからなぁ、とか思った時にはこの話を思い出してほしい。自分の書くコードは机上の空論までカバーする必要はない。将来のあらゆる可能性をカバーする必要もない。具体的なコードを書くことを恐れる必要はない。抽象的すぎるコードは具体的な問題を解決できないコードであることがほとんどだ。必要ならあとでコードを書き換えればいい。いま何かを実現したいのなら、それに必要なことを直接やるだけのコードをそのまま書くのがいい。