Go 1.27 mở rộng generics: Tin vui cho lập trình viên, thách thức cho AI
Phiên bản Go 1.27 vừa được phát hành mang đến những cải tiến đáng kể cho generics, cho phép hỗ trợ methods và giảm bớt sự trùng lặp mã nguồn. Tuy nhiên, sự phức tạp gia tăng này đặt ra câu hỏi về khả năng đọc hiểu mã nguồn, vốn là điểm mạnh cốt lõi của Go, đặc biệt trong bối cảnh AI ngày càng tham gia sâu vào quá trình viết code.

Ngôn ngữ lập trình Go vừa chính thức phát hành phiên bản v1.27 với một bước tiến lớn dành cho generics, hứa hẹn giúp các lập trình viên tiết kiệm đáng kể thời gian viết mã. Tuy nhiên, điều này cũng làm dấy lên lo ngại về việc ngôn ngữ vốn nổi tiếng với sự đơn giản này có đang trở nên quá phức tạp, gây khó khăn cho cả con người lẫn các tác nhân AI trong việc đọc hiểu code.
Generics mở rộng cho methods: Một cuộc cách mạng nhỏ
Về cơ bản, generics cho phép lập trình viên viết logic với kiểu dữ liệu được coi như biến, loại bỏ nhu cầu phải viết lại (hoặc copy-paste) một phương thức riêng cho từng kiểu dữ liệu khác nhau (int, string, float...). Được giới thiệu từ phiên bản 1.18 vào năm 2022, generics trong Go ban đầu chỉ hỗ trợ cho functions và custom data types. Giờ đây, v1.27 mở rộng generics để hỗ trợ cả methods — về cơ bản là các hàm gắn với một kiểu dữ liệu cụ thể.
Theo các nhà phát triển, điều này sẽ giúp tiết kiệm rất nhiều thao tác gõ phím. Ví dụ, bộ sinh số ngẫu nhiên chuẩn của Go (standard random number generator) có thể tạo ra số nguyên 32-bit (int32), 64-bit (int64) hoặc bất kỳ kích thước nào mà CPU yêu cầu (int). Trước đây, lập trình viên phải viết một method riêng cho từng kiểu số họ muốn sử dụng.
Ngoài ra, v1.27 còn mang đến những cải tiến đáng chú ý khác:
- Làm việc với structs dễ dàng hơn: Lập trình viên có thể đặt giá trị cho các trường (fields) lồng nhau hoặc nhúng (embedded) trực tiếp mà không cần chỉ định tất cả các bước trung gian. Điều này giúp tiết kiệm thời gian khi xử lý các struct lồng nhau sâu.
- Suy luận kiểu dữ liệu thông minh hơn: Go giờ đây có thể suy luận kiểu dữ liệu từ các hàm mà không cần lập trình viên khai báo tường minh, chẳng hạn khi một generic function được truyền vào slice literal, channel send hoặc type conversion.
"Tiết kiệm một cú gõ, làm rối một bộ não"?
Go được tạo ra bởi các kỹ sư Google Rob Pike, Robert Griesemer và Ken Thompson vào năm 2009, với triết lý ưu tiên khả năng đọc hiểu (readability) hơn khả năng viết nhanh (writability). Các nhà thiết kế đã nhận ra rằng "các lập trình viên dành nhiều thời gian đọc mã nguồn hiện có hơn là gõ ra chúng", theo lời của Cameron Balahan (Google Group Product Manager) và Richard Seroter (Google Cloud Chief Evangelist).
Chính vì vậy, việc bổ sung generics và các tính năng rút gọn khác trong v1.27 đang gây ra nhiều tranh luận. Một mặt, chúng là "cứu cánh" cho những lập trình viên mệt mỏi với việc phải gõ đi gõ lại những đoạn code giống hệt nhau. Mặt khác, những lối tắt này khiến mã trên màn hình trở nên trừu tượng hơn, tạo thêm gánh nặng về mặt tinh thần.
Generics sẽ "làm cho mọi code base trở nên hoàn toàn khác biệt. Bạn sẽ nhảy vào một code base và không biết chúng hoạt động như thế nào. Bạn sẽ phải vượt qua các lớp trừu tượng và những cách diễn đạt mới, giống như mọi ngôn ngữ khác, nhưng lại thiếu đi sự tiện lợi."
Nhận định này được đưa ra bởi ThePrimeagen (Michael Paulson), một nhà bình luận công nghệ nổi tiếng trên YouTube và cựu kỹ sư Netflix. Anh cho rằng giá trị của Go nằm ở sự đơn giản, và việc áp dụng các cấu trúc cấp cao hơn sẽ khiến nó trở thành bản sao của C++ hay Rust. Quan điểm này cũng được Aliaksandr Valialkin, nhà sáng lập VictoriaMetrics, đồng tình: "Generics không thực sự cần thiết trong hầu hết các code Go thực tế", và chúng khiến việc "hiểu điều gì đang xảy ra chỉ bằng cách đọc code trở nên khó khăn hơn".
Và câu chuyện với AI
Khả năng đọc hiểu dễ dàng của Go không chỉ là sở thích cá nhân; nó trở nên quan trọng hơn bao giờ hết trong kỷ nguyên AI. Khi mã nguồn được tạo ra bởi AI, "nút thắt chính của kỹ thuật phần mềm chuyển hoàn toàn từ tốc độ viết sang sự nghiêm ngặt trong việc đánh giá, xác minh và bảo trì", theo các chuyên gia Google.
Các câu hỏi đặt ra là: Liệu những phép thuật cú pháp (syntactic magic) như generics có thực sự hữu ích khi các tác nhân AI có thể viết một method riêng cho từng kiểu dữ liệu chỉ trong vài giây mà vẫn dễ dàng gỡ lỗi hơn? Hay việc học generics sẽ tạo thêm gánh nặng nhận thức (cognitive overhead) cho AI, dẫn đến tình trạng "context rot" khi xử lý các tác vụ phức tạp?
Đây là một câu hỏi không chỉ dành riêng cho đội ngũ duy trì Go, mà là thách thức chung cho tất cả các ngôn ngữ lập trình trong bối cảnh AI đang ngày càng tham gia sâu vào quá trình phát triển phần mềm. Liệu các ngôn ngữ sẽ tiếp tục phát triển để phục vụ con người, hay sẽ phải thích nghi để trở nên "thân thiện" hơn với các tác nhân AI? Thời gian sẽ trả lời.