プログラミング未経験の僕が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コード実行方法
- 上記のコードをコピーし、
worst_code.pyという名前でファイルに保存します。 - ターミナル(WindowsならPowerShellやコマンドプロンプト、macOSならターミナルアプリ)を開きます。
-
cdコマンドで、worst_code.pyを保存したフォルダに移動します。
(例:cd Documents/Python_Projects) - 以下のコマンドを実行します。
これで、Pythonスクリプトが実行されます。
python worst_code.py
そしたら、案の定、エラーが出たり、想像と違う出力が出たりするわけです。
例えば、最初に実行した時は、リストに文字列と数字が混じってるから、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が書いた『最悪のコード』から、私たちは何を学べたのでしょうか?