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

あるプロジェクトで、久しぶりにこの問いと正面から向き合うことになりました。動いているコードを「もっときれいに」したい衝動と、「今はそこじゃない」という声。どちらも正しくて、どちらも間違っている気がする。

正解がないからこそ、悩ましい。でも最近、この問いの前提そのものが変わってきているのではないか、と感じています。

安全に倒した結果、別の危険が生まれる

既存の機能を壊さないように開発を重ねていくと、コードの複雑度が上がり、逆に保守しにくくなる。これは多くのプロジェクトで起きていることだと思います。

既存コードに触れず、横に新しい分岐を足す。汎用化せずに似たようなコードをコピペする。「とりあえず動く」条件分岐をどんどん追加する。

短期的には安全です。でも積み重なると誰も全体を把握できなくなり、結果として「触ると何が起きるかわからない」状態になる。本末転倒ですよね。

これは昔からある話です。技術的負債という言葉で語られてきた問題でもあります。

初期は負債を積む、でもいつ返すのか

とはいえ、初期の開発では機能のリリースを優先してコードの品質が後回しになるのは、ある意味で自然なことです。最終的な形がまだ見えていないわけですから。

問題は、その負債を返すタイミングをどう見極めるか。

プロダクトが安定期に入ったとき。バグ修正に異常に時間がかかるようになったとき。チームに余裕ができたとき。いくつかの「潮目」はあります。

ただ、「いつか時間ができたらやる」は永遠に来ない。どこかで意思決定として「今やる」と決める必要がある。でもそれは、プロダクトが軌道に乗って初めて許される贅沢でもある。

この問いに対して、私自身は「今の目的に対して十分か」を基準にするのが現実的だと考えてきました。でも、最近この基準自体が揺らいでいます。

AI時代の技術的負債は性質が違う

特に最近だと、AIネイティブで開発を進めていった結果、いつのまにか管理できないコードが生まれている、という現象が起きています。

従来の負債とは性質が違う部分があります。

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

一貫性がない。同じプロジェクト内でスタイルや設計パターンがバラバラになる。AIは文脈を毎回リセットしがちです。

過剰に複雑なコードが生まれやすい。AIは「正しく動く」ことは得意ですが、「シンプルに保つ」意識が弱い。エッジケースを聞くたびに条件分岐が増えていく。

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

でも、本当にそうなのか

ところが、ここで前提が崩れ始めます。

実は最近、コードを読んで理解しようということをあまりやっていないんです。AIに読んでもらって、そのコードの概要を教えてもらっている。細かく知りたいときはその仕様を聞くようにしている。

実際、人にとっては理解しにくいコードであっても、AIの方が早く確実に情報を紐解いてくれる。

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

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

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

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

こういうとき、イラッとします。

あの現象、独特のストレスがあるんですよね。人間のデバッグなら、たとえ時間がかかっても「ここは違った、次はこっちを疑おう」と絞り込んでいく感覚がある。でもAIは同じようなところをぐるぐる回ったり、「とりあえずログ入れてみました」を繰り返したりする。

試行錯誤しているようで、実は何も学習していない。そしてコードだけが汚れていく。

リファクタリングは「誰のため」なのか

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

結局、リファクタリングが必要なのは変わらない。ただ、その目的が変わってきているのではないか。

昔は「人間にとっての可読性」が前提でした。変数名がわかりやすいとか、関数が短いとか。全部「人が読むから」という理由だった。

でも今、AIが十分に正確にコードを解釈できるなら、その前提が崩れる。

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

スコープを小さく保つ。AIが一度に把握できる範囲を超えると精度が落ちる。
依存関係を明確にする。暗黙の結合が多いと、AIが影響範囲を見誤る。
状態を減らす。グローバルな状態や副作用が多いと、AIは追跡できなくなる。
テストを増やす。AIが変更を加えたときに、壊れたかどうかを即座に判定できる。

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

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

ただ、ここで新しい問いが生まれます。

人間は「流れ」で理解します。上から下に読んでいって、ストーリーとして頭に入れる。だから途中で別ファイルに飛ばされると文脈が途切れる。

でもAIにとっては、関数が呼ばれたら定義を見に行くコストがほぼゼロです。分割されていても困らない。むしろ一つの塊が大きいと、どこが本質でどこが枝葉か区別しにくくなる。

共通化についても同じです。人間が「共通化しすぎ」を嫌がるのは、影響範囲が見えなくなるから。でもAIは参照箇所を列挙するのは得意です。

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

これからはAIにとっての読みやすさを優先すべきか

人間がコードを読む機会自体が減っていくのなら。読むときもAIに説明させればいいのなら。

だったら、コードそのものは「AIが正確に扱える形」に最適化しておいて、人間向けの説明は必要になったときに生成すればいい。

これは割り切った判断です。でも、筋は通っている気もします。

ドキュメントを書くのと似た話かもしれません。コードとドキュメントを二重管理するより、コードを正として、ドキュメントは都度生成する方が合理的。この流れはすでにあります。

でも、正解がわからない

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

AIにとって扱いやすいコードの「正解」が、まだ誰もわかっていない。今の感覚で分割や抽象化を進めても、実はそれがベストじゃない可能性があります。

あと、AIの世代が変わったら最適解も変わるかもしれない。今のモデルに合わせて最適化したコードが、次のモデルでは逆に扱いにくい、とか。

でも、正解がわからないから何もしない、だといつまでも進まない。

今あるAIにとって扱いやすい形にしておいて、変わったらまたAIに直させればいい。人間が保守するよりは変更コストが低いはず。そう考えることもできます。

残る問い

リファクタリングの基準は「AIがデバッグで迷走しない粒度」になるのか。
人間にとっての可読性は、本当に二の次でいいのか。
そもそも「良いコード」の定義は、これから書き換わっていくのか。

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

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

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

参考書籍

リファクタリングの具体的な手法を学びたい方には、こちらの書籍がおすすめです。「5行ルール」という明確な基準を使って、コードを段階的に改善していく実践的なアプローチが紹介されています。

[📦 商品リンク: moshimo-book-5line-refactoring]