クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

小さな変更のコードレビュー

このレッスンのあとで: 小さな変更を読み、動かして問題を見つけ、役に立つコメントを書ける。

60分のレッスンコマンド9件毎日使う Linux コマンドのラボ:エンジニアが暗記している30のコマンド

コードレビューは何のためか

コードレビューとは、変更が本流に入る前に、同僚が読むことです。自分の作業では見えない欠陥を見つけ、コードの知識をチームに広げます。

役に立つレビューは、身につける技術です。見た目だけでなく、変更が何をするかを見ます。

このレッスンのゴール

メモ

小さな変更を読み、動かして問題を見つけ、役に立つコメントを書ける。

重要な言葉

ことばいみ
差分変更が削る行と足す行の一覧
コードレビュー変更を取り込む前に、同僚が読むこと
端のケース空のリストのような、珍しくてもコードが扱うべき入力
レビューコメント変更の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つ書きましょう。

このラボとソースについて: 毎日使う Linux コマンドのラボ:エンジニアが暗記している30のコマンド

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。