How to do a Code Review - nycu-xuan/FastShop GitHub Wiki

What to look for in a code review

設計

這個改變的引入時機是否恰當?它是否有在該出現的地方?是否有展現應有的功能?

功能

當改變會直接影響使用者時,例如 UI 的改變,單純看程式碼可能感受不出來,此時 reviewer 可以先實際感受改變的效果,或請設計者提供 demo。

複雜度

程式使否超出它該有的複雜度?這包括行與行、函式和類別。「太複雜」代表讀者無法快速理解程式的意圖,這樣的程式碼容易在往後的改變中引入 bug。 有一種情況是「過度工程」(over-engineering):設計者將函式或類別的功能過度泛化 (generic)。

我們只需要解決現在目標解決的問題,而不是未來說不定會需要的

測試

對應的測試(單元測試、整合測試,等等)應該包含在同樣的 PR 中。reviewer 應該確認測試的有效性:是否在程式有問題時會 fail?有沒有可能產生 false positive?有沒有將不同函式的測試分門別類?有沒有遺漏的測試邊界?測試不應該測試自己。 同時測試的程式碼也是需要維護的,因此同樣需要檢視其複雜度,盡可能清楚、簡短且有用

命名

是否使用有意義的命名。好的命名應該足夠表達其作用,但也不該過長而影響閱讀。

註解

註解不應該解釋程式碼在做什麼,而是解釋為什麼需要這些程式碼或某些決策的原因。同時檢查有無過時的註解,譬如已完成的 TODO。

當你覺得需要寫註解時,多半只是程式碼缺乏表現力;當你必須要寫註解時,請盡可能把它寫好。

例外

正規表達式或演算法有時無法避免使用註解。

風格

我們的專案統一使用 formatter,原則上不再需要擔心程式碼風格。

若有強制規範,以規範為主;若無強制規範,以周邊一致性為主;若無周邊需考量,以設計者偏好為主,而不是 reviewer。

當有必要引進風格調整時,不要將其混入包含功能變更的 PR 中, 這會掩蓋重要的變更,並使 commit 糾纏在一起。

文件

如果改變影響建置程序、使用方式或釋出新的 release,相關的文件需一並更新。

每一行

除了 data file、自動產生的程式碼或大型資料結構,應該看過每一行由人寫出的程式碼,或至少,瞭解所有的程式碼做的事情。 如果覺得有不清楚的地方,可以請設計者進行說明。如果發現自己缺少特定領域的知識,如資安,可以請更熟悉的人員幫忙 review。

例外

如果你是多位 reviewer 的其中一位,只負責 review 部分的程式碼,可以不用看過每一行,但應該在 review 後註明自己看過的部分。

上下文

有時看起來只是新增了幾行程式碼,卻讓其所屬的函式超出了合適的複雜度;除了看更改的地方,也要綜觀其周遭。多數系統都是在許多微小的改變之後變得複雜,要避免引入不必要的複雜度。

不要引入會降低系統品質的改變。

好事

在改變中看到了不錯的地方,尤其是對你的 comment 的回應,別吝嗇於稱讚。

總結

在進行 code review 時,應當確認:

  • 程式設計良好
  • 此功能對使用者來說有用
  • UI 的改變合理且美觀
  • 程式碼沒有過度複雜
  • 設計者不是在解決想像中的問題
  • 有適當且良好的測試
  • 設計者使用清楚的命名
  • 註解清楚流暢,且解釋 why 而不是 what
  • 文件有更新
  • 程式碼風格有遵循規範

確保有 review 過被指派的每一行、看過上下文,並且有提升程式碼品質,也記得稱讚設計者做的好事


參考自 Google: How to do a code review