720 tests: tôi đã tối ưu hoá từ 9 giờ xuống còn 1 giờ
Chào anh em! Có bao giờ anh em rơi vào cảnh: Viết xong bộ Automation "xịn xò", hí hửng bấm Run rồi... đi ngủ một giấc, sáng dậy nó vẫn chưa chạy xong không?
Đó chính là câu chuyện của mình tuần trước. Và đây là cách mình đã "hack" thời gian để lấy lại 8 tiếng tự do mỗi ngày.
Nỗi đau mang tên "9 tiếng đợi chờ"
Mình đang làm con Node.js Quickstart Generator. Anh em tưởng tượng, nó có 720 tổ hợp (MySQL, MongoDB, TS, JS, Kafka...). Để test hết, mình phải:
- Generate project.
npm install(Cái này là "trùm" cuối gây lag).- Chạy test.
Kết quả? 9 TIẾNG! CI/CD của mình khóc thét, máy tính của mình thì nóng như lò sưởi.

Tư duy: Làm việc thông minh, đừng chỉ làm việc chăm chỉ
Mình nhận ra: Tại sao phải tải đi tải lại express, jest, typescript tận 720 lần? Chúng có khác gì nhau đâu?
Keyword ở đây là: BASE CACHE.
Bước 1: Gom nhóm "anh em cùng cha khác ông nội"
Dù 720 project, nhưng thực tế chúng chỉ thuộc về 8 nhóm chính (Ví dụ: TypeScript + MySQL). Mình tạo sẵn một folder node_modules mẫu cho mỗi nhóm này.
Bước 2: Kỹ thuật "Copy & Patch"
Thay vì bắt script chạy npm install từ con số 0, mình sử dụng logic cực kỳ hiệu quả này,
code mẫu: https://github.com/paudang/nodejs-quickstart-structure/blob/feature/oauht2-google-github/scripts/lib/validation-core.js#L500
// 1. Xác định Base Cache dựa trên ngôn ngữ và DB
const baseHashKey = `${config.language}_${config.database}`;
const cachePath = path.join(testDir, `node_modules_base_${baseHashKey}`);
// 2. Nếu đã có cache, copy nó chỉ mất ~2 giây
let usedCache = false;
if (await fs.pathExists(cachePath)) {
await fs.copy(cachePath, path.join(projectPath, 'node_modules'));
usedCache = true;
}
// 3. Chạy npm install (Nếu có cache thì dùng --prefer-offline để cài delta cực nhanh)
const npmCmd = usedCache
? 'npm install --prefer-offline --no-audit'
: 'npm install --no-audit';
await runCommand(npmCmd, projectPath);
// 4. Lưu lại cache nếu đây là lần đầu tiên cài đặt
if (!usedCache) {
await fs.copy(path.join(projectPath, 'node_modules'), cachePath);
}
Kết quả: npm sẽ thấy 95% library đã có sẵn. Nó chỉ tải thêm vài cái râu ria cụ thể cho project đó thôi.
Những con số "biết nói"

Sau khi áp dụng chiêu này, mình đã sốc:
- Thời gian: 9 tiếng ➡️ 1 tiếng (Giảm 800%!).
- Dung lượng: Nếu cache từng project thì tốn 80GB, giờ chỉ tốn 1.2GB.
- Productivity: Mình có thể test lại toàn bộ hệ thống ngay sau mỗi lần sửa bug nhỏ.
Bài học rút ra cho anh em Dev
- Tìm nút thắt (Bottleneck): Đừng tối ưu code lung tung khi cái chậm nhất là I/O và Network.
- Reuse everything: Cái gì giống nhau thì đừng làm lại.
- Scale Mindset: Khi làm Automation, luôn tự hỏi: "Nếu chạy 1000 lần thì sao?".
Anh em có chiêu nào tối ưu script hay hơn không? Cùng thảo luận ở comment nhé! 👇
Nếu thấy bài viết hữu ích, đừng quên cho mình 1 Upvote để mình có động lực chia sẻ tiếp nhé! ✌️
All rights reserved