生成AIの濫用：新世代のコピペ・プログラミング

ハイサイ！オースティンやいびーん。コロナ、なたんど！はっさみよー。にち ぬ うわたやしが、なーだ ちぶる ぬ やむる くとぅ。いちでーじやっさ！

# 概要

生成AIの勃発を受けて、開発業界は大きく揺らいでいます。開発の効率化を図るために積極的に生成AIを取り組むようにマネジメントからのプレッシャーも強く感じる日々です。

しかし、むやみに生成AIを取り組むことには危険があります：

- 生成AIが作るコンテンツが正しくないことがある
- 生成AIは著作権侵害の可能性がある
- 生成AIが作るコンテンツのコード品質に問題がある
- 生成AIは新しいコード基準に則れない

上記の問題を理解した上で、AIが生成してくれるコンテンツを「コードレビュー」して修正した上で使うならあるいは問題ないでしょうが、最近の開発に筆者は危険な流れを見受けています。**初心者プログラマーは生成AIに頼って開発をしていることがとても危険に思えます**。

本記事では生成AIが作ってくれたコンテンツの問題点について話した上で、最後に初心者がAIに頼るリスクについて解説します。そして最後に、個人の意見として初心者じゃなくとも生成AIを避けるべき理由を述べます。

# 生成AIを業務に使う落とし穴

業務上でAIを使う場合に考慮しないといけない問題がいくつかありますので先にそれについて説明します。

## 生成AIが作るコンテンツが正しくないことがある

ChatGPTのコード生成機能を使っているとその性能に驚きます。例えば素数を見つける関数を作るように頼んでみると以下のような結果が出ます：

##### プロンプト

```
JavaScriptで数値の引数までの素数を見つけて数値の配列として返す関数を作ってください。
```

##### 結果

```javascript
function findPrimes(n) {
  const primes = [];

  for (let i = 2; i <= n; i++) {
    if (isPrime(i)) {
      primes.push(i);
    }
  }

  return primes;
}

function isPrime(number) {
  if (number <= 1) {
    return false;
  }

  if (number <= 3) {
    return true;
  }

  if (number % 2 === 0 || number % 3 === 0) {
    return false;
  }

  for (let i = 5; i * i <= number; i += 6) {
    if (number % i === 0 || number % (i + 2) === 0) {
      return false;
    }
  }

  return true;
}
```

一旦正しそうに見えますが、果たしてこれは正しい関数でしょうか？読者は評価できますか？

コードをレビューして評価することもできますが、コメントもないし、わかりやすい中間変数もないし、一部の重要なコードはとても難解です。大学でかなり数学の勉強をしている筆者ですが、一見しても首を傾げます。PRでしたら筆者はこのまま通しません:joy:

AIの作ったコードが簡単に信用できないのは、**AIには空想現象と呼ばれるものが起きるからです**。生成AIの空想現象は、プロンプトに対して見当違いな答えを稀に出すことがある現象のことです。英語ではDay Dreamingと言っていますが、いくら生成AIの技術が進んでもこの現象は根本的になくせません。

そのせいで、生成AIを絶対的なものだと誤解していると、必ず痛い目に遭います。これが社会的にあまり重要ではないサービス（SNS、広告等）だったらいいのかもしれませんが、高い可用性と信用性が求められるインフラに関するコードだとAIを取り入れることには責任問題が生じます。

#### 反論：生成AIの答えをコードレビューすればいいのではないでしょうか？

確かにある程度の空想・間違いはコードレビューでキャッチできると思います。普通の人間が書いたコードでも必ず間違いが入っているものです。ただし、我々人間は自分らの本性を誤魔化してはなりません。**我々人間は、怠惰になりがち**なのです。AIを取り込む初期の頃は厳しくコードレビューしていたものの、だいたい正しいと我々が学習すると、どんどんAIに対して甘くなることが想像できませんでしょうか？

コードレビューすることは人間を相手にでも大変なことで極力避けたい労働です。生成AIが優秀な経歴を残していると、「まあAIで作ったから大丈夫でしょう」と自分らが甘く見やすくなるのが目に見えています。その時にこそ問題が起きます。

## 生成AIは新しいコード基準に則れない

ここはとても大きな問題でほぼほぼ生成AIをアウトにするほどかと思います。生成AIは過去の人間が書いたコードを元に学習してモデルを形成しますが、これは人間の勉強の仕方と若干異なります。

我々人間のプログラマーは、二流の怠け者じゃない限り、必ず新しい手法とコード基準を日頃から勉強しています。そしてソフトウェア開発とUX向上のために日々様々な研究が進んでどんどん「正しい」コードが変わりつつあります。

