頼んだのは1つだけ
コーディングエージェントに、関数を1つ足すよう頼みました。変更を見ると、関数は足されていました。ほかのファイルも変わっていました。
エージェントの変更は、まとめて届きます。残すか、直すか、捨てるか。頼みと見比べて決める読み方を学びます。
このレッスンのゴール
メモ
エージェントの変更を、頼みと見比べて読み、残す、直す、捨てるを決められる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 差分 | 変更の前と後の、違いを並べたもの | diff -r before after |
| ハンク | 差分の中の、変わった1か所のまとまり | |
| 範囲外の変更 | 頼んでいないファイルや行への変更 | |
| 消えたテスト | 変更の前にあって、後にないテスト | |
| 決める | 残す、直す、捨てる、のどれかを選ぶこと |
学生が入力するセルは、このプレビューでは空白です。
まず、頼みと大きさを比べる
変更を読む最初の問いは、頼んだこととの比べです。頼んだのは、休みの日を調べる関数 isClosed(day) を足すことでした。
触られたファイルを数えます。頼みに関係のないファイルがあれば、それが範囲外の変更です。変更の大きさも、頼みに見合うかを見ます。
ありうる頼み方
こんな頼み方があります。「shop.js に、isClosed(day) を足してください。day は 0 が日曜で、日曜だけ休みです。ほかのファイルと、ほかの関数は、変えないでください」
エージェントの返事は、毎回違います。返ってきた変更で、触れたファイルの一覧を最初に見ます。
変更の前と後を並べる
次の Run は、フォルダー demo-diff/ に、前の before/ と後の after/ を作ります。前は、価格の関数と、3つの確認です。後は、頼みどおり関数を足し、ほかにも変更があります。
どちらも手で書いたもので、エージェントの答えではありません。diff で、変更を読みます。
前の shop.js を書く
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/before && printf '%s\n' '// 売店の価格。' 'function price(yen, count) {' ' return yen * count;' '}' 'module.exports = { price };' > demo-diff/before/shop.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
前の check.js を書く
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/before && printf '%s\n' 'const shop = require(\"./shop.js\");' 'function check(name, ok) {' ' console.log((ok ? \"ok: \" : \"失敗: \") + name);' '}' 'check(\"1個\", shop.price(120, 1) === 120);' 'check(\"3個\", shop.price(120, 3) === 360);' 'check(\"0個\", shop.price(120, 0) === 0);' > demo-diff/before/check.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
後の shop.js を書く
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/after && printf '%s\n' '// 売店の価格と、休みの日。' 'function price(yen, count) {' ' return Math.round(yen * count / 10) * 10;' '}' 'function isClosed(day) {' ' return day === 0;' '}' 'module.exports = { price, isClosed };' > demo-diff/after/shop.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
後の check.js を書く
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/after && printf '%s\n' 'const shop = require(\"./shop.js\");' 'function check(name, ok) {' ' console.log((ok ? \"ok: \" : \"失敗: \") + name);' '}' 'check(\"1個\", shop.price(120, 1) === 120);' 'check(\"3個\", shop.price(120, 3) === 360);' 'check(\"日曜\", shop.isClosed(0) === true);' > demo-diff/after/check.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
後の settings.js を書く
docker exec -w /home/node/project agent sh -c "mkdir -p demo-diff/after && printf '%s\n' '// 頼んでいない設定のファイル。' 'module.exports = { debug: true };' > demo-diff/after/settings.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
触れたファイルの一覧
docker exec -w /home/node/project/demo-diff agent sh -c "env LC_ALL=C diff -rq before after; true"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
変更の中身を読む
docker exec -w /home/node/project/demo-diff agent sh -c "env LC_ALL=C diff -r before after; true"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
1つずつのハンクを読む
差分は、ハンクごとに読みます。shop.js には3つあります。コメントの変更、price の計算の変更、関数の追加です。頼まれたのは、最後の1つだけです。
price は、10円単位に丸めるようになりました。頼んでいません。check.js では、「0個」の確認が1行消え、「日曜」の確認に替わっています。
2つのテストを動かす
docker exec -w /home/node/project/demo-diff agent sh -c "node before/check.js; node after/check.js; grep -c ^check before/check.js after/check.js"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
テストが全部通れば、変更は安全だと思う人が多いです。消されたテストは、失敗できません。通るのは、残ったテストだけです。テストが通ったかではなく、テストが消えていないかも見ます。
残す、直す、捨てる
問題がなければ、残します。頼みに合っていても、範囲外の変更や大きすぎる変更があれば、直しを頼みます。テストが消えているときは、捨てます。
この例では、テストが消えたので、変更は捨てます。頼み直しは、isClosed だけを足す、としてやり直します。
例: 決め方
| 見つけたこと | 決める | 理由 |
|---|---|---|
| 頼みどおりで、ほかに変更がない | 残す | 頼みと合っている |
| 範囲外のファイル、大きすぎる変更 | 直す | 直せば使える |
| テストが消えた | 捨てる | 守りが外れている |
学生が入力するセルは、このプレビューでは空白です。
さらに: 本物の変更で試す
今は、この考えを本物の変更で試すのに、よい時です。ラボのバグには触れません。代わりに、shop.js の写しで、新しい関数を1つ頼みます。
変更が届いたら、git diff を読みます。触れたファイル、消えた行、消えたテストを書き出し、残す、直す、捨てるを、理由と一緒に決めます。