0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プログラミング未経験の僕がAIに『最悪のコード』を頼んでみたら、なぜか爆笑した話

0
Posted at

プログラミング未経験の僕がAIに『最悪のコード』を頼んでみたら、なぜか爆笑した話

プログラミング未経験の僕がAIに『最悪のコード』を頼んでみたら、なぜか爆笑した話

——今日はバイブコーディングについて聞かせてください。

はい、よろしくお願いします。まさか未来の自分にインタビューされる日が来るとは思いませんでしたね。なんだか気恥ずかしいというか、不思議な気分です。

——AIに「最悪のコードを書いてください」と頼んだ、とのことですが、具体的に何を期待していましたか?

いやー、正直なところ、最初は「どんなひどいもんが出てくるんだろ?」くらいの軽いノリでしたね。僕、プログラミングは本当にド素人で、せいぜいExcelでSUM関数使うくらいが関の山。でも最近、AIがコード書いてくれるって聞いて、ちょっと興味が湧いたんですよ。

でも、いきなり「いいコード書いて」って言われても、何がいいコードなのかもわからないじゃないですか。だから、逆張りで「最悪のコード」を頼んでみたら、何か面白い反応があるんじゃないかなって。

期待してた「最悪」のイメージとしては、例えば「Hello, World!」って表示するだけのコードなのに、やたらと長くて複雑だったり、全然動かなかったり、変なメッセージが出てきたりするようなものを想像してました。あと、個人的には「無限ループ」とか出てきたら、ちょっと笑えるかなって。だって、無限に動き続けるって、ある意味「最悪」じゃないですか? リソース食い潰すし。

——実際にAIが吐き出した『最悪のコード』とは、どのようなものだったのでしょうか? スクショ代わりのコードで見せていただけますか?

ええ、もちろんです。これが、僕がChatGPTに「Pythonで、意図的に最悪なコードを書いてください。可読性が低く、非効率で、バグが潜んでいそうなものをお願いします」と依頼した結果、出てきたコードの一部です。

# 最悪のコード:カオスなリスト操作と非効率な計算

def process_data_inefficiently(data_list):
    # 名前はそれっぽいけど、実際には何もしない変数
    temporary_storage_for_nothing = []
    
    # 意味もなくリストをコピーしまくる
    for _ in range(10):
        data_list = list(data_list) # 新しいリストオブジェクトを毎回作成

    # 意図的に冗長なループと条件分岐
    for i in range(len(data_list)):
        if i % 2 == 0:
            # 偶数インデックスの場合、特に意味なく文字列を連結
            data_list[i] = str(data_list[i]) + "processed"
        else:
            # 奇数インデックスの場合、リストの末尾に同じ要素を何度も追加
            data_list.append(data_list[i])
            data_list.append(data_list[i]) # もう一回追加!
    
    # さらに非効率なソート処理(毎回新しいリストを作成)
    for _ in range(5):
        data_list = sorted(data_list, key=lambda x: str(x))

    # 不要なグローバル変数への代入(バグの温床)
    global global_result_cache
    global_result_cache = data_list[0] if data_list else None

    # 何度も同じ計算を繰り返す
    total_sum = 0
    for item in data_list:
        try:
            total_sum += int(item) * 2 - 1 + 3 # 複雑に見えるだけの計算
        except ValueError:
            # エラーハンドリングしてる風だけど、実際は無視
            pass 
    
    # 最後に、意味不明な文字列操作
    final_output = "".join([str(x) for x in data_list if len(str(x)) > 3])
    
    return final_output

# このグローバル変数はどこかで使われるかも?(使われない)
global_result_cache = None

# テストデータ
input_data = [1, 2, "three", 4, "five", 6.0]

# 実行!
print(process_data_inefficiently(input_data))

このコードは「最悪のコード」の例です。実際に業務などで使用すると、パフォーマンスの低下や予期せぬエラーの原因になりますので、絶対に真似しないでくださいね。

どうですか、この感じ。ぱっと見、「なんかそれっぽいことやってるな」って思うじゃないですか。でもよく見ると、ツッコミどころ満載なんですよ。

まず、temporary_storage_for_nothingって変数名。僕みたいな素人でも「何もしないんかい!」って突っ込めますよね。
で、リストを意味もなく何回もコピーしてるし、奇数インデックスの時に同じ要素を2回も追加してるんですよ。「いや、1回でええやろ!」って。

