← Lập trình với Claude Code

Bài 13 · Vận dụng · 24 phút· Cập nhật 13/07/2026

Review code AI sinh ra

Biên soạn bởi Nguyễn Anh Tuấn

Chiến lược review code do AI generate: khoanh phạm vi, đọc diff theo từng lớp, bắt AI giải trình, chạy kiểm chứng và giữ con người là chốt chất lượng.

Khi tự code bằng tay, bạn thường kiểm soát trong lúc viết: viết một hàm, nghĩ qua nhánh lỗi, chạy thử, sửa tiếp. Khi dùng Claude Code, nhịp đó đổi hẳn. AI có thể sửa 12 file, thêm 800 dòng, đổi test, đổi cấu hình trong vài phút. Tốc độ này hữu ích, nhưng nó tạo một rủi ro mới: bạn bị đẩy vào vai người duyệt một khối diff lớn mà mình chưa kịp hiểu.

  • Vấn đề không phải AI viết nhanh; vấn đề là con người mất nhịp kiểm soát nếu không có quy trình.
  • Không merge code chỉ vì nó chạy và AI nói “đã xong”.
  • Mục tiêu review: hiểu đủ để chịu trách nhiệm, sửa tiếp, rollback và vận hành khi AI không còn ở đó.

Nguyên tắc của bài này

AI là người đề xuất và người phụ soát. Con người là điểm chốt chất lượng. Nếu bạn không thể giải thích thay đổi bằng lời của mình, thay đổi đó chưa sẵn sàng đi vào nhánh chính.

Đừng mở diff lớn rồi đọc từ trên xuống ngay. Trước hết, bắt AI lập một bản đồ thay đổi. Bản đồ này giúp bạn biết đang kiểm cái gì, rủi ro nằm ở đâu, và nên đọc file nào trước. Nếu chưa quen cách Claude đọc/sửa file và chạy lệnh, xem lại bài Đọc, sửa code & chạy lệnh an toàn.

prompt khoanh phạm vi trước khi review

Trước khi tôi đọc diff, hãy tóm tắt thay đổi theo mẫu:

1. Mục tiêu ban đầu của task là gì?
2. File nào đã đổi, mỗi file đổi để làm gì?
3. Luồng người dùng hoặc API nào bị ảnh hưởng?
4. Rủi ro lớn nhất của thay đổi này là gì?
5. Test/build/lệnh nào đã chạy, kết quả ra sao?
6. Phần nào bạn chưa chắc và muốn con người kiểm kỹ?
  • Mục tiêu: thay đổi có đúng việc được giao không, hay AI tự mở rộng phạm vi?
  • File đổi: có file nào lạ, cấu hình nào bị đụng, migration nào xuất hiện không?
  • Rủi ro: dữ liệu, phân quyền, thanh toán, xoá/sửa hàng loạt, caching, concurrency.
  • Cách kiểm: test nào chứng minh hành vi, test nào còn thiếu.

Review code AI sinh ra nên đọc theo lớp rủi ro, không đọc như đọc truyện từ đầu tới cuối. Mỗi lượt chỉ tập trung vào một câu hỏi. Cách này chậm hơn một chút ở đầu, nhưng giảm khả năng bị AI dẫn đi khắp nơi.

  • Lớp ý định: diff có giải đúng bài toán không, hay chỉ làm một phiên bản gần giống?
  • Lớp ranh giới: API, route, schema, quyền truy cập, dữ liệu vào/ra có đổi không?
  • Lớp logic: điều kiện, vòng lặp, transaction, cache invalidation, lỗi đồng thời.
  • Lớp lỗi: empty state, null/undefined, lỗi mạng, lỗi DB, rollback, thông báo lỗi.
  • Lớp test: test có bắt đúng hành vi không, có test ca biên không, test có quá phụ thuộc implementation không?
  • Lớp maintainability: tên gọi, cấu trúc file, duplication, code có hợp convention repo không?

lệnh hữu ích khi tự đọc diff

git diff --stat main
git diff --name-status main
git diff main -- src/path/to/file.ts
git diff main --check

Đừng để chi tiết nhỏ che lỗi lớn

