เลิกปล่อยให้ Claude เขียนโค้ดไปเรื่อย ๆ แบบไม่มีโครงสร้างได้แล้ว แชร์สิ่งที่ทำมาแล้วจริง 9 ข้อ ที่ถ้าไม่รู้ไว้ก่อนคือเสียเวลาไปอีกนาน
ปัญหาที่เจอบ่อยที่สุดคือปล่อยให้ Claude เริ่มแก้ไฟล์ทันทีตั้งแต่ข้อความแรก โดยยังไม่ทันเข้าใจโครงสร้างเดิมของโค้ดดีพอ พองานซับซ้อนขึ้นมาหน่อยก็มักจะเดินผิดทางแล้วต้องมานั่ง refactor ทีหลัง ทางแก้คือเข้า Plan Mode ก่อนทุกครั้งที่งานไม่เล็กมาก
Shift+Tab วนสลับโหมดจาก "ถามก่อนทำทุกครั้ง" (default) ไป "แก้ไฟล์อัตโนมัติ" (accept edits) ไป "วางแผนอย่างเดียว" (plan) หรือพิมพ์ /plan นำหน้าข้อความก็เข้าโหมดนี้ได้ทันทีโดยไม่ต้องกดพอ Claude คิดว่าเข้าใจงานพอแล้ว จะร่างแผนออกมาเป็นขั้นตอนคร่าว ๆ ให้ดูก่อน เช่น
email ใน model User พร้อม migrationPOST /users ให้รับและ validate ฟิลด์ใหม่จากนั้น Claude จะถามว่าจะเอายังไงต่อ ซึ่งมีให้เลือกมากกว่าแค่ "ใช่" กับ "ไม่ใช่"
เคล็ดลับ
กด Ctrl+G ตอนแผนโผล่ขึ้นมา เพื่อเปิดแผนนั้นในโปรแกรมแก้ข้อความเริ่มต้นของเครื่อง แล้วแก้ถ้อยคำในแผนตรง ๆ ก่อนอนุมัติ ได้ละเอียดกว่าการพิมพ์บอกทีละจุด
เคล็ดลับ
ข้ามขั้นตอนนี้ได้เฉพาะงานเล็กมาก ๆ ที่อธิบายจบในประโยคเดียว เช่น แก้ typo ในไฟล์ หรือเพิ่ม log บรรทัดเดียว ที่เหลือใช้ Plan Mode ทุกครั้ง
ทุก session ของ Claude Code เริ่มต้นจาก context ที่ว่างเปล่าเสมอ ไม่มีความจำอัตโนมัติข้ามจากการคุยครั้งก่อน
ไฟล์ CLAUDE.md คือทางแก้: เป็นไฟล์ markdown ธรรมดาที่ Claude อ่านอัตโนมัติทุกครั้งที่เริ่ม session ใหม่
ไม่ต้องพิมพ์อธิบายโปรเจกต์ซ้ำทุกรอบ
ไม่ควรยัดกฎยาวเป็นร้อยบรรทัด เพราะไฟล์นี้ถูกอ่านเข้า context ทุก session ยิ่งยาวยิ่งกินพื้นที่และยิ่งมีโอกาสที่ Claude อ่านไม่ครบทุกบรรทัด ควรเน้นข้อมูลที่จำเป็นจริง ๆ และที่สำคัญคือบันทึก "บทเรียน" ทุกครั้งที่ Claude ทำพลาดอะไรบางอย่าง แล้วเพิ่มเป็นบรรทัดกันพลาดซ้ำ ไฟล์นี้จะค่อย ๆ โตขึ้นตามความเข้าใจโปรเจกต์ ไม่ใช่เขียนครั้งเดียวจบ
# My Project
## Commands
- npm test: run tests
- npm run build: build for production
## Conventions
- Use camelCase for variables
- Never commit directly to main
## Lessons
- Auth tokens go in the "Authorization" header, not a custom header ระวัง
อย่าใส่ API key, password หรือ secret ใด ๆ ลงใน CLAUDE.md เด็ดขาด เพราะไฟล์นี้มักถูก commit เข้า git และถูกส่งให้ Claude อ่านทุก session
CLAUDE.md เป็นแค่คำแนะนำที่ Claude ทำตามเป็นส่วนใหญ่ แต่ไม่ใช่ 100% เสมอไป เพราะสุดท้ายมันคือ context ที่ Claude "ตีความ" เอา
ถ้ามีอะไรที่ต้องเกิดขึ้นทุกครั้งแบบไม่มีข้อยกเว้น ควรตั้งเป็น hook แทน คือสคริปต์ที่ระบบรันให้อัตโนมัติตาม "เหตุการณ์" ที่กำหนดไว้
ไม่ผ่านการตัดสินใจของโมเดลเลย จึงพลาดไม่ได้
ตั้งค่าไว้ในไฟล์ .claude/settings.json ที่รากโปรเจกต์ ไฟล์เดียวกับที่คำสั่ง /permissions ในบทความก่อนหน้าใช้เก็บกฎอนุญาต/ปฏิเสธที่ตั้งไว้
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "npx prettier --write $CLAUDE_FILE_PATHS" }]
}
]
}
}
อ่านจากในออกนอก: PostToolUse คือชื่อ event, matcher คือ pattern ของชื่อเครื่องมือที่จะให้ hook นี้ทำงานด้วย
(ในตัวอย่างคือ Edit หรือ Write เท่านั้น ไม่รวมเครื่องมืออื่น) ส่วน command คือคำสั่งจริงที่จะรัน
โดย $CLAUDE_FILE_PATHS เป็นตัวแปรที่ Claude Code ใส่พาธไฟล์ที่เพิ่งถูกแก้ให้อัตโนมัติ ไม่ต้องเขียนเอง
ตามที่พูดถึงคร่าว ๆ ไว้ในบทความก่อนหน้า MCP (Model Context Protocol) คือมาตรฐานเปิดที่ Anthropic สร้างขึ้น ให้ Claude เชื่อมต่อกับเครื่องมือและข้อมูลภายนอกได้เป็นระบบ ผ่านตัวกลางที่เรียกว่า MCP server แทนที่จะต้อง copy ข้อมูลจากเครื่องมืออื่นมาแปะในแชทเองทุกครั้ง
เพิ่ม MCP server ด้วยคำสั่ง claude mcp add ตัวอย่างเช่นต่อกับ GitHub ผ่าน token ส่วนตัว
claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \
--header "Authorization: Bearer YOUR_GITHUB_PAT"
วิธียืนยันตัวตนไม่ได้มีแบบเดียว บาง MCP server เป็นโปรแกรมที่รันอยู่ในเครื่องเราเอง (เรียกว่า stdio server)
แทนที่จะเป็น endpoint จากภายนอก แบบนี้ส่ง credential เข้าไปผ่านแฟล็ก --env ได้เลย เช่นต่อกับเครื่องมือจัดการ test case
อย่าง TestRail
claude mcp add testrail \
--env TESTRAIL_URL=https://yourcompany.testrail.io \
--env TESTRAIL_USERNAME=you@company.com \
--env TESTRAIL_API_KEY=your-api-key \
-- npx -y @bun913/mcp-testrail ส่วนบาง server ก็ไม่ต้องไปสร้าง token เองด้วยซ้ำ อย่าง Atlassian (Jira/Confluence) พอ Claude เรียกใช้เครื่องมือครั้งแรก จะเด้งเบราว์เซอร์ให้ล็อกอินผ่าน OAuth ให้เองอัตโนมัติ
claude mcp add --transport http atlassian https://mcp.atlassian.com/v1/mcp
ไม่ว่าจะต่อด้วยวิธีไหนใน 3 แบบข้างบน ตอนรัน claude mcp add ทุกครั้งยังเลือกได้ด้วยว่าจะเก็บการตั้งค่านี้ไว้ "ระดับไหน"
ใครมองเห็นเซิร์ฟเวอร์ที่เพิ่งต่อบ้าง ผ่านแฟล็ก --scope
.mcp.json ที่ commit เข้า git ได้ ทั้งทีมใช้ตัวเดียวกัน
ใส่แฟล็ก --scope ต่อจากชื่อ server ในคำสั่งเดิมได้เลย เช่นถ้าอยากให้ตัวอย่าง GitHub ด้านบนแชร์กับทั้งทีมผ่าน git แทนที่จะเก็บไว้คนเดียว
claude mcp add --transport http github --scope project https://api.githubcopilot.com/mcp/ \
--header "Authorization: Bearer YOUR_GITHUB_PAT" ไม่ใส่ --scope เลยก็ยังใช้งานได้ตามปกติ แค่จะตกไปเป็น local (ค่าเริ่มต้น) โดยอัตโนมัติ
เชื่อมต่อสำเร็จแล้ว นอกจากปล่อยให้ Claude เรียกใช้เองตอนที่เกี่ยวข้อง ยังอ้างอิงข้อมูลตรง ๆ ในข้อความได้ด้วยรูปแบบ
@server:resource ตามที่พูดถึงไว้ก่อนหน้า เช่น @github:repos/owner/repo/issues
ระวัง
ต่อเฉพาะ MCP server ที่เชื่อถือได้เท่านั้น เพราะมันมีสิทธิ์เข้าถึงเหมือนปลั๊กอินที่รันคำสั่งแทนเราได้จริง server ที่ไปดึงเนื้อหาจากภายนอกมาก็มีความเสี่ยงเรื่อง prompt injection ด้วย
เคล็ดลับ
เช็คว่ามี MCP server อะไรต่ออยู่บ้างและสถานะเป็นยังไง พิมพ์ /mcp ในเซสชัน หรือรัน claude mcp list จาก terminal
ปกติโฟลเดอร์ repo หนึ่งใบเช็คเอาต์ได้ทีละ 1 branch เท่านั้น สลับ branch คือไฟล์ในโฟลเดอร์เดิมเปลี่ยนหน้าตาไปมา ถ้าอยากทำงานสอง branch พร้อมกันแบบเดิมต้อง clone repo ซ้ำทั้งก้อน เปลืองพื้นที่และต้อง fetch ใหม่ทุกครั้ง git worktree แก้ปัญหานี้โดยสร้างโฟลเดอร์ใหม่บนดิสก์ที่ผูกกับ repo เดิม (ใช้ประวัติ git ก้อนเดียวกัน) แต่เช็คเอาต์คนละ branch ได้พร้อมกันจริง ๆ
myapp/ ← โฟลเดอร์เดิม เช็คเอาต์ branch main
myapp-auth/ ← โฟลเดอร์ใหม่จาก worktree เช็คเอาต์ branch feat/oauth
(ใช้ .git ก้อนเดียวกับ myapp/ ไม่ใช่ repo แยก) สร้าง worktree แล้วเปิด Claude Code ในโฟลเดอร์ใหม่นั้นได้เลย ทำงานคนละ feature พร้อมกันในคนละ terminal
git worktree add ../myapp-auth feat/oauth
cd ../myapp-auth && claude
Claude Code เองก็มีทางลัดให้สร้าง worktree แล้วเปิด session ใหม่ในนั้นให้เสร็จในคำสั่งเดียว โดยไม่ต้องตั้งชื่อโฟลเดอร์กับชื่อ branch แยกกันเองแบบตัวอย่างข้างบน
ชื่อที่ใส่ต่อท้าย --worktree จะกลายเป็นทั้งชื่อโฟลเดอร์ (สร้างไว้ที่ .claude/worktrees/ชื่อนั้น/ ในโปรเจกต์เอง)
และชื่อ branch ใหม่ (ได้ branch ชื่อ worktree-ชื่อนั้น) ให้อัตโนมัติ
claude --worktree feature-auth เสร็จงานแล้วเช็คว่ามี worktree อะไรค้างอยู่บ้าง และลบทิ้งได้เมื่อไม่ใช้แล้วโดยไม่กระทบ branch หลัก
git worktree list
git worktree remove ../myapp-auth เคล็ดลับ
เริ่มจาก 2 session ก่อน อันนึงเขียนโค้ด อีกอันคอยตรวจ พอคุ้นมือแล้วค่อยเพิ่มจำนวน
งานที่ใช้เวลานาน context ของ Claude จะเริ่มเต็มและความแม่นยำค่อย ๆ ลด การให้มันตรวจงานตัวเองด้วยการอ่านซ้ำอย่างเดียวจึงไม่นิ่งพอ วิธีที่ได้ผลกว่าคือให้ test เป็นตัวชี้ขาดแทนสายตา วนตามวงจร red-green-refactor
test("rejects duplicate email on signup", () => {
createUser("a@x.com");
expect(() => createUser("a@x.com")).toThrow("email already exists");
}); ส่งข้อความแค่ "implement จนกว่า test นี้จะผ่าน" Claude จะรัน test ซ้ำเองหลังแก้ทุกรอบ แล้วอ่านผล fail ที่ได้เพื่อปรับโค้ดต่อ ได้ feedback ที่ชัดเจนกว่าการอ่านโค้ดด้วยตาเปล่ามาก
งานที่ต้องค้นหาไฟล์เยอะ ๆ อ่านเอกสารยาว ๆ หรือ review โค้ดเฉพาะด้าน ถ้าทำในบทสนทนาหลักจะกิน context เร็วมาก subagent คือ AI ผู้ช่วยเฉพาะทางที่รันแยก context window ของตัวเองต่างหาก มี system prompt และสิทธิ์เครื่องมือเป็นของตัวเอง เมื่อ Claude เจองานที่ตรงกับคำอธิบายของ subagent ตัวไหน จะมอบหมายงานให้ subagent นั้นทำเองอัตโนมัติ แล้วส่งกลับมาแค่สรุปผล ไม่เอารายละเอียดที่ค้นเจอระหว่างทางมาทำให้ context หลักรก
สร้างเป็นไฟล์ markdown ไว้ที่ .claude/agents/
---
name: code-reviewer
description: ใช้ตรวจโค้ดหลังแก้เสร็จ ก่อน commit ทุกครั้ง
tools: Read, Grep, Glob
---
คุณคือผู้ช่วยตรวจสอบโค้ด เน้นหา bug และจุดที่ควรปรับปรุง
อ่านโค้ดที่เปลี่ยนแปลงแล้วรายงานปัญหาที่พบเป็นข้อ ๆ ไม่ต้องแก้ไฟล์เอง description ให้ชัดว่าใช้ตอนไหน Claude จะมอบหมายงานให้อัตโนมัติเมื่อเจองานที่ตรงกัน
ถ้ามีขั้นตอนที่ต้องอธิบายให้ Claude ฟังซ้ำทุก session เช่น ขั้นตอน deploy, convention เฉพาะของทีม,
หรือความรู้เฉพาะทางของระบบ ควรเก็บเป็น Skill แทนการพิมพ์อธิบายใหม่ทุกครั้ง เก็บเป็นไฟล์ SKILL.md
ไว้ในโฟลเดอร์ .claude/skills/ชื่อ-skill/ ต่างจาก CLAUDE.md ตรงที่เนื้อหาจะโหลดเข้ามาเฉพาะตอนใช้งานจริงเท่านั้น
ไม่กิน context ค้างอยู่ตลอดเวลา และยังเรียกตรง ๆ ได้ด้วยพิมพ์ /ชื่อ-skill
---
name: deploy-checklist
description: ใช้เมื่อ user จะ deploy โปรเจกต์นี้ขึ้น production
---
ก่อน deploy ให้ทำตามลำดับนี้เสมอ:
1. รัน npm test ให้ผ่านทั้งหมด
2. รัน npm run build เช็คว่า build ผ่าน
3. อัปเดต CHANGELOG.md
4. Tag เวอร์ชันด้วย git tag โน้ต
เขียน description ให้ชัดว่า "ใช้เมื่อ..." เช่น "ใช้เมื่อ user รัน test แล้ว fail" แล้ว Claude จะตัดสินใจโหลด skill ได้ถูกจังหวะกว่าคำอธิบายกว้าง ๆ
นอกจากเรื่องใหญ่ ๆ ด้านบน ยังมีปุ่มลัดเล็ก ๆ น้อย ๆ ที่ช่วยพิมพ์คุยกับ Claude Code ได้เร็วขึ้นในชีวิตประจำวัน
Ctrl+R แล้วพิมพ์คำที่จำได้จากข้อความที่เคยพิมพ์ไปก่อนหน้า
ระบบจะค้นและไฮไลต์คำที่ตรงกันให้ กด Ctrl+R ซ้ำเพื่อไล่ดูผลลัพธ์เก่ากว่านั้นไปเรื่อย ๆ
พอเจอที่ต้องการกด Tab หรือ Esc เพื่อนำมาแก้ต่อ หรือกด Enter เพื่อส่งข้อความนั้นทันทีเลย
/config แล้วเลือก Editor mode เปลี่ยนช่องพิมพ์ให้ทำงานแบบ vim
คือมีโหมด NORMAL (กด Esc เข้า ใช้ h j k l เลื่อนเคอร์เซอร์ ไม่ได้พิมพ์ตัวอักษรตรง ๆ)
กับโหมด INSERT (กด i จาก NORMAL เพื่อเข้าไปพิมพ์ตามปกติ) เหมาะกับคนที่คุ้นคีย์ลัดของ vim อยู่แล้ว
\ ตามด้วย Enter ได้เสมอทุก terminal หรือกด Ctrl+J ก็ได้เหมือนกันโดยไม่ต้องตั้งค่าอะไรเพิ่ม
(บาง terminal เช่น iTerm2, Windows Terminal รองรับ Shift+Enter ตรง ๆ ได้เลยด้วย)
ทั้ง 9 ข้อนี้คือ workflow ระดับวันต่อวัน แต่ยังไม่ได้พูดถึงการ "เตรียมของ" ก่อนเริ่มงาน ว่าจะเลือกโมเดลไหนให้เหมาะกับงาน แล้ว AI จะจำสิ่งที่สอนไปได้ยังไงในระยะยาว ต่อด้วยซีรีส์ "ติดอาวุธ" ได้ที่บทความ เลือกโมเดล + วางระบบความจำ และ ของเสริมนอกกล่องที่ควรมี เลยครับ
เรียบเรียงขึ้นใหม่ด้วยคำตัวเอง โดยได้แรงบันดาลใจส่วนหนึ่งจากแหล่งด้านล่าง