Có một câu nói nổi tiếng trong giới lập trình: "Code chạy được thì ai cũng viết được. Viết code để người khác hiểu được mới là khó." Đó chính xác là bản chất của Clean Code.
Cuốn sách "Clean Code" của Robert C. Martin (Uncle Bob) xuất bản năm 2008 đã trở thành "kinh thánh" của nhiều lập trình viên. Nhưng bạn không cần đọc cả cuốn sách dày để bắt đầu — dưới đây là những nguyên tắc cốt lõi nhất, được trình bày đơn giản nhất có thể.
1. Clean Code là gì và tại sao cần thiết?
Clean Code là code được viết theo cách dễ đọc, dễ hiểu, dễ bảo trì — không chỉ cho người viết ra nó mà còn cho toàn bộ team. Code sạch không có nghĩa là code ngắn nhất hay code chạy nhanh nhất, mà là code truyền đạt ý định rõ ràng nhất.
Thực tế trong công việc, lập trình viên dành tới 70-80% thời gian để đọc code (của người khác hoặc của chính mình từ 3 tháng trước) và chỉ 20-30% để viết mới. Code bẩn (dirty code) làm chậm toàn bộ quá trình đó, dẫn đến bug nhiều hơn, onboard nhân viên mới khó hơn và chi phí bảo trì cao hơn.
2. Đặt tên có ý nghĩa — Nguyên tắc quan trọng nhất
Tên biến, hàm, class là "ngôn ngữ giao tiếp" của bạn với người đọc code. Một cái tên tốt có thể thay thế hoàn toàn cho một dòng comment.
❌ Code bẩn:
javascript
let d = 7;
function calc(x, y) {
return x * y * d;
}✅ Code sạch:
javascript
const DAYS_IN_WEEK = 7;
function calculateWeeklySalary(dailyRate, hoursPerDay) {
return dailyRate * hoursPerDay * DAYS_IN_WEEK;
}Cùng một logic, nhưng phiên bản sạch tự giải thích được nó đang làm gì mà không cần một dòng comment nào.
Một số quy tắc đặt tên cơ bản:
Biến và hàm dùng camelCase:
getUserById,totalPriceHằng số dùng UPPER_SNAKE_CASE:
MAX_RETRY_COUNTTên hàm bắt đầu bằng động từ:
getUser,createOrder,isValidEmailTránh tên chung chung vô nghĩa:
data,info,temp,x,foo
3. Hàm nhỏ — làm một việc duy nhất
Nguyên tắc Single Responsibility (Trách nhiệm đơn lẻ) nói rằng mỗi hàm chỉ nên làm đúng một việc. Nếu bạn phải dùng từ "và" để mô tả hàm đó làm gì, đó là dấu hiệu cần tách ra.
❌ Hàm làm quá nhiều việc:
javascript
function processUser(user) {
// Validate
if (!user.email || !user.name) return false;
// Format
user.name = user.name.trim().toLowerCase();
// Save to DB
db.save(user);
// Send email
emailService.sendWelcome(user.email);
}✅ Tách ra từng hàm nhỏ:
javascript
function validateUser(user) { ... }
function formatUser(user) { ... }
function saveUser(user) { ... }
function sendWelcomeEmail(email) { ... }Hàm nhỏ dễ test, dễ tái sử dụng và khi có bug bạn biết ngay vấn đề nằm ở đâu.
4. Comment đúng chỗ — đừng lạm dụng
Nhiều người mới có thói quen comment mọi thứ. Thực ra, comment tốt nhất là không cần comment — vì code đã đủ rõ ràng để tự giải thích. Comment chỉ nên xuất hiện khi bạn cần giải thích tại sao (why), không phải làm gì (what).
❌ Comment thừa:
javascript
// Tăng i lên 1
i++;
// Kiểm tra xem user có tồn tại không
if (user) { ... }✅ Comment có giá trị:
javascript
// Dùng indexOf thay vì includes vì cần hỗ trợ IE11
const found = arr.indexOf(item) !== -1;
// Timeout 3s theo yêu cầu từ team backend (ticket #2341)
setTimeout(retry, 3000);5. Tránh số ma thuật (Magic Numbers)
Magic Numbers là những con số xuất hiện trực tiếp trong code mà không có giải thích, khiến người đọc phải đoán ý nghĩa.
❌ Magic number:
javascript
if (user.role === 2) { ... }
if (password.length < 8) { ... }
setTimeout(refresh, 86400000);✅ Đặt tên rõ ràng:
javascript
const ROLE_ADMIN = 2;
const MIN_PASSWORD_LENGTH = 8;
const ONE_DAY_MS = 86400000;
if (user.role === ROLE_ADMIN) { ... }
if (password.length < MIN_PASSWORD_LENGTH) { ... }
setTimeout(refresh, ONE_DAY_MS);6. DRY — Don't Repeat Yourself
Nếu bạn thấy mình copy-paste một đoạn code sang chỗ khác, đó là lúc nên tách ra thành hàm dùng chung. Code lặp lại đồng nghĩa với việc khi cần sửa, bạn phải nhớ sửa ở tất cả mọi nơi — rất dễ bỏ sót và sinh ra bug.
7. Bắt đầu thực hành Clean Code như thế nào?
Đừng cố gắng viết clean code hoàn hảo ngay từ lần đầu — điều đó không thực tế. Thay vào đó, hãy áp dụng quy tắc "Boy Scout": Mỗi lần bạn chạm vào một đoạn code, hãy để nó sạch hơn một chút so với lúc bạn tìm thấy nó.
Một số bước nhỏ để bắt đầu ngay hôm nay:
Đặt tên lại những biến mơ hồ khi bạn đọc qua chúng
Tách hàm dài ra khi bạn thấy nó làm nhiều hơn một việc
Xóa code comment out (code bị comment lại) — nếu cần thì có Git lưu lịch sử rồi
Cài ESLint hoặc Prettier để tự động format code đồng nhất
Kết luận
Clean Code là kỹ năng phân biệt một lập trình viên tốt với một lập trình viên xuất sắc. Nó không phải là tài năng bẩm sinh mà là thói quen được xây dựng dần dần qua từng dòng code bạn viết mỗi ngày. Bắt đầu từ những nguyên tắc nhỏ nhất — đặt tên rõ ràng, hàm nhỏ, tránh lặp lại — và bạn sẽ thấy chất lượng code của mình cải thiện rõ rệt chỉ sau vài tuần.