理解しないままバグを「修正」し続けていた
かつて私は、バグが消えると祝杯をあげていた。ある問題に苦しめられ、何かを変えると、問題が消え去り、勝利の温かい高揚を感じてそのまま次へ進む。バグが消えることと、バグが直ることは、まったく別の出来事なのだ——そして両者を混同することが、自分ではまったく解決していない問題を、知らぬ間にシステムへと静かに溜め込んでいたのだ。私はそれを、ただ自分自身から隠していたにすぎない。これを学ぶのに、長い時間と多くの痛みを要した。
これは、平易に言葉にすればごく当たり前に聞こえるのに、実際に守るとなると恐ろしく難しい類の教訓だ。なぜなら、その瞬間にまつわるすべてが、人を誤った方向へと押しやるからだ。
症状が消えることの誘惑
何かを変えた直後に問題が消えると、あらゆる本能が「直した」と叫ぶ。その安堵は本物で、即座にやってきて、化学的なものだ。次のことへ進みたいという圧力は途方もなく大きい。見たところすでに問題でなくなったものを、わざわざつつき続けたい人などいるだろうか。
だが、その安堵の下に潜む居心地の悪い真実はこうだ——症状が消えたという事実は、ただ症状が消えたことを証明するだけだ。それは、根本原因に実際に対処したのか、それとも今だけ静かにさせる程度に揺さぶっただけなのかについて、何も——本当に何も——教えてくれない。この二つの結末は、その瞬間にはまったく同じに見える。同じに感じられる。だが、似ても似つかないものなのだ。
説明できなかった「修正」
私の場合、そのパターンは恥ずかしくなるほどありふれていた。何かを変える——いくつかの処理の順序を入れ替える、ガードを一つ足す、近くの何かを調整する——すると、エラーが出なくなる。そしてもしその瞬間に私を呼び止めて、なぜその変更が問題を解決したのかを正確に説明しろと言われたら、私にはできなかっただろう。私は本当のところ分かっていなかった。ただ、何かに触れたら、よくないものが静かになった、それだけを知っていたのだ。
私はそれを修正と呼んでいた。だが、それは実のところデバッグでも何でもなかった。祭壇に供物を捧げ、神々が今のところ機嫌を直したらしいと気づくことに、むしろ近かった。私が何かを変えると、宇宙が私を罰するのをやめ、私はその相関を理解だと解釈することにした。それは理解ではなかった。コミットメッセージ付きの迷信だった。
理解していないバグは死んでいない——隠れているだけだ
説明できない修正の根深い問題は、自分が実際に何をしたのかまったく分からない点にある。バグを取り除いたのか、それとも今は見えないどこかへ移しただけなのか。本当に分からない。そして、その不確かさは無害ではない。なぜなら、原因が手つかずのままそこに残っているなら、それは必ず戻ってくるからだ。後になって、別の衣装をまとい、システムの別の片隅で、おそらくはより悪い形で再び姿を現す——そしてそのとき、それが数か月前に倒したと思っていたのと同じ敵だという記憶は、あなたには残っていない。
これこそ、私が最も過小評価していたことだ。説明できない修正は、システム内のバグの数を実際には減らさない。バグを移動させ、しかもそれを再び見分けられるはずの知識をあなたから奪う。あなたは戦いに勝っているのではない。同じ相手を、さまざまな変装へとばらまいているだけなのだ。
少しずつ建ててしまう幽霊屋敷
十分な時間が経つと、こうして保守されたシステムは、作者本人を含め誰も実際には理解していない変更で満ちていく。「これがないと壊れたから」付け足されたガード。恐れ以外の何の理由もなく保たれた順序。本来の目的はすっかり忘れ去られたのに、もう誰もが不安で取り除けなくなった小さな儀式の数々。
コードベースは次第に迷信の幽霊屋敷と化す——それが何を支えているのか確信が持てないから、触れられないもので満ちていく。そして最も残酷なのは、これがあなたの「何かを変える能力」に及ぼす影響だ。何が荷重を支えていて、何が装飾にすぎないのかが分からなければ、自信を持って動くことなど到底できない。あらゆる変更が、理解できない力を相手にした賭けになる。自分で建てたのに、もはや理解できない構造物の中で。
規律——説明できない修正を信用するな
最終的に私が自分に課したルールは、口にするのは簡単だが、守るのは本当に難しい——なぜそれが起きたのか、そしてなぜ自分の変更がその原因に対処するのかの両方を説明できるまで、問題は直っていない。両方の半分が必要だ。症状は消えたのに、その完全な物語を語れないなら、私は何も直していない——ただ問題を見失っただけだ。それは、まだ見えている問題よりはるかに危険な状態である。
これは遅い。常に飛ばしたくなる誘惑にかられるし、その誘惑はちょうど最悪の瞬間に最も強くなる——症状がすでに消え、すべてが順調に見え、目に見えるあらゆる兆候からして作業は完了したように思える、まさにそのときだ。それこそ、この規律が最も重要になる瞬間であり、最も不必要に感じられる瞬間でもある。もらった修正の口の中をのぞき込むのは不自然だ。だが、それこそが仕事そのものなのだ。
ノイズの多い領域で、これがいっそう重要になる理由
このような領域で、この罠がとりわけ厄介になるのには理由がある。環境は激しくノイズが多く、つまり絶え間なく偽りの確証を手渡してくる。何かを変え、次の実行はより良く見える——だが、それは変更のおかげだったのか、それともただの運だったのか。結果がそれ自体で揺れ動くシステムでは、「Xをしたら良くなった」は、Xが何かをしたという証拠として絶望的に弱い。
迷信は、まさに結果がノイズに満ちた場所で繁栄する。なぜなら、そのノイズが、ランダムな儀式をちょうど本物に感じさせるのに十分な頻度で報いてくれるからだ。あらゆるものの評価を難しくするその同じランダムさが、何もしなかった修正を信じ込ませる危険なほどの容易さも生む。なぜなら、ときおり、無意味な仕草の直後にサイコロが都合よく出て、あなたの脳はいそいそとそこに原因を記録してしまうからだ。
より深い教訓——理解だけが唯一の本当の修正だ
最終的に私が信じるに至ったのは、唯一持続する修正とは、その原因の底まで理解した修正だということだ。それ以外はすべて、未来からの借金だ。理解しないまま上塗りしたバグは消えない。静かになるだけで、借金は後で利子付きで返済期限を迎える——その借金をしたことすら完全に忘れ去った頃に。
だから今では、何かが動き始めて理由が分からないとき、私は安堵を感じないよう自分を訓練してきた。代わりに、疑念を感じようとする。説明のつかない成功は勝利ではない。それは、たまたま勝利の衣装をまとった未解決の謎であり、それを前者として扱うことは、過去の自分自身に待ち伏せされる、私の知る限り最も確実な方法の一つなのだ。
— シグナルもリターンもなし、投資助言ではありません。