“コピペは悪”と習ったのに——名エンジニアが説く「まちがった共通化は、コピペよりずっと高くつく」。迷ったら、いちど元に戻せ

「同じコードのコピペはダメ、1つにまとめなさい」——プログラミングを習うと必ず言われるこの鉄則に、真っ向から但し書きをつける10年前の名エッセイが、いままたHacker Newsで話題(コメント300)になっている。書いたのは Sandi Metz(サンディ・メッツ)という著名なエンジニアで、彼女のRailsConf 2014の講演「all the little things」から生まれた文章だ。主張はシンプルで強烈——「まちがった“共通化”は、コピペのまま放っておくより、はるかに高くつく(duplication is far cheaper than the wrong abstraction)」。よくない共通化は、こう育つという。(1)誰かが重複コードを見つけ、きれいな共通部品にまとめる。(2)時間がたち、「ほぼ同じだけど、ちょっとだけ違う」要求が来る。(3)次の人は、その部品にスイッチ(引数や条件分岐)を一個足して間に合わせる。(4)それが繰り返され、いつしか誰も読めない、スイッチだらけのお化けになる。こわいのは、関わった全員が、その時その時は“正しいこと”をしていた点だ。さらに、手をかけたコードほど捨てられなくなる「サンクコスト(埋没費用)」の罠が、まちがった共通化への固執を生む。メッツの処方箋はいさぎよい——気づいたら、共通化をいったんバラして、それぞれの呼び出し元にコピペで“戻せ”。各所に散らばった固有の条件を消し、きれいになった土台から、改めて正しい共通化を生やせばいい。「進むための一番の近道は、戻ること(the fastest way forward is back)」。コードを書くことね・ひかり・みずき・ひなたの4人が、この逆説を掘る。

ことね:ねえ、ちょっと聞いて。プログラマーの世界で、もう10年も語り継がれてる、すごく有名な“教え”があるの。題して——「まちがった共通化は、コピペよりずっと高くつく」。

ひかり:えっ、待って待って。わたしずっと、コピペ……同じものをコピーして貼るのが、いちばんダメなことだって聞いてたよ? 「同じコードは1つにまとめなさい」って。ことね先輩も前にそう言ってたじゃん!

ことね:そう、それが普通の教え。同じ処理が2回出てきたら、1つの“共通の部品”にまとめる——プログラミングの基本中の基本。でね、Sandi Metz(サンディ・メッツ)さんっていう有名なエンジニアが、あえてこう言うのよ。「まとめ方をまちがえると、コピペのままにしておくより、はるかに高くつく」って。

ひかり:うーん……なんで? いちど“ちゃんと”まとめたなら、それでハッピー、じゃないの?

ことね:それがね、こう育つの。最初の人は、正しくまとめた。でも後日「ほぼ同じだけど、ちょっとだけ違う」注文が来る。次の人は、まとめた部品に“スイッチ”を一個足して対応する。また別の注文。またスイッチ。……繰り返すうちに、誰も中身を読めない、スイッチだらけのお化けが出来上がる。こわいのはね、関わった全員が、その時その時は“正しいこと”をしてた、って点なの。

みずき:…あー。それ、コードに限らないやつだ。「ここまでやったんだから、いまさら捨てられない」ってズルズルいくやつ。手をかけたものほど、まちがってても、もったいなくて手放せない。

ことね:まさにそれ! “サンクコスト(埋没費用)”の罠、って言うの。で、メッツさんの答えがいさぎよくてね。「まちがった共通化に気づいたら、いったんバラして、それぞれの場所にコピペで戻せ」。一回、後戻りしろ、って。「進むための一番の近道は、戻ること」——ここが、この教えのいちばんカッコいいところなのよ。

みずき:…戻る勇気の話か。前に進むより、よっぽどむずかしいやつ。

ひなた:ふぁ〜……あのね。わたし、カレーとシチュー、にてるなあって思って、いっぺんに、おんなじお鍋で作ってみたことがあるのです。……そうしたら、カレーでもシチューでもない、ふしぎな茶色いのが出来たのです。にてるからって、むりに一緒にすると、どっちも、おいしくなくなるのです。……べつべつのお鍋で、いいと思うのです。

まとめ:プログラミングの定番「重複(コピペ)は1つにまとめろ」に、名エンジニア Sandi Metz が刺す但し書き——「まとめ方をまちがえると、コピペのままよりずっと高くつく」。正しくまとめた部品に、似て非なる注文が来るたびスイッチを足し、いつしか誰も読めないお化けになる。しかも関わった全員が、その都度“正しかった”。みずきの言うとおり、もったいなくて捨てられない「サンクコスト」の罠だ。Metzの答えは潔く、「迷ったら、いちどバラしてコピペに戻せ。進む一番の近道は、戻ること」。ひなた曰く、似てるからって一つの鍋で煮ると、カレーもシチューも、ただの茶色になる——というわけです。

元記事を読むホームへ