Tên biến xấu nên sửa, nhưng đừng để nó chiếm hết năng lượng review. Với code AI, lỗi nguy hiểm thường nằm ở giả định sai: sai quyền, sai luồng dữ liệu, sai ca biên, sai cách rollback.

AI có thể giúp bạn review nhanh hơn nếu bạn hỏi đúng. Nhưng hãy nhớ: câu trả lời của AI là đầu vào cho review, không phải phán quyết. Việc của bạn là biến phần giải trình đó thành hiểu biết của chính mình.

prompt yêu cầu AI giải trình quyết định kỹ thuật

Review phần diff này như một senior engineer, nhưng chỉ báo cáo, không sửa file.

Tập trung vào:
- Giả định nghiệp vụ có thể sai.
- Rủi ro dữ liệu, phân quyền, concurrency, rollback.
- Test còn thiếu hoặc test yếu.
- Đoạn code nào khó bảo trì nếu không có AI.

Với mỗi finding, ghi: file, dòng, vì sao nguy hiểm, cách kiểm chứng, đề xuất sửa.
  • Hỏi “vì sao chọn cách này?” thay vì chỉ hỏi “có lỗi không?”.
  • Yêu cầu AI chỉ báo cáo ở vòng review; đừng để nó vừa tự sửa vừa tự chấm.
  • Bắt buộc có bằng chứng: file/dòng, rủi ro, cách tái hiện hoặc test cần thêm.
  • Nếu bạn không giải thích lại được, hãy coi đó là tín hiệu cần đọc kỹ hơn.

Một diff quá lớn không chỉ khó review. Nó còn khiến bạn dễ nhượng quyền định hướng cho AI: AI đã dựng thế này rồi, mình sửa tiếp theo nó vậy. Cách chống lại là chia việc lớn thành các checkpoint nhỏ. Đây cũng là lúc plan mode phát huy tác dụng: bắt AI trình kế hoạch trước khi sửa.

  • Plan trước: yêu cầu AI trình kế hoạch và điểm dừng trước khi sửa.
  • Một PR = một thay đổi có thể hiểu được, test được, rollback được.
  • Commit theo lát cắt: schema riêng, logic riêng, UI riêng, test riêng nếu cần.
  • Dừng sau mỗi checkpoint: đọc diff, chạy test, quyết định đi tiếp hay đổi hướng.

prompt cắt thay đổi lớn thành PR nhỏ

Thay đổi này đang quá lớn để review.
Hãy đề xuất cách chia thành 3 PR nhỏ, theo thứ tự merge an toàn.

Với mỗi PR, ghi:
- Mục tiêu.
- File dự kiến đổi.
- Test/lệnh kiểm chứng.
- Rủi ro còn lại sau khi merge PR đó.

Chưa sửa file. Chỉ lập kế hoạch để tôi duyệt.

Checkpoint không thay thế git

Rewind/checkpoint trong phiên Claude hữu ích, nhưng nó không phải lịch sử dự án. Với thay đổi đã đáng giữ, hãy dùng git: nhánh riêng, commit nhỏ, PR nhỏ. Bài Quy trình: nhánh → PR → review là nền cho bài này.

Một thay đổi AI sinh ra chỉ nên merge khi bạn trả lời được các câu hỏi dưới đây. Không cần thuộc lòng mọi dòng, nhưng phải hiểu đủ để chịu trách nhiệm vận hành.

  • Tôi có nói lại được thay đổi này làm gì và không làm gì không?
  • Tôi biết file nào là lõi, file nào chỉ là wiring/UI/test không?
  • Tôi biết test nào bảo vệ hành vi chính và ca biên nào đã được thử không?
  • Tôi biết rollback thế nào nếu deploy lỗi không?
  • Tôi có thể debug bug đầu tiên mà không cần AI viết lại cả tính năng không?

Móc sang bài kế

Bài này là lớp kiểm soát thủ công của con người. Bài kế - Kiểm chứng & tự động hoá - sẽ thêm lớp máy chạy: test/build, headless mode, CI. Hai lớp này đi cùng nhau: máy kiểm những thứ lặp lại, con người chốt chất lượng và hướng giải pháp.

Câu hỏi thường gặp

