技術的負債
コードレベル
スパゲッティコード
- 論理構造が複雑で、依存関係が絡み合い、可読性や保守性が極めて低い
- とにかく実装することを優先し、コード品質を後回しにした場合に現れる
重複コード
- 同じようなロジックが複数箇所に存在し、修正や変更の手間がかかる
- こちらも実装を優先し、コード品質を後回しにした場合に現れる
不適切な命名規則やコメント不足
- 変数名、関数名、クラス名などが意味不明瞭で、コードの意図が理解しにくい
- コメントも不足しており、他者がコードを理解するのに時間がかかる
マジックナンバー
- コード中に意味不明な定数が直接記述されており、意図が分かりにくく、変更時にミスを誘発しやすい
未使用のコードやライブラリ
- 削除されずに残っている不要なコードや、古いバージョンのライブラリなどが残っている
低凝集・高結合なコード
- モジュールやクラスの責任範囲が曖昧で、互いの依存関係が強すぎるため、一部の変更が全体に波及しやすい
アーキテクチャレベル
アドホックな設計
- 長期的な視点や拡張性を考慮せず、一時的な解決策として導入された設計
- じっくり検討する時間が無かったり、そもそもエンジニアの力量不足で入ることもある
モジュール間の依存関係が複雑
- モジュールの依存関係が入り組んでおり、特定のモジュールへの変更が予期せぬ箇所に影響を与える
拡張性が考慮されない設計
過剰なレイヤー
- 不要なレイヤーが存在しており、複雑性が上昇し、理解や保守が困難になる
- クリーンアーキテクチャを脳死で適用するとこうなる
「動いているからOK」の構造放置
- 問題のあるアーキテクチャだと認識はあるが、現状動いているからという理由で改善を先送りする
- 改善のコストが高すぎる、時間や人手が取れないという背景もある
インフラ・環境レベル
時代遅れのライブラリやフレームワークの使用
- セキュリティリスクやパフォーマンス低下、新しい機能の利用不可などにつながる
バージョン管理の不備
- サーバー設定やインフラコードがバージョン管理されていないため、再現性や変更履歴の追跡が困難
- コンテナやモダンな依存管理ツールが普及した昨今ではあまり見掛けないが、2000年代のPHPやPythonは本当に大変な事になっているケースがあった
非推奨ライブラリへの依存
- サポートが終了したライブラリやフレームワークを使用し続けることで、バグや脆弱性への対応が困難になっている
セキュリティ設定の不備
- セキュリティホールが放置され、システムの脆弱性につながっている
- 例: 外部企業(セキュリティ監査)などの為に空けた抜け穴がそのままになっているなど
- イレギュラーな対応を手動で行うと後始末を忘れることは多い
テスト環境やデプロイ環境の不備
- 環境構築に手間がかかる、本番とテスト環境の乖離が大きい、デプロイプロセスが手動でエラーを起こしやすいなど
テストの負債
テストゼロ文化
- テストコードが書かれていない、またはテストケースが不十分なため、バグが潜在的に存在し、リリース後に問題が発生するリスクが高い
テストコードの品質が劣悪
- テストコード自体がバグを含んでいたり、可読性が低かったりするため、テストの信頼性が低い
CI/CDの不備
- CI/CDが壊れていてもなんとなく「いつもの」でスルーしたり、アドホックな対応で済ませてしまう
- 折角自動化しているのに、謎の手作業を挟む必要があるので開発効率が悪くなる上、明文化されない手順となり新規参入メンバーのDXが悪くなる
手動テスト依存症
- 自動テストが少なく、多くのテストを手動で行うため、時間とコストがかかり、ヒューマンエラーのリスクも高い
ドキュメントの負債
ドキュメントの欠落
- システム設計、要件定義、API仕様、運用手順などのドキュメントが不足しているため、新しいメンバーがシステムを理解するのに時間がかかる
ドキュメントの不適切・不完全
- ドキュメントの内容が古かったり、誤っていたり、情報が不足していたりするため、信頼性が低い
知識の属人化
- 特定の個人しか知らない情報や知識が多く、その人が離職するとシステムに関する知識が失われるリスクがある
プロセスと管理の負債
レビュー不足
- コードレビューや設計レビューが十分に行われないため、問題が早期に発見されず、後になって大きな修正が必要になる
朝令暮改の仕様変更
- 要件定義が頻繁に変更され、それに伴う手戻りや設計の破綻が発生する
意思決定の不明確さ
- プロジェクトの意思決定者が不明確なため、問題解決や方向性の決定に時間がかかる
非効率なタスク管理
- タスクの優先順位付けが適切でなかったり、進捗管理が不十分だったりするため、開発が滞る
技術選定の負債
チームのスキルに合わないオーバーエンジニアリング
- エンジニアのエゴで選定された技術要素
- 技術選定を行ったエンジニアの個人的趣味など