- Claude Code được sử dụng rất rộng rãi trong cả dự án cá nhân lẫn môi trường monorepo doanh nghiệp, đồng thời bài viết tổng hợp cách dùng thực tế của các thành phần cốt lõi và tính năng nâng cao
- Trọng tâm của việc vận hành agent hiệu quả nằm ở chất lượng của PR cuối cùng chứ không phải kiểu đầu ra hay UI, với mục tiêu ủy quyền theo kiểu “cài xong để đó (shoot and forget)”
- Trung tâm của codebase là tệp
CLAUDE.md, đóng vai trò như “hiến pháp” định nghĩa quy tắc hành vi và cách sử dụng công cụ của agent
- Mức độ cộng tác và tự động hóa được nâng lên thông qua nhiều tính năng như quản lý ngữ cảnh, lệnh slash, subagent, Hooks, GitHub Action(GHA)
- Bài viết phân biệt mối quan hệ giữa Skills và MCP(Model Context Protocol), nhấn mạnh cấu trúc agent linh hoạt lấy scripting làm trung tâm
- Cung cấp hướng dẫn thực tiễn để mở rộng Claude Code từ một công cụ CLI đơn thuần thành hạ tầng phát triển AI cấp doanh nghiệp
- Sử dụng Claude Code rất nhiều
- Với dự án sở thích, chạy vài lần mỗi tuần trên VM, dùng
--dangerously-skip-permissions để biến ý tưởng vừa nảy ra thành code ngay lập tức
- Trong công việc, cả nhóm xây dựng quy tắc và công cụ cho AI-IDE, và đội ngũ kỹ sư của chúng tôi mỗi tháng tiêu thụ hàng tỷ token chỉ riêng cho việc sinh mã
- Thị trường agent CLI đang chật chội với Claude Code, Gemini CLI, Cursor và Codex CLI, nhưng cạnh tranh thực chất là giữa Anthropic và OpenAI
- Tuy vậy, khi nói chuyện với các lập trình viên thì việc chọn công cụ lại phụ thuộc vào những yếu tố bề mặt
- Chẳng hạn một tính năng được triển khai “gặp may”, hay “vibe” của system prompt mà họ thích
- Ở thời điểm hiện tại, tất cả những công cụ này đều đã rất tốt
- Một số người lại quá tập trung vào kiểu đầu ra hoặc UI
- Những câu nịnh như "you're absolutely right!" không phải là lỗi đáng để chú ý
- Ngược lại, đó là dấu hiệu cho thấy người dùng đang can dự quá nhiều vào vòng lặp
- Triết lý sử dụng cốt lõi của tôi là "Shoot and Forget"
- Thực hiện theo thứ tự ủy quyền, thiết lập ngữ cảnh, thực thi công việc
- Công cụ được đánh giá bằng PR cuối cùng, tức là bằng kết quả chứ không phải quá trình đi đến đó
- Bài viết này là suy ngẫm về toàn bộ hệ sinh thái dựa trên trải nghiệm dùng Claude Code trong vài tháng qua
- Gần như mọi tính năng tôi dùng (và cả những thứ tôi không dùng)
- Tệp
CLAUDE.md cơ bản
- Lệnh slash tùy chỉnh
- Thế giới mạnh mẽ của Subagent, Hook và GitHub Actions
- Vì bài khá dài nên khuyến nghị dùng như tài liệu tham khảo hơn là đọc từ đầu đến cuối
CLAUDE.md: Hiến pháp của agent
Compact, Context, Clear: Quản lý context window
- Dùng lệnh
/context để kiểm tra tình trạng sử dụng của context window 200k token
- Ngay cả với Sonnet-1M, vẫn chưa rõ toàn bộ context window có được tận dụng hiệu quả hay không
- Một phiên mới trên monorepo mặc định tiêu tốn khoảng ~20k token (10%), còn lại 180k dành cho công việc chỉnh sửa (và hết rất nhanh)
- Ba workflow chính
/compact (tránh dùng): nén tự động thiếu minh bạch, dễ lỗi, tối ưu chưa tốt nên cố gắng tránh tối đa
/clear + /catchup (khởi động lại đơn giản): cách reboot mặc định, dùng /clear để xóa trạng thái rồi dùng /catchup tùy chỉnh để đọc mọi tệp đã thay đổi trên nhánh git
- "Document & Clear" (khởi động lại phức tạp): dành cho tác vụ lớn, Claude dump kế hoạch và tiến độ vào
.md → /clear → ở phiên mới đọc .md rồi tiếp tục
Lệnh slash tùy chỉnh
- Lệnh slash chỉ là lối tắt đơn giản cho các prompt dùng thường xuyên, không hơn không kém
- Thiết lập tối thiểu
/catchup: prompt để đọc mọi tệp đã thay đổi trên nhánh git
/pr: trợ lý dọn dẹp code, stage và chuẩn bị PR
- Danh sách lệnh tùy chỉnh phức tạp là một anti-pattern
- Điểm cốt lõi của agent như Claude là: gần như mọi đầu vào ngôn ngữ tự nhiên đều có thể tạo ra kết quả hữu ích và có thể merge
- Bắt kỹ sư (hoặc cả người không phải kỹ sư) phải học một danh sách “lệnh ma thuật” cần thiết để làm việc = thất bại
- Mục tiêu là xây dựng agent có
CLAUDE.md trực quan hơn và công cụ tốt hơn
Subagent tùy chỉnh
- Về mặt lý thuyết là tính năng quản lý ngữ cảnh rất mạnh
- Tác vụ phức tạp: ngữ cảnh đầu vào
X token + ngữ cảnh tác vụ Y token + câu trả lời Z token
N tác vụ = (X + Y + Z) * N token trong cửa sổ chính
- Giải pháp Subagent: giao
(X + Y) * N tác vụ cho các agent chuyên biệt, chỉ trả về câu trả lời cuối cùng Z token
- Trong thực tế, Subagent tùy chỉnh tạo ra hai vấn đề mới
- Gác cổng ngữ cảnh: khi tạo Subagent
PythonTests, toàn bộ ngữ cảnh kiểm thử bị ẩn khỏi agent chính → không thể suy luận tổng thể → buộc phải gọi Subagent để biết cách tự xác minh mã của chính nó
- Ép buộc workflow của con người: ép Claude vào một workflow cứng nhắc do con người định nghĩa → chỉ dẫn cách ủy quyền chính là vấn đề mà agent tự nó phải giải quyết
-
Cá nhân tôi thích tính năng Task(...) hơn
- Tạo bản sao agent đa dụng bằng tính năng
Task(...) tích hợp sẵn của Claude
- Đặt toàn bộ ngữ cảnh cốt lõi vào
CLAUDE.md
- Agent chính tự quyết định thời điểm và cách ủy quyền công việc cho bản sao của chính nó
- Giữ được lợi ích tiết kiệm ngữ cảnh của Subagent nhưng loại bỏ nhược điểm
- Agent tự quản lý điều phối một cách động
- Được gọi là kiến trúc "Master-Clone" trong "Building Multi-Agent Systems (Part 2)"
- Ưa chuộng hơn hẳn so với mô hình "Lead-Specialist" mà Subagent tùy chỉnh dẫn tới
Resume, Continue, History
- Cách dùng cơ bản
- Thường xuyên dùng
claude --resume và claude --continue
- Khởi động lại terminal bị lỗi hoặc khởi động nhanh lại các phiên cũ
claude --resume một phiên từ vài ngày trước để tóm tắt cách vượt qua một lỗi cụ thể → cải thiện CLAUDE.md và công cụ nội bộ
- Cách dùng nâng cao
- Claude Code lưu toàn bộ lịch sử phiên trong
~/.claude/projects/
- Có script để tận dụng dữ liệu phiên lịch sử thô
- Chạy phân tích meta trên log: tìm ngoại lệ phổ biến, yêu cầu quyền hạn, mẫu lỗi → cải thiện ngữ cảnh dành cho agent
Hooks
- Rất quan trọng trong repo enterprise: không dùng trong các dự án cá nhân
- Các quy tắc "must-do" mang tính xác định để bổ sung cho các gợi ý "should-do" trong
CLAUDE.md
- Hai loại
- Hook chặn ở bước commit (Block-at-Submit): chiến lược chính
- Dùng Hook
PreToolUse để bọc mọi lệnh Bash(git commit)
- Kiểm tra file
/tmp/agent-pre-commit-pass (script kiểm thử chỉ tạo khi toàn bộ test đều pass)
- Nếu không có file thì chặn commit → buộc Claude vào vòng lặp "test-sửa" cho đến khi build thành công
- Hook gợi ý: Hook không chặn đơn giản, cung cấp phản hồi "fire-and-forget" khi agent thực hiện phương án kém tối ưu
- Cố ý không dùng Hook chặn ở bước ghi (
Edit hoặc Write)
- Chặn agent giữa lúc lập kế hoạch dễ gây rối hoặc tạo cảm giác "bực bội"
- Xác nhận kết quả hoàn chỉnh cuối cùng ở bước commit sau khi xong việc hiệu quả hơn nhiều
Chế độ lập kế hoạch
- Khi thay đổi tính năng ở quy mô "lớn" trong AI IDE thì lập kế hoạch là bắt buộc
- Dự án cá nhân: chỉ dùng chế độ lập kế hoạch tích hợp sẵn
- Sắp xếp cách tiếp cận trước khi khởi động Claude
- Xác định cách build và các "checkpoint kiểm tra" cần dừng lại để hiển thị kết quả trong quá trình làm việc
- Việc dùng thường xuyên giúp xây dựng trực giác rất tốt về lượng ngữ cảnh tối thiểu cần thiết để Claude đưa ra kế hoạch tốt mà không làm hỏng phần triển khai
- Monorepo enterprise: bắt đầu triển khai công cụ lập kế hoạch tùy chỉnh dựa trên Claude Code SDK
- Tương tự chế độ plan native, nhưng tập trung prompt để căn đầu ra theo định dạng thiết kế kỹ thuật hiện có
- Tích hợp sẵn việc áp dụng các best practice nội bộ (từ cấu trúc mã đến quyền riêng tư dữ liệu và bảo mật)
- Giúp kỹ sư có thể "vibe plan" tính năng mới như một kiến trúc sư cấp cao (ít nhất đó là lời hứa)
Skills
- Đồng ý với Simon Willison: Skills (có lẽ) là thương vụ lớn hơn MCP
- Mô hình tư duy về quyền tự chủ của agent tiến hóa qua 3 giai đoạn
- Single Prompt: đưa mọi ngữ cảnh cho agent trong một prompt khổng lồ duy nhất (mong manh, không thể mở rộng)
- Tool Calling: mô hình agent "cổ điển", tự tay xây công cụ và tạo lớp trừu tượng hóa hiện thực cho agent (đã cải thiện nhưng lại tạo ra các abstraction mới và nút thắt cổ chai về ngữ cảnh)
- Scripting: cho agent quyền truy cập môi trường thô (binary, script, tài liệu) → agent tự viết mã tại chỗ để tương tác
- Agent Skills rõ ràng là tính năng tiếp theo: sản phẩm hóa chính thức lớp "Scripting"
- Nếu bạn ưa chuộng CLI hơn MCP thì bạn đã ngầm hưởng lợi từ Skills
- File
SKILL.md là cách có tổ chức hơn, dễ chia sẻ hơn và dễ khám phá hơn để ghi lại các CLI và script này rồi phơi bày chúng cho agent
- Skills là abstraction đúng đắn: chính thức hóa mô hình agent dựa trên "scripting" bền vững và linh hoạt hơn mô hình kiểu API cứng nhắc mà MCP đại diện
MCP (Model Context Protocol)
- Việc có Skills không có nghĩa MCP đã chết (xem "Everything Wrong with MCP")
- Vấn đề trước đây: nhiều người xây MCP khủng khiếp và nặng ngữ cảnh với hàng chục công cụ chỉ để phản chiếu REST API (
read_thing_a(), read_thing_b(), update_thing_c())
- Mô hình "Scripting" (được chính thức hóa qua Skills) là cách tốt hơn, nhưng vẫn cần một phương thức an toàn để truy cập môi trường → vai trò mới và tập trung hơn của MCP
-
Vai trò mới của MCP: cổng dữ liệu
- Thay vì API cồng kềnh, hãy cung cấp một cổng đơn giản và an toàn với vài công cụ cấp cao mạnh mẽ
download_raw_data(filters…)
take_sensitive_gated_action(args…)
execute_code_in_environment_with_state(code…)
- Vai trò của MCP: quản lý xác thực, mạng và ranh giới bảo mật rồi tránh cản đường, chứ không phải trừu tượng hóa hiện thực cho agent
- Cung cấp điểm vào cho agent → agent dùng scripting và ngữ cảnh
markdown để thực hiện công việc thực tế
- MCP duy nhất hiện đang dùng: Playwright (hợp lý vì đây là môi trường phức tạp và có trạng thái)
- Mọi công cụ không trạng thái (Jira, AWS, GitHub) đều đã được chuyển sang CLI đơn giản
Claude Code SDK
- Claude Code không chỉ là một CLI tương tác mà còn là một SDK mạnh mẽ để xây dựng agent hoàn toàn mới cho cả tác vụ lập trình lẫn không lập trình
- Trong hầu hết các dự án sở thích mới, bắt đầu dùng nó làm framework agent mặc định thay vì các công cụ như LangChain/CrewAI
- Ba cách sử dụng chính
- Scripting song song quy mô lớn: không dùng chat tương tác khi refactor quy mô lớn, sửa lỗi, hoặc migration
- Viết script bash đơn giản để gọi song song
claude -p "in /pathA change all refs from foo to bar"
- Có khả năng mở rộng và kiểm soát tốt hơn nhiều so với việc để một agent chính quản lý hàng chục tác vụ Subagent
- Xây dựng công cụ chat nội bộ: hoàn hảo để bọc các quy trình phức tạp trong giao diện chat đơn giản cho người dùng không chuyên kỹ thuật
- Ví dụ: một trình cài đặt fallback sang Claude Code SDK khi có lỗi để xử lý vấn đề cho người dùng
- Ví dụ: công cụ nội bộ "v0-at-home" để đội thiết kế có thể vibe-code frontend mockup bằng framework UI nội bộ (đảm bảo độ trung thực cao của ý tưởng, có thể dùng trực tiếp hơn từ mã frontend production)
- Tạo prototype agent nhanh: trường hợp sử dụng phổ biến nhất, không chỉ dành cho lập trình
- Khi có ý tưởng cho một tác vụ agent (ví dụ: "agent điều tra mối đe dọa" dùng CLI tùy chỉnh hoặc MCP)
- Có thể nhanh chóng xây dựng và kiểm thử prototype bằng Claude Code SDK trước khi commit toàn bộ khung triển khai
Claude Code GitHub Action (GHA)
- Một trong những tính năng yêu thích nhất và bị đánh giá thấp nhất: khái niệm đơn giản (chạy Claude Code trong GHA), nhưng chính sự đơn giản này là nguồn gốc sức mạnh của nó
- Tương tự Cursor background agent hoặc giao diện web được quản lý của Codex nhưng tùy biến cao hơn rất nhiều
- Kiểm soát toàn bộ container và môi trường → cải thiện khả năng truy cập dữ liệu
- Sandboxing và kiểm soát audit mạnh hơn nhiều so với các sản phẩm khác
- Hỗ trợ mọi tính năng nâng cao như Hook, MCP
-
Trường hợp sử dụng
- Xây dựng công cụ "PR từ bất cứ đâu" tùy chỉnh
- Có thể kích hoạt PR từ Slack, Jira, thậm chí cả cảnh báo CloudWatch
- GHA trả về PR đã được kiểm thử đầy đủ sau khi sửa lỗi hoặc thêm tính năng
- Flywheel dựa trên dữ liệu
- Log của GHA = log agent đầy đủ
- Ở cấp độ công ty, định kỳ rà soát log để phát hiện lỗi phổ biến, lỗi bash, các thực hành kỹ thuật không đồng bộ
- Flywheel: bug → cải thiện CLAUDE.md/CLI → agent tốt hơn
$ query-claude-gha-logs --since 5d | claude -p "see what the other claudes were getting stuck on and fix it, then put up a PR"
settings.json
- Một số cấu hình thiết yếu cho cả công việc cá nhân lẫn công việc chuyên môn
HTTPS_PROXY/HTTP_PROXY: dùng để debug
- Kiểm tra raw traffic để xem chính xác prompt mà Claude gửi đi
- Với background agent, đây là công cụ mạnh để sandbox mạng ở mức chi tiết
MCP_TOOL_TIMEOUT/BASH_MAX_TIMEOUT_MS: tăng giá trị
- Ưu tiên chạy các lệnh dài và phức tạp, trong khi timeout mặc định thường quá thận trọng
- Chưa chắc còn cần thiết sau các tác vụ bash chạy nền, nhưng vẫn giữ lại cho chắc
ANTHROPIC_API_KEY: dùng API key enterprise trong công việc (qua apiKeyHelper)
- Chuyển từ giấy phép "theo ghế" sang mô hình giá "theo mức sử dụng" (phù hợp hơn nhiều với cách làm việc)
- Xét đến chênh lệch mức sử dụng khổng lồ giữa các developer (đã thấy chênh lệch 1:100 giữa các kỹ sư)
- Kỹ sư có thể thử nghiệm các script LLM không phải Claude Code bằng một tài khoản enterprise duy nhất của công ty
"permissions": định kỳ tự audit danh sách lệnh mà Claude được phép tự động chạy
Kết luận
- Nội dung khá nhiều nhưng hy vọng sẽ hữu ích
- Nếu vẫn chưa dùng các agent dựa trên CLI như Claude Code hoặc Codex CLI thì nên dùng
- Gần như không có hướng dẫn tốt nào cho các tính năng nâng cao này, và cách duy nhất để học là tự lao vào dùng thử
2 bình luận
Ý kiến trên Hacker News
Chúng tôi đang đồng bộ tệp với AGENTS.md để tương thích với các AI IDE khác
Tìm hiểu gần đây thì cách mà Anthropic khuyến nghị là chỉ đặt một dòng
@AGENTS.mdtrong tệpCLAUDE.md, còn nội dung thực tế thì để trong AGENTS.mdTài liệu liên quan: Claude Code Best Practices
Tôi thực sự thích bài viết này về MCP
Tôi thích góc nhìn rằng “MCP không nên là một API phức tạp, mà nên là một cổng trung gian gọn nhẹ quản lý xác thực, mạng và ranh giới bảo mật rồi tránh sang một bên”
Bài liên quan
Dù vậy tôi gần như không dùng MCP. Tôi muốn họ tập trung vào phần auth hơn
Link tham khảo: bài đăng trên X
Hơi tiếc khi một bài 3000 từ lại bị xem là “quá dài nên chỉ đọc để tham khảo”
Tôi muốn xem một phiên bản còn dài hơn với các ví dụ thực tế
Tôi đang dùng một quy trình khởi động lại đơn giản với
/clearvà/catchupđể đặt lại trạng thái Claude và buộc nó đọc lại các tệp đã thay đổiCó lẽ sắp tới lệnh
/compactsẽ đảm nhận vai trò này/compactnên gần như không thể dùng đượcDù hiển thị “0% context remaining” thì thực tế vẫn có khoảng 30% được dành riêng cho việc nén
Nhưng ngay cả vậy thì khoảng một nửa số lần nén vẫn thất bại hoặc vướng giới hạn API
Dùng Claude Code để cải thiện chính cấu hình của mình cũng là một ý hay
Hãy chuyển sang chế độ plan và thử prompt sau:
“Hãy đọc tài liệu này (How I use every Claude Code feature) và cho tôi biết cách cải thiện cấu hình Claude Code của tôi”
Tôi đã bỏ cuộc trong việc bảo trì CLAUDE.md vì Claude không tuân thủ tốt ngay cả các chỉ dẫn đơn giản trong đó
Ví dụ, dù bảo đặt tên script được tạo là
<foo>.aigen.tsthì một nửa số lần nó vẫn bỏ quaVì vậy tôi đang lách bằng cách đưa thẳng context vào prompt mỗi lần
Có phải chỉ mình tôi gặp vấn đề này không?
Tôi cũng có kết quả tương tự ở nhiều dự án
Có câu “nếu bạn chưa dùng agent nền CLI thì bạn nên dùng”, nên tôi tò mò liệu nó có thực sự tốt hơn ứng dụng Cursor không
Cursor hay ở chỗ có thể chọn một đoạn mã cụ thể rồi nhấn Cmd-L để nói “hãy sửa phần này” rất dễ
Còn gửi một đoạn code qua CLI thì có vẻ hơi phiền
Cả UX gọn nhẹ lẫn hiệu quả đều tốt hơn. Claude hoạt động tốt nhất trong CC
ghv.v.)Khi thấy câu “Claude Code không phải là một CLI đơn thuần mà là một SDK để tạo ra các agent mới”, tôi thấy mệt vì nó giống giọng văn do AI viết
Nó tạo cảm giác không tôn trọng độc giả
Bài này theo tôi là một ví dụ tốt vì có dấu vết tác giả đã tự đọc và biên tập
Ngược lại, việc copy-paste nguyên xi đầu ra của AI thì đáng bị phê phán
Trái lại, tôi còn cảm thấy được tôn trọng nên đã đọc đến cuối
Những công cụ này đúng là thú vị, nhưng tôi lo rằng ngành này lại một lần nữa đang tập trung vào công nghệ tự thân thay vì khách hàng
(Nó làm tôi nhớ đến bài luận “Top idea in your mind” của Paul Graham)
Một sản phẩm làm nhanh và rẻ mà đầy lỗi thì chẳng có ý nghĩa gì
AI cũng vậy, các CEO chỉ nhìn nó như công cụ cắt giảm nhân sự, nhưng công nghệ vẫn chưa ở mức đem lại lợi ích thực chất cho khách hàng
Chatbot AI chỉ khiến khách hàng bực bội hơn mà thôi
Tốc độ phát triển của Claude Code nhanh đến mức đáng kinh ngạc
Nó liên tục tốt hơn đến mức tuần nào tôi cũng phải học thứ mới
Nếu nó có thể tăng tính năng mà không làm chậm chiếc M4 Mac của tôi (64GB RAM), thì đó mới thật sự là phép màu
Cũng hay đấy nhưng ..