1 tháng học Rust - Nhìn lại

1 tháng học Rust - Nhìn lại

Vấn đề

Chuỗi bài viết tự học Rust hiện tại đã đến bài Iterators, gần như đã hết kiến thức cơ bản của Rust, sau đó là kiến thức nâng cao như là con trỏ thông minh (smart pointer), async/await, channel và nhiều kiến thức khác. Nhưng phải nói thật với độc giả rằng sau cùng kiến thức đọng lại trong đầu là không đáng kể.

Nếu đã theo dõi chuỗi bài viết về quá trình tự học Rust, hầu hết bạn thấy là lý thuyết được ghi chép lại theo chuỗi bài viết gốc tại The Rust Programming Language. Nó đơn giản lọc ra một số khái niệm cho là quan trọng, cần phải nhớ, viết lại rồi chia sẻ. Dù sao đi nữa vẫn khuyến khích bạn đọc nên đọc bài viết gốc để có cái nhìn chi tiết nhất. Còn những bài viết ở đây chỉ là phiên bản rút gọn để tóm tắt kiến thức cần nhớ.

Rốt cục thì chúng đều là lý thuyết, mà lý thuyết thì có thể quên và nhiều khi không áp dụng được vào thực tế. Bây giờ bảo viết lại một chương trình bằng Rust đi thì e rằng phải dè chừng vì không biết bắt đầu từ từ đâu, không biết còn nhớ cú pháp nữa hay không ấy chứ!

Nhận ra hạn chế đó, thời gian gần đây tôi đã quyết tâm thay đổi cách học của mình. Song song với lý thuyết thì thực hành nhiều hơn. Hiện tại tôi đang oằn mình giải bài tập Rust tại kho lưu trữ mainmatter/100-exercises-to-learn-rust - nơi tập hợp 100 bài tập ngắn để giúp làm quen với cú pháp và khái niệm. Đồng thời tham khảo thêm tài liệu học Rust ở các nguồn như chuỗi bài giảng của Google: google/comprehensive-rustrust by example - tổng hợp các ví dụ ngắn về cách sử dụng Rust.

Nhưng tại sao phải ép mình làm những điều đó?

Học phải đi đôi với hành

Học phải đi đôi với hành - điều này ai cũng biết, vì thực hành giúp biến kiến thức thành kỹ năng, kiểm chứng và củng cố những điều đã học, đồng thời rèn tư duy linh hoạt để áp dụng vào thực tế. Khi học mà không hành, kiến thức dễ mai một, khó mà sử dụng hiệu quả.

Cách học Rust hiện tại chỉ là đọc tài liệu rồi ghi chép điều mình hiểu, giải thích lại thông qua một bài viết ngắn. Qua đó giúp tóm tắt, hệ thống hoá lại kiến thức đã học, đồng thời khi viết ra cũng coi như là một lần học, giúp mình nhớ lâu hơn và quan trọng là nếu có sai sót, ai đó sẽ giúp chỉ ra lỗi sai, như vậy khác nào lại học thêm được điều mới.

Nếu bảo bây giờ hãy tạo một dự án bắt đầu bằng Rust, viết các chương trình đơn giản như tính tổng các số, giai thừa, dãy Fibonacci... thì không thành vấn đề, chỉ cần xem lại cú pháp cơ bản rồi vận dụng nó vào viết chương trình. Nhưng đối với logic phức tạp hơn, cần làm nhiều hơn thì sợ rằng không thể.

Thực tế kiến thức lúc học so với khi làm khác nhau một trời một vực. Đó không phải là chương trình tính tổng mà là logic nghiệp vụ phức tạp mà khách hàng yêu cầu. Đây cũng là lý do khiến cho người ta dễ cảm thấy chán nản khi học ngôn ngữ mới mà không thể áp dụng được vào thực tế. Nó quá khó so với ngôn ngữ hiện tại đã thành thạo. Con người thường tỏ ra thích thú với vấn đề đơn giản hơn, cái nào càng không phải suy nghĩ nhiều thì não bộ càng thích ưu tiên làm việc đó.

Vậy mới nói thực hành là điều quan trọng nếu muốn thành thạo một cái gì đó. Cho dù ban đầu có gian nan vất vả. Trước khi muốn kết thúc, hãy nghĩ về ban đầu tại sao lại bắt đầu.

Lợi ích của việc học thêm ngôn ngữ lập trình mới

Tại sao phải học thêm một ngôn ngữ lập trình mới trong khi công việc chính sử dụng cái khác? Thay vì lan man thì tập trung vào một cái cho giỏi không phải tốt hơn sao? Không biết bạn đọc nghĩ thế nào chứ riêng tôi thấy việc học thêm ngôn ngữ mới giúp ích cho mình rất nhiều.

Trước tiên hãy tìm câu trả lời cho lý do tại sao lại phải tạo ra nhiều ngôn ngữ lập trình để làm gì? Tại sao cả thế giới không quy về một ngôn ngữ cho thống nhất? Trả lời được câu hỏi này tôi tin rằng bạn đã nhận ra được lợi ích thật sự của việc học thêm cái mới.

Ngôn ngữ lập trình sinh ra để giải quyết vấn đề mà ngôn ngữ khác không làm được, tuỳ thuộc vào chức năng, vị trí và khả năng giải quyết vấn đề của ngôn ngữ mà nó phát huy hết sức mạnh. Lấy ví dụ JavaScript không dùng để lập trình cho bộ vi xử lý vì đơn giản nó không được thiết kế cho việc đó. Ngược lại, mấy ai dùng C/C++ để tạo nên giao diện cho một trang web hiện đại?

