Refactor legacy code với AI
Codebase 3 năm tuổi. Nợ kỹ thuật chồng chất.
Tôi dùng AI để refactor trong 2 tuần.
Đây là quy trình thật.
Bối cảnh
- Codebase: Node.js backend
- Kích thước: ~50k dòng
- Vấn đề: Patterns không nhất quán, không có types, code rối
- Mục tiêu: Dọn dẹp để dễ bảo trì
Tuần 1: Hiểu và lên kế hoạch
Ngày 1-2: Kiểm toán code với AI
Prompt:
Đây là cấu trúc của codebase:
[dán folder tree]
Đây là file chính:
[dán main files]
Phân tích:
1. Các architecture patterns đang dùng
2. Những điểm không nhất quán
3. Vấn đề tiềm ẩn
4. Các khu vực ưu tiên refactor
Kết quả: Danh sách vấn đề, đã sắp ưu tiên.
Ngày 3: Kế hoạch refactor
Với AI, tôi tạo kế hoạch:
Dựa trên phân tích, đây là ưu tiên refactor:
[danh sách từ ngày 1-2]
Ràng buộc:
- Không phá vỡ chức năng hiện có
- Có thể làm dần dần
- Quy mô team: 1 (tôi)
- Thời hạn: 2 tuần
Tạo kế hoạch refactor với thứ tự và phụ thuộc.
Tuần 1: Thắng lợi nhanh
Ngày 4-5: Định dạng nhất quán
Dễ nhất, tác động lớn.
- Thêm ESLint + Prettier
- Tự động sửa tất cả
- Commit
AI giúp: File config, giải quyết xung đột.
Ngày 6-7: Thêm TypeScript dần dần
Không chuyển đổi cả codebase.
Bắt đầu với:
- File mới = TypeScript
- Định nghĩa shared types
- Dần chuyển đổi các file quan trọng
Prompt cho việc chuyển đổi:
Chuyển file JavaScript này sang TypeScript:
[dán code]
Yêu cầu:
- Chế độ strict
- Types đúng cách (không any trừ khi cần thiết)
- Giữ nguyên chức năng
- Thêm JSDoc comments cho public functions
Tuần 2: Thay đổi cấu trúc
Ngày 8-9: Trích xuất patterns
Tìm code trùng lặp:
Đây là 3 files có logic tương tự:
[dán files]
1. Xác định logic trùng lặp
2. Đề xuất cách trích xuất thành shared function
3. Hiển thị trước/sau
Trích xuất → Test → Commit.
Ngày 10-11: Dọn dẹp dependencies
Circular dependencies là ác mộng.
Đây là dependency graph:
[dán hoặc mô tả]
Có circular dependencies.
Đề xuất cách tái cấu trúc để loại bỏ.
Ngày 12-14: Bù đắp tests
Thêm tests cho các đường quan trọng.
AI sinh test cases:
Đây là function:
[dán function]
Sinh unit tests bao gồm:
- Đường đi đẹp
- Trường hợp biên
- Các tình huống lỗi
Framework: Jest
Phong cách: Arrange-Act-Assert
Cạm bẫy gặp phải
Cạm bẫy 1: AI không hiểu toàn bộ ngữ cảnh
AI chỉ thấy code tôi dán.
Không biết các phần nối với nhau thế nào.
Giải pháp: Giải thích ngữ cảnh rõ ràng mỗi prompt.
Cạm bẫy 2: Refactor quá mạnh tay
AI đề xuất thay đổi lớn.
Nhưng thay đổi lớn = rủi ro lớn.
Giải pháp: Thay đổi nhỏ, dần dần. Test sau mỗi lần.
Cạm bẫy 3: Tin nhưng phải xác minh
Code AI sinh trông ổn.
Nhưng có lỗi tinh vi.
Giải pháp: Review cẩn thận. Test kỹ lưỡng.
Kết quả
- Dòng thay đổi: ~15k
- Tests thêm: 200+
- Nợ kỹ thuật: Giảm ~60%
- Thời gian: 2 tuần (so với ước tính 2 tháng nếu làm tay)
Bài học chính
1. AI tăng tốc, không thay thế
Vẫn cần:
- Hiểu biết về codebase
- Đưa ra quyết định
- Testing
- Review
AI giúp với:
- Boilerplate
- Nhận dạng patterns
- Đề xuất
2. Dần dần tốt hơn đại tu
Thay đổi nhỏ, test riêng lẻ.
Không bao giờ refactor tất cả cùng lúc.
3. Viết tài liệu trong lúc làm
Tôi trong tương lai sẽ cảm ơn.
AI giúp sinh tài liệu từ code.
Mẫu prompt tôi dùng
Phân tích code
Phân tích code này về [khía cạnh cụ thể].
Ngữ cảnh: [code này làm gì]
Đang tìm: [muốn tìm gì]
Refactoring
Refactor code này để [mục tiêu].
Ràng buộc: [danh sách]
Giữ nguyên: [cái gì không được đổi]
Sinh code
Sinh [cái gì] để [làm gì].
Phong cách: [coding style]
Bao gồm: [yêu cầu]
Mẫu refactoring và prompts đầy đủ có trong Tony’s Friends VIP.