35 ngày học Rust
Tuần 1:
Ngày 1:
Giới thiệu về Rust, tại sao nên chọn Rust
Cài đặt Rust và công cụ (rustup, cargo)
Chương trình Rust đầu tiên ("Hello, world!")
Bài tập:
Viết chương trình in ra thông tin cá nhân của bạn (họ tên, tuổi, sở thích).
Tạo một chương trình tính toán tổng, hiệu, tích, thương của hai số nhập từ bàn phím.
Tìm hiểu về các kiểu dữ liệu cơ bản trong Rust (số nguyên, số thực, boolean, ký tự) và viết chương trình minh họa cách sử dụng chúng.
Ngày 2:
Các khái niệm cơ bản: Biến, kiểu dữ liệu, hàm, điều khiển luồng (if/else, loop)
Bài tập:
Viết hàm tính giai thừa của một số nguyên dương.
Viết chương trình kiểm tra một số có phải là số nguyên tố hay không.
Tạo một chương trình chuyển đổi nhiệt độ từ độ C sang độ F và ngược lại.
Ngày 3:
Ownership (quyền sở hữu): Quy tắc sở hữu, di chuyển (move), mượn (borrow)
Bài tập:
Viết chương trình minh họa quy tắc sở hữu và sự khác biệt giữa di chuyển và mượn.
Tạo một hàm nhận vào một chuỗi và trả về một chuỗi mới được đảo ngược thứ tự các ký tự.
Giải thích tại sao đoạn mã sau không biên dịch được và cách sửa:
fn main() { let s1 = String::from("hello"); let s2 = s1; println!("{}", s1); }
Ngày 4:
References (tham chiếu) và Borrowing (mượn): Tham chiếu không thay đổi (
&
) và tham chiếu có thể thay đổi (&mut
)Slice Type: Làm việc với một phần của mảng hoặc chuỗi
Bài tập:
Viết hàm tính tổng các phần tử trong một slice của số nguyên.
Tạo một hàm tìm kiếm vị trí của một phần tử trong một slice.
Viết chương trình chia một chuỗi thành các từ và in ra từng từ trên một dòng.
Tuần 2:
Ngày 5:
Struct: Định nghĩa struct, khởi tạo struct, cập nhật trường của struct
Bài tập:
Tạo một struct
Point
để biểu diễn một điểm trong mặt phẳng 2 chiều.Viết hàm tính khoảng cách giữa hai điểm.
Tạo một struct
Rectangle
với các trường chiều rộng và chiều cao. Viết hàm tính diện tích và chu vi của hình chữ nhật.
Ngày 6:
Method Syntax: Định nghĩa các phương thức cho struct
Bài tập:
Thêm các phương thức
area
vàperimeter
vào structRectangle
.Tạo một struct
Circle
và viết phương thức tính diện tích và chu vi của hình tròn.Viết một chương trình quản lý danh sách sinh viên, sử dụng struct để lưu trữ thông tin sinh viên và các phương thức để thêm, sửa, xóa sinh viên.
Ngày 7:
Enum: Định nghĩa enum, các biến thể (variant) của enum
Pattern Matching: Sử dụng
match
để kiểm tra và xử lý các giá trị của enumBài tập:
Tạo một enum
Coin
với các biến thểPenny
,Nickel
,Dime
,Quarter
.Viết hàm chuyển đổi giá trị của
Coin
sang số cent tương ứng.Xây dựng một chương trình máy tính đơn giản sử dụng enum để biểu diễn các phép toán và
match
để thực hiện các phép tính.
Tuần 3:
Ngày 8:
Packages và Crates: Tìm hiểu về khái niệm package và crate trong Rust
Modules: Cách tổ chức mã nguồn thành các module
Bài tập:
Tạo một package mới và tổ chức mã nguồn thành các module theo chức năng.
Viết một module
math
chứa các hàm tính toán cơ bản (cộng, trừ, nhân, chia).Tạo một module
utils
chứa các hàm tiện ích (ví dụ: hàm in thông báo ra màn hình).
Ngày 9:
Sử dụng các module: Cách import và sử dụng các module khác trong dự án
Path: Cách tham chiếu đến các item trong module
pub
: Tìm hiểu về từ khóapub
và cách kiểm soát khả năng truy cập của các itemBài tập:
Sử dụng các module đã tạo ở ngày 8 để xây dựng một chương trình tính toán đơn giản.
Thử nghiệm các cách khác nhau để import và sử dụng các item trong module.
Tìm hiểu về các quy tắc hiển thị (visibility) của Rust và cách chúng ảnh hưởng đến việc sử dụng các item trong module.
Ngày 10:
Collections: Vector: Mảng động trong Rust
Các thao tác cơ bản với Vector: Thêm, xóa, truy cập phần tử
Bài tập:
Tạo một vector chứa các số nguyên và thực hiện các thao tác thêm, xóa, truy cập phần tử.
Viết hàm tính tổng các phần tử trong một vector.
Tạo một vector chứa thông tin sinh viên (sử dụng struct
Student
đã tạo trước đó) và thực hiện các thao tác quản lý danh sách sinh viên.
Ngày 11:
Collections: String: Chuỗi ký tự trong Rust
Các thao tác cơ bản với String: Nối chuỗi, cắt chuỗi, tìm kiếm, thay thế
Bài tập:
Viết chương trình nhập vào một chuỗi và in ra chuỗi đó dưới dạng chữ hoa.
Tạo một hàm kiểm tra xem một chuỗi có phải là palindrome (chuỗi đối xứng) hay không.
Xây dựng một chương trình đơn giản để mã hóa/giải mã một chuỗi sử dụng phương pháp Caesar cipher.
Tuần 4:
Ngày 12:
Error Handling: Tìm hiểu về khái niệm lỗi trong lập trình
panic!
: Cách xử lý lỗi không thể khôi phục bằngpanic!
Bài tập:
Viết chương trình cố tình gây ra lỗi
panic!
và quan sát kết quả.Tìm hiểu về backtrace và cách nó giúp gỡ lỗi khi xảy ra
panic!
.Viết một hàm tính căn bậc hai của một số, sử dụng
panic!
để xử lý trường hợp số âm.
Ngày 13:
Error Handling: Xử lý lỗi có thể khôi phục bằng
Result
Các phương thức của
Result
:unwrap
,expect
,map
,and_then
Bài tập:
Viết lại hàm tính căn bậc hai ở ngày 12 sử dụng
Result
để xử lý lỗi.Tạo một hàm đọc nội dung của một tệp tin và trả về
Result
.Xử lý lỗi khi mở tệp tin không tồn tại hoặc đọc tệp tin bị lỗi.
Ngày 14:
Generic Types: Viết code tổng quát, làm việc với nhiều kiểu dữ liệu
Traits: Định nghĩa hành vi chung cho các kiểu dữ liệu
Bài tập:
Viết một hàm generic tính tổng các phần tử trong một slice hoặc vector.
Tạo một trait
Summary
với phương thứcsummarize
và implement cho các kiểu dữ liệuNewsArticle
vàTweet
.Sử dụng trait bound để viết hàm in ra bản tóm tắt của một item bất kỳ implement trait
Summary
.
Ngày 15:
Lifetimes: Đảm bảo tính hợp lệ của tham chiếu
unsafe Rust
: Giới thiệu vềunsafe Rust
và các quy tắc cần tuân thủBài tập:
Tìm hiểu về các lỗi liên quan đến lifetime và cách khắc phục.
Viết một hàm nhận vào hai tham chiếu và trả về tham chiếu có giá trị lớn hơn, đảm bảo tính hợp lệ của tham chiếu.
Đọc và tìm hiểu về một số ví dụ sử dụng
unsafe Rust
trong thư viện chuẩn hoặc các dự án mã nguồn mở.
Tuần 5:
Ngày 16:
Unit Test: Kiểm tra từng đơn vị mã nguồn (hàm, struct)
Cách viết và chạy unit test trong Rust
Bài tập:
Viết unit test cho hàm tính căn bậc hai đã tạo trước đó.
Viết unit test cho các phương thức của struct
Rectangle
.Tìm hiểu về các thuộc tính (attribute) của test như
#[test]
,#[should_panic]
,#[ignore]
.
Ngày 17:
Integration Test: Kiểm tra sự tương tác giữa các thành phần của chương trình
Cách viết và chạy integration test trong Rust
Bài tập:
Viết integration test cho chương trình dòng lệnh đã tạo trước đó.
Viết integration test cho chương trình đọc ghi tệp tin.
Tìm hiểu về cách sử dụng mock object trong integration test.
Ngày 18:
I/O Project: Ôn tập kiến thức về input/output trong Rust
Đọc ghi tệp tin, làm việc với stdin/stdout
Bài tập:
Viết chương trình đọc nội dung của một tệp tin và in ra màn hình.
Tạo một chương trình sao chép nội dung của một tệp tin sang một tệp tin khác.
Xây dựng một chương trình dòng lệnh đơn giản để quản lý danh sách công việc (todo list).
Ngày 19:
Thư viện chuẩn của Rust (std): Tìm hiểu về các module quan trọng trong thư viện chuẩn
std::fs
,std::io
,std::collections
,std::env
Bài tập:
Sử dụng
std::fs
để liệt kê các tệp tin trong một thư mục.Sử dụng
std::io
để đọc ghi dữ liệu từ bàn phím và màn hình.Sử dụng
std::env
để lấy các biến môi trường.
Tuần 6:
Ngày 20:
Functional Programming: Giới thiệu về lập trình hàm trong Rust
Iterators: Duyệt qua các phần tử của một tập hợp
Bài tập:
Sử dụng iterator để tính tổng các phần tử trong một vector.
Tạo một iterator tùy chỉnh để sinh ra các số Fibonacci.
Tìm hiểu về các adapter (map, filter, etc.) và consumer (collect, for_each, etc.) của iterator.
Ngày 21:
Closures: Hàm ẩn danh, có thể lưu trữ trạng thái
Bài tập:
Viết một closure để sắp xếp một vector theo thứ tự tăng dần.
Sử dụng closure để lọc các phần tử chẵn trong một vector.
Tìm hiểu về cách closure capture biến từ môi trường xung quanh.
Ngày 22:
Cargo: Trình quản lý package của Rust
Tạo, build, và chạy project với Cargo
Bài tập:
Tạo một project Cargo mới và thêm một dependency từ crates.io.
Tìm hiểu về cấu trúc của tệp
Cargo.toml
.Sử dụng Cargo để chạy test và build project ở chế độ release.
Ngày 23:
Tuần 7:
Ngày 24:
Async/Await: Tìm hiểu về lập trình bất đồng bộ trong Rust
Khái niệm Future, async fn, await
Bài tập:
Viết một chương trình bất đồng bộ để tải xuống nhiều tệp tin cùng lúc.
Sử dụng async/await để tạo một chương trình kiểm tra trạng thái của nhiều website.
Tìm hiểu về các executor phổ biến trong Rust (Tokio, async-std).
Ngày 25:
Tokio: Framework bất đồng bộ phổ biến nhất trong Rust
Tìm hiểu về các thành phần cơ bản của Tokio (runtime, task, channel)
Bài tập:
Sử dụng Tokio để xây dựng một máy chủ TCP đơn giản.
Sử dụng Tokio để tạo một chương trình client/server giao tiếp qua TCP.
Tìm hiểu về cách sử dụng Tokio để xử lý timeout và cancellation.
Ngày 26:
Serde: Thư viện phổ biến để tuần tự hóa/giải tuần tự hóa dữ liệu (JSON, YAML, etc.)
Cách sử dụng Serde để làm việc với các định dạng dữ liệu khác nhau
Bài tập:
Sử dụng Serde để đọc và ghi dữ liệu JSON từ/vào tệp tin.
Sử dụng Serde để tuần tự hóa/giải tuần tự hóa các struct tùy chỉnh.
Tìm hiểu về cách tùy chỉnh quá trình tuần tự hóa/giải tuần tự hóa với Serde.
Ngày 27:
Regex: Thư viện để làm việc với biểu thức chính quy (regular expression)
Cách sử dụng Regex để tìm kiếm, khớp, và thay thế chuỗi
Bài tập:
Sử dụng Regex để kiểm tra định dạng email.
Sử dụng Regex để trích xuất thông tin từ một đoạn văn bản.
Tìm hiểu về các tính năng nâng cao của Regex (ví dụ: lookahead, lookbehind).
Ngày 28:
Clap: Thư viện để xây dựng giao diện dòng lệnh (CLI)
Cách sử dụng Clap để định nghĩa các tùy chọn và argument cho chương trình
Bài tập:
Sử dụng Clap để tạo một chương trình CLI đơn giản.
Sử dụng Clap để tạo một chương trình CLI có nhiều subcommand.
Tìm hiểu về cách sử dụng Clap để xác thực đầu vào của người dùng.
Tuần 8:
Ngày 29:
FFI: Gọi các hàm từ các ngôn ngữ khác (như C)
Cách sử dụng FFI để tương tác với các thư viện không phải Rust
Bài tập:
Sử dụng FFI để gọi một hàm C đơn giản.
Sử dụng FFI để làm việc với một thư viện C phức tạp hơn (ví dụ: thư viện xử lý ảnh).
Tìm hiểu về cách xử lý các vấn đề về an toàn bộ nhớ khi sử dụng FFI.
Ngày 30:
Các công cụ hữu ích cho automation:
xsv
: Công cụ dòng lệnh mạnh mẽ để làm việc với các tệp CSVripgrep
: Công cụ tìm kiếm nhanh chóng và mạnh mẽfd
: Công cụ tìm kiếm tệp tin thay thế chofind
bat
: Công cụ xem nội dung tệp tin với syntax highlighting
Bài tập:
Sử dụng
xsv
để lọc, chuyển đổi, và phân tích dữ liệu CSV.Sử dụng
ripgrep
để tìm kiếm các đoạn mã trong dự án của bạn.Sử dụng
fd
vàbat
để tìm và xem nội dung các tệp tin một cách nhanh chóng và thuận tiện.
Ngày 31:
Nghiên cứu và thiết kế:
Tìm hiểu về cách Rust quản lýdependency thông qua
Cargo.toml
vàCargo.lock
.Nghiên cứu các thư viện Rust hỗ trợ làm việc với Cargo (ví dụ:
cargo-edit
,cargo-outdated
).Thiết kế cấu trúc dự án và các tính năng chính của công cụ (ví dụ: kiểm tra phiên bản mới, tự động cập nhật, tạo báo cáo).
Bài tập:
Đọc tài liệu về Cargo và các thư viện liên quan.
Lập danh sách các tính năng mong muốn của công cụ.
Vẽ sơ đồ cấu trúc dự án.
Ngày 32:
Xây dựng chức năng kiểm tra dependency:
Sử dụng
cargo metadata
hoặc các thư viện liên quan để lấy thông tin về các dependency hiện tại của dự án.So sánh phiên bản hiện tại với phiên bản mới nhất trên crates.io.
Hiển thị danh sách các dependency cần cập nhật.
Bài tập:
Viết hàm lấy thông tin về các dependency từ
Cargo.toml
.Viết hàm kiểm tra phiên bản mới nhất của một dependency trên crates.io.
Hiển thị danh sách các dependency cần cập nhật ra màn hình.
Ngày 33:
Xây dựng chức năng cập nhật dependency:
Sử dụng
cargo update
hoặc các thư viện liên quan để cập nhật các dependency.Xử lý các trường hợp xung đột phiên bản.
Tạo bản backup của
Cargo.lock
trước khi cập nhật.Bài tập:
Viết hàm cập nhật một dependency lên phiên bản mới nhất.
Xử lý trường hợp cập nhật không thành công (ví dụ: xung đột phiên bản).
Thêm tùy chọn cho phép người dùng chọn các dependency cần cập nhật.
Ngày 34:
Hoàn thiện và tối ưu hóa:
Thêm các tính năng bổ sung (ví dụ: tạo báo cáo, tùy chọn cấu hình).
Tối ưu hóa hiệu suất của công cụ.
Viết test để đảm bảo tính đúng đắn của công cụ.
Bài tập:
Thêm tính năng tạo báo cáo về các dependency đã cập nhật.
Tối ưu hóa tốc độ kiểm tra và cập nhật dependency.
Viết unit test và integration test cho các chức năng chính của công cụ.
Ngày 35:
Triển khai và chia sẻ:
Lưu ý:
- Hãy tham khảo các dự án tương tự (ví dụ:
cargo-outdated
,cargo-update
) để có thêm ý tưởng và học hỏi kinh nghiệm.