Giải thích cho người mới · 10/2026

Gỡ lỗi như
thám tử

Năm bước tìm lỗi trước khi hỏi AI: tái hiện, thu nhỏ, giả thuyết, chia đôi, kiểm lại. Có kho thử chạy thật và bài tập.

Ví dụ đời thường Chạy thật 20 commit Bài tập có đáp án Mẫu báo lỗi
FAIL: want 90.0 Lỗi nằm ở đâu?
Câu hỏi của bài này

Tự thu hẹp lỗi trước, rồi mới hỏi AI

1Chưa biết lỗi ở đâu thì không phán xét được câu trả lời của AI. Bạn chỉ còn tin hoặc không tin.
2Năm bước đưa bạn đến một commit cụ thể. Rồi bạn đưa AI một báo lỗi gọn, và kiểm được lời giải thích.
3Chưa ai có lý thuyết thống nhất về gỡ lỗi giỏi. Năm bước là tổng hợp thực hành, các hình ảnh chỉ để dễ nhớ.
Hình dung trước

Đừng bắt người khả nghi đầu tiên

Đoán rồi sửa ngay

Bắt người đầu tiên thấy lạ

Không giữ hiện trường, không kiểm lại. Nếu sai, vụ án mở lại sau này.

Thám tử giỏi

Giữ hiện trường, đặt giả thuyết, loại dần

“Nếu thủ phạm vào bằng cửa sau thì có bùn ở sàn bếp.” Đi kiểm đúng điều đó.

Giỏi không phải đoán đúng ngay. Giỏi là có cách loại dần các khả năng sai.
Từ khó, nói dễ

Sáu từ sẽ gặp trong bài

Tái hiện

tên kỹ thuật: reproduce

Làm lỗi xảy ra theo ý mình, mỗi lần đều thế, như dựng lại hiện trường.

Ca lỗi tối thiểu

tên kỹ thuật: minimal reproduction

Ví dụ nhỏ nhất mà lỗi vẫn xảy ra. Bỏ thêm gì nữa là lỗi biến mất.

Giả thuyết

tên kỹ thuật: hypothesis

Lời đoán về nguyên nhân mà có thể bị chứng minh là sai.

Chia đôi

tên kỹ thuật: bisect

Mỗi lần thử loại một nửa vùng nghi ngờ, như đoán số từ 1 đến 100.

Lỗi quay lại

tên kỹ thuật: regression

Thứ từng chạy đúng, nay hỏng vì một thay đổi sau đó.

Mã kết thúc

tên kỹ thuật: exit code

Số một lệnh trả về khi xong: 0 là ổn, khác 0 là có lỗi.

Số liệu · BairesDev Q2 2026

Giải quyết vấn đề vẫn được coi trọng

Giải quyết vấn đề48%
Thành thạo công cụ AI18%
Hiểu hết code AI16%

Hai thanh đầu: dev trẻ chọn kỹ năng quan trọng nhất để được tuyển. Thanh cuối: tỷ lệ dev cao cấp nói dev trẻ hiểu đầy đủ code AI.

Khảo sát 1.569 dev ở 77 nước, công bố tháng 6/2026.

Của một công ty thuê ngoài, có lợi ích thương mại. Tôi đọc số qua kết quả tìm kiếm, trang gốc chặn truy cập. Hãy coi là tín hiệu.

Năm bước

Năm bước tìm lỗi

1Tái hiệnMột lệnh làm lỗi xảy ra mỗi lần
2Thu nhỏBỏ chi tiết thừa cho đến ca nhỏ nhất
3Giả thuyếtMột lời đoán có thể sai, đoán kết quả trước
4Chia đôiLoại một nửa vùng nghi ngờ mỗi lần (git bisect)
5Sửa và chặn quay lạiSửa, chạy lại, để lại một phép thử
Bước 1 trên 5

Bước 1: tái hiện bằng một lệnh

python3 test_cart.py
FAIL total([(50, 2)]) = 100.0,
want 90.0
exit=1

Kết quả thật của lần chạy trên kho thử.

Cách đọc

Đơn 2 món giá 50 (tổng 100) phải ra 90.0 nhưng ra 100.0. Mã kết thúc 1 nghĩa là không đạt.

Chỗ hỏng

Chạy hai lần ra hai kết quả khác nhau là chưa tái hiện được. Giải quyết việc đó trước.

Bước 2 trên 5

Bước 2: thu nhỏ ca lỗi

Ca thửDữ liệuKết quảCòn lỗi?
3 dòng hàng[(25,2),(25,2),(0,5)]100.0có
Bỏ dòng giá 0[(25,2),(25,2)]100.0có
Gộp một dòng[(50,2)]100.0có
Một món[(100,1)]100.0có
Số dòng, số món, giá từng món đều vô can. Chỉ còn: tổng trước giảm đúng bằng 100.
Bước 3 trên 5

Bước 3: giả thuyết có thể sai

discount(99.99) 0.0
discount(100) 0.0
discount(100.01) 10.0

Kết quả thật. Đoán trước: dưới 100 không giảm, đúng 100 lẽ ra phải giảm.

Giả thuyết

Hàm giảm giá xử lý sai đúng tại biên 100. Giảm giá bắt đầu sau 100, không phải từ 100.

Giả thuyết mà kết quả nào cũng “khớp” thì vô ích. Nếu discount(100) ra 10.0, phải bỏ nó.

