10 quy ước Go mà một kỹ sư AI chỉ thấm sau khi đã muộn
Một kỹ sư AI chia sẻ những quy ước viết Go mà anh chỉ thực sự hiểu sau khi đã va vấp trong dự án thực tế. Bài viết tổng hợp các nguyên tắc then chốt giúp mã nguồn Go dễ đọc, dễ bảo trì và ít lỗi hơn — đặc biệt hữu ích với người chuyển từ Python hay các ngôn ngữ khác sang.
10 quy ước Go mà một kỹ sư AI chỉ thấm sau khi đã muộn
Với những người làm AI quen với Python, việc chuyển sang Go thường bắt đầu bằng cảm giác nhẹ nhõm: cú pháp gọn, biên dịch nhanh, triển khai đơn giản. Nhưng chính sự đơn giản đó lại khiến nhiều người bỏ qua những quy ước ngầm của cộng đồng Go — và chỉ nhận ra tầm quan trọng của chúng khi mã nguồn đã phình to, đội nhóm đã đông và việc bảo trì trở thành cơn ác mộng.
Bài viết tổng hợp trên blog cá nhân của một kỹ sư AI đang được bàn luận trên Hacker News đã đúc kết 10 quy ước như vậy. Dưới đây là những điểm đáng chú ý nhất, được nhìn từ góc độ của người làm kỹ thuật phần mềm.
Vì sao dân AI dễ "vấp" với Go?
Người làm AI thường mang theo tư duy từ Python: linh hoạt, ít ràng buộc, ưu tiên tốc độ thử nghiệm. Go thì ngược lại — nó thưởng cho sự nhất quán và trừng phạt sự tùy tiện.
Go không cấm bạn viết mã lộn xộn. Nó chỉ khiến bạn phải trả giá rất đắt khi dự án lớn dần.
Đây chính là lý do nhiều kỹ sư chỉ "ngộ" ra các quy ước sau khi đã viết hàng nghìn dòng code khó đọc.
Những quy ước đáng nhớ nhất
1. Đặt tên ngắn gọn, nhưng có chủ đích
Trong Go, tên biến ngắn là chuyện bình thường — i, r, ctx, err. Nhưng ngắn không có nghĩa là tùy tiện. Quy ước là: phạm vi càng hẹp thì tên càng ngắn, phạm vi càng rộng thì tên càng rõ nghĩa. Một biến đếm trong vòng lặp ba dòng không cần tên dài dòng, nhưng một trường trong struct công khai thì phải tự giải thích.
2. Xử lý lỗi ngay tại chỗ, không ném lên trên
Go không có exception. Cách làm chuẩn là kiểm tra err ngay sau mỗi lời gọi và trả về sớm nếu có lỗi. Mô hình "happy path" thẳng hàng, không lồng sâu — vừa dễ đọc vừa dễ debug. Đây là điều dân Python thường làm sai khi mới chuyển sang, vì quen với try/except bao quanh cả khối lệnh.
3. Interface nhỏ là interface tốt
Thay vì định nghĩa interface với hàng chục phương thức, cộng đồng Go khuyến khích interface một hoặc hai phương thức. Cách này giúp việc giả lập (mock) trong kiểm thử trở nên đơn giản và giảm sự phụ thuộc chéo giữa các gói.
4. Tránh package util và common
Đây là cái bẫy kinh điển: gom mọi thứ "dùng chung" vào một package tên util. Vài tháng sau, package đó trở thành bãi rác không ai dám xóa. Quy ước là đặt tên package theo chức năng thực sự của nó.
5. Truyền context.Context ở tham số đầu tiên
Với các hàm liên quan đến I/O, mạng hay tác vụ dài, context nên là tham số đầu tiên và không được lưu vào struct. Điều này giúp kiểm soát timeout và hủy tác vụ một cách nhất quán — cực kỳ quan trọng với các dịch vụ suy luận AI chạy lâu.
6. Khởi tạo rõ ràng, tránh init() ngầm
Hàm init() chạy tự động và rất khó lần theo. Cộng đồng Go khuyên dùng hàm khởi tạo tường minh để luồng thực thi của chương trình dễ đoán hơn.
7. Đừng lạm dụng goroutine
Goroutine rẻ, nhưng không miễn phí. Quy ước là luôn có cơ chế kiểm soát số lượng, có kênh tín hiệu kết thúc và có cách xử lý khi một goroutine panic. Bỏ qua điều này là con đường ngắn nhất dẫn đến rò rỉ bộ nhớ.
8. Viết kiểm thử theo bảng
Mẫu table-driven test là chuẩn mực gần như bắt buộc trong Go. Nó giúp thêm ca kiểm thử mới chỉ với vài dòng, đồng thời giữ cho mã kiểm thử gọn gàng và nhất quán.
9. Dùng gofmt và tuân thủ lint
Không tranh cãi về định dạng: gofmt là chuẩn chung, và các công cụ như golangci-lint giúp bắt lỗi sớm. Việc thống nhất công cụ trong toàn đội giúp review code tập trung vào logic thay vì khoảng trắng.
10. Thiết kế API công khai thật kỹ
Mọi thứ viết hoa trong Go đều là API công khai. Một khi đã phát hành, việc thay đổi sẽ gây ảnh hưởng lớn. Quy ước là giữ bề mặt công khai nhỏ nhất có thể và cân nhắc kỹ trước khi xuất ra ngoài.
Góc nhìn cho lập trình viên Việt Nam
Với các đội ngũ Việt Nam đang xây dựng backend cho sản phẩm AI — từ dịch vụ suy luận, hàng đợi xử lý đến API gateway — Go đang là lựa chọn phổ biến nhờ hiệu năng và khả năng triển khai gọn nhẹ trên các nền tảng cloud.
Việc nắm sớm những quy ước trên không chỉ giúp mã nguồn dễ bảo trì mà còn giảm đáng kể chi phí vận hành, đặc biệt khi đội ngũ luân chuyển nhân sự hoặc mở rộng quy mô.
Bài học lớn nhất: trong Go, sự nhất quán quan trọng hơn sự thông minh.
Nếu bạn đang chuyển từ Python sang Go cho các dự án AI, hãy dành thời gian đọc kỹ các quy ước cộng đồng trước khi viết những dòng code đầu tiên — thay vì học lại chúng sau khi đã quá muộn, như tác giả bài viết gốc.

