見出し画像

現役ITエンジニアがChatGPTにプログラミングさせた感想

最近、ChatGPTが話題になっています。
ChatGPTはAIと自然な会話ができることで知られていますが、文章からプログラムを自動生成する機能も注目されています。
そのため、プログラマが職を失う時代を迎えつつあると言う人までいます。

これは本当でしょうか。
学生アルバイトから始めて30年、今も第一線でプログラムを書いている立場から、ChatGPTの生成するプログラムはどんな感じか、試してみました。

アプリの例題

プログラムを作成する例として、ChatGPTにWindows用の小さなGUIアプリを作ってもらいます。

例題は、TSVファイル(TAB文字で値を区切ったテキストファイル)の操作です。
TSVファイルをウィンドウにドロップすると、先頭フィールドに、行番号を追加し、そのTSVファイルを出力します。

このツールは、先日、業務で必要となって、Googleで調べながら人力で作りました。
手頃な例題なので、同じアプリをChatGPTに初めから作ってもらいます。

ChatGPTでのプログラミング

というわけで、質問文を作成します。
言語はC#で、Windows GUI用のフレームワークであるWinFormsを使用する点を記述しました。
数秒で以下のような結果が出力されました。

プログラムの全文はこんな感じです。

using System;
using System.IO;
using System.Windows.Forms;

namespace TsvFileProcessor
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // ウィンドウにアプリの概要を出力する。
            label1.Text = "TSVファイルをドロップしてください。";
        }

        private void MainForm_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                e.Effect = DragDropEffects.Copy;
            }
        }

        private void MainForm_DragDrop(object sender, DragEventArgs e)
        {
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            if (files.Length > 0)
            {
                string inputFile = files[0];
                string outputFile = Path.Combine(
                    Path.GetDirectoryName(inputFile),
                    Path.GetFileNameWithoutExtension(inputFile) + "_output.tsv");

                try
                {
                    // TSVファイルを読み込む
                    string[] lines = File.ReadAllLines(inputFile);

                    // 先頭カラムに行番号を追加する
                    for (int i = 0; i < lines.Length; i++)
                    {
                        string[] columns = lines[i].Split('\t');
                        lines[i] = $"{i + 1}\t{lines[i]}";
                    }

                    // 出力ファイルに書き込む
                    File.WriteAllLines(outputFile, lines);

                    // 完了メッセージを表示する
                    label1.Text = "処理が完了しました。出力ファイル:" + outputFile;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("エラーが発生しました。\n" + ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }
}

指示した通りのプログラムです。

「TSV」という指示から、入力ファイルがタブ区切りのテキストであると認識したり、ループ変数0,1,2,3,…に対して行番号1,2,3,4,…の関係を認識していたりと優秀です。
指示がないのにエラー処理まで用意されています。

噂通りすごいですが、アプリを実際に動かすと、いくつか問題点が見えてきました。

問題点1:プログラムの行間を読んだ修正が必要

ChatGPTのプログラムには、暗黙の前提となっている箇所があります。
これらは、人間が解釈して補います。

まず、メッセージの表示領域がlabel1という名前のラベルであることは暗黙の了解のようです。ラベルを追加します。

また、プログラムとイベントが紐づいていないので、手作業で追加します。

その他、開発環境が自動生成した空のプロジェクトに合わせてクラス名の修正を行うと動かせるようになりました。

問題点2:処理の不足によるバグ

アプリは起動しましたが、肝心のドラッグ&ドロップを受け付けません。

調べてみると、ウィンドウのAllowDropsプロパティでドロップを許可するという処理が抜けていました。

先程の問題点1は、暗黙の手順を省略している印象ですが、こちらは手続きの抜けといえます。

プログラムは問題ないように見えても、別の場所にある別の要素との関係で正常に動作しないタイプの厄介なバグです。

問題点3:冗長な処理

さらにプログラムをよく見ると謎の処理があります。
TSVの先頭に行番号を追加する以下の部分です。

string[] columns = lines[i].Split('\t');
lines[i] = $"{i + 1}\t{lines[i]}";

一般的に、TSVにフィールドを追加するには、フィールド単位に処理する方法と、文字列として処理する方法が考えられます(下図)。
実行効率や汎用性から長所と短所はありますが、どちらを使用しても問題ないといえます。

では、ChatGPTの回答はどうでしょうか?
フィールドに分解し、その結果を捨て、文字列処理で結果を得ています。
このままでも動きますが、本来は修正対象になる処理です。

これは興味深い結果です。
ChatGPTは文の並びを統計的に学習し、質問文に応じた結果の文章を出す仕組みのようですが、データの意味ではなく、定石の並びを重視したような結果になっている点、大規模言語モデルの仕組みが垣間見えます。

ChatGPTで商用プログラムを書けるか?

私は前世紀の末、大学院で日本語文章からのプログラムの自動生成技術について学びましたが、それ以来、この種の技術に疑問を持っています。
それは、自動生成されたプログラムを誰がどのようにデバッグ・テストし、誰が責任を持つかという点です。

私はITエンジニアとして商用のシステムを作っていますが、過去、危うくYahooニュースに載るレベルのバグを作り込んだことがあります。
先程の問題2と同様、一見プログラムは正しくても、他の要因との不整合で起こるバグです。気づかないうちにデータが壊れるもので、そのまま見つからなければ数百万人に影響が出るところでした。
商用プログラムの開発とは、これぐらいシビアなものです。

多かれ少なかれ、ITエンジニアが作るプログラムは、社会的な影響力を持ちます。
作業用の簡単な便利アプリならともかく、定石を混ぜたようなAIの結果を、そのまま商用プログラムに適用することは考えられません。

商用プログラムでのAIの利用

しかし、AIによるプログラム生成が不要とは思いません。

最近、開発環境Visual Studioで、AIによるプログラミングを応用したIntellicodeを使いました。
これは、自分が書いているプログラムの意図をAIが解釈し、これから打ち込もうとしているプログラムを先取りして、自動で提案してくれる機能です。
TSVファイルの変換処理なら、「for」と打ち込むだけで、続きを「for (int i = 0; i < lines.Length; i++) { }」などと予測し、一気に補完してくれるイメージです。非常に快適でした。

これなら、提案が意図通りでない場合、すぐに書き換えられます。
最終責任は人間が持ったまま作業を省力化でき、人間は知的な作業に集中できます。
これが現在のAI技術での理想的な形だと私は考えます。

ChatGPTの結果も人間がしっかりと評価すれば良いのですが、大きな単位だと評価が難しく、ブラックボックスになりがちです。
あなたはオープンソースの巨大なコードを読んですぐに改変できますか?

まとめ

というわけで、私の感想をまとめるとこんな感じです。

  • ChatGPTでは指示文からアプリを作れるのは確かだが、完璧ではない

  • プログラムが不完全である以上、商用プログラムでAIの出力結果を鵜呑みにすることは、考えられない

  • AIのプログラミングは、自動生成ではなく、自動提案として使うことに期待