どの書き直しも、これが最後になるはずだった

私はシステムの同じ中核コンポーネントを三度書き直した。パッチを当てたのでも、リファクタリングしたのでもない——ほぼゼロに近いところから、三度別々に作り直したのだ。そして毎回必ず、今度のこのバージョンこそが本物だと確信していた。これでようやく、この上に末永く築いていける、きれいで正しいアーキテクチャだと。

私は三度連続で、そのたびに満々の自信を持って間違えた。間違っていたこと自体は腹立たしい。だが私が本当に語りたいのは、その満々の自信のほうだ。なぜなら、それは同じ感覚の繰り返しだったのに、私はそれを一度として警告として認識しなかったからだ。

「今度こそ正しい」

新鮮な書き直しには、特有の高揚感がある。古いコードはぐちゃぐちゃだ——あらゆる妥協、あらゆるパッチ、現実に押されて曲げざるを得なかった場所のすべてが見える。一方、頭の中にきれいに収まっている新しい設計には、そのどれもがない。エレガントだ。自明だ。明らかに優れている。

そこであなたは古いものを取り壊して新しいものを作る。しばらくは前進しているように感じる。なぜなら新しいコードは実際にきれいだからだ。それから使い始めると、また曲げが始まり、しばらくすると、あなたは二つ目のぐちゃぐちゃの前に立ち、また一からやり直したいというまったく同じうずきを感じている。

なぜ書き直しはいつもよく見えるのか

その比較は仕組まれている。そしてそのからくりが見えるまで、私には三周かかった。書き直しを評価するとき、あなたは新鮮で理想化された設計を、実際の使用という摩擦を何ヶ月も吸収してきた古い設計と比べている。新しいほうがよく見えるのは当然だ。それはまだどの問題にも出会っていないのだから。

古いコードが醜く見えるのは、設計が不完全だったからだけではない。それが自らの経験を身にまとっているからでもある。その中の不格好な分岐の多くは、現実のエッジケースから来た傷跡だ——世界が投げつけてきたもので、きれいな新しい設計はそれを生き延びる必要にまだ一度も迫られていない。あなたは常に良い設計と悪い設計を比べているわけではない。多くの場合、あなたはベテランと新兵を比べて、新兵がいかに無傷であるかに感心しているのだ。

私が払い続けたコスト

それぞれの書き直しは、コード以上のものを捨て去った。それは知識を捨てた——古いバージョンが静かに対処できるようになっていた、あらゆる奇妙な状況に対する、積み重ねられ苦労して得られた処理だ。そしてその知識は私の頭の中ではなくコードの中に住んでいたので、作り直すことはそれを再発見することを意味した——同じ奇妙なケースに再びぶつかり、同じ問題を再びデバッグし、すでに買い取ったはずの教訓に二度目、三度目の代金を払うことを。

バグを直して、これとまったく同じバグを以前にも直したことがある、と気づくときには、特有の疲労がある。しかもそれはもう存在しないバージョンのコードでのことだ。それが私の三度目の書き直しの大部分だった——二度目で捨て去った知識を、ゆっくりと再び稼ぎ直すことが。

その下にあったもの:早すぎる抽象化

このすべての作り直しの真のエンジンは、設計についての考え方の誤りだった。私が書き直し続けたのは、問題を実際に理解する前に正しい構造を見つけようとし続けたからだ。私は正しい抽象を、十分に賢くさえあれば、最初に腰を据えて正しく設計できるものとして扱っていた。

私の経験では、有用な抽象が最初から正しく設計されることはめったになかった。それらは使用を通じて勝ち取られた。それらは、問題と十分長く付き合い、それが本当にどこで曲がるのか——どの部分が変化しどの部分が固定されたままか、本当の継ぎ目がどこにあるのか——を学ぶことから生まれる。それを事前に完全に設計するのは推測であり、それぞれの書き直しは、ほんの少し情報が増えただけの、しかしうまく推測できるほど学ぶにはまだまだ遠い、私のまた一度の推測にすぎなかった。

書き直しが本当に値するとき

私は書き直しが常に間違っていると主張したいのではない。ときには設計が本当に、必要とされる場所まで伸びきれず、その場で進化させるほうが一から始めるよりコストがかかることもある。私が最終的に引けるようになった区別は、その衝動の源泉に関するものだ。

問題についての本物の新しい理解に駆られた書き直し——「一つの概念として扱っていたこれが、実は二つだと今わかった」——は、しばしば本物の前進だ。一方、主に現状のコードへの不快感に駆られた書き直し——「これは醜い、きれいなものが欲しい」——は、たいてい新しいペンキを塗っただけの動きだ。前者は意味のある構造的前進を生み出す可能性が高い。後者はたいてい、数週間それについての気分を変えるだけで、やがて新しいものもまた醜くなる。

対処法:本当にできなくなるまで、その場で曲げる

私が身につけた習慣は、書き直しを最初の本能から最後の手段へと格下げすることだった。自分を苛立たせる構造に直面したら、私はまずその場で変えることを試みる——形を変え、リファクタリングし、必要なものへと動かしながら、それが積み重ねた知識を保たせる。完全な作り直しは、既存の構造が進化させようとするあらゆる試みに本気で抗うときのために取っておこうとする。単に私の整頓感覚を逆撫でするだけのときではなく。

多くの場合、あなたに一からやり直したいと思わせる不快感は、情報であって判決ではない。それはコードが、どこが痛いのかをあなたに告げているのだ——そしてそれこそが、一から作り直すことで捨て去ってしまう、まさにその知識なのだ。

確信こそが手がかりだった

三度の書き直しすべてを貫いていた糸は、悪いコードではなかった。それは一つの感覚だった——今度こそ正しくつかんだ、というきれいで完全な確信だ。「これが最終アーキテクチャだ」というのが、事実上、私がそれぞれの前に口にした文だった。ある文が間違っていると判明し続けるなら、その文への信頼は下げるべきだ。そしてゆっくりと、私はそうした。

まだストレステストにかけていない設計についての強い確信は、洞察と同じではない。それはしばしば、さもなければあなたに別のことを教えていたはずの傷跡が、ただ欠けているだけなのだ——まだ世界に出会っていない計画の、心地よい自信。最近では、新しい設計が最終のものだと完全に確信したとき、私はその感覚そのものを、その意見を任せられるほど長く問題と付き合っていないかもしれないという暗示として扱うよう努めている。

— シグナルもなければ、リターンもない。投資助言ではない。