技術的負債管理

英語名 Technical Debt Management
読み方 テクニカル デット マネジメント
難易度
所要時間 可視化に1〜2日、返済は継続的
提唱者 ウォード・カニンガム
目次

ひとことで言うと
#

「今は時間がないからこの書き方で」という技術的な妥協の蓄積を「負債」と捉え、可視化して計画的に返済するマネジメント手法。放置すると利子(開発速度の低下)が雪だるま式に増える。

押さえておきたい用語
#

押さえておきたい用語
技術的負債(Technical Debt)
短期的な速度を優先して蓄積した設計・実装上の妥協のこと。金融の負債と同様に、放置すると「利子」として開発速度の低下が加速する。
利子(Interest)
技術的負債があることで発生する追加の開発コストや時間のこと。「この修正、本来1日で終わるのに負債のせいで3日かかる」の「追加の2日分」が利子。
ボーイスカウトルール
来た時よりもきれいにして帰る」という原則を指す。機能開発のついでに、触ったコードの周辺を少し改善する習慣。
リファクタリング
外部から見た振る舞いを変えずに、コードの内部構造を改善する作業のこと。技術的負債の「返済」にあたる具体的な行動。
静的解析(Static Analysis)
コードを実行せずにソースコードの問題点を検出するツール・手法である。SonarQubeやESLintが代表例。負債の可視化に使う。

技術的負債管理の全体像
#

技術的負債管理:可視化→評価→計画→返済のサイクル
1. 可視化負債を洗い出しリスト化・分類する2. 評価影響度と返済コストを見積もる3. 返済スプリントの10〜20%を負債返済に充てる4. 予防新たな負債を増やさない品質基準を設ける計画的に返済Debt Management負債の種類設計負債コード負債テスト負債インフラ負債ドキュメント
技術的負債管理の進め方フロー
1
可視化
問題箇所を洗い出しカテゴリ分類する
2
影響度評価
利子の大きさと返済コストを見積もる
3
返済計画
スプリントの10〜20%を返済に充てる
予防ルール
新たな負債を増やさない品質基準を設定

こんな悩みに効く
#

  • 機能追加のたびに予想の2〜3倍の時間がかかるようになった
  • 「触ると壊れそうなコード」が増えて、誰も手を出せない
  • ビジネス側に「なぜこんなに遅いのか」を説明できない

基本の使い方
#

ステップ1: 技術的負債を可視化する

現在の負債を洗い出し、リスト化する

  • コードベースの中で「ここは問題がある」と全員が知っている箇所を集める
  • 静的解析ツール(SonarQube等)の結果を活用する
  • カテゴリ分け: 設計負債、コード負債、テスト負債、インフラ負債、ドキュメント負債

ポイント: 「なんとなく遅い」を「具体的にどこが問題か」に変換する。

ステップ2: 影響度と返済コストを評価する

各負債の「利子の大きさ」と「返済の難易度」を見積もる

  • 影響度: この負債があることで、毎週どのくらい追加の時間がかかっているか
  • 返済コスト: この負債を解消するのにどのくらいの工数が必要か
  • リスク: 放置した場合に障害やセキュリティ問題につながる可能性

ポイント: 影響度が高く返済コストが低いものが、最優先の返済対象。

ステップ3: 返済計画を立てる

スプリントの中に負債返済の時間を組み込む

  • スプリントの10〜20%を負債返済に充てるルールを作る
  • 大きな負債は段階的に返済する(ストラングラーパターン)
  • 新機能開発のついでに、周辺の負債を返済する(ボーイスカウトルール)

ポイント: 「余った時間で返済」は永遠に来ない。予算として確保すること。

具体例
#

例1:BtoB SaaS企業の技術的負債を可視化して返済する

状況: 従業員40名のBtoB SaaS企業。創業5年目でプロダクトが成長期に入ったが、機能追加のたびに「予想の2.5倍の時間がかかる」状態に。エンジニア12名の体感では「コードベースの30%が触りたくないコード」。

負債の洗い出し:

#負債カテゴリ影響度返済コスト
1注文処理が1つの2,000行のクラスに集約設計負債高(3週間)
2ユーザー認証がフレームワークの非推奨メソッドに依存インフラ負債中(1週間)
3商品検索のテストカバレッジが10%テスト負債中(2週間)
4エラーハンドリングがcatch(e) {}で握りつぶしコード負債低(2日)

