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

AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach

こちらの登壇資料です。

AI駆動開発を妨げる技術的負債の解消アプローチ
https://levtechlab.connpass.com/event/395968/

Avatar for MinoDriven

MinoDriven

June 30, 2026

More Decks by MinoDriven

Other Decks in Programming

Transcript

  1. © DMM 4 技術的負債 とは 開発上の何らかの都合による、将来の追加作業コストの総称。 • ドキュメント不足 • 複雑で混乱したコード etc..

    負債が蓄積している状態だと調査に時間がかかったり、 コードを正しく変更できるまでに時間がかかったりします。 同じ規模の機能を開発するにしても、 新規開発と比べて開発コストが増大します。 負債はAIにも悪影響を及ぼします。混乱して正確にコード変更できなく なったり、既存コードの破壊的変更をするケースもあります。
  2. © DMM 8 変更容易性 現状構造 変更容易性の高い 理想構造 理想構造を知らないとギャップを 認識できない! 技術的負債を認識できない!

    「このコードの一体どこが負債な んですか?これが普通でしょ?」 バグをなるべく埋め込まず 素早く正確にコード変更できる度合い
  3. © DMM 9 変更容易性の知識が薄いとどうなるか • そもそも負債を認知できない 「このコードの一体どこが負債なんですか?」となる • リファクタリングしても中途半端になる •

    逆にコード品質が悪化してしまうことも • AIにリファクタリングさせても、 結果良くなったのか悪くなったのか判断できなくなる
  4. © DMM 目的−目標−手段 そして目標を満たすために 適切な手段を用います。 目的、目標、手段の関係が右図となります。 17 【目的】 ダイエットしたい 【目標】

    ・体重60kgまで減らすこと ・体脂肪率を17%まで減らすこと 【手段】 ・有酸素運動 ・バランスの取れた食事
  5. © DMM 目的、目標、手段は、 私たちが開発するソフトウェアでも同じことが言えます。 顧客の要求(目的)を叶えるための手段として、 私たちはソフトウェアを開発しているのです。 18 目的 手段 商品を売買したい

    ショッピングサイト 動画を視聴したい 動画投稿サイト 遊びたい ゲームソフト 効率良く勉強したい 学習サイト 私たちは「手段」を開発している
  6. © DMM 「目標」は要件や仕様に相当する 19 【目的】 注文数を正しく表現したい 【目標】 注文数は1〜200であること 【手段】 目的を満たすソースコード

    システムを不具合なく的確に機能させるには、 仕様を決める必要があります。 例えば注文数が負数だと不具合になりますし、 5000兆個といった非現実的な数量も 問題があります。 注文数については 出荷業務の都合などを考慮し仕様を決めます。 こうした要件や仕様が目標に相当します。 目標を満たすようにコードを実施します。
  7. © DMM 22 // 注文明細クラス class OrderItem { int orderItemId;

    int orderId; int productId; int unitPrice; int quantity; // 注文数 } たとえばショッピングサイトにおける「注文」を考えてみます。 注文明細クラスを次のように実装したとします。 quantityは注文数です。
  8. © DMM 24 class Validator { boolean isValidQuantity(OrderItem orderItem) {

    return 1 <= orderItem.quantity && orderItem.quantity <= 200; } } 正しい注文数だけを受け付けられるよう、 次のようなバリデーションをどこかに実装するかもしれません。 しかしこの実装では、以下のような問題が生じる可能性があります。 • バリデーションを呼び忘れるとバグになる • 別の箇所に重複したコードが実装される可能性 • 注文数の仕様変更時、あちこち探し回らなければならない
  9. © DMM 25 【目的】 注文数を正しく表現したい 【目標】 注文数は1〜200であること 【手段】 OrderItem.quantity 【手段】

    Validator.isValidQuantityメソッド 目的に対して手段がバラバラになっているのが原因 家電に例えるとドライヤーがバラバラに提供されているような状態
  10. © DMM 27 class Quantity { private static final int

    MIN = 1; private static final int MAX = 200; final int value; Quantity(final int value) { if (value < MIN || MAX < value) { throw new IllegalArgumentException("注文数は1以上200以下で指定してください"); } this.value = value; } Quantity add(final Quantity other) { return new Quantity(value + other.value); } } カプセル化とはデータとそのデータを操作するロジックをひとま とめにすること。これで正しい注文数を確実に表現できる。
  11. © DMM 28 【目的】 今すぐ注文したい 【目的】 予約したい 【目的】 商品の抽選に応募したい 【手段】

    注文クラス 【目標】 即時注文に関する要件 【目標】 予約注文に関する要件 【目標】 抽選注文に関する要件 さまざまな目的のコードがひとつのクラスに混在している状態
  12. © DMM 29 【目的】 今すぐ注文したい 【目的】 予約したい 【目的】 商品の抽選に応募したい 【手段】

    即時注文クラス 【目標】 即時注文に関する要件 【目標】 予約注文に関する要件 【目標】 抽選注文に関する要件 手段(クラス)に対して目的がひとつになるよう設計する 【手段】 予約注文クラス 【手段】 抽選注文クラス
  13. © DMM 38 【目的】 今すぐ注文したい 【目的】 予約したい 【目的】 商品の抽選に応募したい 【手段】

    注文クラス 【目標】 即時注文に関する要件 【目標】 予約注文に関する要件 【目標】 抽選注文に関する要件 目的(関心)が混在したクラスを
  14. © DMM 39 【目的】 今すぐ注文したい 【目的】 予約したい 【目的】 商品の抽選に応募したい 【手段】

    即時注文クラス 【目標】 即時注文に関する要件 【目標】 予約注文に関する要件 【目標】 抽選注文に関する要件 各目的ごとに分離するにはどうすればいいか 【手段】 予約注文クラス 【手段】 抽選注文クラス
  15. © DMM 40 注文クラス 即時注文用の処理 全注文共通処理 全注文共通処理 即時注文用の処理 予約注文用の処理 抽選注文用の処理

    全注文共通処理 抽選注文用の処理 予約注文用の処理 複数の目的のコードが混在するクラスは、この図のように 共通処理と各目的専用の処理が入り乱れています。
  16. © DMM 41 予約注文クラス 即時注文用の処理 全注文共通処理 全注文共通処理 即時注文用の処理 予約注文用の処理 抽選注文用の処理

    全注文共通処理 抽選注文用の処理 予約注文用の処理 即時注文、予約注文、抽選注文の各目的ごとのクラスを作ります。 これらに元の注文クラスのコードを全コピーします。 即時注文クラス 即時注文用の処理 全注文共通処理 全注文共通処理 即時注文用の処理 予約注文用の処理 抽選注文用の処理 全注文共通処理 抽選注文用の処理 予約注文用の処理 抽選注文クラス 即時注文用の処理 全注文共通処理 全注文共通処理 即時注文用の処理 予約注文用の処理 抽選注文用の処理 全注文共通処理 抽選注文用の処理 予約注文用の処理
  17. © DMM 42 予約注文クラス 全注文共通処理 全注文共通処理 予約注文用の処理 全注文共通処理 予約注文用の処理 目的とは無関係な処理を削除します。

    例えば即時注文クラスからは予約注文と抽選注文の処理を削除します。 即時注文クラス 即時注文用の処理 全注文共通処理 全注文共通処理 即時注文用の処理 削除 全注文共通処理 抽選注文クラス 全注文共通処理 全注文共通処理 抽選注文用の処理 全注文共通処理 抽選注文用の処理 削除 削除 削除 削除 削除 削除 削除 削除 削除 削除 削除