- Tính đơn giản của ngôn ngữ Go và đặc tính biên dịch giúp nâng cao độ ổn định của mã do AI agent tạo ra và hiệu quả thực thi
- Nhờ kiểu tĩnh và tốc độ biên dịch nhanh, agent có thể nhanh chóng kiểm tra lỗi mã và thực hiện các vòng lặp lặp lại một cách hiệu quả
- Các công cụ được chuẩn hóa ở cấp độ ngôn ngữ (
gofmt, kiểm thử, build) giúp agent tạo mã nhất quán
- Việc build binary đa nền tảng được hỗ trợ mặc định, cho phép agent chạy nền phân tán xác minh và thực thi cùng một mã trên nhiều hệ điều hành khác nhau
- Nhờ những đặc điểm này, Go được đánh giá là ngôn ngữ cân bằng giữa năng suất, tính đơn giản và hiệu năng, và đang nổi lên như một lựa chọn hàng đầu cho phát triển dựa trên AI agent
Lợi ích khi Go là ngôn ngữ biên dịch
- Agent tạo ra lượng lớn mã, nhưng phần lớn chỉ ở mức “trông có vẻ hợp lý”, nên việc xác minh xem mã có thực sự hoạt động hay không là thách thức cốt lõi
- Khi dùng ngôn ngữ biên dịch, hệ thống kiểu mạnh và kiểu tĩnh có thể loại bỏ một số nhóm lỗi như sai kiểu hoặc dùng sai đối số ngay tại thời điểm biên dịch
- Nếu biên dịch thành công, bạn có được sự đảm bảo rằng đó là mã đúng cú pháp trong phạm vi tiêu chuẩn của ngôn ngữ
- So với Rust, lý do Go phù hợp với agent hơn:
- Cú pháp và khái niệm của Go đơn giản hơn Rust
- Hệ thống kiểu của Go kém tinh vi hơn Rust, nên mã được tạo ra gần với cách viết thành ngữ hơn và con người dễ hiểu hơn
- Tốc độ biên dịch của Go nhanh hơn Rust, giúp rút ngắn vòng phản hồi của agent
- Mã Go xuất hiện nhiều hơn trong dữ liệu huấn luyện so với Rust, nên mô hình tạo mã Go tốt hơn
Tính đơn giản của Go
- Nếu đã quen với bất kỳ ngôn ngữ lập trình nào, bạn có thể đọc mã Go và nắm được cách nó hoạt động ngay lập tức, vì bản thân ngôn ngữ rất đơn giản
- Ngay cả khi agent tạo ra lượng lớn mã Go, lập trình viên cũng không gặp quá nhiều khó khăn để theo dõi mã
- Khi agent đôi lúc đưa ra những quyết định thiết kế kỳ lạ và tiếp tục đi theo hướng đó, sự đơn giản của ngôn ngữ giúp dễ dàng nhận ra agent đang đi tới đâu
- Sau 12 tháng, có thể việc trực tiếp đọc mã sẽ giảm đi nên tầm quan trọng của khả năng đọc và tính đơn giản cũng giảm theo, nhưng việc vẫn có thể tự kiểm tra mã khi cần vẫn là một lựa chọn có giá trị
Cách làm được chuẩn hóa của Go
- Go là một ngôn ngữ có tính định hướng rõ ràng (opinionated), với hướng dẫn và công cụ rõ ràng, có các cách chuẩn để chạy kiểm thử, định dạng mã và build binary
- Cách xử lý lỗi cũng gây tranh cãi với nhiều người, nhưng nó cung cấp một mẫu hình đã được thiết lập, giúp nhiều người và agent cùng làm việc dễ dàng hơn và khuyến khích viết mã thành ngữ
- So với JavaScript: mỗi dự án JS dùng công cụ khác nhau, và quan điểm về định dạng mã, phát hành package hay cách import thư viện bị phân tán, khiến nó kém hiệu quả với agent
- Nhờ tính chuẩn hóa của Go, mô hình có thể nhất quán tạo ra mã Go thành ngữ dựa trên dữ liệu huấn luyện
- Nếu yêu cầu agent định dạng mã JS, nó có thể cố cài thêm công cụ mới và thiết lập cấu hình, còn với Go thì chỉ cần chạy
gofmt là xong
- Việc viết unit test hay build binary cũng được chuẩn hóa tương tự
Build binary đa nền tảng
- Trong Go, hỗ trợ đa nền tảng là tính năng hạng nhất (first-class citizen), đặc biệt có lợi cho phần mềm như công cụ CLI, nơi không thể kiểm soát môi trường chạy
- Có thể chạy unit test và integration test trên nhiều môi trường bằng cùng một lệnh, để xác minh xem chức năng hiện có có bị phá vỡ hay không
- Lợi ích này còn được tối đa hóa khi dùng agent chạy nền:
- Xu hướng hiện nay là dần tách khỏi việc kiểm soát trực tiếp môi trường build và chạy mã, chẳng hạn kích hoạt Cursor bằng tin nhắn Slack hoặc chuyển phiên cục bộ sang từ xa
- Mã Go có thể tạo cùng một binary trên Linux, Windows, macOS, và toàn bộ quy trình làm việc được chuẩn hóa giữa các môi trường, nên không cần quá bận tâm việc nhà cung cấp sandbox có hỗ trợ phụ thuộc phát triển hay không
Chất lượng mã Go do agent tạo ra
- Tính đến đầu năm 2026, tỷ lệ agent tạo được mã Go hợp lệ ngay trong một lần khoảng 95% (con số dựa trên trải nghiệm cá nhân, không phải dữ liệu chính thức)
- Cảm nhận là khi dùng agent với Go thì ít khó khăn hơn so với Python
- Mô hình đã học đủ về thư viện, pattern và best practice của Go, nên chỉ cần định hướng là việc hiện thực tính năng gần như diễn ra khá suôn sẻ
- Tổng lượng dữ liệu huấn luyện Go có thể ít hơn Python, nhưng trong Python có 20 cách khác nhau để làm cùng một việc, nên xét theo một thư viện cụ thể thì hiệu ứng mật độ dữ liệu huấn luyện của Go lại cao hơn
- Lợi thế này có thể biến mất theo thời gian khi hiệu năng mô hình tăng lên và dữ liệu huấn luyện được mở rộng
Bối cảnh Bruin chọn Go
- Bruin là một công cụ ETL mã nguồn mở, chủ yếu là một công cụ CLI được viết bằng Go
- Dù Python là dòng chính trong hệ sinh thái dữ liệu, các ràng buộc chính dẫn đến việc chọn Go là:
- Là công cụ điều phối dữ liệu nên xử lý đồng thời là yếu tố cốt lõi
- Cần hệ sinh thái đủ mạnh vì phải tương tác với nhiều hệ thống như runtime ngôn ngữ hay API bên ngoài của nền tảng dữ liệu
- Là công cụ CLI nên cần hiệu năng đủ tốt để dùng cho extension VS Code hoặc backend UI cục bộ
- Cần xử lý lỗi có thể dự đoán được để tích hợp với nhiều hệ thống khác nhau
- Vì chạy trên máy người dùng nên cần dễ hỗ trợ nhiều OS và kiến trúc khác nhau
- Về yếu tố chủ quan, ngôn ngữ này cũng phải là thứ mà những người đóng góp chính cảm thấy thích làm việc cùng, và trong một nhóm nhỏ, niềm vui và năng lượng là tài nguyên khan hiếm nhất
- Dù có nhược điểm là thiếu một số thư viện dữ liệu so với Python, họ vẫn quyết định theo trực giác rằng ưu thế về tốc độ và trải nghiệm lập trình viên (DX) của Go sẽ mang lại giá trị lớn hơn về lâu dài
Kết luận: Go trong kỷ nguyên agent
- Ngôn ngữ lập trình đang bước vào thời đại mà con người không còn trực tiếp viết mã nữa
- Giờ đây cần những hệ thống hỗ trợ để agent có thể viết mã hiệu quả
- Go, nhờ sự cân bằng giữa tính dễ dùng, hiệu năng và tính phổ quát, mang lại môi trường lý tưởng để AI agent viết và chạy mã
- Agent có thể tự động tạo ra phần mềm hiệu năng cao có thể biên dịch, kiểm thử, định dạng và triển khai lên nhiều máy khác nhau bằng Go
- Chưa rõ Go có trở thành ngôn ngữ tối thượng cho agent hay sẽ có ngôn ngữ phù hợp hơn xuất hiện, nhưng hiện tại nhóm đang đạt được kết quả đủ tốt về năng suất và chất lượng phần mềm
3 bình luận
Trước hết là vì tốc độ build nhanh nên rất thích.
Ngôn ngữ Go thực sự có một triết lý rất rõ ràng, nên với những người hợp với triết lý đó thì đây có vẻ là một lựa chọn tốt. Bản thân tôi cũng đã chuyển từ việc xây dựng backend bằng runtime JS sang Go, và tôi nghĩ mình có thể tự tin nói rằng cả hiệu năng lẫn năng suất phát triển ở mức này đều khá đáng hài lòng.
Ý kiến trên Hacker News
Tôi đã làm tư vấn hơn 9 tháng và liên tục xác nhận rằng Go rất phù hợp cho việc sinh mã bằng LLM
Go cung cấp hệ thống build nhất quán, formatter, static typing và khả năng đồng thời dựa trên CSP mà không có những phần nguy hiểm như C++
Hơn 10 năm nay không có phiên bản phá vỡ khả năng tương thích, và framework cũng hầu như không thay đổi
Khi tôi tư vấn cho các đội ngũ tại Sancho Studio triển khai agentic coding workflow, Go cho kết quả rất ổn định trên Claude và Codex
Trong khi đó Python hay TypeScript có quá nhiều framework và cách tiếp cận kiểu dữ liệu khác nhau nên LLM khó tạo ra đầu ra nhất quán
Thực ra chính lý do trước đây tôi không thích Go — giới hạn về mức độ trừu tượng — lại trở thành ưu điểm đối với LLM
go fixmới trong Go 1.26 hỗ trợ tự động refactor ở cấp độ AST để giữ codebase luôn cập nhậtTrước đây tôi từng xây dựng PKI bằng Go trong dự án Zoom E2E Whitepaper, còn giờ thì LLM xử lý phần boilerplate lặp đi lặp lại nên sự đơn giản của Go mới thực sự phát huy giá trị
Java có nhiều dữ liệu huấn luyện hơn và hệ thống kiểu mạnh hơn, nên cũng thuận lợi cho việc kiểm chứng đầu ra của LLM
Tôi thích môi trường low-level, và rất thích stack trừu tượng nông cùng cấu trúc dễ dự đoán của Go
Cuối cùng thì sự đơn giản và tính nhất quán đều rất hợp với LLM lẫn những lập trình viên như tôi
Ngôn ngữ chuẩn hóa như Go giúp kết quả dễ hiểu hơn, nhưng Ruby hay C++ cũng khá ổn
Lisp hay Bash có độ tự do cao nên kết quả khá thất thường
Xếp Python và TypeScript vào cùng một nhóm là không chính xác
Python làm LLM bối rối vì đứt gãy giữa các phiên bản và việc bổ sung kiểu dữ liệu chậm, còn TypeScript thì nhất quán hơn nhiều
Nếu có dịp tôi rất muốn thử một màn đấu code trực tiếp Go vs TypeScript
Trong phát triển agent, tôi nghĩ nên chuyển càng nhiều phần kiểm chứng càng tốt sang thời điểm biên dịch
Go ổn nhưng hệ thống kiểu không mạnh bằng một số ngôn ngữ khác
Rust rất hữu ích ở chỗ nếu vượt qua được lỗi compiler thì gần như không còn lỗi runtime
Haskell có lẽ còn tốt hơn nữa
Khi agent sửa source thì nó cũng cập nhật test cùng lúc
Ở ngôn ngữ khác rất dễ quên phần test
Tôi đang làm một toy language dựa trên dependent types chạy trên Haskell, và nhờ cú pháp đơn giản nên LLM xử lý khá dễ
Bên trong nó hoạt động giống Rust an toàn/không an toàn
Vì đâu phải chúng ta trực tiếp viết nó nên hơi bất tiện một chút cũng không sao
Có thể kết hợp với TypeScript để làm SPA, hoặc tạo ứng dụng đa nền tảng bằng Tauri, rồi gắn thêm Python sidecar
Tôi cũng đang thử nghiệm game với Bevy và rất thích cấu trúc ECS của nó
Tôi đã tận dụng được ưu điểm của nhiều ngôn ngữ trong khi tránh được nhược điểm của chúng
Trong vài ngày, tôi đã bảo Gemini, Claude Code và Codex rằng “hãy thiết kế một ngôn ngữ mà các bạn muốn dùng”
Kết quả là một ngôn ngữ kiểu Forth với hệ thống kiểu mạnh, contract, test tích hợp sẵn, fuzz test và bộ giải ràng buộc dựa trên Z3
Tôi triển khai interpreter bằng Elixir và công khai nó thành dự án Cairn
Một ngôn ngữ được tạo ra sau khoảng 150 commit đã chạy mà không có lỗi runtime
Thí nghiệm này cho thấy tầm quan trọng của phân tích ở thời điểm biên dịch và công cụ kiểm thử
Nếu thông tin đó không có trong dữ liệu huấn luyện thì nó không thể biết được
Việc phát triển tooling cho một ngôn ngữ như vậy chắc sẽ cực kỳ thú vị
Tôi vẫn cho rằng OCaml là lựa chọn tốt nhất
Nó có nhiều ưu điểm như hệ thống kiểu mạnh (bao gồm GADT), thiên về hàm thuần, tốc độ build nhanh, hỗ trợ target WASM/JS
Việc code được đánh giá theo thứ tự trong file, nên phải xử lý phụ thuộc vòng một cách tường minh, cũng mang lại sự ổn định
Trên hết, đây còn là một ngôn ngữ rất thú vị với con người khi sử dụng
Trước đây F# đi trước ở mảng đó
Kể cả khi agent vô tình đưa bug vào thì phần lớn vẫn bị bắt ra
Trong số PHP, Go, JavaScript và Python thì Go tốt hơn, nhưng như vậy vẫn chưa đủ để chứng minh nó là “ngôn ngữ tốt nhất”
Sự đơn giản của Go cùng hệ thống kiểu đủ dùng cũng rất hấp dẫn
Có thể tham khảo cuộc thảo luận trước đó "Why Elixir is the best language for AI"
Khả năng runtime introspection của BEAM là một điểm rất đáng chú ý trong môi trường agent
Bài này đặc biệt chỉ trích Go
Go có công cụ govulncheck để phân tích tĩnh các lỗ hổng trong mã và binary
Nó được tích hợp rất sâu vào hệ sinh thái Go như trong hướng dẫn chính thức, và có mức độ tích hợp cao hơn nhiều ngôn ngữ khác
Tôi vẫn nghi ngờ việc govulncheck có thực sự phân tích lỗ hổng trong mã hay không
Khả năng lần theo call path là ưu điểm, nhưng nó vẫn khác với các công cụ phân tích tĩnh thực thụ như Coverity
Trong Go, các bộ công cụ cộng đồng như
golangci-lintcó lẽ gần với điều đó hơnTôi đã viết lại dự án bằng nhiều ngôn ngữ khác nhau, và Python là ngôn ngữ hợp với Claude nhất
Mã ngắn và dễ hiểu nên tốc độ làm việc nhanh hơn hẳn
Tôi đã thử Go, Kotlin và JavaScript nhưng cuối cùng vẫn dừng ở Python
passkhôngGo không phải lựa chọn tệ. Dữ liệu huấn luyện phong phú và API ổn định khiến LLM dễ làm việc với nó
Nhưng tôi nghĩ Rust vẫn tốt hơn nhờ hệ thống kiểu
Tuy vậy Rust thay đổi nhanh nên LLM khó theo kịp API mới nhất
Haskell lại thuận lợi nhất cho LLM nhờ tốc độ thay đổi chậm và mã an toàn
Các script Python cũng dễ đọc theo cách tương tự
Với góc nhìn của người làm việc với agent lập trình AI hằng ngày, “ngôn ngữ tốt nhất” còn tùy thuộc vào mục đích của agent
Sự đơn giản và dễ đoán của Go rất hợp cho các tác vụ phổ thông, nhưng TypeScript lại vượt trội trong việc tích hợp với môi trường web
Python vẫn không có đối thủ trong mảng dữ liệu/ML
Điều cốt lõi không phải là chọn ngôn ngữ mà LLM xử lý tốt nhất, mà là chọn ngôn ngữ phù hợp với domain của agent