May 15, 2024
AIは、ソフトウェアエンジニアの代わりにコードを書けるのか?
*本記事は Perforce Software社の以下のブログ記事(2024年6月10日時点)の参考訳です。
With AI Writing Code, Will AI Replace Software Engineers?
*ブログの内容は更新されている可能性があります。
ソフトウェア開発者が抱える悩みは数多くあるでしょう。今までであれば、CやC++、Erlang、Javaなどのプログラミング言語を使って、最新のアルゴリズムをいかに表現するかで頭を悩ませることが多かったかもしれません。しかし、今多くの開発者が懸念するのは、人工知能(AI)によって仕事を奪われる未来ではないでしょうか。
本ブログ記事では、AIのコード記述プロセスについて簡単に解説しながら、「AIは、ソフトウェアエンジニアの代わりにコードを書けるのか?」という疑問に回答したいと思います。
目次
AIによるコード生成とは?
近年、ディープラーニングのアルゴリズムを処理するための十分なコンピューティングリソースが整い、機械学習モデルのトレーニングに必要となる大量のデータが利用可能になったことで、生成AIの利用が急増しています。
AIコード生成とは、生成AIと機械学習の技術を利用してコンピューターコードを書くプロセスです。
生成AIのコーディングツールによって、ソフトウェア開発のプロセスは変わりつつあります。しかし、このような進歩は"不確実性"をもたらします。AIがコードを書くようになると、ソフトウェア開発者にどのような影響があるのでしょうか。
AIがコードを書く未来
生成AI技術はすでに実用段階に入り、その成果も形として現れ始めており、様々な業界で変革をもたらし、イノベーションを加速させています。OpenAIが実施した最近の調査では、生成AIツールはあらゆる業務タスクの47%に影響を与え、ソフトウェア開発プロセスを劇的に加速させる可能性があると見られています。
Evans Data Corpによる調査で、550人のソフトウェア開発者に自身の今後のキャリアで最も心配していることを尋ねたところ、29%が「自分や自分の開発努力が人工知能に取って代わられること」と回答しました。
この点については、アメリカ合衆国エネルギー省のオークリッジ国立研究所の研究者チームも同意見のようです。2040年までに、機械学習や自然言語処理技術は大幅に進化し、優れた人間の開発者よりも高品質なコードを、より速く書くことができるようになるだろうと考えられています。
オックスフォード大学の研究「The Future of Employment(雇用の未来)」では、機械学習の進歩により、現在のソフトウェアエンジニアの仕事は機械化・自動化され、ソフトウェア設計に関する決定もアルゴリズムによって最適化されるようになるだろうと警告されています。
ソフトウェア開発おいては、高いコード品質を確保し、機能要件を満たすことが求められます。特にセーフティクリティカルな業界においては、この点が非常に重要となってきます。
したがって、AIにコード開発を任せるのであれば、そのコードにエラーや問題が入り込まないようにしなければなりません。これは、ソフトウェアテストにAIを用いる場合も同様であり、AIに任せるのであれば、人間では検出不可能なコーディングエラーですら検出できるような信頼性が求められます。
もし、あなたがAIが書いたコードを使用するのであれば、そのコードが本当に安全で、セキュアで、信頼性のあるものであるかどうかを、静的コード解析ツールを使って確認するようにしてください。
AIがコードを書くことはできるのか?
簡単に回答してしまうのであれば、AIがコードを書くことはできます。
2015年、リカレントニューラルネットワーク(RNN)を使用してコードを生成するプロジェクトがAndrej Karpathy氏によって実施されました。彼は、GitHubのLinuxリポジトリ(すべてのソースファイルとヘッダーファイル)を1つのドキュメントにまとめ、その400MBを超えるCコードを用いてRNNのトレーニングを行いました。
その結果、生成されたコードが以下になります。
/*
* If this error is set, we will need anything right after that BSD.
*/
static void action_new_function(struct s_stat_info *wb)
{
unsigned long flags;
int lel_idx_bit = e->edd, *sys & ~((unsigned long) *FIRST_COMPAT);
buf[0] = 0xFFFFFFFF & (bit << 4);
min(inc, slist->bytes);
printk(KERN_WARNING "Memory allocated %02x/%02x, "
"original MLL instead\n"),
min(min(multi_run - s->len, max) * num_data_in),
frame_pos, sz + first_seg);
div_u64_w(val, inb_p);
spin_unlock(&disk->queue_lock);
mutex_unlock(&s->sock->mutex);
mutex_unlock(&func->mutex);
return disassemble(info->pending_bh);
}
static void num_serial_settings(struct tty_struct *tty)
{
if (tty == tty)
disable_single_st_p(dev);
pci_disable_spool(port);
return 0;
}
static void do_command(struct seq_file *m, void *v)
{
int column = 32 << (cmd[2] & 0x80);
if (state)
cmd = (int)(int_state ^ (in_8(&ch->ch_flags) & Cmd) ? 2 : 1);
else
seq = 1;
for (i = 0; i < 16; i++) {
if (k & (1 << 1))
pipe = (in_use & UMXTHREAD_UNCCA) +
((count & 000000fffffff8) & 0000f) << 8;
if (count == 0)
sub(pid, ppc_md.kexec_handle, 0x20000000);
pipe_set_bytes(i, 0);
}
/* Free our user pages pointer to place camera if all dash */
subsystem_info = &of_changes[PAGE_SIZE];
rek_controls(offset, idx, &soffset);
/* Now we want to deliberately put it to device */
control_check_polarity(&context, val, 0);
for (i = 0; i < COUNTER; i++)
seq_puts(s, "policy ");
}
AIは、関数や関数宣言を含む形で、コードを一晩で生成することに成功しました。生成されたコードには、パラメータ、変数、ループ、正しいインデントが含まれています。括弧の使い方も適切であり、さらにはコメントまで付けられていました。
しかし、AIが生成したコードには構文エラーが含まれており、変数名が適切に把握できていないようです。宣言された変数が使用されていなかったり、逆に定義されていない変数が使用されている箇所も見受けられます。また、コード例の二つ目の関数では、tty == ttyという無意味な比較が行われています。
このプロジェクトはTorch7ディープラーニングライブラリを使用しており、GitHubで公開されています。Karpathy氏のプロジェクトで生成された全出力ファイルは、ここからご覧いただけます。
生成AIはソフトウェアエンジニアの代わりとなり得るのか?
AIがプログラマーに置き換わることはないでしょう。しかし、コードを書く手伝いは既に可能になっています。ChatGPT、Github Copilot、OpenAI CodexなどのAIによるコーディングアシスタントは、組込み開発者がより良いコードをより速く書くのを支援する便利なツールです。今のAIコード生成ツールは、高品質なコードスニペットを迅速に生成することができます。また、人が記述したコードスニペットのバグや不具合を特定したり、改善点をアドバイスすることもできます。
ただし、本番環境で実際に使用できるような長めのコードをAIが生成できるようになるには、まだしばらくかかるでしょう。
では、AIは近い将来、ソフトウェア開発にどのような影響を与えるでしょうか。
進化するAI
AIはタスクの自動化に効果を発揮し、開発者にさまざまな選択肢を提示してくれるようになるでしょう。そして、AIの理解が及ばない部分、つまりは状況に応じて何が最適かを決める作業については人に委ねることになると考えれられます。
コーディングパートナーとしてのAI
ソフトウェア開発者は、より良いソフトウェアを書くために今後、AIをコーディングパートナーとして利用していくことになるでしょう。AIは既にこの用途で活用されていますが、一度に書き出すことができるコードの行数が増えるにつれ、さらに普及していくと考えられます。開発者がプログラミングを支援するAIをIDE(統合開発環境)に組み込むと、まずはAIがプロンプトに基づいてコーディングを行い、その後に開発者がそのコードをレビューするような形になります。これにより、人間同士でペアプログラミングを実施するのと比べて、かなりの手間を削減できます。SDLC(ソフトウェア開発ライフサイクル)のプロセスによっては、人間の開発者よりもAIの方が速く処理できるので、そういったプロセスをAIに任せることで、開発者はより複雑なタスクに注力できるようになるでしょう。
しかし、プログラマーの重要性は変わらず
プログラマーの真の価値は、プログラムの構築方法を知っていることではありません。彼らの価値は、何を作るべきかを理解したうえで、何から開発すべきかの判断ができることにあるのです。そう言った意味では、人間のプログラマーの役割が失われることはないでしょう。
AIで信頼性の高いコードを書けるとしたら?
その可能性はかなり低いものだと思います。信頼性の高いコードを書くことは、ほとんどの人間にとっても難しいことです。そして、AIは人間が書いた膨大な量のコードを分析しているアプリケーションに過ぎません。したがって、AIが信頼性のあるコードを書けるようになるとは、あまり期待できないように思います。
この点については、多くのプログラマーが同意するところです。CodeSignalが最近、1,000人以上の開発者を対象にしてグローバルに実施した調査では、81%がAIのコーディングアシスタントツールを使用していると回答した一方、55%のソフトウェアエンジニアは、AI生成したコードの品質について懸念を抱いていることが分かりました。
つまり、コードの品質改善という面では、AIの利用は解決策にはならないようです。
今すぐコード品質を向上させる方法は?
コードの品質はすぐにでも向上させることができます。しかし、それはプログラマーをAIで置き換えることによってではありません。
コードの品質向上に必要なのは、静的コード解析です。
プログラマーがコードを書き、静的コード解析ツールを使って、そのコードがコーディングルールに準じているかどうかを確認するのです。静的コード解析ツールは、コードをスキャンして潜在的なエラーやセキュリティの脆弱性を特定することができますし、コードレビューやソフトウェアテストでは見逃されがちなバグも発見することができます。これにより、コードやソフトウェアの全体的な品質向上が可能になります。
つまり、コード品質を向上させる最も簡単な方法の1つが、静的コード解析ツールを使用することです。
Perforce Software社は以下の2種類の静的解析ツールを提供しています。
ご興味のある方は、お気軽にお問合せください。