Vào tháng Tư năm 1944, ba vị lãnh đạo của phe trục, Hitler, Stalin và Tojo (chức vị của Mussolini đã bị thuyên giảm gần đây) đến quần đảo Canary để chứng kiến sự bắt đầu của “Chiến dịch Underbelly”, cuộc xâm lược Mexico. Họ hi vọng việc ở Mexico sẽ kết thúc nhanh và tiếp tục tiến vào vùng sản xuất lương thực của nước Mỹ.
Vào chính xác 8 giờ tối buổi lễ, ngay trên vùng trời của quần đảo Canary rực lên quang tuyến một cách dữ dội. Trong một phần giây cả vùng được bao trùm bởi ánh sáng như giữa trưa ban ngày. Tất cả những ai tình cờ nhìn thẳng lên đều bị lóa mắt như thể đang nhìn vào mặt trời. Không có âm thanh, không có sấm, đúng thế, sự im lặng đến rợn người. Khoảng một giây sau cú chớp, bầu trời chuyển sang ánh xanh lục tan dần vào quầng đỏ màu máu trải dài ở đường chân trời trong vài phút.
Ở khách sạn nơi ba vị lãnh đạo của phe Trục đang thưởng thức bữa ăn, xảy ra mất điện, và điện thoại cùng với radio mất liên lạc trong vài phút. Khi thông tin liên lạc quay trở lại các nhà lãnh đạo được biết rằng sự kiện tương tự cũng xảy ra ngay trên bầu trời Berlin, Tokyo và Moscow.
“Chết tiệt, ta làm hỏng bài unit test từ lúc nào vậy?” Tôi hơi xấu hổ về việc đã để cho bài kiểm thử thất bại. Tôi tự nhủ là phải chạy bài kiểm thử thường xuyên hơn.
Nụ cười đầy răng và thái độ thông cảm của Jasper tiếp tục làm gai người tôi: “Thử kiểm tra lỗi xem, Alphonse?”
Lỗi ghi là:
Tôi ấn vào lỗi và nó đưa tôi đến bài kiểm thử không đạt. (Tôi đã đánh dấu dòng không đạt bằng mũi tên.)
“À, được rồi.‘ Tôi nói. “Khi tao thay ID của tin nhắn, tao quên đổi trong bài kiểm thử. Cũng dễ sửa.‘ Rồi tôi thay đổi bài kiểm thử như sau.
Tôi chạy lại mấy bài unit test và tất cả đều đạt.
Nhưng Jasper không thích thế, và hắn nói như vậy: “Tao không thích thế Alphonse.”
“Sao không, Jasper? Nó chạy mà.”
“Chắc chắn là nó chạy, Alphonse, nhưng nếu id của tin nhắn lại thay đổi, thì bài kiểm thử sẽ lại không đạt.”
“Thế mày nghĩ ta nên làm gì với nó, Jasper?”
“Như này thì sao?” Và cứ thế, Jasper lấy bàn phím và đổi bài kiểm thử như sau:
Cái này không biên dịch được do trường id không public. Jasper đã đưa ra một thay đổi đơn giản và chạy mấy bài kiểm thử. Tất cả đều đạt.
Rồi Jasper đưa lại bàn phím cho tôi, bắt lấy ánh nhìn của tôi bằng đôi mắt lấp lánh của hắn, và nhanh chóng nhướn cả hai lông mày. Hắn ta rõ ràng nghĩ những thay đổi của hắn là thông minh. Tôi bắt đầu băn khoăn sẽ phải cần như nào mới có thể trở thành Du mục ở đây. Nếu dùng Jasper để nhận biết, tiêu chuẩn của ngài C chắc hẳn khá thấp.
Tôi nhìn lại màn hình và tập trung vào việc của tôi. “Được rồi, tao hiểu ý mày. Tốt hơn là không nên để hằng số ở trong mã nếu tránh được. Giờ, để xem tại sao mấy bài kiểm thử chấp thuận lại không đạt.”
“Tao cá lý do cũng tương tự.” Jasper châm biếm.
Chắc hắn đúng. Bài kiểm thử chấp thuận có lẽ cũng gọi thẳng đến id tin nhắn.
“Ừ.” Tôi nói, và mở bài kiểm thử chấp thuận không đạt đầu tiên.
“Thấy chưa!” Jasper rú lên. “Cùng một vấn đề.”
“Ừ, tao thấy rồi Jasper. Mày đúng. Cùng là một vấn đề.” Tôi thở dài và lắc đầu.
Jasper để ý thấy tâm trạng của tôi và thấy ngại. “Tao xin lỗi Alphonse, tao lại làm thế phải không.”
“Ừ, đại loại thế.” Tôi nói, không nhìn vào hắn.
“Được rồi, nghe này, tao sẽ tạo khoảng cách. Tao nghĩ là tao hơi dễ xúc động.”
Tôi khịt mũi, nhìn sang phía hắn với một nụ cười và nói: “Ừ, đại loại thế!”.
Hắn ta cười lại, vẫn hơi xấu hổ và cả hai chúng tôi nhìn vào đoạn mã.
“Được rồi, Jasper, tao nghĩ chúng ta cần phải sử dụng lại cách chữa của mày. Thay vì thay đổi chuỗi trong bảng kiểm thử, chúng ta phải xem nếu id trong tin nhắn giống với nội dung của biến id tĩnh trong lớp.”
“Ừ, tao đồng ý. Đây là thứ mà Jean chỉ cho tao vài tháng trước.” Và hắn lấy bàn phím rồi bắt đầu sửa các bảng kiểm thử.
“Được rồi, tao hiểu.” Tôi nói. “Ta chỉ xem nếu tin nhắn có đúng kiểu hay không. Chúng ta còn không đề cập đến định nghĩa của ID.”
“Đúng. Không cần thiết phải đề cập đến chi tiết như id tin nhắn, nhất là khi chúng dễ thay đổi.”
Jasper lưu lại trang và chạy bài kiểm thử. Dĩ nhiên nó hiện thông báo.
“Được rồi, giờ ta phải thêm phương thức SuitRegistrationApprovalRequest vào fixture.” Jasper nói.
“Để tao làm cho.” Và tôi lấy bàn phím để thay đổi vào fixture.
Tôi lưu lại và chạy bài kiểm thử, và nó đạt.
Trong một giây mắt Jasper lại lóe lên sự phấn khích như trước, nhưng hắn kiềm chế lại và chỉ nói: “Được rồi, tốt. Giờ phần còn lại của mấy bài kiểm thử chấp thuận thì sao?”
Chúng tôi tìm được một phần nữa không đạt với cùng lý do, và nhanh chóng sửa nó. Chỉ còn một bài kiểm thử không đạt nữa: RejectDuplicateRegistration.
“Tuyệt vời!” Tôi nói một cách vui mừng. “Đó là phần ta mới làm sáng nay. Phần này không đạt là đúng vì ta vẫn chưa hoàn tất để cho nó hoạt động được.”
“Được rồi.” Tôi nói. “Phần này không đạt vì Registrar không phát hiện ra được là bộ đồ #314159 đã được đăng ký. Ta có thể sửa nó dễ dàng thôi.”
“Cứ tự nhiên.” Jasper nói, vẫn hơi có phần bị kìm nén.
Tôi mở phần mã cho Registrar và tìm phương thức đang cần.
“Được rồi, nhìn xem, nó chỉ truyền yêu cầu sang cho bên sản xuất mà không kiểm tra.”
Rồi tôi sửa mã như sau:
Tôi nói trong khi gõ. “Được rồi, giờ ta phải viết phương thức IsSuitRegistered.”
Jasper cản tôi lại. “Không, Alphonse. Giờ ta phải viết unit test cho IsSuitRegistered.”
“Đúng! Tao tí quên.” Rồi tôi tìm phần unit test cần sửa để thay đổi, nhưng tôi không tìm được cái nào.
“Chà, có vẻ như ta viết mấy cái gateway mà không có unit test!” Tôi mở phần InMemorySuitGateway mà chúng tôi vẫn dùng.
Jasper nhìn mã và nói: “Được rồi, phần mã này khá đơn giản. Tao có thể hiểu sao lại không viết unit test, nhưng giờ là lúc để viết nó.” Và hắn lấy bàn phím bắt đầu viết.
Rồi, từng bước, hắn viết phần thực thi.
Tất cả các bài unit test đều đạt.
“Được rồi, giờ ta phải kết nối nó vào lớp SuitGateway”
Bọn tôi chạy unit test, tất cả đều đạt. Rồi chúng tôi chạy tiếp bài kiểm thử chấp thuận RejectDuplicateRegistration.
“Tuyệt!” Tôi nói. “Ô không đạt đầu tiên đã qua. Chỉ còn hai cái nữa.”
Jasper nhìn lên tôi và nói: “Tao cần phải nghỉ. Đi ngắm vầng sao một lúc đi.”
“Kế hoạch hay đấy.” Làm việc với Jasper đúng là mệt mỏi. Có lẽ hắn cảm thấy làm việc với tôi cũng mệt mỏi.