🔖

AI時代のリファクタリング──可読性の基準が変わり始めている

に公開

はじめに

「リファクタリングってどこまでやるべきなんだろう」

あるプロジェクトで、久しぶりにこの問いと正面から向き合うことになりました。ただ、最近この問いの前提そのものが変わってきているのではないか、と感じています。

AIと一緒にコードを書くようになって、「誰のための可読性か」という根本的な問いが浮かび上がってきたんです。

AI開発で起きている「理解の負債」

従来の技術的負債とは違う現象が起きています。

理解を伴わないコードが増える

人間が一行ずつ書いたコードは、少なくとも書いた本人は理解しています。でもAIに生成させると「動いたからOK」で、なぜそう書かれたかを誰も把握していない。

  • 一貫性がない(スタイル・パターンがバラバラ)
  • 過剰に複雑(エッジケース対応で条件分岐が増殖)
  • 設計意図が読み取れない

書くコストが下がった分、読んで理解するコストの比重が上がっている。これを「理解の負債」と呼んでみました。

技術的負債との違い

従来の技術的負債は「将来の変更コスト」の問題でした。「今は急いで実装するけど、後で直す」という先送りです。

一方、理解の負債は「現在の理解コスト」の問題です。コード自体は動いているし、構造的に破綻しているわけでもない。ただ、誰もその意図を説明できない。

技術的負債は「後で返済する」という選択肢がありますが、理解の負債は「今すぐ理解できないと次の変更ができない」という即座の問題になります。

でも、本当に問題なのか?

ところが、実は最近コードを読んで理解しようということをあまりやっていません。

AIに読んでもらって概要を教えてもらう。細かく知りたいときはAIに仕様を聞く。人にとっては理解しにくいコードでも、AIの方が早く確実に情報を紐解いてくれます。

だとすると、「理解の負債」はどのくらい重いのか。正直、わからなくなってきました。

AIに聞けば済む、で回らなくなる瞬間

もちろん、すべてがうまくいくわけではありません。

デバッグで迷走するAI

不具合の指摘をして問題箇所を特定してもらう。でも何度やっても根本原因にたどり着かない。デバッグ用のコードが場当たり的に仕込まれて、結局問題解決しない。

ここ、イラッとします。

人間のデバッグなら「ここは違った、次はこっち」と絞り込んでいく感覚があります。でもAIは同じところをぐるぐる回る。試行錯誤しているようで、実は何も学習していない。

なぜAIはこれが苦手なのか:

  • 状態を持っていない(さっき試したことを構造的に覚えていない)
  • 仮説を立てていない(網羅的に見えて場当たり的)
  • 諦め時がわからない(延々と小手先の修正を提案)

結局、デバッグみたいに「なぜ」を掘る作業は、まだ人間がハンドルを握った方が早いことが多いです。

現状の落とし所

AIには「ここが怪しいと思うんだけど、この関数の挙動を説明して」みたいに、仮説の検証を手伝わせる使い方の方が噛み合います。

生成や理解は任せて、問題の切り分けと判断は人間がやる。これが今の現実解かもしれません。

AIのためのリファクタリング

ここで最初の問いに戻ります。

リファクタリングの目的が変わってきているのではないか。

従来:人間のための可読性

  • 変数名がわかりやすい
  • 関数が短い
  • コメントが丁寧

全部「人が読むから」という理由でした。

これから:AIが正確に扱える形

AIにとって扱いやすいコードの条件:

  • スコープが小さい → 一度に把握できる範囲を超えると精度が落ちる
  • 依存関係が明確 → 暗黙の結合が多いと影響範囲を見誤る
  • 状態が少ない → グローバルな状態や副作用は追跡できない
  • テストが充実 → 変更の影響を即座に判定できる

これって昔から言われている「良い設計」の原則と重なります。ただ、理由が「人間が読みやすいから」ではなく「AIが正確に扱えるから」に変わっている。

人間とAIで最適解は違うのか

ここで新しい問題が浮上します。

分割粒度のジレンマ

人間の場合:

  • 流れで理解する(上から下にストーリーとして)
  • 途中で別ファイルに飛ばされると文脈が途切れる
  • 分割しすぎると全体像が見えなくなる

AIの場合:

  • 関数定義を見に行くコストがほぼゼロ
  • 分割されていても困らない
  • むしろ一つの塊が大きいと本質と枝葉の区別が難しい

共通化のトレードオフ

人間が嫌がる理由:

  • 影響範囲が見えなくなる
  • 「これを変えたらどこが壊れる?」を追えない

AIの得意・不得意:

  • 参照箇所の列挙は得意
  • でも「この共通関数を変えていい文脈か」の判断は苦手

つまり、最適な設計が人間とAIで違う可能性があります。

これからどう判断するか

選択肢1:AIにとっての読みやすさを優先

人間がコードを読む機会が減っていくなら、コードは「AIが正確に扱える形」に最適化する。人間向けの説明は必要なときにAIに生成させればいい。

メリット:

  • AIの精度が上がる(デバッグの迷走が減る)
  • 変更コストが低い(AIに直させられる)

デメリット・懸念:

  • AIの「正解」がまだわかっていない
  • 次世代のAIで最適解が変わるかも

選択肢2:使い分ける

  • AIに任せる前提のユーティリティ層 → 細かく分割
  • 人間が判断するビジネスロジック層 → 流れを重視

課題:

  • 境界線の引き方が難しい
  • 多くのプロジェクトでは混在している

選択肢3:今は両方を満たす設計を目指す

人間のための可読性とAIのための扱いやすさは、今のところ大きく矛盾していない。むしろ同じ方向を向いている。

将来的には:

  • AIの比重が上がれば最適化の方向も変わる
  • その時また判断すればいい

私の暫定的な答え

正直に言うと、確立した答えはありません。

ただ、今の実感としては 「AIがデバッグで迷走しない粒度」を一つの指標にする のが現実的だと考えています。

実際にそこで困っているわけですから。

具体的には:

  • 関数は小さく保つ(AIが一度に把握できる範囲)
  • 状態管理を明確にする(暗黙の依存を減らす)
  • テストを書く(AIの変更を検証できる状態にする)

そして、人間が読む必要があるときはAIに説明させる。この分業が、今の落とし所かもしれません。

残る問い

  • リファクタリングの基準は本当に「AIの扱いやすさ」に移行していくのか
  • 人間にとっての可読性は二の次でいいのか
  • そもそも「良いコード」の定義は書き換わっていくのか

私自身、まだ答えが見えていません。

ただ一つ言えるのは、「誰のための可読性か」を問い直す時期に来ているということ。そして、その答えは現場で試行錯誤する中からしか出てこない、ということです。

あなたは、誰のためにコードを書いていますか?


こうした判断や内省のプロセスを、
エンジニア向けにもう少し整理して書いています。

興味があれば、こちらにまとめています。
https://tielec.blog/

Discussion