
AIにコードの複雑さ・設計の臭いを指摘させる|直す順番の決め方
引き継いだばかりのコードを開いて、正直なところ少し途方に暮れて、AIに全部貼って「設計上の問題を指摘してください」と頼んでみる。——この流れは、たぶん今日もどこかで起きています。
返ってくる指摘は、四十いくつ。責務が多すぎる関数、深すぎるネスト、重複したロジック、意味の伝わらない変数名、マジックナンバー、長すぎる引数リスト。どれも、読めば「たしかに」と思う内容です。
そして手が止まります。全部直す時間はないし、どれが「直す価値のある問題」なのかは書いていないからです。
これは、聞き方が悪かったから起きることではありません。AIは「教科書的な理想形との差」なら答えられますが、「そこを直すと今後の仕事が楽になるかどうか」は知らない——ただそれだけです。知らないことを聞かれたから、理想形との差分がそのまま並んだ。この記事では、その足りない材料をどう補うかを整理します。
結論:AIに複雑さや設計の臭いを洗わせるときの要点は3つです。①AIに出させるのは「直すべき順番」ではなく「気になる箇所の一覧」。順番を決める材料——そのコードを今後も触るのか、壊れたら何が止まるのか、テストがあるのか——は、こちらしか持っていません。②「事実」と「意見」を分けて出させる。行数・ネストの深さ・分岐の数は数えれば決まる事実で、「責務が多すぎる」は意見です。混ぜて並べると重みが分からなくなります。③直すのは「次に触る予定のある場所」だけ。この先1年誰も開かないファイルの臭いは、臭いのまま置いておいて構いません。
AIに足りないのは腕ではなく、そのコードの変更履歴とこれからの予定です。そこだけ渡せば、指摘の並びは急に使えるものに変わります。
全部を今日やる必要はありません。まずは①の「一覧として受け取る」という構えだけで大丈夫です。
何が起きているのか——AIは「理想形との差」を出している