Vì ngôn ngữ giải quyết được vấn đề mà cái khác không làm được nên bằng cách học ngôn ngữ mới giúp chúng ta hiểu rõ hơn tại sao nó lại giải quyết được vấn đề của ngôn ngữ khác. Học được quy tắc mới, mẫu mới, những điều từ trước đến nay chưa từng xuất hiện trong ngôn ngữ của mình, đi tìm câu trả lời cho câu hỏi sâu xa: "Tại sao nó lại có triết lý thiết kế như thế này?".

Nói tóm lại học một ngôn ngữ mới là giúp thoát ra vùng an toàn. Mở rộng vùng hiểu biết và xâu chuỗi kiến thức rời rạc mà lâu nay đã thu thập được.

Quyết tâm! Quyết tâm! Quyết tâm!

Cái gì quan trọng nên nhắc lại ba lần. Gần đây tôi đang thực hành với Rust nhiều hơn. Đọc lại một lượt kiến thức cũ và giải bài tập Rust để làm quen với cú pháp mới. Phải công nhận với bạn đọc rằng việc cưỡi ngựa xem hoa bao giờ cũng thanh cảnh hơn so với việc sắn tay áo lên mà gieo mạ.

Nói vậy nhưng học lý thuyết không hẳn là thừa. Lý thuyết giúp hình dung ra những cái đang có. Ít nhất khi nhìn vào bài tập còn có thể nhận ra từ khoá và công dụng của nó chứ không hẳn là mù tịt như một kẻ chưa nhìn thấy thứ gì đó bao giờ. Giải bài tập như là thực hành, biến lý thuyết thành kiến thức cứng, trải nghiệm, thử nghiệm rồi dần biến thành kinh nghiệm của mình.

Theo tôi thấy điều khó khăn khi học một ngôn ngữ mới là ánh xạ những thứ mình biết sang những thứ chưa biết. Kiểu như là JavaScript/Node.js có cái này thì Rust có cái tương tự không? Điều đó vừa lợi mà vừa hại. Lợi ở chỗ nó giúp lập trình viên có kinh nghiệm tiếp cận với cái mới nhanh hơn. Hại ở chỗ khi cố gắng gượng ép kiến thức cũ sang mới, nhiều khi cái mới không có hoặc có cách làm khác tốt hơn thì lại lúng túng rồi rơi vào hoảng loạn. Chưa kể mỗi ngôn ngữ có cách tiếp cận khác nhau nên nếu đứng ở góc độ hiện tại sẽ khó mà tiếp nhận được cái mới.

Phải thú thật rằng Rust rất phức tạp, khi đọc tài liệu của nó như đang tiếp cận với một lượng thông tin khổng lồ, bao gồm cả cú pháp và triết lý thiết kế rất dễ làm nản lòng bất kỳ ai. Nhưng đừng để não bộ đánh lừa, vì chúng luôn thích công việc dễ mà dẫn dụ chúng ta bỏ qua. Hãy luôn tỉnh táo nhận thức rằng chính ta mới là chủ nhân của nó.

Một lưu ý quan trọng khác là trong khi học Rust hãy tắt tính năng gợi ý mã của trình soạn thảo. Tự mình gõ ra sẽ giúp bản thân động não nhiều hơn và rèn luyện phản xạ. Nếu chỉ tab, tab và tab, bạn chỉ như đang rong ruổi giữa rừng hoa mà lại chẳng biết cách trồng chúng như thế nào.

Ngày nay việc tự học không còn quá khó bởi có thêm sự trợ giúp từ các mô hình ngôn ngữ lớn. Nhớ lại trước kia tự học Go, tôi phải vật lộn với hàng chục câu hỏi tại sao mà chẳng có lời giải đáp. Còn bây giờ chỉ cần hỏi LLMs, chúng sẽ giải thích cặn kẽ cho bạn hiểu vấn đề. Tuy nhiên LLMs chỉ trở nên thực sự hữu ích nếu biết cách đặt câu hỏi thay vì vội vàng muốn có luôn câu trả lời. Vì chúng biết rất nhiều nên câu trả lời thường mang tính định hướng, nếu không biết rất dễ rơi vào cái bẫy lan man không hồi kết.

Cuối cùng thì chuỗi bài viết một tháng học Rust này vẫn sẽ tiếp tục, chỉ có điều không biết rằng có nhiều thời gian để viết tiếp hay không. Cảm ơn tất cả mọi người đã quan tâm.

Tổng kết

Nhìn lại một tháng học Rust, tôi nhận ra rằng việc chỉ tập trung vào lý thuyết không đủ để biến kiến thức thành kỹ năng thực tiễn. Mặc dù việc tóm tắt và ghi chép lại từ tài liệu gốc giúp hệ thống hóa và củng cố phần nào kiến thức, nhưng nó không thể thay thế cho thực hành. Chính vì lẽ đó, tôi quyết định thay đổi cách tiếp cận, kết hợp học lý thuyết với thực hành thông qua việc giải các bài tập từ những nguồn khác. Điều này không chỉ giúp tôi làm quen với cú pháp mà còn rèn luyện tư duy giải quyết vấn đề trong thực tế, dù ban đầu việc này đòi hỏi nhiều nỗ lực và có thể gây nản lòng.

Học một ngôn ngữ lập trình mới như Rust không chỉ là việc vượt qua khó khăn ban đầu mà còn giúp mở rộng hiểu biết, khám phá những triết lý thiết kế mới và thoát khỏi vùng an toàn. Hiểu rằng quá trình học cần sự kiên nhẫn, vượt qua sự lười biếng của bản thân, và tận dụng hợp lý các nguồn tài liệu cũng như sự trợ giúp từ mô hình ngôn ngữ lớn mà việc học trở nên dễ thở hơn rất nhiều. Còn bạn đọc thì sao? Có bí kíp nào để học tốt hơn không? Hãy để lại bình luận xuống dưới bài viết nhé.