Chuyển đổi từ Rust sang Ruby: Giảm 77% lượng code nhờ AI
Một lập trình viên đã sử dụng mô hình ngôn ngữ lớn (LLM) cục bộ để chuyển đổi ứng dụng web từ Rust sang Ruby on Rails. Kết quả là lượng mã nguồn giảm tới 77%, từ gần 15.000 dòng xuống còn hơn 3.000 dòng, đồng thời cải thiện đáng kể khả năng kiểm thử.

Chuyển đổi từ Rust sang Ruby: Giảm 77% lượng code nhờ AI
Ai lại làm chuyện như thế?!? Hóa ra là tôi. Đó là câu mở đầu đầy bất ngờ của một lập trình viên khi chia sẻ hành trình chuyển đổi dự án cá nhân từ Rust – ngôn ngữ nổi tiếng về hiệu suất và an toàn – sang Ruby – ngôn ngữ được biết đến với sự ngắn gọn và tốc độ phát triển nhanh.
Thử nghiệm chuyển đổi code
Tác giả sở hữu một dự án Rust cá nhân với quy mô khoảng 30.000 dòng code. Mặc dù con số này nghe có vẻ lớn, nhưng do bản chất của Rust khá dài dòng (verbose), nên thực tế nó không quá khổng lồ. Sau một thời gian để dự án sang một bên để tìm hiểu về suy luận cục bộ (local inference), các mô hình ngôn ngữ lớn (LLM) và viết các tác nhân AI, sự chú ý của tác giả quay trở lại với Ruby.
Ruby hiện đại và ý định táo bạo
Đã một thời gian dài trôi qua, nên tác giả phải xem lại Ruby và Ruby on Rails đang ở đâu. Thực tế cho thấy chúng vẫn phát triển rất tốt, với các sáng kiến về kiểu dữ liệu tĩnh như Sorbet, và ngôn ngữ này vẫn giữ được sự ngắn gọn đặc trưng.
Trong ứng dụng Rust của mình, tác giả có một crate (thư viện) riêng biệt hoạt động như một ứng dụng web được viết bằng Tera và Axum. Phần này chứa tổng cộng 14.943 dòng code Rust, mất khoảng 10 giây để biên dịch và kéo theo một lượng lớn các thư viện phụ thuộc. Các bài kiểm thử E2E (End-to-End) cũng rất nặng nề, đòi hỏi phải cài đặt Playwright, cơ sở dữ liệu cô lập và các dịch vụ giả lập (mocking services) phức tạp.
Tác giả đã nảy ra ý định: "Tôi tự hỏi liệu mình có thể dùng Local Qwen3.6 để thực hiện việc chuyển đổi này một lần (oneshot) được không?".
So sánh Rust và Ruby on Rails
Trước khi bắt tay vào làm, tác giả đã yêu cầu các phiên bản LLM khác nhau phân tích dự án về các khía cạnh như độ phức tạp, ổn định và khả năng kiểm thử. Dù rõ ràng độ ổn định sẽ giảm đi do Ruby thiếu kiểu dữ liệu tĩnh (static typing), nhưng với sự hỗ trợ của Sorbet, vấn đề này không quá nghiêm trọng.
Tác giả đã lập một bảng so sánh chi tiết giữa Rust/Axum/Diesel và Rails (có và không có Sorbet) trên các tiêu chí như độ phù hợp cho lập trình viên đơn độc, tốc độ phát triển, độ an toàn, hiệu suất, và khả năng kiểm thử.
Kết quả tổng hợp cho thấy Rails đạt 710 điểm, trong khi Rust chỉ đạt 480 điểm. Điều này gợi ý rằng ứng dụng này sẽ có hiệu quả tốt hơn gấp 1,47 lần nếu được viết bằng Ruby on Rails thay vì Rust, ít nhất là đối với một lập trình viên làm việc độc lập.
Kết quả gây sốc: Giảm 77% lượng code
Được trang bị một chiếc máy có card đồ họa RTX 4090 Ti (mua từ thời chưa bùng nổ AI), tác giả cảm thấy tự tin với khả năng chạy LLM cục bộ không giới hạn token. Quá trình chuyển đổi đối với một dự án tương đối nhỏ này mất khoảng 30 phút.
Giảm 77% lượng mã nguồn
Tuy nhiên, điều khiến tác giả "ngồi nhìn trong kinh hoàng" là kết quả so sánh số dòng code:
- Rust: 14.943 dòng.
- Ruby: 3.322 dòng.
Đúng vậy各位 bạn đọc! Lượng code đã giảm tới 77%, tương đương với việc 4,49 dòng Rust code chỉ bằng 1 dòng Ruby code.
Tác giả đã xem qua code Ruby được tạo ra và nhận xét nó trông... ổn. Có thể sẽ có một số lỗi (bugs), nhưng nhìn chung code rất sạch sẽ và đúng chuẩn (idiomatic) với kinh nghiệm cũ của tác giả.
Khả năng kiểm thử và những lợi ích khác
Một trong những lợi thế lớn nhất mà tác giả nhận thấy là khả năng kiểm thử (testability). Trong Ruby/Rails, việc viết test đơn giản và trực diện hơn nhiều so với Rust.
Ví dụ, để kiểm tra một cuộc gọi LLM, trong Ruby bạn có thể dùng VCR để ghi lại và phát lại yêu cầu một cách dễ dàng:
VCR.use_cassette("llm_call") do
result = LlmClient.match(entry, data_list)
expect(result.results.size).to eq(data_list.size)
end
Trong khi đó, với Rust, bạn phải định nghĩa các struct Mock phức tạp, implement các trait, và quản lý bộ nhớ chia sẻ (Arc, RwLock) chỉ để giả lập một provider cho bài test. Sự khác biệt về độ phức tạp là rõ rệt.
Kết luận
Lợi ích của việc làm việc trên dự án riêng là bạn có thể đưa ra những quyết định điên rồ. Tác giả thừa nhận đây là một thử nghiệm táo bạo và sẽ theo dõi kỹ lưỡng kết quả của nó. Với việc giảm thiểu đáng kể lượng mã mẫu (boilerplate) và tăng tốc độ phát triển, việc chuyển đổi sang Ruby (được hỗ trợ bởi AI) có thể là một lựa chọn hợp lý cho các dự án nhỏ hoặc các lập trình viên đơn độc, ngay cả khi phải đánh đổi một phần hiệu suất và độ an toàn mà Rust mang lại.



