AIに頼ってまでクソコードを生成するコーディング

タイトルにもあるように、「AIで生成されるクソコード」とそうでないコードの話です。
最近話題の職でプロンプトエンジニアというものが流行っているようです。
実際にコードを書かず、プロンプトを考えコーディングする新しいエンジニアの形。将来的にコードは書かなくて済むと言われていますが、果たしてどうなるのか。

ここからの内容は実際に自分がプロンプトエンジニアのようにプログラミングしてみて、感じた感想です。

# ・プロンプトでコードは書けるのか？
プロンプトを使用し、コードを生成することは可能です。
例えば、Pythonのコードを書いてもらうために、

「＃Pythonでコードを書いてください。Rを押してから画面のクリック操作を記憶し、Tを押して記憶した画面操作を実行する。escを押すまで操作はループされる。クリックは１秒間実行され、次のクリック操作まで0.2秒待機する。」

といったプロンプトを考えます。

### ・GPT−４

Pythonでは、画面のクリック操作を記録し、再生する機能を実装するには、pyautoguiとkeyboardライブラリを利用することが一般的です。pyautoguiはマウス操作やキーボード操作を自動化するためのライブラリで、keyboardはキーボードイベントを記録や検出するためのライブラリです。

以下は、要求に応じてPythonで書かれたサンプルコードです。このコードは、Rキーを押してからのマウスクリック操作を記録し、Tキーを押すことで記録した操作を実行するものです。ESCキーが押されるまで操作はループされます。クリックは1秒間実行され、次のクリック操作まで0.2秒待機します。

    python
    Copy code
    import pyautogui
    import keyboard
    import time
    
    # 操作を記録するリスト
    clicks = []
    
    def record_clicks():
        print("Recording clicks. Press 'S' to stop.")
        while True:
            if keyboard.is_pressed('s'):  # 'S'キーで記録を停止
                print("Stopped recording.")
                break
            if pyautogui.position() not in clicks:  # 重複するクリックを避ける
                clicks.append(pyautogui.position())
            time.sleep(0.2)  # 次の位置取得まで少し待つ
    
    def execute_clicks():
        print("Executing clicks.")
        for pos in clicks:
            pyautogui.click(pos)
            time.sleep(1)  # クリック実行時間
            time.sleep(0.2)  # 次のクリックまでの待機時間
    
    def main():
        while True:
            if keyboard.is_pressed('esc'):  # 'ESC'キーでループから脱出
                print("Exiting.")
                break
            elif keyboard.is_pressed('r'):  # 'R'キーで記録開始
                record_clicks()
                time.sleep(0.5)  # 誤操作防止のための遅延
            elif keyboard.is_pressed('t'):  # 'T'キーで操作実行
                execute_clicks()
                time.sleep(0.5)  # 誤操作防止のための遅延
    
    if __name__ == "__main__":
        main()
注意事項:

このコードを実行するには、Python環境にpyautoguiとkeyboardモジュールがインストールされている必要があります。これらはpip install pyautogui keyboardを使用してインストールできます。
keyboardライブラリは管理者権限が必要な場合があります。スクリプトを管理者として実行する必要があるかもしれません。
このコードは、実際の使用環境によっては調整が必要になる場合があります。特にtime.sleep()の値は、実行環境に応じて調整してください。
安全性の観点から、自動化スクリプトを使用する際は、実行中の操作を常に監視してください。
実際には、このコードをそのまま実行することはできません。というのも、実行環境にpyautoguiやkeyboardライブラリがインストールされていない、または、セキュリティの制約で直接的なキーボードやマウスの制御が許可されていない可能性があるためです。したがって、このコードは参考として提供されており、実際に使用する際は適切な環境でテストし、必要に応じて適応してください。

