コードレビューは何のためか
コードレビューとは、変更が本流に入る前に、同僚が読むことです。自分の作業では見えない欠陥を見つけ、コードの知識をチームに広げます。
役に立つレビューは、身につける技術です。見た目だけでなく、変更が何をするかを見ます。
このレッスンのゴール
メモ
小さな変更を読み、動かして問題を見つけ、役に立つコメントを書ける。
重要な言葉
| ことば | いみ |
|---|---|
| 差分 | 変更が削る行と足す行の一覧 |
| コードレビュー | 変更を取り込む前に、同僚が読むこと |
| 端のケース | 空のリストのような、珍しくてもコードが扱うべき入力 |
| レビューコメント | 変更の1か所に付ける、もう一度見てほしい点のメモ |
| 消し忘れ | デバッグ用の表示のように、開発者が消し忘れたもの |
学生が入力するセルは、このプレビューでは空白です。
レビューする変更
同僚が、小さな関数を整理したいと言っています。お客様が商品につけた評価を平均する関数です。2つのフォルダーを作ります。before は今のコード、after は同僚の変更を入れたコードです。
あなたの仕事は、それをレビューすることです。プルリクエストとは、自分の変更を取り込んでよいか、同僚に読んで決めてもらう依頼のことです。
2つのフォルダーを作る
mkdir -p ~/reviewtest/before ~/reviewtest/afterここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
プロジェクトに入る
cd ~/reviewtestここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
今のコードを書く
printf 'def average_rating(ratings):\n if len(ratings) == 0:\n return 0.0\n total = 0\n for rating in ratings:\n total = total + rating\n return total / len(ratings)\n' > before/ratings.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
同僚の版を書く
printf 'def average_rating(ratings):\n print("評価", ratings)\n return round(sum(ratings) / len(ratings), 1)\n' > after/ratings.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
何より先に差分を読む
差分は、変わった所だけを見せます。- で始まる行は削られた行です。+ で始まる行は足された行です。空白で始まる行は文脈で、そのままです。
@@ の行は、変更の位置を言います。ここでは、古いファイルは1行目から7行、新しいファイルは1行目から3行です。
変更を差分で見る
diff -u before/ratings.py after/ratings.py | tail -n +3ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
どの変更にも4つの質問をする
言っている通りのことをしますか。この変更は、関数を整理すると言っています。
端ではどうなりますか。空のリスト、1つだけ、とても大きなリストです。気づくテストはありますか。デバッグ用の行や、わかりにくい名前のような、残り物はありませんか。
読むだけでなく動かす
読むと、おかしく見える所がわかります。動かすと、何がおかしいかがわかります。空のリストを含めて、両方の版に同じ呼び出しをします。PYTHONPATH は、どのフォルダーから import するかを Python に教えます。
古いコードを試す
PYTHONPATH=before python3 -B -c "from ratings import average_rating; print(average_rating([4, 5]), average_rating([]))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
新しいコードに2つの評価を渡す
PYTHONPATH=after python3 -B -c "from ratings import average_rating; print(average_rating([4, 5]))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
新しいコードに空のリストを渡す
PYTHONPATH=after python3 -B -c "from ratings import average_rating; print(average_rating([]))" 2>&1 | grep Errorここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
新しいコードの消し忘れを探す
grep -n "print(" after/ratings.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
役に立つコメントを書く
役に立つコメントは、場所を言い、見たことを言い、なぜ大事かを言い、先へ進む方法を示します。話題はコードで、人ではありません。
「だめ」や「直して」だけのコメントは、書いた人に、動くための手がかりを何も渡しません。
例: 弱いコメントと役に立つコメント
| 弱いコメント | 役に立つコメント |
|---|---|
| これは間違い | 3行目: average_rating([]) が ZeroDivisionError になります。古いコードは 0.0 を返していました。そのケースを残して、テストも足しませんか。 |
| これを消して | 2行目: この print は、呼ぶたびにログへ書き出します。デバッグの消し忘れですか。 |
| なぜ丸める? | 3行目: 小数1桁に丸めると、4.33 が 4.3 になり、呼ぶ側すべてに影響します。意図したものですか。そうなら、名前かタイトルに書いてください。 |
| テストがない | テストが変わっていません。空のリストと評価1つのテストがあれば、次の変更を守れます。 |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
名前と空白だけを見て、承認するレビューアーがいます。見た目は、いちばん大事ではありません。変更を動かし、空のケースを試し、壊れたときに気づくテストがあるかを問いましょう。
さらに: 自分の変更をレビューする
自分の関数に、機能を足すなどの小さな変更をします。先に古いファイルをコピーしておきます。
2つに diff -u をかけ、レビューアーのつもりで4つの質問に答えます。もらってうれしいコメントを1つ書きましょう。