Tổng thống Henry Wallace tuyện thệ vào ngày 13 tháng Mười Một năm 1942. Wallace là một nhà khoa học có tầm nhìn. Trước khi nhận chức, ông đã từng mơ là sẽ lật đổ phát xít, tạo ra sự hòa bình công bằng và độc lập kéo dài trên toàn thế giới. Ông cảm thấy Trái Đất đang gần tiến tới “Thế Kỷ của Con Người Thông Thông Thường.”
Một người yếu hơn có thể sẽ từ bỏ hi vọng khi biết rằng “con người thông thường” có ít hơn hai mươi năm để sống. Nhưng Wallace không hề run sợ. Ông đã đọc báo cáo của hội nghiên cứu về việc sử dụng Năng Lượng Nguyên Tử để bật lại, ít nhất là tránh được, Clyde. Ông nhất quyết về việc tài nguyên của cả thế giới phải được quy về để xử lý vấn đề này, và ông nhất quyết dẫn đầu nước Mỹ để đạt được điều đó.
Chỉ có thứ duy nhất cản đường ông… Bán Cầu Phía Đông.
“Điều đầu tiên phải làm, Fonse thân mến của tao, là phải làm cho các bài kiểm thử này đạt. Mày có biết tại sao lại đang thất bại không?” nụ cười toàn răng của Jasper vừa thân thiện vừa tạo cảm giác gai người.
“Tao nghĩ vậy.” Tôi nói, cố không làm lộ vẻ rối bời. “Có vẻ như bài kiểm thử đầu tiên thay đổi cơ sở dữ liệu theo cách mà bài thứ hai không hề nghĩ tới.”
“Đúng rồi, anh bạn! Tao chắc chắn đó là lý do. Vậy ta cần phải xóa cơ sở dữ liệu giữa mỗi test case.”
Điều này hơi lạ với tôi, cảm giác như thêm việc. “Sao chúng ta không thay đổi bài kiểm thử thứ hai tiếp nhận những gì bài đầu tiên để lại? Như thế ta đâu phải dọn dẹp. Thậm chí còn tốt hơn, như thế tức là các bài kiểm thử có thể xây dựng dựa trên nhau. Mỗi bài lại giúp cho cơ sở dữ liệu sẵn sàng cho bài sau.” Tôi tự hào về bản thân vì đã nghĩ ra điều này.
Jasper lắc ngón tay qua lại trước mặt tôi. Mái tóc vàng dày dặn của hắn, cắt cụt ở phần tai, rung rung mỗi lần hắn lắc đầu. “Không đâu bạn già Fonse. Chúng ta không được làm các bài kiểm thử phụ thuộc vào nhau. Chúng ta muốn các bài kiểm thử có thể chạy được bất kỳ lúc nào. Ta đâu muốn phải chạy chúng theo thứ tự lần lượt.”
Trong đầu tôi có thể tưởng tượng được Avery đảo mắt với suy nghĩ này. Tôi kiềm chế không làm thế và chỉ hỏi: “Sao lại thế? Không phải dễ hơn nếu chạy nó lần lượt?”
“Có thể sẽ dễ hơn trong lúc này”, Jasper nói nhấn mạnh vào ba từ cuối, “Nhưng nó sẽ khó để phát hiện vấn đề sau này.” Jasper quàng tay qua vai tôi và tiếp tục bài giảng của hắn: “Nghĩ xem cái gì sẽ xảy ra, Fonse, nếu một trong những bài kiểm thử trong chuỗi không đạt? Tất cả những bài sau đó đều sẽ không đạt, phải không?”
Tôi bỏ tay hắn ra một cách lịch sự và nói: “Ừ, chắc rồi, nhưng thế thì sao? Vẫn biết bài nào không đạt.”
Một chút hối tiếc hiện lên trên mặt Jasper khi tôi bước cách khỏi hắn. “Đúng, nhưng mày sẽ không biết bài nào sau đó có thể đạt. Để biết được mày sẽ phải làm cho bài không đạt đầu tiên đạt. Nếu cái khác, sau đó, không đạt, mày sẽ phải sửa lại từng cái.”
Jasper im một lúc rồi nói: “Nó sẽ như kiểu biên dịch một chương trình C++. Mày đã làm thế bao giờ chưa?”
Tôi lắc đầu.
“Không sao. Mày có thể thấy là nó sẽ bất tiện. Sẽ tốt hơn nếu mỗi bài kiểm thử không đạt theo kiểu của nó, thay vì do bài trước nó không đạt. Thêm nữa, nó sẽ rất tiện nếu có thể chạy mỗi bài kiểm tra bất kỳ lúc nào. Nếu ta đặt nó trong một chuỗi, chúng ta sẽ không thể chạy các bài kiểm thử riêng biệt.”
Tôi thở dài. Nó nghe thực sự có lý. Tôi không hiểu sao tôi không thích nghe lý lẽ từ Jasper. Có lẽ vì khi hắn nói càng nhiều, nụ cười của hắn càng rộng ra, trông như đầu hắn bị chẻ làm đôi.
“Được rồi.” Tôi nói, “Vậy ta cần phải xóa trong cơ sở dữ liệu trước mỗi test case.”
Jasper nháy mắt và nói: “Giỏi lắm cu Fonse!”
Đúng là tra tấn. Tôi không biết tôi có thể bình tĩnh đến bao giờ. Tôi nhìn vào bàn phím và chạy tất cả các bài unit test một lần nữa. Unit test của hai tập tin: RegistarTest và UtilitiesTest không đạt. Tôi mở mỗi cái ra và xem lỗi. Gần như chắc chắn, mỗi test case không đạt đều sử dụng SuitGateway, phần trước của cơ sở dữ liệu. Tôi mở SuitGateway và thấy cái này:
Tôi tự nghĩ là có thể đã đến lúc làm theo phần todo. Tôi thay phần khởi tạo của biến instance thành null, và chạy lại tất cả unit test. Dĩ nhiên là tôi gặp phải nhiều lỗi null pointer exception, nhưng chỉ có trong RegistarTest và UtilitiesTest. Tôi mở RegistarTest và sửa nó như sau:
Chức năng setup được gọi trước mỗi lần kiểm thử, nên giờ mỗi chức năng kiểm thử sẽ chạy với một cơ sở dữ liệu trống. Tôi ấn nút và tất cả các unit test đều đạt, kể cả mấy cái trong UtilitiesTest!
“Lạ thật.” Tôi nói.
Jasper nhìn tôi cười như thể hắn mới nghe được câu chuyện hài. “Thôi nào, Fonse, dùng đầu đi anh bạn. Test case cuối trong RegistarTest chỉ để lại cơ sở dữ liệu trống.”
Tôi có thể cảm nhận được mặt tôi nóng bừng. Tôi hi vọng nó không quá lộ. Tôi hít thở sâu và nói: “Tao hiểu ý mày nói gì. Nhưng tao vẫn cần phải dọn dẹp cơ sở dữ liệu trong UtilitiesTest, để đảm bảo.”
“Ôi dĩ nhiên rồi Fonse! Tao đâu nói gì về cái đó!”
Nụ cười kiểu mèo Chesire của hắn lơ lửng trong đầu mỗi khi tôi nhắm mắt. Khi nó mờ dần tôi sửa UtilitiesTest một cách tương tự, và tất cả các bài kiểm thử tiếp tục đạt.
Jasper chọc nhẹ khuỷu tay vào sườn tôi và nói: “Thuận buồm xuôi gió quá thuyền trưởng, giờ sửa mấy bài kiểm thử thôi.”
Thứ gì đó lạnh lẽo bắt đầu xuất hiện trong tôi, áp chế cơn đỏ mặt bằng đá, hoặc có thể là thép. Tôi hít một hơi nữa thật sau, và nhận ra rằng đó là lần cuối cùng tôi có thể chịu đựng. Tôi chạy bài kiểm thử. Gần như chắc chắn tất cả đều không đạt do lỗi null pointer violation.
Phần fixture đầu tiên ở cả hai bài kiểm thử là DtrackContext. Phần fixture này được làm cho quá trình khởi tạo. Nên tôi thay đổi như sau.
Như này đảm bảo cả hai trang kiểm thử đều bắt đầu với một cơ sở dữ liệu rỗng. Tôi ấn nút, và thấy màu xanh; tất cả các bài kiểm thử đều đạt.
Không nhìn tôi cũng biết là nó sắp xảy ra. Tôi có thể cảm nhận được câu chúc mừng đầy tâm huyết trước khi nó rời mồm hắn. Tôi đợi nó xảy ra với nước đá ở trong mạch máu, biết rằng tôi phải làm gì.
Hắn vỗ đầu tôi. “Làm tốt lắm Fonse!”
Hắn vỗ đầu tôi! Tôi nhắm mắt. Tôi không chịu được nữa. Điều nãy sẽ không xảy ra nữa. Tôi thắt chặt bụng và các cơ xung quanh và quay về phía hắn.
“Jasper, tên tao là Alphonse. Làm ơn đừng có gọi là Fonse nữa. Và làm ơn đừng có quá đà như thế. Tao không thể làm việc nếu mày cứ coi tao như con thú nuôi. Tao biết mày có nhiều kinh nghiệm hơn, nhưng như thế không có nghĩa tao là thằng đần cấp dưới luôn cần phải âu yếm. Giờ, nếu mày cho phép, tao sẽ đi ra phòng vệ sinh.”
Có phải tôi vừa nói thế không? Có phải tôi vừa nói một cách bình tĩnh và rõ ràng không? Tôi có thể cảm nhận được trong lúc đi là nước đá đã rút đi và thay thế bằng nỗi sợ hãi và sự xấu hổ. Tôi đứng trong phòng vệ sinh và đợi cho hết run. Jean sẽ rất tức tôi. Bà ấy sẽ đưa tôi đến căn nhà gỗ. Nhưng tôi không thể tiếp tục như này. Tôi phải ngưng hắn lại.
Tôi đã làm như thế?