ChatGPT 先生にコードを教わる現役技術者

皆さん使ってますか? ChatGPT。
私は震えています。正直ここまで適切な回答を、人の言葉で返してくれるのは驚きしかありません。
と、いうわけでいくつかお題を出して、自分のコードとの違いを見てみました。

お題1:ランダムの人名を取得する

私が作ったコード

string[] lastnames = { "佐藤", "鈴木", "田中", };
string[] firstnames = { "太郎", "花子", };

var rnd = new Random();
var firstname = firstnames[rnd.Next(firstnames.Length)];
var lastname = lastnames[rnd.Next(lastnames.Length)];
Console.WriteLine($"{lastname} {firstname}");

ChatGPT

string[] surnames = { "佐藤", "鈴木", "高橋", "田中", "渡辺", "伊藤", "山本", "中村", "小林", "加藤", "吉田", "山田", "佐々木", "山口", "松本", "井上", "木村", "林", "斎藤", "清水" };
string[] names = { "太郎", "花子", "次郎", "三郎", "四郎", "五郎", "六郎", "七郎", "八郎", "九郎", "十郎", "和子", "和美", "和代", "和枝", "麻衣", "麻美", "麻子", "由美", "由紀" };

Random rnd = new Random();
string surname = surnames[rnd.Next(surnames.Length)];
string name = names[rnd.Next(names.Length)];
Console.WriteLine(surname + name);

VS:微差でChatGPTの勝ち

ほぼ変わりませんが、ランダムな名前を即座に、大量に用意してくれるところがさすが。
私はこんなに瞬時に思いつきませんので、ググって名前リストを作成しにいきますし、ChatGPT よりコーディング時間はかかってしまいます。

お題2:2022/1/1 00:00:00~2022/12/31 23:59:59 のランダム時間を取得する

私が作ったコード

var rand = new Random();
var date = new DateTime(2022,1,1, 0,0,0).AddSeconds(rand.Next(0, 31536000)); // 60s * 60m * 24h * 365d
Console.WriteLine(date.ToString());

ChatGPT

DateTime start = new DateTime(2022, 1, 1, 0, 0, 0);
DateTime end = new DateTime(2023, 12, 31, 23, 59, 59);

Random rnd = new Random();
TimeSpan range = end - start;
TimeSpan randomTimeSpan = new TimeSpan((long)(rnd.NextDouble() * range.Ticks));
DateTime randomDate = start + randomTimeSpan;

Console.WriteLine(randomDate.ToString("yyyy/MM/dd HH:mm:ss"));

VS:引き分け

私の方は短いコードで記述しているものの rand.Next(0, 31536000) とか脳が拒否しますね。コメントがないとわからない。
また、うるう年だったら条件を満たしていないのも汎用性の点でマイナスです。

ChatGPT はわかりやすいコードです。ToString("yyyy/MM/dd HH:mm:ss") のあたりのしっかりさにも感心します。

お題3:PropertyInfo.PropertyType.Name から Type を生成する

class Test
{
    public int      ID      { get; set; }
    public DateTime Date    { get; set; }
    public string   Message { get; set; }
    public decimal  Cost    { get; set; }
}

このクラスから typeof(Test).GetProperties() でプロパティ一覧を取得できますが、Type そのものが帰ってくるわけではなく、以下のようなタイプ名文字列の取得になります。

Int32, DateTime, String, Decimal

ここから Type を取得するコードを生成します。

私が作ったコード

Type type = null;

switch (prop.PropertyType.Name)
{
    case "Int32": type = typeof(int); break;
    case "String": type = typeof(string); break;
    case "Decimal": type = typeof(decimal); break;
    case "DateTime": type = typeof(DateTime); break;
    default:
        Debug.WriteLine($"unknown type. '{prop.PropertyType.Name}'");
        break;
}

一見 Type.GetType(prop.PropertyType.Name) で出来そうですが実は出来ない(エラーになる)ので、素直に switch で場合分けしました。

ChatGPT

Type type = Type.GetType(prop.PropertyType.Name);

これはエラーになるコードです!

VS:勝った!! ……と、思いきや質問の仕方を変えてみると

Type.GetType だと Int32 でエラーになる事はわかっているので ChatGPT に勝ったか……?? と思いましたが、甘い考えでした。

質問を追加すると、なんとそれに対応して新しい答えを出してくれます。

TypeCode typeCode = Type.GetTypeCode(prop.PropertyType);
Type type = Type.GetType("System." + typeCode.ToString());

このコードのままでは正直微妙ですが、このコードを見たお陰で、自ら最良のコードを導き出せました。
Name じゃなくて、FullName にすればよかったんですね。

Type type = Type.GetType(prop.PropertyType.FullName);


結果

想像以上に ChatGPT 先生はいいコードでした。

なお、GitHub Copilot という ChatGpt 先生の更に上を行く教授も控えています……。

元々プログラムの知識があり、プロンプトでの質問に慣れてくると ChatGPT によってコードの生成速度が上がり、かつ自分の知識を増やせる素晴らしいヘルパーです。
今回は無料の ChatGPT 3.5 でしたがそれでも十分使えます。是非自分の武器として ChatGPT を使いこなしてください。

ただ、お題3のように「質問の仕方が悪いと、望んだ結果にならない」ことはありますし、ChatGPT 先生は本当にわからない事を「さも本当のように嘘をつく」性質があるので、真贋を見極める人の目は必要です。プログラム出来ない勢がこれだけでなにかを作るのはさすがに難しいですね。

一方、単なるコーダーは駆逐されてもおかしくありません。プログラムが書けるだけの仕事で満足しないよう、気をつけましょう。

ChatGPT の進化に人間がついていっていない

ChatGPT はプログラムだけでなく、ありとあらゆる質問に対して答えを返してくれます。
その情報に正確性がなかったとしても、信じたいものを信じてしまう人は大勢います。

ChatGPT はその能力の高さ故に、世界を煽動することすら可能かもしれない……。
あまりにも出来がいいので、つい、そんな風に考えてしまうこともあります。

イタリアでは ChatGPT が一時的に停止されました。AI 開発を少なくとも半年は遅らせるべきだという声明も出ました。
これは ChatGPT が悪いということではなく、ちょっと政治的な臭いを感じるニュースですが、それだけ ChatGPT が短期間に成長した証でもあります。

ともあれ、一度産まれた技術です。
闇に潜って秘密裡に成長を遂げていくよりは、みんなで乗りこなすことを考えていきたいですね。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA