Upgrade to Pro — share decks privately, control downloads, hide ads and more …

現場で役立つ技術負債の効果的な返済方法

Avatar for 増田 亨 増田 亨 PRO
September 16, 2026

 現場で役立つ技術負債の効果的な返済方法

#技術的負債con_findy

①技術的負債の何が問題か?
②限られた時間の中でどう取り組むか?
③既存のコード改善:実践編
④データベースの設計改善:効果と課題

Avatar for 増田 亨

増田 亨 PRO

September 16, 2026

More Decks by 増田 亨

Other Decks in Technology

Transcript

  1. 自己紹介 著書(2017) *1 増田 亨(masuda220) 専門領域 訳書(2024) • 業務系アプリケーションの開発 *2

    最近の仕事 • 大きな泥団子退治のお手伝い • エンジニアの設計スキル向上のお手伝い *1 増田 亨(2017) 『現場で役立つシステム設計の原則』技術評論社 *2 Vlad Khononov(著) 増田 亨、綿引 琢磨(訳) 2024 『ドメイン駆動設計をはじめよう』オライリージャパン 2
  2. 準備編(初期投資) リファクタリングの基本的な知識とスキル ✓ tidy first 本とリファクタリング本を手元に置く ✓ リファクタリング本の最初の例を使って、基本のリファ クタリング(チャンキング、名前の変更、説明用変数、 メソッドの抽出、クラスの抽出)の一日研修

    実験環境の構築(実験の奨励) ✓ 基本のリファクタリングを実コードで体験学習 ✓ ブランチ作って、破壊的なリファクタリングを実験 ✓ テストは不要(コンパイルOK/NGで十分) 18
  3. 技術的負債の実際の姿の認識合わせ ✓ 時間経過とともに肥大化した区分 ✓ どの区分にあてはまるかを判断する区分判定ロジック も肥大化 ✓ 区分によって適用するビジネスルールを切り替える業 務ロジックも肥大化 ✓

    積み重なった技術的負債を目に見える形で特定できる (すでに意味がない区分、複数の関心事が無秩序に混 在した区分、読み替えられた区分、…) 23
  4. 区分整理の進化モデル 第一形態 暗黙の区分 (無名区分) 第二形態 区分定数 区分の番号化(原始的な構造化) 第三形態 区分名 区分の意味の明示、意味的構造化の第一歩

    第四形態 第五形態 if文で記述された分岐構造 カプセル化 区分名の列挙、区分ごとの定数とロジックを一箇 所に集める 意味的構造化 区分名の並びの不整合、定数構造やロジック構造 の不整合 ⇒ 関心を分離し整合性を向上させる 25
  5. 第一形態:暗黙の区分 if (信号が赤){ 止まる(); }else { 進む(); } そして泥沼へ… •

    黄色と緑を追加して • 黄色の点滅と赤の点滅を追加して • 点灯していない場合を追加して • 歩行者用信号(緑の点滅)を追加して • 自転車が車道走行か歩道走行かを追加して … 27
  6. 第二形態:区分定数(原始的な構造化) int 信号番号; String action = switch (信号番号){ case 1

    -> “止まる”; // 赤 case 2 -> “注意して進む”; // 黄 case 3 -> “進む”; // 緑 default -> “番号が不正”; //ここにはこないはず }; 28
  7. 第二形態:区分定数(原始的な構造化) int 信号番号; String action = switch (信号番号){ case 1

    -> “止まる”; // 赤 case 2 -> “注意して進む”; // 黄 case 3 -> “進む”; // 緑 default -> “番号が不正”; }; これが変更に強い設計だ! 要素の追加が楽で安全 29
  8. 第三形態:区分名 enum 信号 {赤,黄,緑} String action = switch (信号){ case

    赤 -> “止まれ”; case 黄 -> “注意して進め”; case 緑 -> “進め”; }; 30
  9. 第三形態:区分名 enum 信号 {赤,黄,緑} String action = switch (信号){ case

    赤 -> “止まれ”; 大きな進歩 case 黄 -> “注意して進め”; case 緑 -> “進め”; }; データとロジックは分かれて いるが、区分定義への参照を 手がかりに、ロジックの記述 場所を特定できる 31
  10. 第四形態:カプセル化(集めて整理) enum 信号 { 赤(“止まれ”), 黄(“注意して進め”), 区分名を一箇所に集めて並べる 緑(“進め”); String message;

    区分ごとのリテラル(即値)を抽象化 String action() { 区分ごとのロジックを抽象化 return message; } } ロジックの散在・重複・不整合を解消する特効薬 33
  11. 第四形態:カプセル化(集めて整理) enum 信号 { 赤(“止まれ”), 黄(“注意して進め”), 緑(“進め”); 区分定義、定数、ロジックを一箇所に 集めて整理 散在、重複、不整合の解消の特効薬

    意味的構造化の出発点 String message; String action() { return message; } } 参考図書 特に 1章 小さくまとめてわかりやすく 2章 場合分けのロジックの整理 3章 業務ロジックをわかりやすく整理 34
  12. 第5形態:意味的構造化 enum 信号{ 赤、 // ガード節 if (信号が点灯していない){ 赤の点滅、 黄、

    黄の点滅、 緑、 return “一旦停止して、まわりに十分注意して進め”; } enum 車両信号{ 緑の点滅、 点灯していない } if (車両), if(歩行者), if(自転車), … enum 自転車走行{ 赤、 赤、 車道、 赤の点滅、 緑の点滅、 自転車専用、 黄、 緑 歩道 黄の点滅、 緑 } enum 歩行者信号{ +定数とロジック } } +定数とロジック +定数とロジック 36
  13. 事実の記録テーブル event / history 状態の保持テーブル status / summary 増加した/減少した 残高

    状態を遷移させた 有効-無効-保留などの有限状態 ToDoが発生、Doneになった 約束リスト(行動待ち) 関係の発生、関係の終了 現在の関係(担当、配属、…) 地点 現在地点 理論的には、状態は事実の記録から導出可能 49