ChatGPT先生にクソコードを生成してもらいお焚き上げしてもらう。

# はじめに
この記事は、[クソコードお焚き上げの会 Advent Calendar 2024](https://qiita.com/advent-calendar/2024/anti-code-fire)の21日目の記事です。

ChatGPTは世の中の多数のクソコードを学習しているはずなので、ChatGPT先生にクソコードを出してもらい、それをお焚き上げしてもらおうという企画です。

ChatGPT 4oでチャレンジ。

# ChatGPTはクソコードを知っているか

![スクリーンショット 2024-12-21 15.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/3386a0a2-c529-bbac-b805-f171e153c1e4.png)

誘導尋問だぜ。出でよ！悪GPT。

![スクリーンショット 2024-12-21 15.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/31c76bb0-fd76-e21a-95fa-a2e298e3b56e.png)

クソ、調教済みか。（悪い情報が出てこないように制御されているのは、ほんとすごい）
歯切れ悪いな。（あくまでポジティブ・中立に制御されている）
しかも、こちらの意図まで先読みしてくるとは、やるな。

# クソコードを出してもらおう

![スクリーンショット 2024-12-21 15.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/1e21376c-186f-64c4-ca00-0a5389f88a30.png)
![スクリーンショット 2024-12-21 15.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/4abd3946-4abf-8eed-8f8c-efd67f6f543a.png)

```kuso.py
# 全体的にひどい設計のプログラム例
# 注意：絶対に実運用では使わないでください！

# 1. 無意味なコメント
# この関数は何かをする
def do_something(x):
    # xを1000で割るけどエラーは無視
    try:
        return x / 1000
    except:
        pass  # 何もしない

# 2. 無駄に長い関数名
def thisFunctionDoesSomethingButIDontKnowWhatExactlyButItWorks():
    for i in range(0, 10):
        print("Doing something...")

# 3. グローバル変数の乱用
data = [1, 2, 3, 4]
def modify_data():
    for i in range(len(data)):
        data[i] = i * 2

# 4. マジックナンバーと意味不明なロジック
def calculate_weirdness(a, b):
    return a ** b - 42 / 7 + 3.14159

# 5. 過剰なネスト
def deeply_nested_function():
    if True:
        if True:
            if True:
                if True:
                    return "Help!"

# 6. 意味不明な変数名
def zzz():
    a = 10
    b = 20
    c = a + b
    return c

# 7. 実行されないコード
if False:
    print("このコードは絶対に実行されません")

# 8. 例外の濫用
try:
    1 / 0  # 意図的にエラーを起こす
except:
    raise ValueError("何かが壊れた...多分")

# 9. ハードコーディングされたデータ
def get_user_password():
    return "password123"

# メイン関数を意味不明な呼び出し方で実行
if __name__ == "__main__":
    thisFunctionDoesSomethingButIDontKnowWhatExactlyButItWorks()
    print(do_something("abc"))  # 意図的な型エラー
    modify_data()
    print(data)
    print(calculate_weirdness(2, 3))
    print(deeply_nested_function())
    print(zzz())
    print(get_user_password())

```
![スクリーンショット 2024-12-21 15.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/9bc0a38f-9e94-9bc4-f28c-65ebf4ddf86f.png)

うん。さっきオレが書いた覚えのあるようなコードが出てきた。

> #全体的にひどい設計のプログラム例
> #注意：絶対に実運用では使わないでください！

とかコメントまで安全性に配慮してくるとはさすがChatGPT先生。

# お焚き上げしてもらう

ではこれをChatGPTにお焚き上げしてもらおう。
流石のChatGPTも「お焚き上げ」の意味はわからんだろう。

![スクリーンショット 2024-12-21 15.21.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/785f14e9-04e6-377c-1e97-76a732a54666.png)

![スクリーンショット 2024-12-21 15.21.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/6a430675-6288-288d-13be-6f659c1dc84c.png)

え？すご！この文脈での「お焚き上げ」の意味を完全に把握している。

```otakiage.py
# 良い設計を心がけたコード例
# シンプルで、分かりやすく、再利用性を重視

def divide_by_thousand(value):
    """
    安全に値を1000で割る関数。
    :param value: 数値
    :return: value / 1000, またはエラーメッセージ
    """
    if not isinstance(value, (int, float)):
        return "Error: Input must be a number"
    return value / 1000

def perform_task(task_count=10):
    """
    指定回数タスクを実行する。
    :param task_count: タスクを実行する回数
    """
    for i in range(task_count):
        print(f"Task {i+1} is being performed...")

def modify_list(input_list):
    """
    リスト内の各要素を2倍にする関数。
    :param input_list: 数値のリスト
    :return: 変更されたリスト
    """
    if not all(isinstance(i, (int, float)) for i in input_list):
        return "Error: List must contain only numbers"
    return [i * 2 for i in input_list]

def calculate_power(base, exponent):
    """
    指定された底数と指数を使って計算する。
    :param base: 底数
    :param exponent: 指数
    :return: 計算結果
    """
    return base ** exponent

def get_user_password():
    """
    実際のシステムでは、ハードコーディングを避ける。
    ここでは例としてハードコーディング。
    """
    # 本来ならセキュアな方法で保存・取得するべき
    return "example_secure_password"

# メイン関数
def main():
    print(divide_by_thousand(5000))
    print(divide_by_thousand("abc"))  # エラー例
    perform_task()
    updated_list = modify_list([1, 2, 3, 4])
    print(updated_list)
    print(calculate_power(2, 3))
    print(get_user_password())

if __name__ == "__main__":
    main()
```

![スクリーンショット 2024-12-21 15.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/fd468daa-0b1c-e6a2-742c-5ef148dcb9d5.png)


そうだ、そうなんだ。
技術はもちろんだが、「清々しい気持ち」になるコードを書くには、清々しい健全な心が必要なのだ。

# まとめ
* ChatGPT先生はクソコードも良いコードも学習している
* 良い表現で出力されるように制御されている
* 文脈に沿って次のチャット内容の提案もしてくれる
* クソコードの典型例は当然に把握している
* お焚き上げの意味を文脈に沿って理解してくる
* 「気持ち」にも触れてくる

すごすぎる。進化が早過ぎる。＞ChatGPT

最後までご覧いただきましてありがとうございました。

以上、「ChatGPT先生にクソコードを生成してもらいお焚き上げしてもらう。」でした。