Nỗi ám ảnh mang tên ‘chờ đợi’ khi Linting và Formatting
Nếu bạn đang quản lý một dự án Python lớn, chắc hẳn kịch bản này rất quen thuộc: Viết code xong, nhấn Save, rồi ngồi đợi 3-5 giây để Black format lại code. Tiếp theo là chạy CI/CD và mất thêm vài phút chỉ để Flake8 kiểm tra lỗi logic.
Hồi mới làm dự án quy mô hàng trăm file, mình từng coi việc đợi chờ này là hiển nhiên. Nhưng sau 6 tháng chuyển hẳn sang Ruff trên môi trường production, mình nhận ra mình đã lãng phí quá nhiều thời gian. Ruff không chỉ là một công cụ mới. Nó thay đổi hoàn toàn cách chúng ta duy trì chất lượng code nhờ sức mạnh của ngôn ngữ Rust.
Tại sao bạn nên dẹp bỏ các công cụ cũ để dùng Ruff?
1. Tốc độ thực sự khủng khiếp
Ruff nhanh đến mức khó tin. Theo các bài benchmark chính thức, nó nhanh hơn Flake8 từ 10 đến 100 lần. Trong thực tế, với một repo khoảng 500 file, Flake8 mất gần 10 giây để hoàn tất, còn Ruff chỉ tốn đúng 0.18 giây. Cảm giác bấm Ctrl + S và thấy code nhảy về đúng format ngay lập tức thực sự rất gây nghiện.
2. Gom tất cả về một mối (All-in-one)
Trước đây, file cấu hình của mình thường lỉnh kỉnh đủ thứ: .flake8, pyproject.toml (cho Black), rồi .isort.cfg. Ruff giải quyết triệt để sự cồng kềnh này. Chỉ với một công cụ duy nhất, bạn có thể thay thế hoàn toàn cho:
- Flake8: Kiểm tra lỗi logic và style code.
- Black: Tự động format code theo chuẩn.
- isort: Sắp xếp các dòng import ngăn nắp.
- pyupgrade: Tự động nâng cấp syntax lên phiên bản Python mới nhất.
3. Khả năng tự động sửa lỗi (Autofix) thông minh
Ruff không chỉ đứng ngoài “chỉ tay năm ngón”. Nó có khả năng tự sửa cực nhiều lỗi phổ biến. Chỉ cần thêm flag --fix, Ruff sẽ tự xóa các import dư thừa, sửa lại các biến chưa sử dụng hoặc chuyển đổi syntax cũ sang Python 3.10+. Khoảng 80% cảnh báo sẽ biến mất mà bạn không cần chạm tay vào bàn phím.
Hướng dẫn triển khai Ruff vào dự án thực tế
Để bắt đầu, bạn không cần phải xóa bỏ mọi thứ ngay lập tức. Hãy cài đặt và trải nghiệm song song theo các bước dưới đây.
Bước 1: Cài đặt siêu đơn giản
Bạn có thể cài đặt qua pip hoặc các trình quản lý package như Poetry:
pip install ruff
Nếu bạn dùng macOS và muốn sử dụng cho mọi dự án trên máy:
brew install ruff
Bước 2: Cấu hình tập trung trong pyproject.toml
Mình luôn khuyến khích anh em đưa cấu hình vào pyproject.toml. Cách này giúp dự án gọn gàng hơn nhiều. Đây là bộ config mình đang áp dụng cho các dự án thực tế:
[tool.ruff]
line-length = 88
target-version = "py311"
[tool.ruff.lint]
# E, F: Flake8 cơ bản
# I: isort (sắp xếp import)
# B: flake8-bugbear (tìm lỗi logic tiềm ẩn)
# UP: pyupgrade (nâng cấp syntax)
select = ["E", "F", "I", "B", "UP", "N"]
ignore = ["E501"] # Để formatter tự xử lý dòng dài
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
Bước 3: Các lệnh điều khiển cần nhớ
Để quét lỗi toàn bộ dự án, hãy gõ:
ruff check .
Để vừa quét vừa tự động sửa lỗi (như xóa import thừa):
ruff check . --fix
Và để format code (thay thế hoàn toàn cho Black):
ruff format .
Kinh nghiệm thực chiến: Đừng bỏ qua bước này
Một mẹo nhỏ khi làm việc với các rule phức tạp của Ruff, đặc biệt là lỗi liên quan đến chuỗi Regex: Đôi khi Ruff sẽ báo lỗi escape sequence nếu bạn viết regex không chuẩn. Kinh nghiệm của mình là hãy test nhanh pattern tại toolcraft.app/vi/tools/developer/regex-tester trước khi đưa vào code. Việc này giúp bạn xác định xem lỗi nằm ở logic regex hay do cấu hình Ruff đang quá khắt khe.
Tích hợp vào VS Code để code “mượt” hơn
Hãy cài extension Ruff chính chủ của Astral. Sau đó, thêm đoạn sau vào settings.json để mỗi lần nhấn Save, code của bạn sẽ tự động sạch đẹp:
{
"[python]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit",
"source.organizeImports.ruff": "explicit"
}
}
}
Tối ưu CI/CD với GitHub Actions
Vì Ruff cực nhẹ, nó giúp tiết kiệm đáng kể thời gian chạy pipeline. Dưới đây là snippet mình hay dùng, chỉ mất vài giây để hoàn tất kiểm tra cho mỗi lần Pull Request:
name: Lint
on: [push, pull_request]
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/ruff-action@v1
with:
args: "check ."
Lời kết: Có nên chuyển đổi ngay hôm nay?
Nếu bạn bắt đầu dự án mới, đừng chần chừ: Hãy dùng Ruff ngay từ đầu. Nó giúp môi trường phát triển sạch sẽ và nhanh hơn gấp nhiều lần.
Đối với các dự án cũ đang chạy ổn định, bạn có thể chuyển đổi dần dần. Ruff cung cấp lệnh ruff check --add-noqa để tự động gắn tag bỏ qua các lỗi tồn đọng. Nhờ đó, bạn có thể áp dụng Ruff ngay mà không phải đi sửa thủ công hàng nghìn dòng code cũ.
Tin mình đi, một khi đã quen với tốc độ của Rust, bạn sẽ không bao giờ muốn quay lại thời kỳ ngồi chờ Black hay Flake8 chạy nữa đâu.

