コードレビューで安易に質問形式を使うとチームが疲弊する
修正依頼の意図があるならば、素直にその内容を書いたほうが良い。安易に質問形式を使うとチームが疲弊する。
質問形式のレビューとは
例えばユーザーのidを抽出したいときに以下のコードがあったとして
user_ids = User.where(hoge).map(&:id)
それに対してレビュアーが
みたいな質問形式。これ、なるべくやめたほうが良い。
「この処理で必要なのはIDだけなので、pluck(:id)を使う方が効率が良いからそうしてほしい」という意図があるならば、シンプルにそう伝えれば良い。
上記の例は極端かもしれないが、以下のような書き方をしている人もいるのではないだろうか
pluckではなくてmapを使っているのはなぜですか?
質問形式によるレビューの「こじれ」
質問形式を取ってしまうと以下のような「こじれ」が発生する
真意を探る
防御的な姿勢を取る
無益な議論へと発展する
コードが歪む
質問形式自体にこういう「こじれ」のリスクが有ることを意識したほうが良い。
なぜレビュアーは質問形式を使ってしまうのか
以下のような理由がある。質問形式のレビューは楽なのだ。
上二つの理由は心理的だったり技術的な問題であるため説明は省略するが、最後の理由は注意したい。確かにレビューのコメントでレビュイーが自身のコードの問題点に気付き、それの修正を行うことはあるが、それによる教育的なメリットはどれぐらいあるのだろうか。おそらくほぼ無いと言っていいだろう。仮にあったとしても、それは質問形式を行ったことによるものではない気がする。
より建設的なレビューをするために
提案をする(コスト:低)
純粋な質問であることを伝える(コスト:低)
具体的な指摘をする(コスト:中)
指摘内容の意図や背景を伝える(コスト:高)
コストの高いレビューをレビュアーに期待するのはやめる
自分がレビューするときはこれらのことを意識していきたいが、一方で人のレビューにこれらを期待するのは少し虫が良すぎるかもしれない。なぜレビュアーが質問形式を使うのかと言うと、それが楽だからだ。
雑なレビューを受け取ると少しがっかりすることもあるが、まずはレビューのために時間を割いてくれた相手に感謝の気持ちを持つようにしよう。
git ですでに管理されているファイルの変更を無視する
.gitignoreとは違い、既に管理されているファイルの変更を無視したい。
環境依存の関係でどうしても変更したいが、全体には影響させたくないときに使う。
git update-index --skip-worktree [ファイル名]
git update-index はインデックスを更新する。インデックスはワーキングツリーとリポジトリの中間に位置するステージングエリアのこと。
これの--skip-worktreeオプションでファイルの変更を無視する。
この操作を取り消すには --no-skip-worktree を使う
git update-index --no-skip-worktree [ファイル名]
注意点
--no-skip-worktree を使うと、変更を検知することができなくなる。そのため、変更を取り込めないことによる別のトラブルが発生する場合がある。後述する--assume-unchangedの方が目的に合っている場合もある。
--assume-unchangedオプション
似たようなオプションで、--assume-unchangedがある。--skip-worktreeがファイルの変更を無視するのに対して、--assume-unchangedはローカルでのファイル変更が無いと仮定するように指示する。
使用目的としては、自動生成されるファイルなど、頻繁に更新されるけど頻繁に変更を追跡しなくても良いものに対して使う。ファイル変更の監視をしなくて良くなるので、パフォーマンスが向上する。
git update-index --assume-unchanged [ファイル名]
この操作を取り消すには--no-assume-unchangedを使う
git update-index --no-assume-unchanged [ファイル名]
--skip-worktreeと--assume-unchangedの違い
ローカルとリポジトリでそれぞれファイルの更新が行われ、マージされたときの挙動が異なる
設定ファイルにおける軽微な調整を無視したいときなどは、将来の変更が取り込まれる--assume-unchangedの方が向いていそう。
無視したファイルを確認する
git ls-files -v | grep '^[Ssh]'
git ls-files -vで先頭にSがついているものが--no-skip-worktree指定したもの。--assume-unchangedを指定したものについては小文字のsがつく。マージ中にコンフリクトしたものは小文字のhで表示される。grepでそれらを抽出している。
参考
ASN (Autonomous System Number) とは何か
大きいところから説明するほうがわかりやすい。
ICANN (Internet Corporation for Assigned Names and Numbers)
インターネットのアドレス空間をグローバルに管理する非営利団体がある。
IANA(Internet Assigned Numbers Authority)を通じて、各地域のRIRにASNのブロックを割り当てている。
RIR (Regional Internet Registry)
各地域におけるIPアドレスとASNの割り当てと管理を担当する組織
世界には5つある
ARIN (American Registry for Internet Numbers): 北米地域
RIPE NCC (Réseaux IP Européens Network Coordination Centre): ヨーロッパ、中東、中央アジア地域
APNIC (Asia-Pacific Network Information Centre): アジア太平洋地域
LACNIC (Latin America and Caribbean Network Information Centre): 中南米、カリブ地域
AFRINIC (African Network Information Centre): アフリカ地域
ASN(Autonomous System Number:自律システム番号)
インターネット上でネットワークを識別するために使用される番号。主にインターネットサービスプロバイダー(ISP)や大規模ネットワークを管理する組織に割り当てられる。
この分類があるおかげでルーティングの効率化ができている。
IPの情報を取得するときに、プライベートIPアドレスではASNは割り振られない。IPの情報を使ったロジックを書くときはこれを使って開発時かどうか判定できる。