Sự bất tiện của các thiết lập mặc định
Tôi đã dành giờ đầu tiên sử dụng Claude Code chỉ để nhấn phím ‘y’ một cách thủ công. Lúc đó tôi đang làm việc trên một dự án Node.js cũ với hơn 2.000 tệp và một luồng build (build pipeline) cực kỳ phức tạp. Nếu bạn đã từng sử dụng công cụ CLI của Anthropic, bạn sẽ biết quy trình làm việc: nó có thể refactor các hàm, chạy kiểm thử và sửa lỗi trực tiếp ngay trong terminal của bạn. Nhưng trải nghiệm mặc định ban đầu lại gây ra khá nhiều rào cản.
Mỗi khi tôi yêu cầu Claude chạy lệnh ls hoặc grep đơn giản, nó đều dừng lại để xin phép. Nó mặc định sử dụng Claude 3.5 Sonnet—vốn có chi phí 3,00 đô la cho mỗi triệu token đầu vào—ngay cả đối với các tác vụ viết tài liệu tầm thường mà Haiku có thể xử lý chỉ với 0,25 đô la. Việc phải nhập thủ công --model claude-3-5-haiku hoặc --yes cho mỗi lần tương tác nhanh chóng trở thành tác nhân làm gián đoạn đà làm việc.
Tại sao các tham số dòng lệnh là chưa đủ
Theo mặc định, Claude Code hoạt động với tư duy đặt an toàn lên hàng đầu một cách nghiêm ngặt. Nó không giả định bất cứ điều gì về môi trường của bạn. Mặc dù việc truyền các tham số (flags) vào lệnh claude có tác dụng đối với các lần sửa lỗi đơn lẻ, nhưng nó không thể mở rộng cho một ngày làm việc tám tiếng.
Việc chỉ dựa vào các tham số CLI tạo ra ba nút thắt cổ chai cụ thể:
- Thiếu nhất quán: Bạn rất dễ quên một tham số an toàn và vô tình để AI ghi đè lên tệp
.env. - Rò rỉ ngân sách: Nếu không có các giới hạn cứng, một vòng lặp đệ quy trong shell script có thể làm cạn kiệt hạn mức API của bạn trước khi bạn kịp uống xong tách cà phê.
- Thiếu hụt ngữ cảnh: AI sẽ không nhớ rằng dự án của bạn sử dụng thụt đầu dòng bằng Tab hoặc các pattern Vitest cụ thể trừ khi bạn nhắc lại điều đó mỗi lần.
Biến môi trường so với settings.json
Bạn có hai cách chính để tùy chỉnh CLI. Cách thứ nhất là thêm các biến môi trường vào tệp .zshrc hoặc .bashrc của bạn. Cách này hoạt động tốt đối với API key, nhưng sẽ trở nên lộn xộn khi bạn cố gắng định nghĩa các hành vi phức tạp hoặc các thư mục bị loại trừ.
Cách tiếp cận bằng settings.json sạch sẽ hơn nhiều. Nó cho phép cấu hình có cấu trúc mà bạn có thể theo dõi trong một repo riêng tư hoặc đồng bộ hóa giữa các máy tính. Nó biến Claude từ một chatbot thông thường thành một công cụ chuyên dụng hiểu rõ ngăn xếp công nghệ (tech stack) cụ thể của bạn. Theo kinh nghiệm của tôi, việc chuyển các cấu hình này vào một tệp riêng biệt giúp giảm khoảng 15 phút thời gian thiết lập mỗi khi tôi chuyển đổi dự án.
Cấu hình tệp settings.json
Trên macOS và Linux, Claude Code tìm kiếm cấu hình tại ~/.claude.json (hoặc một đường dẫn tương tự tùy thuộc vào phiên bản của bạn). Dưới đây là các tham số thực sự ảnh hưởng đến tốc độ làm việc hàng ngày của bạn.
1. Lựa chọn mô hình và kiểm soát chi phí
Không phải lúc nào bạn cũng cần đến khả năng xử lý nặng của Sonnet. Đối với việc đổi tên tệp cơ bản hoặc tạo mã mẫu (boilerplate), Haiku rẻ hơn 12 lần và nhanh hơn đáng kể. Bạn có thể đặt mô hình mặc định để giữ cho chi phí của mình luôn trong tầm kiểm soát.
{
"model": "claude-3-5-haiku-20241022",
"max_tokens_to_sample": 4000,
"temperature": 0
}
Tôi luôn đặt temperature bằng 0 khi lập trình. Điều này đảm bảo kết quả đầu ra có tính nhất quán. Bạn muốn AI tuân theo logic, chứ không phải trở nên “sáng tạo” với cú pháp code production của mình.
2. Tối ưu hóa quyền truy cập
Luồng xác nhận Y/N liên tục là lời phàn nàn lớn nhất của người dùng CLI. Bạn có thể tự động hóa việc này mà không cần trao toàn quyền kiểm soát cho AI. Chiến lược tốt nhất là tự động phê duyệt các hành động chỉ đọc (read-only) trong khi vẫn giữ các lệnh ghi (write) ở chế độ thủ công.
{
"auto_approve": {
"read_files": true,
"list_files": true,
"run_commands": ["ls", "pwd", "git status", "npm test"]
}
}
Bằng cách đưa npm test vào danh sách trắng (whitelist), bạn cho phép AI tự lặp lại các bước sửa lỗi một cách tự chủ. Nó có thể chạy bộ kiểm thử, thấy lỗi và thử lại mà không cần đợi bạn nhấp ‘Allow’ (Cho phép) hàng chục lần.
3. Chỉ dẫn tùy chỉnh (System Prompt)
Đây là nơi bạn định nghĩa “Định nghĩa về sự hoàn thành” (Definition of Done) cho nhóm của mình. Nếu bạn sử dụng lập trình hàm hoặc TypeScript nghiêm ngặt, hãy đưa những yêu cầu đó vào đây để AI không gợi ý các pattern cũ kỹ.
{
"custom_instructions": "Sử dụng arrow function trong TypeScript. Ưu tiên early return để dễ đọc. Sử dụng Vitest cho tất cả unit test. Bỏ qua thư mục /legacy-backup."
}
Tổ chức quy trình làm việc của bạn
Các thiết lập hiệu quả nhất không chỉ sử dụng một tệp cấu hình toàn cục khổng lồ. Tôi thấy rằng cách tiếp cận theo tầng hoạt động tốt nhất cho môi trường chuyên nghiệp.
Cấu hình Toàn cục so với Cấu hình Cục bộ
Giữ các tùy chọn giao diện người dùng của bạn, như "theme": "dark", trong thư mục home toàn cục. Tuy nhiên, hãy sử dụng các cấu hình ghi đè ở cấp độ dự án cho các quy tắc đặc thù của ngôn ngữ. Một AI cần hành xử khác nhau khi nó chuyển từ frontend React sang backend Go.
Bảo vệ Context Window
Claude có thể bị bối rối nếu nó phải đọc 50MB JavaScript đã được nén (minified). Hãy sử dụng mảng ignore_patterns để ẩn các thư mục node_modules, dist và các tệp lockfile lớn. Điều này giữ cho context window sạch sẽ và đảm bảo AI chỉ tập trung vào mã nguồn quan trọng.
Một ví dụ thực tế cho môi trường Production
Đây là cấu hình tôi sử dụng cho các dự án TypeScript hiện đại. Nó ưu tiên tốc độ và ngăn chặn AI đưa ra các thông tin sai lệch (hallucination) trong các thư mục lớn.
{
"model": "claude-3-5-sonnet-20241022",
"max_history_limit": 20,
"auto_approve": {
"read_files": true,
"list_files": true,
"run_commands": [
"npm test",
"git diff",
"ls -la"
]
},
"custom_instructions": "Bạn là một Kỹ sư cao cấp. Hãy trả lời ngắn gọn. Sử dụng early returns. Khi sửa lỗi, hãy kiểm tra các lỗi kiến trúc trước khi áp dụng bản vá.",
"ignore_patterns": [
"**/node_modules/**",
"**/dist/**",
"package-lock.json"
]
}
Điều chỉnh cuối cùng
Sau khi thiết lập xong, công cụ này mang lại cảm giác hoàn toàn khác biệt. Bạn ngừng việc quản lý vi mô và bắt đầu ủy thác. Bạn có thể chạy claude "Sửa lỗi auth" và rời đi trong giây lát. AI sẽ đọc các tệp, chạy các bài kiểm thử hiện có và trình bày một bản so sánh (diff) hoàn chỉnh. Nếu nó vẫn mắc lỗi, đừng chỉ đổ lỗi cho mô hình—hãy tinh chỉnh ignore_patterns của bạn. Thông thường, AI thất bại đơn giản vì nó đang nhìn vào quá nhiều dữ liệu không liên quan.

