Product Management
Đăng nhập
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Bài 3 — Chia nhỏ công việc: từ đại dự án thành các lô agent xử lý được

Đã đọc 0/10 mục · còn khoảng 3 phút
Cách chúng tôi ghi nhận

Một mục được tính là đã đọc khi nó nằm giữa màn hình đủ lâu so với độ dài của nó (bảng và sơ đồ tính một nửa), bạn vẫn đang cuộn hoặc bấm phím, và bạn đã thấy tới cuối mục. Lướt nhanh hoặc để tab mở không được tính. Chúng tôi chỉ lưu thời gian đọc từng mục — không lưu gì khác.

Kẻ thù số một của refactor bằng agent là cửa sổ ngữ cảnh. Bạn không thể nhét 800 file vào một prompt. Nghệ thuật ở đây là chia đại dự án thành các lô (batch) vừa với context, mỗi lô độc lập verify được, và tổng các lô = toàn bộ công việc. Chia sai thì agent quên đầu quên đuôi, kết quả không nhất quán.

Nguyên tắc chia lô

Một lô tốt có 3 tính chất:

  • Vừa context: đủ nhỏ để agent đọc hết file liên quan + hướng dẫn trong một lần (thường 5–15 file, hoặc một module).
  • Độc lập verify: sau khi làm xong lô, chạy verify gate mà không phụ thuộc lô khác.
  • Có ranh giới tự nhiên: theo thư mục/module/tầng, không cắt ngang một dependency chặt.

Ba chiến lược chia phổ biến

A. Chia theo module/thư mục

Phù hợp khi codebase tách module rõ. Ví dụ migrate mỗi thư mục một lô:

src/auth/      -> lô 1
src/billing/   -> lô 2
src/dashboard/ -> lô 3

B. Chia theo tầng (leaf-first)

Migrate từ lá lên gốc theo đồ thị phụ thuộc: đổi util trước, rồi component dùng util, rồi page dùng component. Cách này giảm việc phải sửa lại (rework) vì lớp dưới đã ổn định khi bạn động tới lớp trên.

date-utils.ts (lá, không ai phụ thuộc ngược) -> lô đầu
components dùng date-utils                   -> lô giữa
pages dùng components                        -> lô cuối

C. Chia theo độ khó (đã phân loại ở Bài 1)

Làm hết lô "đơn giản" bằng khuôn mẫu chốt cứng để lấy đà và validate khuôn mẫu, rồi mới tới lô "khó" cần review người.

Manifest — trái tim của việc chia lô

Tạo một file manifest liệt kê mọi lô kèm trạng thái. Đây là bộ nhớ ngoài giúp bạn (và agent) không lạc:

{
  "goal": "migrate moment -> date-fns",
  "done_when": "grep -r 'from .moment.' src = 0 && verify OK",
  "batches": [
    {"id": 1, "scope": "src/utils",   "files": 6,  "status": "done"},
    {"id": 2, "scope": "src/auth",    "files": 11, "status": "done"},
    {"id": 3, "scope": "src/billing", "files": 14, "status": "in_progress"},
    {"id": 4, "scope": "src/reports", "files": 22, "status": "todo"}
  ]
}

Các bước dựng kế hoạch chia lô

  • Liệt kê toàn bộ vùng ảnh hưởng: grep -rl "from 'moment'" src > affected.txt.
  • Nhóm theo ranh giới tự nhiên (module hoặc tầng phụ thuộc).
  • Ước lượng kích thước mỗi lô; lô nào >20 file thì cân nhắc tách đôi.
  • Sắp thứ tự: leaf-first, hoặc dễ-trước để lấy khuôn mẫu.
  • Ghi tất cả vào manifest với trạng thái todo.
  • Làm 1 lô pilot, chốt khuôn mẫu, cập nhật hướng dẫn cho các lô sau.

Khung ước lượng kích thước lô

Số file trong lô  x  độ phức tạp trung bình mỗi file
  <= "ngân sách context" (đọc file + hướng dẫn + code sinh ra)

Dấu hiệu lô quá to: agent bắt đầu quên yêu cầu ban đầu,
hoặc bỏ sót file, hoặc pattern giữa các file lệch nhau.

Sai lầm thường gặp

  • Lô quá to: agent hết context giữa chừng, làm nửa vời, pattern lệch.
  • Cắt ngang dependency chặt: lô A sửa hàm mà lô B đang dùng bản cũ → verify lô B đỏ giả tạo.
  • Không có manifest: sau 3 ngày bạn quên lô nào xong, làm lại chồng chéo hoặc bỏ sót.
  • Chia theo số file cứng nhắc (mỗi lô đúng 10 file) thay vì theo ranh giới ngữ nghĩa → phá vỡ tính độc lập.
  • Bỏ qua lô pilot: nhân rộng ngay một khuôn mẫu chưa được kiểm chứng, sai thì sai cả loạt.
Đã chia được lô độc lập, bài sau ta khai thác chúng để chạy song song bằng git worktree, tăng tốc mà không giẫm chân nhau.

Học xong bài này rồi? Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu, và học hết khóa thì có chứng chỉ. Lưu tiến độ của tôi