返済計画:

  • 今スプリント: エラーハンドリングの修正(影響度高・コスト低で即効性あり)
  • 次の2スプリント: 認証のアップデート(セキュリティリスク解消)
  • 今後3ヶ月: 注文処理クラスの段階的分割(新機能追加のついでに少しずつ)
  • 継続: 商品検索のテスト追加(新しいコードを書くたびにテストも追加)
指標BeforeAfter(6ヶ月後)
機能追加の平均工数見積もりの2.5倍見積もりの1.2倍
本番障害(月間)3.8件1.1件
エンジニア満足度10点中4.210点中7.1

機能追加の工数、見積もりの2.5倍→1.2倍。本番障害は月3.8件→1.1件。影響度が高くコストが低い負債から手をつけたこと、そしてスプリントの20%を返済に確保したことが効いた。

例2:医療系スタートアップがビジネス側と合意して負債を返済する

状況: 従業員25名の医療系スタートアップ。急成長期に「スピード最優先」で開発を進めた結果、テストカバレッジ15%、ドキュメントほぼゼロ、デプロイ手順が属人化。CTOが退職し、残ったエンジニア6名が「何がどう動いているかわからない」状態に。ビジネス側は「新機能を早く出せ」の一点張り。

ビジネス側への説明方法:

  • 「機能Aの開発、本来2週間で終わるが負債のせいで5週間かかっている。差分の3週間×人件費 = 月150万円の無駄」
  • 「テストがないため本番障害が月4回。障害対応で月40時間(= 2人日/週)が消える」
  • 「今の速度低下を放置すると、半年後にはさらに50%遅くなる見込み」

合意した返済計画:

  • 毎スプリントの20%(週2日分)を負債返済に確保
  • 四半期ごとに「負債ダッシュボード」をビジネス側にレポート
  • 3ヶ月後に開発速度の改善を数字で証明する
指標BeforeAfter(3ヶ月後)
テストカバレッジ15%48%
本番障害(月間)4回1.5回
機能開発のリードタイム平均5週間平均3週間
デプロイ頻度月2回週1回

リードタイム5週間→3週間、デプロイ頻度月2回→週1回。「負債のせいで月150万円の無駄」と金額で説明したことで、ビジネス側から返済の時間と予算を正式に引き出せた。

例3:老舗製造業のIT部門が20年もののシステムの負債を段階返済する

状況: 従業員350名の金属加工メーカー。IT部門4名で運用する生産管理システムはAccess + VBAで20年前に構築。VBAマクロが1,200個、ドキュメントはゼロ。開発者は退職済みで、現IT部門は「触ると壊れる」と恐れて一切手を入れていない。月間の手動入力ミスによる出荷エラーが平均8件。

負債の分類と返済順序:

優先度負債返済方法期間
1手動入力がミスの温床バーコードスキャン導入2ヶ月
2VBAマクロが属人化主要30個のマクロをPythonに移植4ヶ月
3Accessの同時接続制限PostgreSQLに段階移行6ヶ月
4ドキュメントゼロ移植しながらドキュメント作成継続
指標BeforeAfter(1年後)
月間出荷エラー8件1.2件(85%削減)
VBA属人化リスク1,200マクロ残450マクロ(62%移植完了)
システム障害月2回月0.3回
ドキュメント化率0%主要機能の65%

出荷エラー月8件→1.2件。VBA 1,200マクロのうち62%をPythonに移植完了。全部作り直すのではなく、最も痛い部分から手をつける——完璧を目指さず「利子が払える範囲に収める」発想が大事。

やりがちな失敗パターン
#

  1. 負債を「見えない問題」のまま放置する — ビジネス側に伝わらないので予算がつかない。「負債のせいで機能Xの開発に追加で2週間かかっている」のように金額や時間で説明する
  2. 全部一気に返済しようとする — 「リファクタリング週間」を設けて全面書き換え → 新しいバグを大量に生む。段階的に、テストを書きながら少しずつ返済する
  3. 負債を増やさないルールがない — 返済しながら別の場所で負債を増やしている。新しいコードは負債を増やさない基準(テスト必須、レビュー必須等)を設ける
  4. 返済の効果を計測しない — 返済に時間を使っているが効果が見えず、ビジネス側から「無駄では?」と言われる。開発速度・障害件数・テストカバレッジを定期的に計測し改善を証明する

まとめ
#

技術的負債は避けられないが、管理できる。大事なのは可視化して、ビジネス側と合意の上で計画的に返済すること。「毎スプリント20%は負債返済に使う」 のようなルールを作り、開発速度の低下を防ごう。負債を完全にゼロにする必要はない。利子が払える範囲に収めることが目標