TTechSpecs

Requesting Code Review Skill

Requesting Code Review 是 Superpowers 中的重要協作型 skills,專注於有效地請求程式碼審查,確保程式碼品質並促進團隊知識分享。

何時使用

在以下情況中使用 Requesting Code Review skill:

必須使用的情境

  • 完成一個功能或重構後
  • 準備合併程式碼到主分支前
  • 需要第二意見確認設計決策
  • 不確定實作方式是否最佳
  • 想要分享知識和經驗

不適合的情境

  • 只是修正明顯的 typo
  • 純粹的配置檔案調整
  • 緊急的 hotfix(可先合併再事後審查)
  • 還在開發中的功能

程式碼審查的價值

1. 品質保證

提升程式碼品質

  • 發現潛在的 bug 和問題
  • 確保符合專案標準
  • 改善程式碼可讀性
  • 提升測試覆蓋率

2. 知識分享

促進團隊學習

  • 分享最佳實踐
  • 學習新的技術和技巧
  • 建立共同的程式碼語言
  • 降低巴士係數

3. 設討驗證

驗證技術決策

  • 確認設計方向的合理性
  • 探索更好的解決方案
  • 識別潛在的技術債務
  • 平衡各種技術考量

如何有效請求審查

第 1 步:自我審查

在請求他人審查前先自我審查:

自我審查清單:
✓ 程式碼符合專案規範
✓ 已經過基本測試
✓ 沒有除錯用的 console.log
✓ 沒有註解掉的程式碼
✓ 檔案和函式命名清楚
✓ 複雜邏輯有註解說明
✓ 已經過 formatting(linting 通過)

第 2 步:撰寫清楚的 PR 描述

好的 PR 描述能幫助審查者快速理解:

## 概述
實作使用者註冊功能,支援 email 註冊和密碼驗證。

## 變更內容
- 新增 User model 和資料庫 schema
- 實作 POST /api/auth/register 端點
- 建立註冊表單 UI 組件
- 加入表單驗證和錯誤處理

## 測試
- [x] 單元測試通過
- [x] 手動測試註冊流程
- [x] 測試錯誤情況(email 重複、密碼太短)

## 截圖
(附上 UI 截圖)

## 問題
- 密碼複雜度要求是否需要更嚴格?
- 是否需要 email 驗證機制?

## 相關 Issue
Closes #123

第 3 步:選擇合適的審查者

選擇適合的審查者:

選擇標準:
✓ 熟悉相關程式碼領域
✓ 有時間進行審查
✓ 能提供有價值的回饋
✓ 考慮時區因素

人數建議:
- 小型變更:1-2 人
- 中型變更:2-3 人
- 大型變更:3-5 人

第 4 步:提供審查指引

清楚地告訴審查者關注什麼:

## 審查重點

請特別關注:
1. 認證邏輯的正確性
2. 密碼安全性實作
3. API 設計是否合理

已知問題:
- 表單樣式還需要調整(在下個 PR 處理)

技術決策:
- 使用 bcrypt 而非 Argon2(因為團隊較熟悉)

實際範例

範例 1:新功能 PR

場景:實作購物車功能

好的 PR 描述

## 實作購物車功能

### 變更摘要
這個 PR 實作完整的購物車功能,讓使用者可以新增、移除和修改商品數量。

### 技術實作
- **狀態管理**:使用 React Context API
- **持久化**:localStorage + 備份到伺服器
- **效能優化**:使用 React.memo 減染優化

### 主要檔案
- `src/components/Cart.tsx` - 購物車組件
- `src/contexts/CartContext.tsx` - 狀態管理
- `src/api/cart.ts` - API 呼叫

### 測試
- 新增商品到購物車 ✓
- 調整商品數量 ✓
- 移除商品 ✓
- 計算總價 ✓
- 持久化功能 ✓

### 問題討論
1. 是否需要支援多種貨幣?
2. 購物車是否需要過期機制?

### Demo
(附上操作影片或 GIF)

範例 2:重構 PR

場景:重構服務層架構

好的 PR 描述

## 重構:提取使用者服務層

### 重構目標
將使用者相關的邏輯從控制器提取到獨立的服務層,提升可測試性和可維護性。

### 重構步驟
1. 建立 UserService 類別
2. 移動認證邏輯到服務層
3. 更新控制器依賴注入
4. 加入單元測試

### 架構改變
**之前**

Controller → 直接操作 Model


**之後**:

Controller → Service → Model


