定義
ソフトウェア開発で、主に早く完成させるために品質よりも場当たり的な対応を選んだ結果、将来に背負うことになる負担のことです。目先の開発スピードは上がりますが、あとで機能を修正したり追加したりするときに、はるかに多くの時間とコストがかかります。金融ローンの元本と利息のように、時間がたつほど負担が雪だるま式に膨らむのが特徴です。
目先の締め切りと引き換えに差し出した、未来の時間
友達が家に遊びに来る10分前を思い浮かべてみてください。床に散らかった物をきちんと元の場所に片づける時間がなければ、とりあえずクローゼットを開けて、手当たり次第に押し込んで閉めてしまいますよね。見た目には部屋が一瞬でスッキリしますが、クローゼットの中はぐちゃぐちゃです。
ソフトウェアを作るときも、これとまったく同じことがよく起こります。サービスのリリース日が目前に迫ると、開発者はコードをしっかり設計する余裕がなくなります。そのため、じっくり考えずに場当たり的でも、とにかく早く動くコードを先に書いてしまうことが多いのです。
こうして作ったプログラムも、その場ではユーザーの目にはまったく問題なくスムーズに動きます。しかし、慌てて問題に蓋をした代償は、自然には消えてくれません。いつか返さなければならない借金として、システムの奥深くにそのまま残り続けます。
時間がたつほど膨らむ利息
クローゼットに物を押し込み続けると、最終的にどうなるでしょうか。あとで小さな靴下を1足取り出そうとしただけでも、扉を開けた瞬間にいろいろな物がどっと崩れ落ちてきます。結局、部屋全体をひっくり返して大掃除をするはめになります。
場当たり的なコードが何層にも積み重なったプログラムも、まったく同じ悲劇に見舞われます。時間がたってから新しい機能をひとつ付け足そうとするたびに、絡み合ったコードのせいで、思わぬ場所で次々とエラーが発生するのです。
銀行のローンに毎月利息がつくように、コードの整理を後回しにすればするほど、新機能を開発する時間が何倍にも膨らんでいきます。本来なら10分で直せたはずの小さなバグを退治するのに、何日も徹夜しなければならない。そんな状況こそが、技術的負債の利息なのです。
もう少し正確に言うと:負債は絶対に悪いものなのでしょうか?
もう少し正確に言うと、技術的負債は常に避けるべき絶対的な悪というわけではありません。競争の激しいビジネスの世界では、ライバルより先にサービスをリリースして、市場や顧客の反応をいち早く確かめることが何よりも大切な場面が多いからです。
経営者が会社を急成長させるために、銀行からの借り入れを戦略的に活用するように、開発チームもリリースを早めるためにあえて負債を抱えることがあります。大切なのは、借りたものをいつ、どうやって返すかをあらかじめ計画しているかどうかです。
借りた負債は、見た目の動きはそのままに内部の設計をきれいに整えるリファクタリング(Refactoring)によって、期限内に返していく必要があります。返さずに長く放置すると、システム全体が手をつけられないほどガチガチに固まってしまうおそれがあります。また、技術的負債はわざと作るものだけではありません。最初は合理的だった設計も、要件が変わったり使っている技術が古くなったりして、あとから負債になることもあります。
よくある誤解
技術的負債は、実力不足やサボり癖のある開発者だけが生み出すものだ。
優秀な開発者でも、素早く市場に出すために意図的に技術的負債を選ぶことがあります。大切なのは実力ではなく、負債を認識したうえで計画的に管理できているかどうかです。
見た目にエラーなくプログラムが動いているなら、技術的負債は返さなくてもいい。
今はうまく動いていても、内部のコードが乱れていると、新機能の追加やセキュリティ上の弱点の修正のときに、手に負えないほどのコストと時間がかかります。
日常で出会う場面
新しい決済手段を急いで導入したせいでコピペのコードが増え、あとから簡単な割引機能を入れるだけで1か月かかってしまいました。
スタートアップが資金調達のために、中核機能だけが動くアプリを2週間でリリースし、翌月にコードを大幅に整理し直しました。
つまり ひとことで
早くリリースするために選んだ場当たり的なコードが、のちに修正の遅れとコストという利息になって返ってくる現象です。