出来事の日付:2026年6月21日。

プログラマーで著述家のサンディ・メッツが10年前に発表したソフトウェア設計に関する論考が、意図的に直感に反するメッセージとともに再び注目を集めている。それは、異なる要件を一つの抽象化に無理やり通すよりも、重複を許す方が低コストな場合がある、というものだ。この記事は、メッツがその2年前のRailsConfでの講演で提示していた考えを発展させたもので、Chainlineニュースレターに掲載された後、2016年1月に彼女のブログで初めて公開された。

議論は、よくあるリファクタリングから始まる。プログラマーが重複したコードを見つけ、共通処理をメソッドやクラスとして抽出して名前を付け、元のコードをそれに置き換える。その時点では、抽象化は明確で有用かもしれない。問題は、後に登場した要件が元のケースに似てはいるものの、一致しないときに始まる。2人目のプログラマーは共有コンポーネントを維持しつつ、パラメーターと条件付きの処理経路を追加する。さらに要件が加わるたびにスイッチや分岐が増え、かつて普遍的だった概念が、緩やかにしか関連しない複数の役割を担うようになる。

メッツは、その結果として理解しにくく、壊れやすいものが生じると説明する。既存のコードは、たとえその形がもはや問題を反映していなくても、それまでに積み重ねた投資を維持しようとする圧力も生む。その圧力はサンクコストの誤謬の一種であり、チームが複雑なコンポーネントに注いだ労力が大きいほど、それを解体することが難しく感じられる。

彼女が提案する立て直し方は、別の抽象化を試す前に、いったん後戻りすることだ。開発者は、共有された振る舞いを各呼び出し元にインライン展開し、条件分岐を削除して、それぞれの呼び出し箇所に必要なコードだけを残すことができる。各ケースが再び独立して見えるようになれば、チームは当初のリファクタリングの根拠となった想定ではなく、現在の振る舞いを比較できる。そうして生じた新たな重複は、より小さく正確な共通概念を明らかにするかもしれないし、各ケースを分離したままにすべきだと示すかもしれない。

この助言は、再利用を全面的に否定するものではない。メッツは、少数の条件付き経路が、問題に何が含まれているかをチームが理解する助けになる場合もあると認めている。彼女が警告するのは、共有コンポーネントがもはや一つの概念を表していないことを証拠が示した後も、それを拡張し続けることだ。実質的に異なる振る舞いを選択するパラメーターは、設計を再検討すべき合図であり、さらに別の選択肢を追加する義務ではない。

この論考が今も意味を持つのは、こうした区別があるからだ。「同じことを繰り返すな」は直接的な規則として教えられることが多いが、この投稿は抽象化を、要件によって誤りだと証明され得る仮説として扱っている。重複は目に見え、局所的だが、誤った共有モデルはすべての呼び出し元に複雑さを拡散させ得る。メッツの実践的な結論は、時代遅れの抽象化を削除することは後退ではない、というものだ。それは、より良い構造が現れ得るほど、現在の問題を理解しやすくする方法である。