Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

ChatGPTとプログラミング2

hiratara.hatenadiary.jp

その後も継続して ChatGPT をサブスクで使っているのだが、今のところサブスクを解除する予定はない。サブスクした直後は Google 検索の代わりに日常の疑問を尋ねることが多かったのだが、最近はもっぱらプログラミングに ChatGPT を使っている。

ChatGPT の強みは、詳細なコンテキストを与えられることだと考えている。しかも、チャット形式のお陰でそれを反復的に行うことができる。「 tiny_skia のサンプル作って」などと短文の一度の指示で課題を解決しようとすると真価は発揮できず、自分の持っている課題について要点を的確に伝えるほど生成される回答の精度は増す。

以下は、オリジナルの Skiatiny_skiaAPI の違いを知るためにそれぞれのサンプルコードを生成させた例である。知りたい情報がきちんと生成されている 1

#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkShader.h"
#include "include/effects/SkGradientShader.h"

void draw(SkCanvas* canvas) {
    SkPoint points[2] = {SkPoint::Make(0, 0), SkPoint::Make(200, 200)}; // グラデーションの開始点と終了点
    SkColor colors[2] = {SK_ColorRED, SK_ColorBLUE}; // グラデーションの色
    auto shader = SkGradientShader::MakeLinear(points, colors, nullptr, 2, SkTileMode::kClamp);

    SkPaint paint;
    paint.setShader(shader);
    paint.setAntiAlias(true);

    canvas->drawRect(SkRect::MakeWH(200, 200), paint);
}
use tiny_skia::*;

fn main() {
    let mut pixmap = Pixmap::new(200, 200).unwrap();
    let gradient = Gradient::new_linear(
        Point::from_xy(0.0, 0.0),
        Point::from_xy(200.0, 200.0),
        vec![
            GradientStop::new(0.0, Color::from_rgba8(255, 0, 0, 255)), // 赤
            GradientStop::new(1.0, Color::from_rgba8(0, 0, 255, 255)), // 青
        ],
        SpreadMode::Pad,
        Transform::identity(),
    ).unwrap();

    let paint = Paint {
        shader: gradient.into(),
        anti_alias: true,
        ..Paint::default()
    };

    pixmap.fill_rect(Rect::from_xywh(0.0, 0.0, 200.0, 200.0).unwrap(), &paint, Transform::identity(), None);
}

他にも知りたいことはあったので、「画像を描画するための skia ライブラリについて質問です。 SkPixelMap 上に四角形を描画したいときは、どうしますか。サンプルコードを作ってください。」というプロンプトから初めて、その後 tiny_skia との違いを教えてもらいつつ、最後に知りたかったこととしてこの違いを生成させた。 Google 検索と決定的に違うのは、この一連の質問の過程で ChatGPT がこちらが話している内容のコンテキストをぐんぐんと取り込んでいくことである。後半に行けば行くほど、こちらが明確な指示を出さなくても的確な結果を生成するようになる。

ChatGPT がもう一点強いのは、英語の生成である。例えば、ブランチ名やメソッド名、コード内のコメント、 git の commit メッセージや github の PR の解説文など、 OSS を意識した場合に英語が望ましいシーンがプログラミングでは大量に発生する。 ChatGPT はこれらの書式をよく知っているので、プロンプトさえ的確に書けば生成して提案してくれる。その際に、どんな言語でどのような開発をしているのかもコンテキストとして与えれば、(我々日本人の感覚では分からないが)英語圏の開発者が違和感を感じないレベルの命名、英文が生成される。

最近購入した UMPC との相性も良い。 UMPC では大量の文字を打つのは大変だが、そこを ChatGPT にやらせて、自分は生成されたコードをレビューすれば良い。 この PR はすべて UMPC (と外付けのモバイルキーボード)上で生成したが、 ChatGPT の力を大いに借りている。太古の昔と違って、現在のプログラミングはほぼすべてのロジックはすでに誰かが生成しており、我々はそれを切り貼りして新しいコードを作っている。ライブラリには必ずサンプルコードが付いているし、 linter がコードの記述のブレをなるべく無くして均一なコードになるようにしてくれる。創作的だと錯覚しているプログラミングだが、実はそこまで創作的な行為ではないのだ。ほとんどの場合は独創性は必要とされず、生成 AI である ChatGPT が得意とするところである。

もちろん、生成されたコードの正しさは必ずしも担保されない。難しいタスクであれば失敗する。しかし、それは人間でも同じである。ちょっと出来の悪い部下に依頼して、コードを書かせたり調査をしてもらったと思えばいいのである。月額 3,000 円以上は少し効果だが、人間を雇うよりは遥かに安い。しかも、「ちょっと出来の悪い」は、そんじょそこらのエンジニアの平均レベルよりは、出来が良い可能性もある。


  1. そのまま使うことが目的ではないので、コンパイルできるか、動くかは見ていない。