### 好處
- ✓ 職責分離更清楚
- ✓ 測試更容易(不需要 mock Controller)
- ✓ 邏輯可被複用

### 測試
- 所有既有測試通過
- 新增服務層單元測試
- 整合測試驗證

### 影響範圍
- 使用者登入/註冊功能
- 使用者資料管理
- 不影響前端(API 保持相容)

審查者的期望

作為審查者,你應該:

  1. 提供具體回饋

    ❌ 「這裡有問題」
    ✅ 「第 45 行的驗證邏輯可能會在 X 情況下失敗,建議加入 Y 檢查」
  2. 說明原因

    ❌ 「改用這個方式」
    ✅ 「建議用 map 替代 forEach,因為這樣更函數式,且更容易測試」
  3. 認可好的部分

    ✓ 「這個抽象設計很好!」
    ✓ 「測試覆蓋很完整」
  4. 區分必須和建議

    **必須修正**:安全問題
    **建議改進**:效能優化
    **可選**:命名風格

回應審查意見

接受建議

感謝建議!我已經修正:
- 使用 map 替代 forEach
- 加入錯誤處理
- 更新測試

請再次審查。

討論不同意見

關於使用 Argon2 的建議:

我考慮過這個選項,但選擇 bcrypt 是因為:
1. 團隊較熟悉 bcrypt
2. 目前效能已足夠
3. bcrypt 的安全性對我們的使用案例來說已經足夠

不過我同意在未來可以考慮遷移到 Argon2。

你的看法呢?

解釋技術決策

為什麼使用 Context 而非 Redux:

這個功能相對簡單,Context 已經足夠:
- 狀態結構簡單
- 不需要複雜的狀態管理
- 減少依賴和複雜度

未來如果需要更複雜的管理,我們可以考慮遷移到 Zustand 或 Redux。

程式碼審查最佳實踐

1. 適時的 PR 大小

✓ 好的 PR:
- 200-400 行程式碼變更
- 單一功能或重構
- 審查時間 15-30 分鐘

✗ 不好的 PR:
- 1000+ 行程式碼變更
- 多個不相關的變更
- 審查時間超過 1 小時

2. 清楚的提交訊息

# 好的提交訊息
git commit -m "feat(auth): add user registration with email verification"

# 不好的提交訊息
git commit -m "update"
git commit -m "fix stuff"

3. 及時的審查

目標回應時間:
- 緊急:2 小時內
- 高優先:24 小時內
- 中優先:3 天內
- 低優先:1 週內

如果無法及時審查:
- 通知 PR 作者
- 建議其他審查者
- 預估審查時間

4. 建設性的討論

原則:
- 對事不對人
- 提供具體建議
- 解釋技術理由
- 尊重不同意見

避免:
- 「這很爛」
- 「為什麼這樣寫?」
- 「重寫」

常見問題

Q1:PR 太大怎麼辦?

A:拆分為多個小的 PR:

第 1 個 PR:資料庫 schema 和 model
第 2 個 PR:API 端點
第 3 個 PR:前端 UI
第 4 個 PR:測試和文件

Q2:沒有人審查我的 PR 怎麼辦?

A

  1. 在團隊頻道提醒
  2. 直接 tag 相關成員
  3. 詢問是否有時間
  4. 考慮調整審查者

Q3:審查者意見不合怎麼辦?

A

  1. 先理解對方的觀點
  2. 解釋你的技術決策
  3. 提供具體的利弊分析
  4. 必要時請第三者意見
  5. 記錄決策理由

與其他 Skills 組合

推薦組合

Verification + Requesting Code Review

verification-before-completion → requesting-code-review

完成後驗證,再請求審查

Requesting + Receiving Code Review

requesting-code-review → receiving-code-review

請求審查,然後處理回饋

程式碼審查檢查清單

功能性

  • 功能符合需求
  • 邊界條件處理
  • 錯誤處理完整

品質

  • 程式碼可讀
  • 命名清楚
  • 邏輯簡潔
  • 沒有重複程式碼

測試

  • 有足夠的測試
  • 測試覆蓋主要情境
  • 測試可讀且可維護

安全

  • 輸入驗證
  • 輸出轉義
  • 認證授權正確
  • 沒有暴露敏感資訊

效能

  • 沒有明顯的效能問題
  • 查詢效率合理
  • 沒有不必要的重渲染

Requesting Code Review 是確保程式碼品質和促進團隊成長的關鍵 skill,善用它來建立高品質的程式碼文化!