生成コードを読む
動くことと正しいことは別
AI が返したコードは、たいてい動きます。動くから正しい、とは限りません。
おこづかい帳の合計を出す関数を頼んだとします。返ってきたのが次のコードだったとします。
Python
def total(records):
return sum(r["amount"] for r in records)テストデータでは正しい数字が出ます。ではこれで採用してよいでしょうか。
読むときに見る3つ
生成コードを読むときは、次の3つを順に確かめます。
プレーンテキスト
意図 頼んだこととコードのやっていることが一致しているか
入力 おかしな入力が来たときどうなるか
副作用 頼んでいないことをしていないかさきほどの total を、この3つで見てみます。意図は合っています。入力はどうでしょうか。records が空リストなら sum は 0 を返すので大丈夫です。では amount という鍵が無いレコードが混ざっていたら、KeyError で落ちます。返金のマイナス金額はそのまま引かれます。それが仕様なのか、たまたまそうなっているだけなのかは、コードを読んだだけでは分かりません。
「たまたまそうなっている」を「仕様として決まっている」に変えるのがレビューです。
1行ずつ説明させる
自分で読んで分からない箇所があったら、書いた本人に聞きます。相手は AI なので、いくらでも聞けます。
プレーンテキスト
悪い このコード合ってる?
良い total 関数を1行ずつ説明してください。
records が空のとき、amount が無いとき、
amount が負のときにそれぞれ何が返るかも書いてください。「合ってる?」と聞くと、AI はたいてい「合っています」と答えます。AI に判定させるのではなく、事実を説明させて、判定は自分がします。
聞くべきは次のような形です。何が起きるかを言わせて、自分が良し悪しを決める、という分担にします。
プレーンテキスト
この関数に空のリストを渡すと何が返りますか。
この関数はファイルを書き換えますか。
この変更で、以前からある関数の戻り値は変わりますか。副作用は差分の外にも出る
副作用とは、頼んだこと以外に起きる変化のことです。ファイルの上書き、グローバル変数の書き換え、渡したリストそのものの並べ替えなどが該当します。
Python
def sort_records(records):
records.sort(key=lambda r: r["date"])
return recordsこれは呼び出し元のリストまで並び替えます。呼んだ側が元の順序を使っていたら、そこが静かに壊れます。エラーは出ません。だから読んで気づくしかありません。
演習
kakeibo.py の total_amount を読んでください。いまは合計を返しますが、amount の鍵が無いレコードや、金額が数値でないレコードが来ると落ちます。落ちない形に直させてください。何を無視して何を数えるのかを、指示の中で決めてください。
完成条件
- 触ってよいのは kakeibo.py だけです
- amount が無いレコードと、amount が int でも float でもないレコードは合計に数えません
- total_amount 関数の戻り値で採点します