Agent làm xong một việc dài. Kết quả rõ ràng sai — con số không khớp, định dạng lệch, một thứ đáng lẽ có mà không có. Nhưng không có dòng lỗi nào. Không có gì đỏ lên chỉ chỗ. Bạn cuộn lên đầu, bắt đầu đọc lại sáu trăm dòng nó vừa làm, dòng một, dòng hai… và tới dòng hai trăm bạn vẫn chưa thấy gì sai. Mỗi bước, đọc riêng ra, đều có vẻ đúng.
Đó là vì bạn đang tìm sai chỗ. Cái sai không nằm ở nơi nó lộ ra. Nó nằm ở nơi nó bắt đầu — và hai nơi đó thường cách nhau rất xa.
01Lỗi chảy xuôi, nên đọc xuôi luôn đuổi theo cái bóng
Hãy hình dung công của agent như một dòng nước. Một giả định lệch ở thượng nguồn — nó hiểu sai một chữ trong yêu cầu, lấy nhầm một cột dữ liệu, đoán sai một định dạng — không gây lỗi ngay tại đó. Cái lệch đó trôi xuôi: mọi bước sau nó đều làm việc chăm chỉ và đúng đắn, chỉ là trên một tiền đề đã sai. Tới tận output cuối, cái lệch tích lại đủ lớn để bạn thấy. Nhưng tới lúc đó nó đã đi xa nơi nó sinh ra rất nhiều.
Đó là lý do đọc xuôi từ đầu là một cái bẫy thời gian. Bạn rà qua hàng loạt bước đúng — đúng so với tiền đề sai của chúng — và chúng trông đúng, vì chúng đúng thật. Bạn đang lội ngược dòng bằng cách bơi xuôi. Mỗi dòng đọc qua tốn công mà gần như không loại được gì, vì cái sai không phô ra ở bề mặt từng bước; nó nấp trong cái giao kèo giữa các bước.
✕ Đọc xuôi toàn bộ
✓ Chia đôi vùng nghi
Khác biệt không phải chăm hơn hay lười hơn — là tuyến tính so với chia-đôi. Đọc xuôi sáu trăm dòng tốn công bằng sáu trăm; chia đôi liên tục thì khoảng mười câu hỏi là chạm đáy. Cùng một cái lỗi, hai cái giá rất khác.
02Bisect: chia đôi, hỏi xác nhận, loại nửa, lặp
Kỹ thuật mượn thẳng từ cách tìm một cuốn sách trong từ điển: bạn không lật từng trang, bạn mở giữa rồi quyết định nửa trước hay nửa sau. Áp vào việc truy lỗi agent, nó thành ba nhịp lặp lại:
Nhịp 2 — Hỏi một câu xác nhận: "Ở bước này, giá trị X đang là bao nhiêu?" hoặc "Cho tôi xem đầu vào bạn dùng cho bước đó." Một dữ kiện kiểm được, không phải lời kể.
Nhịp 3 — Loại nửa rồi lặp: nếu điểm giữa còn đúng, lỗi ở nửa sau; nếu đã sai, lỗi ở nửa trước. Chia tiếp nửa còn lại.
Sức mạnh nằm ở nhịp hai: câu hỏi phải đòi một dữ kiện kiểm được, không phải một lời tự đánh giá. "Bước đó ổn không?" thì agent lại diễn cho bạn nghe — hỏi "giá trị cụ thể là gì" thì nó phải lộ ra cái thật.
Bốn vùng nghi ở nhịp một là cái khung tiện để chia: phần lớn lỗi nằm ở chỗ agent hiểu sai bạn muốn gì, hoặc lấy sai cái đầu vào — hai nguồn này thường ở thượng nguồn và bị bỏ qua nhiều nhất, vì ta hay mặc định "chắc nó hiểu đúng rồi" và lao xuống soi logic. Chia đôi buộc bạn kiểm cả cái mặc định đó, sớm, thay vì để nó là điểm mù.
03Tìm đúng điểm hỏng đáng hơn vá đúng triệu chứng
Có một cái lợi thứ hai, sâu hơn cả tốc độ. Khi đọc xuôi và mệt, người ta hay đầu hàng kiểu khác: thấy output sai thì vá ngay tại output — ép con số về đúng, chỉnh định dạng cho khớp. Cái lệch thượng nguồn vẫn còn nguyên; bạn chỉ dán băng lên chỗ máu chảy ra, không phải chỗ bị thương. Lần sau đầu vào hơi khác, nó lại chảy ra một kiểu khác, và bạn vá lại từ đầu.
Bisect không chỉ nhanh — nó dẫn bạn tới điểm hỏng thật, nơi đáng sửa. Sửa ở đó thì cả dòng nước phía dưới tự trong lại, một lần. Đó là khác biệt giữa dọn hậu quả và chữa nguyên nhân.
Nên lần tới output sai mà không có lỗi chỉ chỗ, đừng cuộn lên đầu và đọc. Hỏi một câu ở khúc giữa. Cái sai im lặng nhất vẫn để lại một dấu vết ở đúng cái bước nó sinh ra — bạn chỉ cần chia đôi đường đi đủ vài lần để dồn nó vào góc.