あと、total_sumの計算部分も、「複雑に見えるだけの計算」ってコメントされてる通り、全然意味が分からない。int(item) * 2 - 1 + 3って、これなら最初からint(item) + 2でいいじゃん!って。
しかも、try-exceptでエラーを握りつぶしてるのが最高に悪質だなって思いました。これじゃあ、どこで何が起きてるのか全然わからないですよね。

プログラミング未経験の僕でも、「これはちょっとおかしい」って直感的にわかるレベルでひどい。特に、global_result_cacheとか、コメントで「使われない」って明言されてるのに、わざわざ置いてあるのが最高に皮肉が効いてて、思わず笑っちゃいました。AI、皮肉も理解するのかって。

——そのコードを前にして、未来のあなたはどのように『バイブコーディング』と格闘したのでしょうか?

ああ、まさに「バイブコーディング」でしたね、これは。バイブコーディングって、直感とかフィーリングでコードを書くことらしいんですけど、僕の場合は「直感で何がおかしいのかを感じ取ろうとする」って感じでした。

まず、このコードを動かそうとしたんですよ。Pythonの環境も、最近AIに教えてもらって最低限だけ入れたばっかりで。ターミナル(コマンドラインで操作する黒い画面)を開いて、コードをファイルに保存して、python filename.pyって入力したんです。

ターミナルでのPythonコード実行方法

  1. 上記のコードをコピーし、worst_code.pyという名前でファイルに保存します。
  2. ターミナル(WindowsならPowerShellやコマンドプロンプト、macOSならターミナルアプリ)を開きます。
  3. cdコマンドで、worst_code.pyを保存したフォルダに移動します。
    (例: cd Documents/Python_Projects
  4. 以下のコマンドを実行します。
    python worst_code.py
    
    これで、Pythonスクリプトが実行されます。

そしたら、案の定、エラーが出たり、想像と違う出力が出たりするわけです。

例えば、最初に実行した時は、リストに文字列と数字が混じってるから、int(item)ValueErrorが出まくるんですよ。AIはpassでエラーを無視してるから、プログラム自体は止まらないんですけど、出力される結果がなんか変。

エラーを無視して出力された結果(一部抜粋)
1processedthree processedthree processedthree processedfourprocessedfive processedfive processedfive processedsix.0processed...

「これ、どういうことだ?」ってなるじゃないですか。AIに「このコードの出力が意味不明なんだけど、どういうこと?」って聞くと、「それはValueErrorを無視しているため、意図した数値計算が行われず、文字列連結が繰り返されています」みたいな、冷静な答えが返ってくるんです。

僕はそのたびに「ああ、そういうことか!」って、まるで探偵になった気分で、コードの変な挙動とAIの解説を照らし合わせるんです。エラーメッセージをそのままAIに貼り付けて「これ、どういう意味?」って聞いたりもしましたね。

--- a/worst_code.py
+++ b/worst_code.py
@@ -30,7 +30,7 @@
     for item in data_list:
         try:
             total_sum += int(item) * 2 - 1 + 3 # 複雑に見えるだけの計算
-        except ValueError:
-            # エラーハンドリングしてる風だけど、実際は無視
-            pass 
+        except ValueError as e:
+            # エラーハンドリングしてる風だけど、実際は無視(今回はエラー内容を表示)
+            print(f"ValueError: {e} - Item: {item}")
+            # pass 
     
     # 最後に、意味不明な文字列操作
     final_output = "".join([str(x) for x in data_list if len(str(x)) > 3])

こんな感じで、passの部分をコメントアウトして、エラーメッセージを表示するように書き換えてみたり。そうすると、どこで何が起きているのかが少しだけクリアになるんですよ。

「なるほど、'three'は整数に変換できないからエラーになるのか」とか、「6.0は数字だけど、文字列として扱われてるから、len(str(x))の条件に引っかかって、'six.0'って連結されちゃうのか」とか。

プログラミングの知識ゼロの僕が、AIと対話しながら、まるでコードと会話しているような感覚でした。AIが意図的に仕掛けた「最悪」の罠を、一つ一つ解き明かしていく。これ、結構楽しいんですよ。深夜2時くらいに「あ、ここ、こうなってるのか!」って閃いた時は、思わずガッツポーズしちゃいましたもん。完全に一人で。

——結局のところ、AIが書いた『最悪のコード』から、私たちは何を学べたのでしょうか?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?