Khi tự viết, bạn thường kiểm từng bước trong lúc gõ. Khi AI sinh nhiều file trong vài phút, quá trình kiểm soát đó bị dồn về cuối. Vì vậy bạn cần một chiến lược review có lớp lang: xem phạm vi trước, đọc diff theo nhóm rủi ro, hỏi lại quyết định quan trọng, rồi mới chạy kiểm chứng.

Có, nhưng đừng bắt đầu bằng từng dòng ngay. Nếu mở diff nghìn dòng và đọc tuần tự, bạn rất dễ mệt và bỏ sót ý chính. Hãy đi từ bản đồ lớn: mục tiêu là gì, file nào đổi, luồng nào bị ảnh hưởng, test nào chứng minh. Sau đó mới đọc từng đoạn quan trọng.

Dừng lại. Yêu cầu AI giải thích bằng ngôn ngữ của dự án, chỉ rõ input/output, invariant, trade-off và ca lỗi. Nếu vẫn không giải thích lại được bằng lời của bạn, chưa nên merge. Một đoạn code bạn không thể vận hành là nợ kỹ thuật, dù nó đang chạy.

Có ích, nhưng chỉ là một lớp lọc. AI tự review giúp bắt lỗi hiển nhiên, thiếu test, lệch convention. Nhưng nó có thể bảo vệ chính hướng đi sai ban đầu. Hãy dùng AI như người phụ soát, còn quyết định cuối vẫn là bạn hoặc reviewer con người.

Tăng tốc không có nghĩa là bỏ kiểm soát. AI giúp tạo nháp, tìm hướng, viết test, sửa lỗi nhanh hơn. Thời gian của bạn chuyển từ gõ nhiều sang đọc, đặt câu hỏi, thiết kế tiêu chí đúng và quyết định. Đó là phần senior trong công việc.

Bạn làm chủ khi có thể giải thích thay đổi, biết rollback ở đâu, biết test nào bảo vệ hành vi, biết log nào cần xem khi lỗi, và có thể sửa một bug nhỏ mà không cần AI viết lại cả cụm code. Đó là tiêu chuẩn tốt trước khi merge.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Vì sao code do AI sinh ra cần chiến lược review riêng?

Bài tập về nhà

  1. 1

    Bản đồ diff

    Lấy một thay đổi AI vừa làm và viết 5 dòng: mục tiêu, file đổi, luồng bị ảnh hưởng, rủi ro lớn nhất, cách kiểm chứng.

    ✅ Hoàn thành khi: Bạn nhìn vào 5 dòng đó và biết nên đọc phần nào trước, không cần mở diff một cách mù mờ.

  2. 2

    Review theo lớp

    Đọc cùng một diff qua 4 lượt: API/luồng, logic, lỗi/biên, test. Mỗi lượt chỉ ghi nhận vấn đề của lớp đó.

    ✅ Hoàn thành khi: Bạn có danh sách nhận xét tách lớp, không lẫn “tên biến xấu” với “logic sai”.

  3. 3

    Bắt AI giải trình

    Chọn một đoạn code AI viết và hỏi: “Giải thích vì sao chọn cách này, trade-off là gì, trường hợp nào dễ lỗi?”.

    ✅ Hoàn thành khi: Bạn tự viết lại được quyết định kỹ thuật bằng lời của mình, hoặc đánh dấu đoạn đó cần sửa.

  4. 4

    Cắt PR lớn

    Nếu AI tạo thay đổi quá lớn, yêu cầu nó đề xuất cách chia thành 2-4 PR nhỏ theo thứ tự merge.

    ✅ Hoàn thành khi: Mỗi PR nhỏ có mục tiêu riêng, test riêng và có thể review độc lập.

  5. 5

    Checklist trước merge

    Tạo checklist review code AI cho repo của bạn: phạm vi, diff, test, bảo mật, rollback, tài liệu.

    ✅ Hoàn thành khi: Checklist có thể dán vào PR template hoặc CLAUDE.md để lần sau dùng lại.

  6. 6

    Kịch bản AI biến mất

    Với một thay đổi mới, trả lời: “Nếu mai không dùng AI nữa, tôi debug phần này bằng cách nào?”.

    ✅ Hoàn thành khi: Bạn chỉ ra được file bắt đầu đọc, log/test cần chạy, và cách rollback khi lỗi.