AIコーディングの弊害とその対策

AIコーディングの弊害とその対策

こんにちは!

今回はコーディングにAIを導入する際の弊害とその対策に関する、筆者なりの考えを共有できればと思います。

昨今はAIエージェントを導入してコーディングするのが当たり前になってきました。実際に筆者の開発現場でも人間がコードを書く割合はかなり減ったかなという印象があります。しかし、数年間AIをコーディングに導入してみて、肌感として弊害もあるなというのを同時に感じてきましたので共有してみたいと思います。

注意点として、すべて個人的な見解なので、鵜吞みにせずにあくまで参考としていただけると助かります。

それでは、さっそく見ていきましょう!

AIコーディングの弊害

開発者のメンタルモデルを形成できない

まず1つ目の問題点として、「メンタルモデルを形成できない」という点があるかなと思っています。メンタルモデルの形成というのは、例えば開発者が以下のようなことを自身の脳内にインプットすることです。

  • 「ここのコードは、こういうクラス構造になっていて、こういう依存関係にしてあるな」
  • 「ここのロジックは、一見直感的ではないけど、こういう事情があってこう書いていたな」
  • 「この機能は全体的にこういう設計にしていたな」

通常、自分で考えながらコードを書いていると、こういったことは無意識にインプットできているものです。ここでは、これをメンタルモデルの形成と言っています。

メンタルモデルが形成されていないと、以下のような弊害があります。

  1. 小さなバグが混入していても気が付かない
  2. バグが実際に発生しても、どこにバグがあるのかがわからない
  3. 人間的には可読性の低いコードが量産され、技術的な負債がたまっていく

これ、結構重大な問題だと思いませんか?

以前なら、バグが起きたときに「この症状なら、たぶんここがおかしいのだろう」という勘が働きます。これは開発者の中にクラス構造や細部のロジックなどのマップが頭の中にあるからできます。

しかし、コーディングをAIに丸投げしているとバグが発生しても、コーディングした張本人にもバグがどこで発生しているのかわからず、最悪の場合「誰もなぜバグが発生しているのかがわからない」という状況になります

間違ったコードの生成

AIは現時点ではプロジェクト全体のコンテキストやドメイン知識を理解するのが苦手です。そのため、部分的には正しいコードだがプロジェクト全体の整合性が取れていないコードや、ドメイン知識不足でシンプルに間違ったコードを生成したりします。

AIが生成したコードを何も考えずに承認していると、簡単にバグが混入してしまうという問題点があります

筆者はまだ経験していませんが、聞いた話では「このテストが通るようにコードを書いてください」と指示すると、テストコードを全部コメントアウトして無理やりテストが通るコードを書いた、などの事例もあるようです。

いや、そういうことじゃないだろ、と。

また、AIは時に回りくどい方法で実装していたり、人間にとっては理解しにくいコードを生成することがあります。そのため、将来的に保守がしにくいコードが量産され、技術的な負債がたまっていくという問題もあると思います。

脆弱性のあるコードを埋め込んでしまう

これは実際に筆者も経験したことが何度もありますが、生成AIは「人間だったらさすがにこんなわかりやすく脆弱性の含まれるコードは書かないだろうな」というコードを生成する場合があります。例えば、教科書に載っているくらいの典型的なXSSリスクのあるコードなどです。

このようなコードを本番にリリースしてしまうと、簡単に脆弱性の穴をつかれて重要な個人情報や秘匿情報が外部に流出したりなど、常に重大なセキュリティリスクのある状態にさらされることになります

現時点での解決策

設計は人間が行う

まず、設計フェーズはしっかりとした経験のあるエンジニアが行いましょう

設計フェーズというのは、「さあ、あとは手を動かしてコードを書くだけだ」という状態の前までです。具体的には、システム全体のアーキテクトからクラス設計などの詳細設計までですね。

これを行うことで、システム全体の構造やクラスの依存関係、DB構造など最低限必要なメンタルモデルは形成できるようになります。また、設計フェーズで何か重大な欠陥があると手戻りがすごいことになりますしシステムを構築する上で特に重要なフェーズなので、ここはAIに丸投げしない方が良いと思います。

AIにすべてを丸投げするのではなく、AIはあくまで「ジュニアレベルのコーディングのお手伝いさん」くらいにとらえておくのが無難だと思います

テンプレだけ書いてもらう

次に、コーディングのフェーズにおいても、個人的にはすべてを丸投げするのはおすすめできません。

では、AIをどう活用するかというと「作業的なところだけを全部任せる」です。テンプレを書いてもらうことですね。例えば、クラスのひな形の部分と必要な関数の枠組みだけ書いてもらう、とかですね。あとは、誰でも書けるような単純なCRUDなども丸投げしてよいと思います。

大切なのは、「重要なコアロジックは自分で書く」ということです

このようにすることで重要なロジックに重大なバグが混入しにくくなりますし、開発者自身が書いているため、重要なところは詳細なロジックまで把握できるようになります。

コード調査にはガッツリ使う

既存のコードのロジックがどうなっているのかの調査や、不足している知識の補填にはガッツリAIを使いましょう

調査で使う分には害はないですし、ここはAIの得意分野なのでAIを使った方がはるかに効率が良いです。実際にAIに頼むと以前よりも理解がかなり早くなる実感があります。

また、この組み込み関数って何ができるんだっけ?や、どう使うんだっけ?など文法や知識の不足などはAIに聞いちゃった方が早かったりするので、積極的に使っていった方が良いと思います。

個人的には、このコード調査がAIが最もバリューを発揮しやすい分野なのではないかと最近思い始めています。

補足

テストコードは丸投げしていいと思う

散々AIにコードを丸投げするな!と警鐘を鳴らしてきましたが、テストコードは丸投げしていいと思います。

なぜなら、テストコードはAIの得意領域だからです。AIは何もないところからコードを書かせると失敗率が高いですが、すでにあるコードを参照してテストを書いたりするのは得意です。

なので、筆者はテストコードは基本的に丸投げしちゃっています。実際にテストコードが間違っていることは少ないなという印象があります。

まとめ:AIと共生し、エンジニアとしての「手綱」を離さない

AIエージェントの台頭により、私たちのコーディング環境は劇的に変化しましたよね。しかし、どれだけ技術が進歩しても、「システムの構造を脳内に描く(メンタルモデルを形成する)」という営みこそが、エンジニアの核(コア)である事実に変わりはありません。

AIを魔法の杖にするか、それとも諸刃の剣にするかは、私たちの向き合い方次第です。

💡 AI時代を生き抜くための3つのルール

  1. 「設計」という羅針盤を離さない: 全体像と依存関係を把握しているのは、AIではなくあなた自身であるべきです。
  2. 「コアロジック」に魂を込める: 定型文はAIに任せ、システムの心臓部には自分の思考を反映させましょう。
  3. 「調査」と「テスト」でAIを使い倒す: 守備範囲(テスト)と情報収集(調査)はAIの独壇場です。賢くレバレッジをかけましょう。

AIは優秀な「副操縦士(コパイロット)」ですが、機長はあくまで人間です。AIが生成した1行のコードに対して、「なぜこのコードが必要なのか」を説明できる状態を保つこと。その小さな積み重ねが、技術負債を防ぎ、あなたを「AIに使われる側」から「AIを使いこなすプロフェッショナル」へと導いてくれるはずです。

この記事が、皆さんのこれからのAIコーディングライフの一助となれば幸いです!