-
Tác giả là thú mỏ vịt
- Việc gạt bỏ chỉ trích bằng cách quy tác giả là kém năng lực là một cách làm lười biếng.
- Lập trình viên junior có thể nhìn vấn đề bằng góc nhìn mới, và đó là một lý do quan trọng để tuyển dụng họ.
- Tác giả không phải là lập trình viên junior, và có hiểu biết về thiết kế ngôn ngữ nhờ nhiều trải nghiệm đa dạng.
-
Mẹ cũng hút thuốc nên chắc không sao đâu
- Việc vô điều kiện chạy theo công nghệ mà các công ty khác sử dụng là không hiệu quả.
- Blog kỹ thuật thường có mục đích làm hình ảnh công ty trông tốt hơn.
- Blog của Tailscale khá thành thật, nhưng vẫn cần rất nhiều nỗ lực để khắc phục các vấn đề của Go.
-
Những điểm tốt
- Go có runtime bất đồng bộ và bộ gom rác rất xuất sắc.
- Các công cụ như quản lý package, refactoring và cross-compiling đều dễ dùng.
- Tuy vậy, không thể bỏ qua những nhược điểm của Go, và vấn đề nằm ở chỗ thiết kế của ngôn ngữ này được hình thành một cách ngẫu nhiên.
-
Go là một hòn đảo
- Go thiếu khả năng tương tác với các ngôn ngữ khác.
- Toolchain của Go rất đặc thù, và không thể dùng các ngôn ngữ assembly hay debugger sẵn có.
- Cách dễ nhất để tích hợp với Go là thông qua ranh giới mạng.
-
Tất cả hoặc không gì cả (nên cuối cùng chẳng làm gì)
- Go có thể để lại các trường struct chưa được khởi tạo.
- Ý nghĩ rằng giá trị zero luôn mang ý nghĩa là một quan niệm ngây thơ, và trong nhiều trường hợp nó gây ra vấn đề.
- Văn hóa của Go thường là bảo người dùng phải cẩn thận thay vì giải quyết vấn đề.
-
"Rust hoàn hảo còn các bạn đều ngốc cả"
- Rust có thể được đưa vào theo từng bước và tích hợp tốt với các ngôn ngữ khác.
- Thành công của Rust một phần đến từ việc nó cho phép chuyển đổi sang một ngôn ngữ an toàn hơn.
- Rust cũng có những vấn đề riêng, nhưng chúng đang dần được giải quyết.
-
Dùng Go như ngôn ngữ prototype/starter
- Go thường được xem là ngôn ngữ dễ học, nhưng trên thực tế lại đòi hỏi khá nhiều kinh nghiệm.
- Nó thiếu những tính năng giúp nhận ra rõ ràng rằng đoạn mã đang sai.
- Nhược điểm của Go bộc lộ theo thời gian, và đây không phải ngôn ngữ dễ rời đi một khi đã dùng.
-
Những lời nói dối về lý do chúng ta tiếp tục dùng Golang
- Người khác dùng thì chắc cũng tốt với chúng ta
- Xem các khiếm khuyết trong thiết kế ngôn ngữ là ổn, dù ở mức cá nhân hay tập thể
- Nghĩ rằng chỉ cần cẩn thận là có thể vượt qua các vấn đề
- Nghĩ rằng dễ viết thì phát triển phần mềm production cũng sẽ dễ
- Nghĩ rằng ngôn ngữ đơn giản thì mọi thứ đều đơn giản
- Nghĩ rằng sau này lúc nào cũng có thể viết lại
2 bình luận
Tôi băn khoăn không biết một người nghiệp dư mới gắn bó khá tập trung với ngôn ngữ Go trong một khoảng thời gian rất ngắn như chớp mắt có nên viết vài dòng hay không... Go là một ngôn ngữ có ưu điểm và nhược điểm rất rõ ràng, nên có vẻ cả những người chọn dùng lẫn những người né tránh nó đều có lý do rất cụ thể. Cá nhân tôi nghĩ không nên so sánh với Rust, mà hợp lý hơn là so với Kotlin(Java).
Goroutine của Go thực sự rất xuất sắc, nhưng không phải phép màu. Đặc biệt ở backend, với những dự án nhỏ chỉ dùng một MySQL, việc quản lý tính đồng thời này thật sự rất khó. Những vấn đề như cạn kiệt tài nguyên MySQL hay quản lý pool — vốn trong runtime JS/TS không cần bận tâm quá nhiều — lại khó hơn tưởng tượng. Cuối cùng trong tình huống này, DB trở thành nút thắt cổ chai nên ưu điểm về tính đồng thời của Go phần nào bị giảm đi. (I/O bất đồng bộ hay event loop của runtime JS/TS thậm chí có thể phù hợp hơn) Chỉ cần thử ném
-c 100bằng công cụ như hey là sẽ thấy ngay.Ngoài ra, dù GC rất tốt, cũng không có nghĩa là có thể tùy tiện chỉ truyền con trỏ của object rồi mặc kệ khâu dọn dẹp phía sau. Mọi thứ đều là trade-off, nhưng với Go, nếu có thể thì các object nhỏ vẫn nên được truyền bằng copy giá trị để khi hàm kết thúc là được xử lý ngay sẽ tốt hơn. Có thể tôi đang bị mắc kẹt trong lối nghĩ cũ, nhưng không thể tiếp cận con trỏ một cách dễ dãi từ góc độ hiệu suất như với C/C++.
Việc gần như lúc nào cũng phải trả về
errorkhi function return, rồi lần nào cũng phải kiểm tra bằngif err != nil {}đúng là rất phiền, nhưng đây lại là một ưu điểm. Vì chi phí của nó rẻ hơntry catch. Và từ khóadefer, thứ đảm nhiệm vai trò giống nhưfinally {}, cũng rất tuyệt vời. Không cần phải bận tâm về thời điểm giải phóng tài nguyên nên rất tiện. Việc chỉ với standard library đã có thể nhanh chóng dựng được một backend server khá tốt cũng là điểm hay (1.23 trở lên). Trên hết, điều tôi thích nhất là chỉ cần build theo target OS thì không cần runtime khác hay cài đặt sẵn gì thêm.Tôi chưa dùng Go quá lâu mà lại viết dài toàn ý kiến quá cá nhân, nên xin dừng ở đây. haha Tôi thích cả Go lẫn những ngôn ngữ khác!
Ý kiến Hacker News
Có nhiều chỉ trích về nhược điểm của ngôn ngữ Go, nhưng xử lý lỗi tường minh không phải là một trong số đó. Xử lý ngoại lệ thêm vào một tầng "ma thuật" khiến việc mắc sai lầm trở nên quá dễ dàng. Trong các dự án cá nhân tôi thích Rust hơn, nhưng với các dự án lớn có nhiều lập trình viên ở các trình độ khác nhau tham gia, triết lý của Go là cách tiếp cận xử lý lỗi hợp lý nhất trong thế giới hiện đại.
Rust và Go rất khác nhau, và điểm ở giữa mà mọi người mong muốn hiện vẫn chưa tồn tại.
Tôi thích những ngôn ngữ đơn giản. Vì công nghệ luôn có đánh đổi, nên một sự phê bình cân bằng là điều quan trọng.
Tôi tự hỏi vì sao việc chỉ trích một ngôn ngữ lại quan trọng đến vậy. Những lời chỉ trích này không được viết theo hướng xây dựng.
Mỗi khi đọc những lời chỉ trích về Go, tôi vẫn sẽ tiếp tục dùng Go.
Mỗi lần dùng ngôn ngữ khác, tôi lại muốn quay về Go.
Tôi từng tìm một Python tốt hơn. Go là lựa chọn hiển nhiên, nhưng tôi ghét cú pháp của nó.
Tôi không hiểu vì sao Go và Rust lại thường bị đem ra so sánh. So với Java thì phù hợp hơn nhiều.