Tại sao tôi lại yêu Rust dù nó đôi khi "vặt" đến mức muốn khóc?
Hồi mới làm systems programming, tôi chỉ quen với C. Cảm giác tự do, cầm cây búa sắt đi nện vào bộ nhớ, thích là làm, nhưng đổi lại là những đêm mất ngủ vì segfault hay use-after-free. Debug với C giống như tìm kim đáy bể trong một bãi rác khổng lồ. Bạn biết lỗi ở đâu, nhưng bạn không biết tại sao nó xảy ra cho đến khi bạn chạy cái con trỏ đó ra, rồi chạy lại, rồi chạy lại nữa.
Rồi một ngày, ai đó bảo tôi thử Rust. Lúc đầu, tôi khinh. "Compiler của họ nói chuyện như người dạy kèm à?". Đúng thật, compiler Rust (gọi là rustc) bắt đầu là một cơn ác mộng. Nó từ chối compile code chỉ vì bạn chưa xử lý case lỗi, hoặc không khai báo ownership rõ ràng. Nhưng rồi... nó chuyển đổi thành một người bạn.
Khi tôi viết một cái Vec::new() hay một HashMap trong Rust, tôi biết chắc chắn rằng khi code chạy, nó sẽ không bị tràn stack hay rò rỉ bộ nhớ. Không cần phải chạy lại 50 lần để hy vọng thấy lỗi. Compiler đã "đánh" cho tôi trước khi tôi kịp làm. Đó là cảm giác an toàn kỳ lạ mà C hay Go không mang lại được (ít nhất là ở mức độ này).
Nói về Go, tôi vẫn thích nó cho các microservices hay tooling nhanh gọn. Nó dễ đọc, dễ viết, compiler nhanh như chớp. Nhưng trong systems programming, Go vẫn dựa nhiều vào Garbage Collector (GC). Đôi khi, độ trễ bất thường do GC gây ra khiến tôi phải lo lắng khi xây dựng những hệ thống yêu cầu real-time nghiêm ngặt. Còn Rust? Bạn kiểm soát mọi thứ. Bạn là vua của bộ nhớ.
Tóm lại, Rust không phải là ngôn ngữ hoàn hảo. Nó học curve cực dốc. Nhưng khi bạn vượt qua "cơn đau" ban đầu đó, bạn nhận ra mình đang được bảo vệ bởi một hệ thống cực kỳ thông minh. Nó không chỉ là một compiler, nó là một kiến trúc sư giúp bạn xây nhà vững chắc hơn. Maybe I'm biased, but once you go Rust, you never go back (at least for low-level stuff).
Còn bạn, đã từng trải qua nỗi đau của borrow checker chưa? Kể nghe coi?