エンジニアの立ち居振舞い:過度に仕組みを作らない
特に仕事でコードを書く場合で意識してることだけど、過度に仕組みを作らないというのを大事にしている。
ここで、過度な仕組み
とは例えば最初から以下のような実装をすることを指すことにする
- 1つのクラスでしか使われないコンテキストの上に成り立つ実装をグローバルなクラスに切り出してそのクラスを他のクラスからも使えるように実装する
- テンプレートメソッドパターンを適用して部分的に実装を差し替えられる用に実装する
- 例えばjavaとかで実装クラスは現時点で一つしかないのに最初からインターフェースを用意する
要するに、万人が使うようなフレームワークやライブラリを実装するかのように拡張性の高い
コードを実装してしまうことを指す。
過度な仕組みを作れば作るほど、仕組みの動作を保証するのに必要なUTの量は増加し、実装量も増えてレビューは大変になり、またその部分を修正する人はロジックそのものに加えて仕組みそのものの仕様理解にも時間を取らされたりと、色んな人の工数を大量に消費する。
それでもまだ本当にそんな仕組みが必要だろうか?自分たちが今必要としているのは動く実装でありフレームワークではない。
自分が過度な仕組み
を持つ実装をする場合は、今から作ろうとしている実装において、明らかにコピペできるレベルの実装がいくつもあるなーと感じた時だけにしている。これもしかしたら他でも使うかもなーと思うこともあるのだが、それでも一箇所でしか使われないコードならグッと我慢してベタッと実装する。
もちろん機能的な分解点やUTの書きやすさを意識してメソッド自体はあれこれ分割したりスコープを考えたりクラスを分けたりといったことはするが、しょっぱなからサブクラスを作ってそのクラスをオーバーライドするところから実装を始めたりはしない。
なぜか?今作ろうとしている目の前の機能こそが一番大事だからだ。
今作ろうとしている機能を過不足なく、他のメンバーが理解しやすい形の落とし所に納めて、リリースすることこそが一番大事だからだ。だから無駄なことはしない。早く作って早くリリースする。
そして時が経って、必要になったらその時初めて抽象化でもなんでもする。
大事なことは常に「今」必要最低限のものだけで始めて、「必要なとき」に素早く拡張できることだと思う。