### ・Gemini

    Python
    import pyautogui
    import time
    
    # 記録開始フラグ
    recording = False
    
    # 記録された操作リスト
    recorded_actions = []
    
    # メインループ
    while True:
        # キー入力待ち
        key = pyautogui.waitKey()
    
        # Rキー押下で記録開始
        if key == 'r':
            recording = True
            recorded_actions = []
            print("記録開始")
    
        # Tキー押下で記録実行
        elif key == 't':
            recording = False
            print("記録実行")
            for action in recorded_actions:
                action[0](*action[1])
                time.sleep(0.2)
    
        # Escキー押下で終了
        elif key == 'esc':
            break
    
        # 記録中の場合
        if recording:
            # クリック操作を記録
            if key == 'mouse1':
                x, y = pyautogui.position()
                recorded_actions.append((pyautogui.click, (x, y)))
            # キー入力操作を記録
            else:
                recorded_actions.append((pyautogui.press, key))
    
        # クリック実行時の待ち時間
        time.sleep(1)
    
    print("終了")
コードは注意してご使用ください。
このコードの説明

pyautoguiライブラリをインポートします。
recording変数をFalseに初期化します。
recorded_actionsリストを初期化します。
無限ループに入ります。
waitKey()を使用してキー入力を待ちます。
Rキーが押されたら、記録を開始します。
Tキーが押されたら、記録を停止し、記録された操作を実行します。
Escキーが押されたら、ループを終了します。
記録中の場合、クリック操作とキー入力操作を記録します。
クリック実行時の待ち時間を1秒に設定します。
このコードの使用方法

Pythonでコードを実行します。
Rキーを押して記録を開始します。
画面上で必要な操作を実行します。
Tキーを押して記録を停止し、操作を実行します。
Escキーを押して終了します。
注意事項

このコードは、Windows環境でのみ動作確認しています。
他のアプリケーションがアクティブな場合、操作が正しく実行されない可能性があります。
画面の解像度が変わると、操作が正しく実行されない可能性があります。
応用

複雑な操作を自動化したい場合
繰り返し作業を効率化したい場合
参考資料

PyAutoGUI公式サイト: https://pyautogui.readthedocs.io/en/latest/



GPT−４、Geminiどちらで聞いても返答があり、注意事項なども指示してくれていますが、若干の違いがあるようです。使用環境によって違いはあるかもしれませんが、GPT-4の方がしっかりと書いてくれているように思います。



# ・クソコードが生成されていく
このようにプロンプトで支持するだけで、クラスやメソッドの役割について説明まで入ったコードが楽々生成されてしまうわけです。
ですが、GPT-4とGeminiはエンジニアではないため、設計というものは人間が考えなくてはなりません。例で出したプロンプトは、あくまでPythonのことが多少なりともわかっているからこそ思いつくプロンプトです。
すくなくともPythonのライブラリに理解がないと書けないでしょう。
プロンプトエンジニアでもっとも必要とされるのは国語ではなく、設計力だと思っています。
そこを勘違いしているとクソコードが大量生成されていくわけです。
（設計もプロンプトで指示すれば考えてくれますが自分が把握していない設計では複雑なコーディング管理は困難）

# ・クソコードを生成しないために
１つ１つのコードは正直自分でせこせこ書いたコードよりも美しく、ちゃんと動作するものだと私は思っています。ですが、あくまでハンドルをにぎっているのはエンジニア本人でないと複雑な設計には耐え得ることができません。
クラスごとに分割し、モジュール化することで可読性をあげ、単体テストを容易にし、保守管理しやすいようにするなどは人間が考えなくてはならない部分です。
気づいた時にはスパゲティがのびのびになって、リファクタリングしようにも手がつけられなくなるのは避けましょう。

# ・AIを使ってプログラミングしてみて
自身で書かなくても済む場所が増えすごく楽ができました。実際、自分が書くコードよりも美しいものが出力されるのでとてもよいです。
AIでコードが出力されるからといって、プログラミングを勉強しなくていいわけではない。複雑なプロジェクトほどエラーハンドリングだったり、保守管理が大事になります。そんな中で全てAIに頼り切りでは、お仕事としては成立しないかと思います。
自分の作ったものくらいどう動いているのかは把握している必要がある。
プログラムを勉強するきっかけとしてとてもいい。実際に結果が見れるし、説明書きが多いので動作と照らし合わせた勉強ができる。変化した部分も提示するよう指示すれば教材としてめちゃくちゃいい。プロンプトを書くのに単語を覚えるのでいい。