Tôi từng sợ code review sáng thứ Hai. Chồng 6-8 PRs từ cuối tuần, mỗi cái là một lần chuyển context. Đến PR thứ 4, tôi bắt đầu lướt. Đến PR thứ 6, tôi approve những thứ lẽ ra không nên. Ai cũng biết cảm giác đó.
Ba tháng trước, tôi bắt đầu dùng Claude Code làm first-pass reviewer trước khi tự mình xem bất kỳ PR nào. Không phải để thay thế human review — mà để xử lý phần cơ học để tôi tập trung vào phần thực sự cần bộ não con người. Kết quả khá bất ngờ, theo cả hai hướng.
Đây là đánh giá thẳng thắn về những gì Claude Code bắt được, những gì nó hoàn toàn bỏ sót, và prompt chính xác tôi dùng để có feedback cấp senior.
Cách Tôi Review Với Claude Code
Workflow rất đơn giản. Trước khi mở PR trên browser, tôi chạy Claude Code trên branch đó:
# Checkout PR branchgit checkout feature/user-preferences
# Yêu cầu Claude Code review changesclaude -p "Review changes trong branch này so với main.Tập trung vào:1. Bugs và logic errors2. Vấn đề bảo mật3. Vấn đề performance4. Code style không nhất quán5. Edge cases bị thiếu
Cụ thể. Nêu tên file và số dòng.Với mỗi issue, giải thích TẠI SAO nó là vấn đề và gợi ý cách sửa.Mức severity: CRITICAL / WARNING / SUGGESTION."Mất 30-60 giây và cho ra review có cấu trúc. Tôi đọc feedback của Claude, rồi mở PR với biết chính xác cần tập trung vào đâu.
Những Gì Claude Code Bắt Rất Giỏi
1. Null Safety và Edge Cases
Đây là siêu năng lực của Claude Code trong review. Nó kiểm tra không mệt mỏi mọi code path cho null values, empty arrays, và boundary conditions.
Trong một PR, developer thêm hàm xử lý hoàn tiền:
fun processRefund(orderId: String) { val order = orderRepository.findById(orderId) val payment = order.payment paymentGateway.refund(payment.transactionId, payment.amount)}Claude flag ba vấn đề trong bốn dòng:
findByIdcó thể trả null — không có null checkorder.paymentcó thể null nếu order miễn phí (zero amount)- Không kiểm tra payment đã được refund chưa
Human reviewer có thể bắt cái đầu tiên. Cái thứ hai và ba đòi hỏi hiểu domain model. Claude bắt hết vì nó đã đọc Order data class và thấy payment là nullable.
2. Lỗ Hổng Bảo Mật
Claude Code thực sự giỏi bắt các vulnerability kiểu OWASP. Nó luôn flag:
- SQL injection: String concatenation trong queries
- XSS: User input chưa escape trong templates
- Path traversal: File paths do user kiểm soát
- Thiếu auth checks: Endpoints không có authentication middleware
- Secrets lộ: API keys, tokens, connection strings trong code
Trong một review, nó bắt được path traversal vulnerability đã nằm trong codebase nhiều tháng:
app.get('/download/:filename', (req, res) => { const file = path.join(uploadsDir, req.params.filename); res.sendFile(file);});Review của Claude: “CRITICAL: Path traversal vulnerability. Request đến /download/../../etc/passwd sẽ thoát khỏi thư mục uploads. Validate rằng resolved path bắt đầu bằng uploadsDir sau path.resolve().”
Đây chính xác là loại lỗi trượt qua mắt human reviewer khi mệt.
3. Patterns Không Nhất Quán
Khi codebase có patterns đã thiết lập, Claude Code nhận ra khi PR phá vỡ chúng:
- Dùng callbacks khi phần còn lại dùng async/await
- Truy cập database trực tiếp khi code khác dùng repository pattern
- Error handling inline khi có global error handler
- Naming conventions khác nhau trong cùng module
SUGGESTION: Function này dùng try/catch với manual error responses,nhưng tất cả endpoints khác trong module này dùng asyncHandler wrapper(xem src/middleware/asyncHandler.ts). Dùng asyncHandler sẽ giữ nhất quánvà đảm bảo errors được log qua central handler.Loại feedback này đòi hỏi human reviewer hiểu sâu codebase. Claude có được từ việc đọc các file xung quanh.
4. Test Coverage Thiếu
Claude Code đáng tin cậy trong việc phát hiện code paths mới thiếu tests:
- Branches mới (if/else) không có test cases tương ứng
- Error paths chưa bao giờ được test
- Public methods mới không có test
- Logic đã sửa mà tests hiện tại không cover
WARNING: Hàm validateEmail() mới có 4 code paths riêng biệt(email hợp lệ, chuỗi rỗng, thiếu @, domain không có TLD) nhưngtest file chỉ cover trường hợp hợp lệ và chuỗi rỗng. Thiếu testscho: email sai format không có @, và domains không có TLD.Những Gì Claude Code Hoàn Toàn Bỏ Sót
1. Business Logic Đúng Hay Sai
Claude Code biết code có crash không. Nó không biết code có làm đúng việc không. Đây là gap lớn nhất.
Developer implement tính discount:
def calculate_discount(user, cart_total): if user.is_premium: return cart_total * 0.15 if cart_total > 100: return cart_total * 0.10 return 0Claude review không thấy vấn đề. Nhưng yêu cầu business là: premium users được 15% VÀ cart discount cộng dồn (25% cho premium users với cart trên $100). Claude không thể biết điều đó vì nó nằm trong Jira ticket, không phải trong code. Đây là giới hạn cơ bản — Claude review code dựa trên code, không phải code dựa trên requirements.
2. Kiến Trúc và Design Decisions
Claude biết function có viết tốt không. Nó khó nói function có nên tồn tại hay không.
Trong một PR, developer tạo NotificationService mới trùng chức năng với EventBus đang có. Claude review code quality của NotificationService và thấy sạch. Nhưng feedback đúng là: “Chúng ta đã có EventBus cho việc này. Đừng tạo hệ thống song song.”
Architecture reviews đòi hỏi hiểu lịch sử và hướng đi của hệ thống. Tại sao chọn EventBus? Nó giải quyết vấn đề gì? Hệ thống đi đâu? Claude không có context đó trừ khi bạn cung cấp rõ ràng.
3. Performance Ở Quy Mô Lớn
Claude bắt được vấn đề performance rõ ràng — N+1 queries, thiếu indexes, O(n²) loops. Nhưng nó bỏ sót vấn đề performance chỉ xuất hiện ở scale lớn.
Nó không flag:
- Database query chạy ổn với 1,000 rows nhưng giết DB ở 1 triệu
- Caching strategy hoạt động trên single-server nhưng fail ở distributed
- Memory allocation patterns gây GC pressure dưới throughput cao
- API response sizes ổn trong dev nhưng khổng lồ trên production
Những điều này đòi hỏi kinh nghiệm production và kiến thức hệ thống mà AI hiện tại chưa có.
4. Context Team Và Project
Claude không biết:
- Developer đó là junior và cần feedback chi tiết hơn
- Khu vực code này đã gây production incidents trước đó (cần xem kỹ hơn)
- Team đã thống nhất tuần trước ngừng dùng library nào đó
- Module đang được deprecated và code mới không nên mở rộng nó
- Dynamics team xung quanh code ownership
Đây là những quyết định cần human judgment, không thể delegate.
Prompt Patterns Cho Feedback Cấp Senior
Pattern 1: Review Tập Trung
Thay vì “review code này,” cho Claude một lens cụ thể:
"Review src/api/payments.ts CHỈ tập trung vào error handling.Với mỗi function:- Những errors nào có thể xảy ra?- Tất cả đều được catch chưa?- Error messages có hữu ích cho debugging không?- Error nào có thể để system ở trạng thái inconsistent?"Review tập trung cho feedback tốt gấp 3 lần review chung chung.
Pattern 2: Review Đối Kháng
Yêu cầu Claude nghĩ như attacker:
"Bạn là security auditor. Review changes này giả sử tất cảuser inputs đều malicious. Với mỗi endpoint:- Inputs có thể craft để break system không?- Có data leaks trong error messages hay responses không?- Rate limiting có thể bypass không?- Có IDOR vulnerabilities nào không?"Pattern này luôn tìm ra security issues mà generic reviews bỏ sót.
Pattern 3: Regression Check
Yêu cầu Claude nghĩ về những gì có thể break:
"Changes này sửa authentication flow. Phân tích:- Features hiện có nào phụ thuộc vào auth flow này?- Có cái nào có thể break với changes này không?- Có vấn đề backwards compatibility nào không?- QA team nên test gì sau khi merge?"Pattern này mô phỏng những gì developer kinh nghiệm làm — trace impact của changes qua hệ thống.
Pattern 4: Review Kiểu Dạy
Cho PRs của junior developers:
"Review PR này như thể tác giả là junior developer.Với mỗi issue:- Giải thích TẠI SAO nó là vấn đề (không chỉ CẦN thay đổi gì)- Liên kết với nguyên tắc chung hoặc best practice- Show code đã sửa- Đánh giá: must-fix vs nice-to-have"Pattern này cho ra review comments dạy, không chỉ chê.
Workflow: Hệ Thống Hai Lượt
Human và AI review phối hợp thế nào:
Lượt 1 — Claude Code (5 phút):
- Chạy review prompt ở trên
- Bắt: bugs, security issues, style, thiếu tests, edge cases
- Output: danh sách issues có cấu trúc với severity ratings
Lượt 2 — Human (15 phút, tập trung):
- Đọc findings của Claude, verify từng cái
- Rồi tập trung vào điều Claude không làm được:
- Đây có đang giải quyết đúng vấn đề không?
- Approach có phù hợp với architecture không?
- Có scale được không?
- Đây có đúng abstraction level không?
- Ảnh hưởng thế nào đến velocity của team?
Tổng thời gian: 20 phút (giảm từ 40 phút human review không tập trung)
Chất lượng cao hơn vì 15 phút human review tập trung vào phần khó, không lãng phí vào bắt thiếu null checks.
Con Số Sau 3 Tháng
| Metric | Trước | Sau |
|---|---|---|
| Thời gian review trung bình | 40 phút | 20 phút |
| Bugs bắt trước merge | ~60% | ~85% |
| Security issues bắt | ~40% | ~90% |
| Style/consistency issues | ~50% | ~95% |
| Architecture issues bắt | ~70% | ~70% |
| PRs review mỗi ngày | 4-5 | 8-10 |
Chiến thắng lớn nhất ở security và consistency — hai lĩnh vực mà sự mệt mỏi và familiarity blindness ảnh hưởng human reviewers nhiều nhất. Chất lượng architecture review giữ nguyên vì đó thuần túy là human skill.
Khi Nào KHÔNG Dùng Claude Code Review
- Code nhạy cảm (crypto implementations, auth systems) — cần specialist human review
- Architecture decisions — dùng Claude phân tích, nhưng quyết định cần human judgment
- PR đầu tiên từ team members mới — họ cần human mentorship, không phải AI feedback
- Changes gây tranh cãi — code liên quan team dynamics cần human EQ
Tóm Lại
- Dùng Claude Code làm first-pass, không phải final-pass. Nó xử lý review cơ học để bạn tập trung vào judgment.
- Prompt cụ thể. Review tập trung thắng review chung chung gấp 3.
- Claude giỏi: null safety, security, consistency, test coverage. Tin tưởng ở đây.
- Claude bỏ sót: business logic, architecture, scale, team context. Đừng delegate những thứ này.
- Hệ thống hai lượt tiết kiệm 50% thời gian review mà chất lượng tăng.
- Security review là killer feature. Claude không bao giờ mệt kiểm tra injection attacks.
Code review không biến mất. Nhưng phần nhàm chán — phần mà con người tệ nhất — chính xác là nơi AI giỏi nhất. Để Claude xử lý phần đó. Giữ phần human cho human.
Code review với Claude Code được trình bày trong Phase 10: Team Collaboration của khóa học Claude Code Mastery. Phases 1-3 miễn phí.