Lời mở
Nếu bạn vừa đọc xong Quyển Một, bây giờ bạn có một phản xạ mới. Gặp một hành vi khó hiểu, bạn không còn đọc lại code của mình lần thứ mười nữa. Bạn hỏi: ở đây có tầng trung gian nào mình đang quên không?
Cái phản xạ đó rất tốt. Nó sẽ cứu bạn nhiều lần.
Và nó có một điểm mù mà bạn chưa nhìn thấy, vì nó là điểm mù của chính cái tư thế bạn đang đứng: đó là câu hỏi của một người đang ngồi một mình trước màn hình.
Nó đi tìm cái tầng đứng chen vào giữa bạn và vật. Nó rất giỏi việc đó. Nhưng nó bất lực hoàn toàn trước một loại bug khác: loại mà bạn soi code cả tuần không thấy gì sai, vì thật sự không có gì sai; loại mà bạn chạy thử một nghìn lần trên máy mình đều đúng, rồi lên production thì hỏng; loại mà mỗi lần bạn thêm một dòng log để bắt nó thì nó biến mất, và bạn bắt đầu nghi ngờ trí nhớ của chính mình.
Giả định bị phá ở quyển này là giả định mà mọi bài test bạn từng viết đều ngầm chứa:
Code chạy đúng thì hệ thống chạy đúng.
Không phải. Code của bạn chạy đúng khi chỉ có một mình bạn.
Trên máy bạn, bạn bấm một lần. Trên production, một nghìn người bấm cùng một giây. Và cái tầng trung gian mà Quyển Một dạy bạn nhìn ra - cái bean ấy, cái kết nối ấy, cái luồng đang chạy code của bạn ấy - bạn không sở hữu nó. Bạn đang chia nó với những người bạn không nhìn thấy.
Tám bài trong quyển này nói về những người ấy. Họ không phải kẻ xấu; họ chỉ đang làm đúng việc của họ, cùng lúc bạn làm việc của bạn, trên cùng một thứ. Không ai sai. Và đó là điều làm loại bug này khó chịu hơn mọi thứ trong Quyển Một: không có dòng code nào để sửa, vì bug không sống trong dòng code nào cả.
Có một chuyện phải nói trước, vì nó sẽ thay đổi cách bạn đọc quyển này. Trong Quyển Một, mình bảo bạn đặt breakpoint và nhìn. Ở đây, cách đó không dùng được - breakpoint làm thời gian đứng lại, mà thời gian đứng lại thì người thứ hai không bao giờ tới. Nên trong quyển này, mỗi bài sẽ bắt bạn làm một việc khác hẳn: tự dựng lấy người thứ hai, tự bắt hai người giẫm lên nhau ngay trên máy bạn, để nhìn tận mắt một con bug mà cả đội bạn đã đổ cho “chập chờn hạ tầng” suốt sáu tháng.
Đọc thì bạn tin được một nửa. Tự tay bật nó lên rồi tắt nó đi, bạn mới tin cả.
Đọc theo thứ tự. Bốn khuôn mặt đi từ trạng thái dùng chung, qua khe thời gian, tới hàng đợi có sức chứa hữu hạn và cuối cùng là tài nguyên được tái dùng nhưng chưa được dọn sạch. Finale gom cả bốn vào một thao tác tưởng như vô hại: người dùng bấm nút hai lần.
Bắt đầu bằng một cái field trong @Service - thứ mà ai cũng từng thêm vào cho tiện.