コードレビューではコンテキストが大事
Context(文脈)とは文章の前後関係や物事の背景を指す言葉です。特に日本はハイコンテキストな文化と言われています。ハイコンテキスト/ローコンテキストとは、コンテキストの共通性をどれくらい重視するかということで、アメリカなどがローコンテキストの文化の代表です。日本では昔から短歌や俳句といった限られれた文字数の中で、暗喩をもたせることが美とされてきた文化で、婉曲的であることが美徳ともされ、読まれた場所や季節、人物のコンテキストを重視します。
そうとはいえ、日本でもビジネスの現場では階層主義的なフラットな組織構造が好まれ、コミュニケーションも同期的なコミュニケーションから非同期のチャットコミュニケーションが一般的になってきていると感じています。チャットコミュニケーションにおいては、ハイコンテキストの強さを活かしづらいです。それはコンテキストが落ちやすいからだと考えています。「言わなくても分かるよね」「察して」という文化で育ちましたが、エンジニアは仕事の大半をオンラインで行うのがスタンダードで、圧倒的ローコンテキストな環境で、そこにギャップがあるんじゃないかなぁとぼんやり想像しています。それが故に「なぜ自分の意図が伝わらないのか?」逆に、「なぜ自分のアウトプットにそんなに質問されるのか?」ということに悩んできました。無意識的にコンテキストが共有されていることを相手に求めるが、今はそれが十分でなかったのだと理解しています。特にコードレビューに関してはその傾向が強いように思います。
コンテキスト次第で良くも悪くもなる
Post.where(status: :published).pluck(:id).each do |id|
sleep(1)
post = Post.find(id)
post.update!(status: :draft)
end
このコードを見てどう思いますか?
- N+1じゃない?
- なぜ
pluckしているの? sleep(1)の意図は?pubsishedの全部が対象?
色々あると思います。どんなコンテキストがあれば見方が変わるでしょうか?
- ユーザーとは関係ないバッチ処理のコードである
- メモリが限られているので、
ActiveRecord::RelationじゃなくてArray[Integer]が良い Postの更新で少し重たい処理が走るので間隔を空けている- インシデント対応で全記事をドラフトに変更したい
などなど。ファイルの場所やファイル名で分かる得られるコンテキスト。マシンリソースなどの実行環境のコンテキスト。このdiffで実現したいWhyというコンテキスト。
ちょっと見え方が変わってきませんか?夏は暑いから冷たいお茶が飲みたいし、冬は寒いから温かいお茶が飲みたいんです。それくらいにコンテキストは重要だと考えています。
コードレビューの目的は?
最近のAIはdiffだけを見た表面的な評価による、バグやパフォーマンスの問題、タイポを見つけるのが上手です。その方面はAIに任せるとしてて、人間は何をレビューするのがいいでしょう?
自分は以下の様に捉えています。
- このdiffはコードベースに加えてよいクオリティか?
- 全体の設計思想に反しないか?
コードレビューは要件を満たしているか、というよりも、そのdiffで何をしようとしているかという設計や影響がレビュイーとレビュアーでシェアされ、コードベースにマージしてよいかを判断するイベントだと思っています。この過程でレビュイーがレビュアーに意図を伝えなければならないし、それにはコンテキストが重要なんじゃないか、ということでした。
AIがコードを書いていてレビュイーの意図が伝わらなかったり、AIがAuthorである場合など状況は変化しているので、1年もしたら自分の考えも変わっているかもしれません。とはいえ、人間が判断をする限り、コンテキストはAIにとっても人間にとっても必要なものなんだと捉えてます。