Tháng Năm, 1944. Henry Wallace có một cái chặn giấy làm từ đồng thau hình quả địa cầu. Ông để nó trên bàn trong phòng Bầu Dục. Được chạm nổi ở đáy là chữ: “29 Apr, 1959, 0943 GMT”. “Mười lăm năm.” Ông lẩm bẩm. “Mười lăm năm.” Ông tự hỏi sao mình có thể cứu lấy một thế giới đã quá quyết tâm tự hủy diệt chính nó. Ông nghĩ ông có hai lựa chọn tồi tệ: kết bè phái hoặc thống trị. Cái đầu tiên có vẻ không khả thi nếu xét đến sự thù địch của các nhà lãnh đạo phe Trục; họ muốn thống trị nước Mỹ, không phải kết bè với ta. Lựa chọn thứ hai khả thi, nhưng có cảm giác khó chịu. Ông có thể, thậm chí, thống trị cả thế giới, và ông có thể làm một cách nhanh chóng. Nhưng liệu ông có thể thống trị nó trong mười lăm năm quan trọng sau đó? Có vẻ là không.
Có một điều là chắc chắn. Lựa chọn thứ hai sẽ không kéo dài được lâu. Do đã thấy sự khả thi của bom hạt nhân; Hitler, Stalin và Tojo chắc hẳn sẽ đẩy các nhà khoa học còn lại đến ngưỡng của họ.
Vừa lúc bọn tôi chuẩn bị bắt đầu test case tiếp theo, Jasper bước đến với với nụ cười thảm hại trên mặt.
“Này Jerry! Cho tao nhờ một chút được không?”
Jerry nhìn lên Jasper, sắc mặt không thay đổi và nói: “Được, Jasper. Alphonse, tao sẽ quay lại sau mấy phút.” Jerry đứng dậy và đi cùng Jasper như thể không có gì khác thường, nhưng rồi hắn nhanh chóng quay lại, đảo mắt và nháy với tôi.
Tôi nở một nụ cười về phía họ và nói: “Được rồi, sớm gặp lại nhé. Tôi sẽ qua xem Avery đang làm gì.”
Tôi lượn sang chỗ Avery ngồi và nói: “Chào.”
Avery nhìn lên nhăn mặt tuyệt vọng. “Sao mày lại để tao với thằng đần đó?”
“Hắn đâu có đần. Thật ra hắn khá thông minh. Nhưng hắn cũng hơi gợi đòn.”
“Hơi gợi đòn? Nếu nó cười tao một lần nữa tao sẽ nhét cả cái bàn phím vào mồm nó. Mà nó cũng vừa luôn.”
Cả hai bọn tôi cười, vừa đủ để không ai có thể nghe thấy tiếng bọn tôi. Rồi Avery nói: “Này, mày đã xem chức năng mới trong Java 5 chưa.”
“Rồi, ý mày là autoboxing, scanners, generics và mấy thứ kiểu thế?”
“Ừ, mày đã thử cái nào chưa?”
“Đến giờ vẫn chưa, thực ra ta cũng có thể dùng generics ngày hôm qua lúc viết cơ sở dữ liệu bản mock. Tao không nghĩ đến nó lúc đấy.”
Mắt Avery lấp lánh. “Thế sao? Cho tao xem!”
Nghe có vẻ vui. Rồi tôi ngồi cạnh hắn và mở InMemorySuitDatabase.
Bọn tôi nhìn một lúc và Avery nói: “Ừ, ta có thể thay đổi cái HashMap quá dễ.” Hắn lấy bàn phím và sửa như sau:
Các bài kiểm thử vẫn chạy.
“Hay!” Tôi nói. Giờ ta có thể dùng autoboxing trong phương thức add! Rồi tôi lấy bàn phím và làm như này:
Các bài kiểm thử vẫn chạy!
“Quá hay! Như này gọn hơn trước nhiều!” Tôi nói.
“Ừ! Và giờ ta có thể bỏ được cái hàm ép kiểu xấu xí trong getArrayOfSuits.” Avery lấy bàn phím và xóa phần ép kiểu.
Bài kiểm thử vẫn chạy ổn.
“Tuyệt!” Tôi nói. Hơi chán vì bọn tôi không còn gì khác để dọn với generics. Nó khá vui!
“Chà…” Avery nói. ”Mày đã nghĩ đến việc là sẽ có hơn một kiểu của Suit?”
“Gì cơ? Ý mày như kiểu là hậu sinh của Suit?”
“Ừ. Hình dung xem mày có hai phần hậu sinh như là MensSuit và WomensSuit.”
“Ý mày là như này?” Và tôi lấy bàn phím để gõ hai lớp vào trong một tập rác.
Avery nhìn tôi gõ, và rồi nói: “Ừ. Giờ tạo một lớp có hai danh sách. Một danh sách của MensSuit và danh sách còn lại của WomensSuit.”
“Được rồi.” Tôi nói, và gõ đoạn sau:
“Ấn tượng đấy, Alphonse! Mày dùng cú pháp vòng lặp mới rất chuẩn.”
Tôi nhớ màn đối đáp lịch sự này. Đôi khi làm việc với Avery rất vui. Đặc biệt là sau khi đã làm với Jasper. “Đúng rồi đấy, Avery, khả năng quan sát rất tốt!”
“Quan sát tốt nhưng không hơn được độ sáng tạo tốt; nhưng tiếp tục chứ?”
“Đúng, hãy thế.”
“Thế thì, có lẽ là giờ ta sẽ tạo phương thức kiểm tra mấy đối tượng WomensSuit?”
“Tao nghĩ là tao có thể viết được phương thức đấy. Viết nhé?”
“Làm ơn cứ viết.”
Và rồi tôi gõ phần sau:
“Này!” Tôi nói, quên mất màn đối đáp lịch sự trong lúc đó. “Không biên dịch được!‘
“Đúng là, nó không được!” Avery trêu. Hắn vẫn bình tĩnh giữ lịch sự.
“Nhưng tao không hiểu, nó phải biên dịch được chứ!”
“Không, Alphonse, nếu nhìn kỹ mày sẽ thấy ta đang truyền List<WomensSuit> vào một đối số nhận vào List<Suit>.”
“Đúng, nhưng mà List<WomensSuit> là một List<Suit>!”
“Có cần cân nhắc câu đó không Alphonse?”
“À…‘ Tôi nghĩ một lúc và nhận ra nó không đúng lắm. “Được rồi, thực ra mày nói đúng, List<WomensSuit> không phải là hậu sinh của List<Suit>, nhưng một danh sách đồ bảo hộ cho phụ nữ vẫn là danh sách đồ bảo hộ.”
“Không hề! Mày có thể thêm một thực thể kiểu MensSuit vào List<Suit>, nhưng mày không thể cho MensSuit vào List<WomensSuit>.”
“Ừ, thế là đúng, thì sao?”
“Rồi, Alphonse thân mến, một List<WomensSuit> không thể thay thế cho List<Suit>, do đó không phải là kiểu con của List<Suit>. Mày dĩ nhiên là biết Nguyên Lý Thay Thế Liskov, phải không?”
Đó là lúc tôi hiểu ra. “Dĩ nhiên, dĩ nhiên! Thay thế là nền tảng của thiết lập tập con. Do đó một danh sách các hậu sinh không giống với hậu sinh của danh sách bản gốc.”
“Chính xác Alphonse!”
“Đúng. Chính xác! Nhưng nó lại tạo cho ta vấn đề, đúng không Avery thân mến?”
“Đúng là như thế! Nếu một danh sách hậu sinh không thay thế được cho một danh sách lớp tiền sinh, thì cái gì được?”
“Và liệu có đáp án cho câu đố này?” Tôi hỏi.
“Chắc chắn là có rồi. Tao minh họa nhé?”
“Làm ơn cứ việc!”
Rồi Avery lấy bàn phím và thay đổi như sau:
Tôi nhìn phần cú pháp kỳ lạ mà Avery viết. “Giờ đó đúng là cú pháp lạ; nhưng tôi nghĩ tôi hiểu mục đích. Dấu hỏi cho thấy là kiểu chưa được khai báo, và phần còn lại của câu lệnh cho trình biên dịch biết kiểu chưa được khai báo kia là hậu sinh của Suit.”
“Chuẩn rồi, chuẩn rồi. Hiểu đúng rồi Alphonse. Để ý luôn là cả chương trình giờ đã biên dịch được.‘
“Ừ, tao thấy rồi. Thú vị thật! Mấy chức năng mới có tiềm năng và khả năng biểu đạt tuyệt vời.”
“Ừ, và nó cũng vui nữa!” Avery nói, chuyển chế độ.
Tôi chọc vào sườn hắn, và hắn đập vào đầu tôi với quyển sách trên bàn.
“Thôi, thôi mấy cậu, đừng có phá cái gì.‘ Đó là Jean. Bà chắc ghé qua để xem bọn tôi đang làm gì. “Trời ơi! Mấy đứa có nhiều năng lượng thật.” Bà nhìn vào màn hình và thốt lên: “À! Mấy cậu đang chơi với cú pháp kỳ dị mới cho generics”. Theo tôi thì nó cùng hơi liên quan, phải không. Quá nhiều cú pháp chỉ để làm thứ nhỏ nhặt. Tôi e rằng luật sư ngôn ngữ đang dẫn ta sâu vào sự rắc rối không cần thiết. Cũng tiếc. Nhưng tôi nghĩ giới trẻ các cậu thích chơi với sự phức tạp, đúng không. Thế thì, tiếp tục, tiếp tục đi. Mấy cậu trai trẻ tuyệt lắm.”
Jean khệnh khạng bước đi, trong khi Avery và tôi cố nhịn cười.