まず、なぜここだけ勝手が違うのかを共有させてください。理由は3つあります。
1つ目は、AIが変更履歴を知らないこと。図の左と中央の違いが、AIには見えていません。同じくらい入り組んだ関数でも、毎月のように修正が入っている場所と、3年間一度も変わっていない場所では、直す価値がまるで違います。前者は直せば今後ずっと楽になりますが、後者は「動いているものを触ってリスクだけ取る」になりかねません。AIはコードの現在の姿だけを見て話しているので、どちらにも同じ強さで指摘を出します。
2つ目は、指摘の粒度が揃わないこと。変数名の付け方と、責務の混在と、モジュール分割の是非が、同じ箇条書きの中に並びます。片方は5分で直る話、もう片方は設計の作り直しです。箇条書きは、並べた瞬間にどれも同じ重さに見える——これが厄介なところで、四十いくつを前にして途方に暮れる原因の半分はここにあります。
3つ目は、「臭い」は欠陥ではなく仮説だということ。コードの臭い(code smell)というのは、もともと「ここ、あとで問題になるかもしれないので見ておいたら」という気づきの目印であって、バグの報告ではありません。長い関数が必ず悪いわけでも、重複が必ず間違いなわけでもない。業務要件がそう決まっているから分岐が多い、似ているけれど別物なので、あえて共通化していない——現場にはそういう事情がありますが、AIはその事情を渡されていません。
この3つが重なると、「AIの指摘を上から順に潰していったのに、コードは別の形で読みにくくなり、時間だけが溶けた」という、いちばん報われない状態になります。逆に言えば、渡す材料を足すだけで、同じAIの同じ指摘が使えるものに変わるということでもあります。
具体例——AIの指摘が、こう外れる
現場で見かけやすいのは、次のような形です。どれも「AIが嘘をついた」わけではなく、判断材料がなかったというだけの話です。
- もう誰も触らないファイルを、丁寧に直させられる:2018年に作られて以来、修正が入っていない帳票出力。AIは律儀に「責務が多すぎます」と指摘します。直しても得られるものは、ほぼありません。
- 意図的な重複を「共通化しましょう」と言われる:見た目は似ているけれど、片方は社内向け、片方は取引先向けで、今後別々に変わっていく予定。ここを一つにまとめると、次の変更で分岐だらけの共通関数ができあがります。
- 業務要件そのものの分岐を、複雑さとして指摘される:料金計算に条件が15個あるのは、料金表に条件が15個あるからです。コードの都合ではありません。整理の余地はあっても、「減らす」ことはできません。
- 設計パターンの導入を勧められて、行数が増える:ストラテジーパターンやリポジトリ層の導入を提案され、真面目に入れたら、ファイルが3つ増えて、追いかける手数も増えた。種類が2つしかないうちは、if文のほうが読めるということはよくあります。
- 同じコードに、二度目は違う指摘が来る:翌日もう一度聞いたら、前回言われなかった箇所が上位に来ている。臭いの判定には唯一の正解がないので、こうなります。出力が毎回ぶれる前提での付き合い方はAIの回答が日によって変わる|再現性のなさと付き合う型にまとめてあります。
- 存在しない指標や規約を根拠にされる:「循環的複雑度が20を超えています」と言われて実際に測ったら8だった、というように、数えていない数字がもっともらしく添えられることがあります。見抜き方はAIのハルシネーションを見抜く|もっともらしい誤りへの備えが参考になります。
- テストが1本もない場所の、大がかりな作り直しを勧められる:提案自体は正しくても、安全網なしで構造を変えるのは、いちばん事故が起きやすいやり方です。図の右のように、受け皿を先に置く話が抜けています。
- 指摘の数が多すぎて、本当に危ない1件が埋もれる:四十いくつの中に、例外を握りつぶしている箇所が1件だけ混じっていた。命名の話と並んでいると、まず気づけません。
並べてみると、外れ方のほとんどが「今後そこを触るのか」「壊れたら何が止まるのか」「テストがあるのか」を渡していないことに由来します。裏を返せば、どれも渡せる情報です。
影響——一番の損失は、時間より「信用が減ること」
指摘を上から順に潰そうとすると、しんどさは工数以外のところにも出ます。
- 差分が大きくなって、レビューが止まる:整理のつもりが数十ファイルの変更になり、レビュアーが読み切れない。結果、中身の薄い承認になるか、そのまま滞留します。差分の追い方はAIに複数ファイルの変更を任せる|差分を見失わない追い方を参照してください。
- 機能追加でもないのに障害が出ると、次から止められる:「リファクタリングで壊した」は、いちばん説明しにくい種類の障害です。一度これをやると、次に本当に必要な整理が通らなくなる——時間より、こちらの損失のほうが痛いところです。
- 直した理由が残らない:半年後に「なぜこの形になっているのか」を誰も説明できない。AIがそう言ったから、では、次に触る人が判断できません。
- チームの中で温度差が生まれる:一人が大きく構造を変えると、他のメンバーの手元の変更と衝突します。整理は、進め方をそろえるところから始めたほうが、結局は速く進みます。
ただ、ここは強調しておきたいのですが、指摘の一覧そのものは、捨てなくて構いません。今日直さない指摘も、次にそのファイルを触る日の下調べになります。並べ替えて、上から1〜2件だけ拾う。残りは、そのままメモとして置いておけば十分です。
明日からやること(3ステップ)
大がかりな静的解析基盤は要りません。この順番で、今日から小さく始められます。
1. 対象を「次に触る場所」に絞ってから貼る
コードベース全体を貼るのをやめて、次のひと月で触る予定のあるファイルに絞ります。予定がはっきりしないときは、変更履歴が教えてくれます。
Gitを使っていれば、直近1年でよく変更されたファイルは、次の1行で出せます。
git log --since="1 year ago" --name-only --pretty=format: -- '*.py' \
| grep -v '^$' | sort | uniq -c | sort -rn | head -20
拡張子の部分は、扱っている言語に読み替えてください。この上位に来たファイルが、手を入れると効きやすい場所です。変更が多いということは、これからも変わるということで、読みにくさのコストを毎回払っている場所でもあります。
逆に、この一覧に出てこないファイルは、今日の対象から外して大丈夫です。図の中央、埃をかぶった箱です。臭いは残りますが、臭いを残す判断も、立派な判断です。
なお、ここでAIに渡すのが社外のサービスなら、貼る前に社内規程と機密の線引きを確認してください。判断の目安は社内データをAIに渡す前の線引き|情報漏えいを防ぐ型に整理してあります。
2. 「事実」と「意見」を分けて出させる
対象が絞れたら、指摘の形を指定します。ここを指定するかどうかで、受け取りやすさがまるで変わります。
そのまま使える頼み方の例:
以下のコードについて、修正コードはまだ出さなくて結構です。 気になる箇所を洗い出して、次の2つに分けて書いてください。
【A】数えれば決まる事実:関数ごとの行数/ネストの最大の深さ/分岐(if・switch・ループ)の数/引数の数。数えられた根拠になる箇所を必ず示してください。数えていない数字は書かないでください。
【B】あなたの見立て(意見):責務の混在、命名、重複、抽象化のずれなど。1件ごとに、次の3点をセットで書いてください。
1. どこが、どう気になるか(ファイル・関数名まで具体的に)
2. 直さないと今後どういう場面で困るか(起きうる具体的な場面で)
3. 直す規模の目安(数分/半日/設計の作り直し、のどれか)
あわせて、「これは意図的にそうしている可能性がある」と思う箇所には、その旨を添えてください。
前提:(言語・フレームワーク/このファイルの役割/今後予定している変更)
ポイントは3つあります。
事実と意見を分けること。行数やネストの深さは、誰が数えても同じになる情報です。ここが分かれていると、「意見のほうは、あくまで見立てとして読む」という構えができます。数えていない数字は書かないでと一言足しておくのは、前掲のとおり、それらしい数値が混ざるのを防ぐためです。可能なら、言語ごとの静的解析ツールで実際に測った値を渡してしまうのがいちばん確実です。
「直す規模の目安」を書かせること。5分の話と、設計の作り直しが同じ行に並ばなくなります。四十いくつの指摘も、数分でできる分だけ拾えば、今日のうちに片づきます。
「意図的かもしれない箇所」を自己申告させること。これを足すと、AIの言い方が少し慎重になります。「重複していますが、用途が別なら意図的な可能性があります」と書かれていれば、こちらも判断しやすい。前提の渡し方そのものはAIにコードを書かせる前に渡す前提と制約|伝え方の型、既存コードの文脈の載せ方は既存コードにAIを馴染ませる文脈の渡し方|実務の型と同じ考え方です。
3. 3つの問いで並べ替えて、上位1〜2件だけ直す
返ってきた一覧を、次の3つの問いで並べ替えます。ここが、AIには代われない仕事です。
①この先3か月、そこを触る予定があるか(ないなら、今日は見送り)
②壊れたときに何が止まるか(決済・在庫・請求まわりは慎重に、社内の集計画面は軽めに)
③テストがあるか(ないなら、直す前にテストを先に置く。図の右です)
この3つを通すと、四十いくつは、たいてい2〜3件まで減ります。減ったことに、後ろめたさを感じなくて大丈夫です。残りを捨てたのではなく、順番を後ろにしただけです。
そのうえで、直し方の作法をいくつか。
- 1回のコミットで、1つの臭いだけ直す:名前の整理と構造の変更を同じコミットに混ぜると、レビュアーが振る舞いの変化を見つけられません。差分の確かめ方はAIリファクタリングの差分レビュー|壊さず確認する手順に手順があります。
- テストが無いなら、まずテストから:完璧な網羅は要りません。いまの振る舞いを写し取るテストを数本置ければ、それが受け皿になります。既存テストの活かし方はAIに直させてもリグレッションを出さない既存テストの渡し方を、AIが書いたテストの確かめ方はAIが書いた単体テストを信用しすぎない|確認ポイントを参考にしてください。
- 振る舞いを変えないと決めて始める:整理のついでに仕様も直したくなりますが、混ぜると原因の切り分けができなくなります。気づいた仕様の疑問は、別のメモに逃がします。
- 直さないと決めた理由も、1行残す:「この重複は、社内用と社外用で今後別々に変わる見込みのため、あえて残す」。この1行があると、次に同じ指摘をAIから受けたとき、3秒で判断できます。同じ迷いを二度しないための、いちばん安い投資です。
3つとも今日やる必要はありません。ステップ1の「対象を絞る」だけでも、返ってくる指摘の量は現実的なところに落ちます。
複雑さの指摘を扱うときのチェックリスト
全部に○が要るわけではありません。気になった行だけで十分です。
① AIに見せる前に
- 対象を「次に触る予定のあるファイル」に絞ったか
- 変更履歴で、よく触られている場所を確認したか
- そのファイルの役割と、今後予定している変更を書き出したか
- 社外サービスに貼ってよいコードか、社内の線引きを確認したか
- 静的解析ツールで測れる数値があるなら、先に測ったか
② 指摘を受け取るとき
- 「事実(数えて決まるもの)」と「意見(見立て)」を分けて出させたか
- 数えていない数値が混ざっていないか、1件だけでも実際に確かめたか
- 各指摘に「直す規模の目安」を書かせたか
- 「意図的な可能性がある箇所」を自己申告させたか
- 例外の握りつぶしなど、臭いではなく実害のある指摘が埋もれていないか一度見返したか
③ 直すと決めたあと
- この先3か月、そこを触る予定があるか確かめたか
- 壊れたときに何が止まるかを言えるか
- テストが無い場所なら、先にテストを置いたか
- 1コミットで直す臭いを1つに絞ったか
- 振る舞いを変えないと決めて始めたか
- 直さないと決めた指摘の理由を、1行残したか
この記事のまとめ
AIは、理想形との差を驚くほど速く並べてくれます。得意なのは気になる箇所を洗い出すことと、数えて決まる事実を整理すること。苦手なのは、そのコードをこれから誰が、どれくらい触るのかを知ることです。それは、渡していない情報だからです。
やることは3つだけです。①対象を「次に触る場所」に絞る/②事実と意見を分けて出させる/③3つの問いで並べ替えて、上位1〜2件だけ直す。この3つがあると、複雑さの整理は「終わりのない掃除」から、「今日ぶんだけ片づける作業」に近づきます。

引き継いだコードが読みにくいのは、あなたが書いたからではありません。それでも、開いて、指摘を受け止めて、どこから直すか考えている。その時点で、このコードはもう、昨日より少しだけ良くなる方向に動いています。 四十いくつを全部やらなくて大丈夫です。ひとつ選んで、ひとつ直す。それで十分、前に進んでいます。
よければ、こちらも
- 指摘を取捨選択したいときはAIレビューの指摘を取捨選択する判断軸|直す・保留・落とす
- 読めないコードを手直しするときは「動くけど読めない」AI生成コードを保守可能にする手直し手順
- 引き継いだコードの中身を知りたいときはレガシーコードの仕様をAIに読み解かせる|仕様復元の進め方
- 設計の見落としを洗いたいときは設計レビューの見落としをAIに洗わせる|プロンプトの型