コードの変化に則って新しいコードが書けるのは、**我々生身の人間のみ**。生成AIは新しい基準に則って最新のベストプラックティスに沿ったコードを書くことが根本的にできません。

芸術の業界でもAIの勃発によって同様な危機が到来していますが、生成AIがコンテンツ生成の主流な源になってしまうと、進化が止まります。新しいコードの書き方と挑戦がしにくくなります。

現実的な例として、現状の世界中で使用されているJavaScriptのソースコードを考えましょう。現在の世界で流通している[Webサイトの８割がjQueryを今も使っています](https://w3techs.com/technologies/details/js-jquery)。このソースコードもきっとGitHubなどに載っているでしょうし、生成AIがこれを学習材料に使っているでしょう。最新のJavaScriptを理解しているプログラマーなら、jQueryのパフォーマンスの問題も分かるでしょうし、そもそもES6以降のVanilla JavaScriptだとjQueryが不要だということもわかります。しかし、**AIにはその判断ができません**。AIは既存の成果物のコンセンサスでしかないので、AIに頼るようなWeb開発業界になってしまうと、**永遠にjQueryと生きていく運命になります**:sob:

更に、Web Componentsみたいに、主流ではないけど確実に優れているWeb技術は、生成AIが採用してくれません。なぜなら、モデルにできるその最新のWeb Componentsを使ったソースコードがまだ少ししか存在しないからです。

このように、生成AI頼りの業界になってしまうと、プログラミングの未来を我々の手で切り開いていくことが難しくなることも大きなデメリットです。

## 生成AIが作るコンテンツのコード品質に問題がある

最新のコード基準に則れない問題と似て非なる問題ですが、生成AIは既存のコードを元にしているわけですから、これまで問題視された手法を踏襲してしまう問題があります。

つまり、セキュリティにリスクがある書き方だというのがわかっているので、生成AIはそれでも採用してしまう可能性があります。また、関数型プログラミング、オブジェクト指向プログラミングに劣っていると言われる命令型プログラミングを採用したコードが生成される可能性があります。

これらのコードの品質の問題は上記と同様に生成されたコンテンツを経験持ちのプログラマーが評価しないとわかりません。

## 生成AIは著作権侵害の可能性がある

これは今世界中で問題視されていますが、生成AIが学習に使われる元ネタを集める際に、著作権に配慮していないと指摘されています。

著作権侵害を起こしているかもしれないコンテンツを営利のプロジェクトに使うことには深刻なリスクが潜んでいるので、生成AIはある意味、ほとんどアウトです。

GitHub CoPilotでも[この問題](https://medium.com/kanlanc/beware-you-might-harm-your-company-if-you-use-github-ai-copilot-89ca5102ff2)にかかってしまう恐れがあります。

# 初心者が生成AIを使う危険

以前、[「プロの初心者」の罠：永遠に抜け出せない二流の道](https://qiita.com/tronicboy/items/34b11b36127abed72c14)の記事で紹介した「プロ初心者」の罠を生成AIの文脈で考えていただきたいのですが、基礎をろくに理解していないプログラマーでも、生成AIの力を借りれば、一気に中流らしいコードが書けてそれらしい機能をチグハグに実装することが容易にできます。

基礎を十分に理解していない初心者の手にそのような力を託してしまうと、維持できない問題のほかに、**深刻なセキュリティ問題を招きます**。これがまず第一の問題点です。

更に、初心者の一個人の立場に立って生成AIを使わないように忠告したいのは、**真の成長を妨げるからです**。

生成AIを使うと、いとも簡単にできてしまう幻覚に慣れてしまい、自分の力だけでコードを書かなくなります。書かないと伸びないので、永遠に生成AIを超えなくなります。タカが知れるのです。ただ、そのAIという補助に慣れてしまうと、自分で努力して学習する意欲も削がれてなかなか基礎勉強に集中できなくなります。

以前から、BootStrap・jQueryなどのせいで同様の落とし穴がありましたが、生成AIだとその補助の力が異次元的です。コーヒーを飲んで集中力を上げるのと、覚醒剤をキメて自分の集中力を格段に上げる（錯覚）と同じような中毒性があると思います。

最近プログラミングを始めた友人が職場の課題を完成させられない時に上司に「できないなら生成AIを使って」と言われたらしいのですが、おそらくその先輩の生成AIを活躍していることでしょう。その先輩が初心者じゃないことを祈りますが、初心者に対して生成AIを使うように指導することはとても無責任に感じましたので危機感を覚えました。もしかして他の現場でも今このような流れが起きているのではないか、と。

真の意味で玄人のプログラマー、会社にも業界にも社会にも貢献するプログラマーになりたいのなら、生成AIに頼ってはいけません。**たとえ遅くても、間違っていても、まずは自分の力で問題を解決して創造の心を育まないといけないのです**。

# 意見：玄人でも生成AIに頼らない方がいいのではないか

これはあくまでも筆者の意見なのですが、玄人でも生成AIを使わない理由もあります。もちろん、上記の著作権侵害などの現実的な問題もありますが、筆者はより抽象的な問題を考えたいのです。

芸術の業界で生成AIの猛反発は皆さんはご存知でしょうが、開発業界から反発があまりないのはなぜかなと疑問に思います。芸術の業界と違って仕事を奪われる危険は我々にAIが普及してもより少ないでしょう。しかし、プログラミングは、ただ単にアプリケーションを作ることに過ぎないのでしょうか？

プログラミングは、芸術とそんなに違うのでしょうか？

建築家などは、もちろん物理学の基礎に従って建物を設計しますが、一流の建築家なら作る建物に自分の心まで込めます。それでこそ一流の建築家、人の心に驚愕と感動を与えるものを創る建築家ではないでしょうか？

我々プログラマーもそんなに違いますか？品質の高い優れたアプリケーションを使った時の喜びを感じたことはありませんか？ロマンチックに過ぎるのかもしれませんが、我々がいいものを作った時に、どんなものでもです、人を喜ばせることができるし、同業者に感動を与えることもできると思っています。

そういう意味では、プログラミングで一種の芸術として捉えることができます。

僕自身がコードを書いている時に、最初にある程度どう解決したらいいかというアイデアがあって、地道にそれをコードに落としますが、コードを書いていること自体はとても地道な作業です。脳みそがある意味シャットダウン状態になりつつあります:joy:

このシャットダウン状態を退屈していることだと捉えますが、実は[これは創造にとても大切らしい](https://www.ted.com/talks/manoush_zomorodi_how_boredom_can_lead_to_your_most_brilliant_ideas?referrer=playlist-why_it_s_sometimes_good_to_be_bored)のです。退屈している時こそ、我々は問題解決について深く考えることができると言われています。筆者はよく夜のシャワーを浴びている時に日中抱えていたコーディング問題の解決法を思いつきますが、まさにこの退屈状態のおかげです。筆者のみならず、[ハブル望遠鏡の修理する問題を解決した人もシャワーで思い付いたり](https://www.baltimoresun.com/news/bs-xpm-1993-11-30-1993334170-story.html)、実に様々な人がこの退屈状態で発想を生み出しています。

我々開発者は、コードを排出することが経営的に求められていることが問題なのかもしれませんが、コード自体が結論ではありません。コードを書く過程がとても大切です。問題解決に至るまでのプロセスこそが重要ではないでしょうか？

そのプロセスを自分で地道にコードを書いていると、「待てよ、そもそもこうじゃないんだよな」と自分の作業を考える一息が生まれます。このプロセスが重要なのではないでしょうか？

生成AIをそのプロセスに入れると確かに机上の効率は良くなるでしょうが、プロセスが邪魔されます。筆者は生成AIを試したことがありますが、コードを書くフローが乱れます。慣れの問題かもしれません。多動症のせいもあるかもしれません。しかし、生成AIが与えてくれる「推測」が、僕が創るかもしれない「実装」からそれだけの可能性を奪うと感じます。もしかして、推測が瞬時に入らなかったら、よりいい方法を書いている途中で思い付いたかもしれないのです。

あとは単純に、補助を使っていると、プログラミングが楽しく感じないです。フレームワークなど、オープンソースは別物だと断っておきますが、生成AIの推測を使っていると、自分が書いている感覚に慣れなくて単純に楽しく感じないんですよ:joy:

筆者はプログラミングに楽しさと愛がないと未来はないと思います。

# まとめ

我々の仕事はいつも変わります。常に人間は人間を不要としたがるこのグローバル社会において、我々は終わりの戦いを強いられています。

今回登場した相手は生成AIです。こいつと手を組んで仕事するようにプレッシャーが開発者にかかっています。

ただ、生成AIがいいものかどうか、一度考えてもいいのではないでしょうか？止められないのでしょうが、我々の業界は我々の意思で形成されているので、生成AIを取り入れるとしても、大切なものが失われないようにどうしたらいいか、考えていきたいです。

特に、初心者から一流のプログラマーになって、その楽しさを味わうチャンスをAIに奪わせたくないと思います。