Bước 4 trên 5

Bước 4: chia đôi vùng nghi ngờ

19
Nghi ngờ
9
Sau lần 1
4
Sau lần 2
2
Sau lần 3
0
Lần 4: thủ phạm

Git chọn commit ở giữa, bạn chạy phép thử, rồi loại một nửa. Số commit còn lại lấy từ lần chạy thật.

19 commit cần tối đa 5 lần (log2 = 4,25). Lần chạy thật: 4 lần. Đi tuần tự: tới 19 lần.

Bước 4 trên 5

Git chỉ ra thủ phạm sau 4 lần kiểm

6b693ef is the first 'bad' commit
refactor: simplify discount check

- if total >= 100:
+ if total > 100:

Lệnh: git bisect run python3 test_cart.py. Hash trên máy bạn sẽ khác.

1

ký tự đổi: >= thành >

Tên commit nói “làm gọn”, nhưng nó đổi hành vi. Hãy tìm commit bằng phép thử, không bằng đọc tên.

Bước 5 trên 5

Bước 5: sửa và chặn lỗi quay lại

python3 test_cart.py
exit=0
total([(99.99, 1)]) 99.99
total([(100, 1)]) 90.0
total([(100.01, 1)]) 90.01

Kết quả thật sau khi đổi > thành >=. Kiểm cả các biên liền kề.

Để lại

Mỗi lỗi nên để lại một phép thử cho chính nó. Ở đây phép thử đã có, nên nếu ai làm hỏng lần nữa sẽ bị bắt.

Năm bước đưa bạn từ “chương trình sai” đến “một ký tự trong một commit”, có bằng chứng ở mỗi bước.

Trong công việc

Chỗ người mới hay vấp

1Sửa nhiều thứ cùng lúcMỗi lần đổi một thứ, chạy lại phép thử
2Tin giả thuyết đầu tiênĐoán trước kết quả, sẵn sàng bỏ giả thuyết
3Không lưu lại ca lỗiGhi lệnh, dữ liệu và thêm phép thử
4Sửa triệu chứng, không sửa gốcHỏi “vì sao” cho đến khi gặp nguyên nhân
5Phép thử không có ở commit cũĐể phép thử ngoài kho, hoặc chọn mốc tốt muộn hơn
Sau năm bước

Báo lỗi gọn cho AI

Lỗi: đơn tổng đúng 100 không được giảm.
Tái hiện: total([(100, 1)])
Mong đợi: 90.0 Thực tế: 100.0
Đã loại trừ: số dòng, giá món
Nghi ngờ: so sánh tại biên 100
Phạm vi: commit refactor: simplify discount check
Yêu cầu: giải thích nguyên nhân trước khi sửa

Với báo lỗi này, đáp án gần như hiển nhiên. Quan trọng hơn: bạn kiểm được câu trả lời bằng phép thử và giá trị biên đã có.

Nếu AI đề xuất sửa chỗ khác, bạn biết ngay là lệch.

Minh họa, không có thật

Minh họa: một buổi sáng, hai cách

Hỏi AI ngay
09:30 · Người dùngĐơn 100 đồng của tôi không được giảm.
09:40 · AgentThêm điều kiện đặc biệt cho tổng bằng 100 trong hàm total.
11:15 · DevBáo cáo cuối ngày vẫn sai, lại đi tìm.
Năm bước rồi mới hỏi
09:40 · DevThu nhỏ về total([(100, 1)]), thử ba giá trị biên.
09:50 · Agentgit bisect run chỉ ra commit đổi một ký tự.
10:00 · DevĐưa báo lỗi gọn cho AI, sửa tại gốc, gộp nhánh.
Thu nhỏ và đặt giả thuyết trước khi hỏi, để bạn kiểm được điều AI nói.
Danh sách kiểm

Tám câu hỏi trước khi hỏi AI

1Tôi có một lệnh làm lỗi xảy ra mỗi lần chưa?
2Ca lỗi đã nhỏ nhất chưa?
3Tôi đã đoán trước kết quả chưa?
4Kết quả khớp, hay tôi gượng ép cho khớp?
5Có commit tốt làm mốc chưa?
6Tôi đã ghi lại những gì đã loại trừ?
7Báo lỗi có mong đợi, thực tế nguyên văn?
8Tôi dùng gì để kiểm câu trả lời của AI?
Nhìn cân bằng

Nhìn cân bằng: được gì, chưa được gì

Làm được
  • Biến “sai” thành một chỗ cụ thể, có bằng chứng
  • Thu hẹp vùng nghi ngờ rất nhanh nhờ chia đôi
  • Báo lỗi gọn, kiểm được, và để lại phép thử
Chưa làm được
  • Cần phép thử cho kết quả giống nhau mỗi lần; lỗi phụ thuộc thời gian hay dữ liệu khó hơn
  • Chưa thấy nghiên cứu đối chứng đo năm bước này
  • Ví dụ chạy thật chỉ có một lỗi trong kho nhỏ
Kết luận

Giữ hiện trường, thu nhỏ, giả thuyết, chia đôi, kiểm lại.

Làm năm bước trước, rồi đưa AI một báo lỗi gọn. Bạn sẽ kiểm được điều nó nói. Thử bài tập với kho 20 commit: khoảng nửa giờ.