Skills For Real Engineers — ปรัชญาและการติดตั้ง
แทร็กนี้พาไปรู้จัก mattpocock/skills — ชุด agent skills ที่ Matt Pocock ใช้ทำงานจริงทุกวัน ไม่ใช่แค่ demo สวยๆ บทนี้เป็นบทเปิด (MP-0) จะพาไปเข้าใจ ปรัชญาเบื้องหลัง ว่าทำไม skill เหล่านี้ถึงถูกออกแบบให้ "เล็ก ปรับง่าย ประกอบกันได้" แทนที่จะเป็นกระบวนการใหญ่ก้อนเดียว, เข้าใจ 4 failure modes ที่พบบ่อยเวลาใช้ AI agent เขียนโค้ด พร้อมยาที่ใช้แก้แต่ละอาการ, ความต่างระหว่าง user-invoked กับ model-invoked skill, และวิธีติดตั้งจริงในโปรเจกต์ ถ้าคุณทำงานสาย TypeScript/NestJS หรือ Go นี่คือชุดเครื่องมือที่เอาไปวางบน repo จริงได้ทันที
ปรัชญา: Real engineering, not vibe coding
README ของ repo นี้เปิดประโยคแรกตรงๆ ว่า skill เหล่านี้คือสิ่งที่ Matt Pocock ใช้ทำ "real engineering, not vibe coding" — งานวิศวกรรมจริง ไม่ใช่การโยนโจทย์ให้ AI แล้วปล่อยไหลตามอารมณ์
ประเด็นที่น่าสนใจคือ การเทียบกับแนวทางอื่นอย่าง GSD, BMAD, และ Spec-Kit — เฟรมเวิร์กเหล่านี้พยายามช่วยด้วยการ "เป็นเจ้าของกระบวนการทั้งหมด" (own the process) เช่น บังคับให้ทำตามขั้นตอนตายตัวตั้งแต่ต้นจนจบ แต่ผลข้างเคียงคือ คุณเสียการควบคุม และเมื่อเกิดบั๊กระหว่างทาง กลับแก้ยากขึ้น เพราะกระบวนการที่ล็อกไว้ไม่ยืดหยุ่นพอให้คุณเข้าไปจัดการปัญหาเฉพาะจุด
แนวทางของ skills repo นี้ต่างออกไป: skill แต่ละตัวถูกออกแบบให้
- เล็ก (small) — แต่ละ skill โฟกัสงานเดียว ไม่พยายามทำทุกอย่างในตัวเดียว
- ปรับง่าย (easy to adapt) — แก้ไข hack เป็นของตัวเองได้ ไม่ใช่กล่องดำ
- ประกอบกันได้ (composable) — เอามาต่อกันเป็น flow ที่ใหญ่ขึ้นได้ตามงาน
- ใช้ได้กับทุกโมเดล — ไม่ผูกกับ Claude เพียงตัวเดียว
พูดง่ายๆ คือแทนที่จะให้ AI "เป็นคนขับ" กระบวนการทั้งหมด คุณยังเป็นคนขับอยู่ เพียงแต่มีชุดเครื่องมือที่ผ่านการกลั่นจาก "ทศวรรษของประสบการณ์ทำ software engineering จริง" (ตามคำใน README) มาช่วยแต่ละจุดของงาน
เทียบกับงานที่คุณคุ้นเคย: นี่คล้ายกับความต่างระหว่าง framework ที่บังคับโครงสร้างทั้งหมด (opinionated ทั้ง stack) กับชุด library เล็กๆ ที่คุณเลือกประกอบเองได้ — NestJS ให้โครงสร้างแน่นอน ส่วน skills พวกนี้เหมือน utility ที่หยิบมาใช้เฉพาะจุดที่ต้องการ ไม่บังคับทั้ง workflow
4 failure modes ที่พบบ่อย และยาที่ใช้แก้
README อธิบายว่า skill ทั้งหมดถูกสร้างมาเพื่อแก้ 4 อาการที่ Matt เจอซ้ำๆ เวลาทำงานกับ Claude Code, Codex และ coding agent ตัวอื่น ลองดูภาพรวมก่อน แล้วค่อยไล่ทีละอาการ
① Misalignment — Agent ไม่ทำตามที่ตั้งใจ
README อ้างประโยคจาก The Pragmatic Programmer ว่า "no-one knows exactly what they want" — ไม่มีใครรู้ชัด 100% ว่าต้องการอะไร ปัญหานี้เกิดกับ dev มนุษย์มาก่อนแล้ว และเกิดซ้ำในยุค AI: มีช่องว่างการสื่อสาร (communication gap) ระหว่างคุณกับ agent
ยาที่ใช้คือ grilling session — ให้ agent ถามคำถามละเอียดกลับมาก่อนเริ่มทำงานจริง
ผ่าน /grill-me (สำหรับงานทั่วไปที่ไม่ใช่โค้ด) และ /grill-with-docs
(แบบเดียวกันแต่มีของแถมเพิ่ม — ดูหัวข้อถัดไป) README บอกว่านี่คือ skill ยอดนิยมที่สุด แนะนำให้ใช้
ทุกครั้ง ที่จะเปลี่ยนแปลงอะไรสักอย่าง
② Too verbose — Agent พูดยืดยาวเกินจำเป็น
อ้างจาก Domain-Driven Design ของ Eric Evans: ตอนเริ่มโปรเจกต์ dev กับ domain expert มักพูดกันคนละภาษา agent ก็เจอปัญหาเดียวกัน — ถูกโยนเข้าโปรเจกต์แล้วต้องเดาศัพท์เฉพาะไปเรื่อยๆ ผลคือใช้ 20 คำในที่ที่ควรใช้แค่ 1 คำ
ยาคือ shared language — เอกสารที่ช่วยถอดรหัสศัพท์เฉพาะของโปรเจกต์ให้ agent อ่านเข้าใจ ตัวอย่างจาก README: ประโยค "There's a problem when a lesson inside a section of a course is made 'real' (i.e. given a spot in the file system)" เขียนสั้นลงเป็น "There's a problem with the materialization cascade" เมื่อมี CONTEXT.md นิยามคำว่า materialization ไว้แล้ว
กลไกนี้ฝังอยู่ใน /grill-with-docs — เป็น grilling session ที่ช่วยสร้าง shared language
กับ AI และบันทึกการตัดสินใจที่อธิบายยากไว้เป็น ADR (Architecture Decision Record) ไปในตัว
README ถึงกับบอกว่านี่อาจเป็นเทคนิคที่เจ๋งที่สุดใน repo นี้
ประโยชน์ของ shared language ไม่ได้มีแค่ลดความยืดยาด: ตัวแปร ฟังก์ชัน และไฟล์ถูกตั้งชื่อสอดคล้องกันตามภาษาร่วม ทำให้ codebase เดินสำรวจง่ายขึ้นสำหรับ agent และ agent ใช้ token คิดน้อยลง เพราะมีภาษาที่กระชับกว่าให้ใช้
③ Code doesn't work — ตกลงกันแล้วแต่โค้ดยังพัง
อ้างจาก The Pragmatic Programmer อีกครั้ง: "ก้าวเล็กๆ ที่ตั้งใจเสมอ อัตราของ feedback คือความเร็วสูงสุดที่ทำได้" ต่อให้ตกลงกับ agent ได้ตรงใจแล้ว แต่ถ้าไม่มี feedback ว่าโค้ดที่เขียนออกมา รันได้จริงไหม agent ก็เหมือนบินโดยไม่เห็นจอเรดาร์
ยาคือชุด feedback loop ที่คุ้นเคย: static types, browser access, automated tests โดยเฉพาะ red-green-refactor loop — agent เขียน test ที่ fail ก่อน แล้วค่อยแก้ให้ผ่าน README บอกว่านี่คือ pattern ที่ทำให้โค้ดคุณภาพดีขึ้นมาก
ผูกกับ skill สองตัว: /tdd (สอน agent ทำ red-green-refactor พร้อมเกณฑ์ว่า test แบบไหนดี/ไม่ดี)
และ /diagnosing-bugs (ห่อ best practice การ debug ไว้เป็น loop ที่มีวินัย) — ถ้าคุณเขียน
NestJS อยู่แล้ว นึกภาพว่า /tdd คือคนช่วยบังคับให้เขียน unit test ของ service ก่อน implement จริง
ไม่ใช่ทิ้งไว้ทำทีหลัง
④ Ball of mud — โค้ดกลายเป็นโคลนพันกัน
อ้างจาก Kent Beck (Extreme Programming Explained): "ลงทุนกับ design ของระบบทุกวัน" และ John Ousterhout (A Philosophy of Software Design): "โมดูลที่ดีที่สุดคือโมดูลที่ลึก — เข้าถึง functionality จำนวนมากผ่าน interface ที่เรียบง่าย"
ปัญหาคือ agent เร่งความเร็วการเขียนโค้ดได้มาก แต่นั่นก็แปลว่า เร่ง entropy ของระบบ
ไปด้วย — codebase ซับซ้อนขึ้นเร็วอย่างที่ไม่เคยเป็นมาก่อน ยาคือแนวทางใหม่: ใส่ใจ design ของโค้ดจริงจัง
ฝังอยู่ทุกชั้นของ skills กลุ่มนี้ — /to-spec จะซักถามว่าคุณกำลังแตะโมดูลไหนก่อนสร้าง spec
และที่สำคัญคือ /improve-codebase-architecture ที่ช่วยกู้ codebase ที่กลายเป็นโคลนไปแล้ว
README แนะนำให้รันสิ่งนี้กับ codebase ของคุณทุกๆ สองสามวัน
User-invoked vs Model-invoked — ใครเป็นคนกด "เริ่ม"
README มีหัวข้อ Reference ที่แบ่ง skill ทั้งหมดออกเป็นสองแกน ตามว่า ใครเป็นคนเรียกได้:
-
User-invoked — เรียกได้เฉพาะตอนที่คุณพิมพ์เอง (เช่น
/grill-me) หน้าที่ของ skill กลุ่มนี้คือ orchestrate — คุมทิศทางของงาน - Model-invoked — คุณเรียกเองก็ได้ หรือ agent หยิบมาใช้เองอัตโนมัติ เมื่อบริบทของงานเข้าเงื่อนไข skill กลุ่มนี้ถือ "วินัยที่ใช้ซ้ำได้" (reusable discipline)
กฎสำคัญจาก README: user-invoked skill เรียก model-invoked skill ได้ แต่ห้ามเรียก user-invoked skill ตัวอื่นเด็ดขาด — ป้องกันไม่ให้ orchestrator ซ้อน orchestrator จนควบคุมทิศทางไม่ได้
ตัวอย่างจริงจาก repo (bucket engineering/ และ productivity/):
| ประเภท | Skill | หน้าที่ |
|---|---|---|
| User-invoked | ask-matt | router ชี้ว่าใช้ skill ไหนกับสถานการณ์ไหน |
| User-invoked | grill-with-docs | grilling session + สร้าง/อัปเดต domain model, CONTEXT.md, ADR |
| User-invoked | implement | สร้างงานตาม spec/ticket ขับ /tdd แล้วปิดด้วย /code-review |
| Model-invoked | tdd | red-green-refactor loop ทีละ vertical slice |
| Model-invoked | diagnosing-bugs | reproduce → minimise → hypothesise → instrument → fix → regression-test |
| Model-invoked | codebase-design | วินัยออกแบบ deep module — behaviour เยอะหลัง interface เล็ก |
การติดตั้ง: จาก npx ถึง /setup-matt-pocock-skills
ขั้นตอน quickstart ตาม README มี 4 ก้าว:
- รันตัวติดตั้งของ skills.sh:
npx skills@latest add mattpocock/skills - เลือก skill ที่ต้องการ และเลือก coding agent ที่จะติดตั้งลง (Claude Code, Codex ฯลฯ)
— ต้องเลือก
/setup-matt-pocock-skillsด้วยเสมอ - รัน
/setup-matt-pocock-skillsใน agent ของคุณ - เสร็จแล้ว พร้อมใช้งาน
/setup-matt-pocock-skills เป็น "prompt-driven skill" ไม่ใช่ script ตายตัว —
ตาม SKILL.md มันจะสำรวจ repo ก่อนเสมอ ไม่เดา: เช็ก git remote -v ว่าเป็น GitHub repo ไหม,
เช็กว่า CLAUDE.md/AGENTS.md มีอยู่แล้วหรือยัง มีส่วน ## Agent skills
อยู่แล้วไหม, เช็ก CONTEXT.md/CONTEXT-MAP.md, docs/adr/,
ว่ามี skill triage ติดตั้งอยู่ไหม (ตัดสินว่าต้องถามเรื่อง label หรือไม่), และเช็ก signal
ของ monorepo (pnpm-workspace.yaml, workspaces ใน package.json)
จากนั้นถามทีละหัวข้อ (นำด้วยคำแนะนำที่ตอบรับได้คำเดียว):
-
Section A — Issue tracker: ที่เก็บ issue ของ repo นี้ (GitHub, GitLab,
local markdown ใต้
.scratch/, หรือ Other อย่าง Jira/Linear) — skill อย่างto-tickets,triage,to-specจะอ่าน/เขียนที่นี่ -
Section B — Triage labels: ถามเฉพาะถ้าติดตั้ง skill
triageไว้ — ค่า default คือ 5 role:needs-triage,needs-info,ready-for-agent,ready-for-human,wontfix - Section C — Domain docs: default เป็น single-context (CONTEXT.md + docs/adr/ ที่ root เดียว) — เสนอ multi-context เฉพาะเมื่อเจอ signal ว่าเป็น monorepo
สุดท้ายมันจะโชว์ draft ของบล็อก ## Agent skills ให้แก้ก่อนเขียนจริง แล้วเลือกไฟล์ที่จะแก้:
ถ้ามี CLAUDE.md อยู่แล้วจะแก้ไฟล์นั้น ถ้าไม่มีแต่มี AGENTS.md จะแก้ไฟล์นั้นแทน
และจะไม่มีทางสร้างไฟล์ใหม่ซ้อนกับไฟล์ที่มีอยู่แล้ว — เช่นถ้า repo คุณมี CLAUDE.md
อยู่แล้ว (เหมือน repo teach-me-ai นี้เอง) มันจะแก้ CLAUDE.md ไม่ใช่สร้าง AGENTS.md ใหม่
ผูกกับงานจริง: ถ้า repo Go หรือ NestJS ของคุณใช้ GitHub อยู่แล้ว (git remote
ชี้ไป github.com) setup จะเสนอ GitHub เป็นค่า default ให้ทันที คุณตอบรับคำเดียวจบ ไม่ต้องอธิบายเพิ่ม
แผนที่แทร็ก MP — บทถัดไปจะเจออะไรบ้าง
แทร็ก mattpocock/skills แบ่งเป็น 7 บท (MP-0 ถึง MP-6) ไล่ตาม flow การทำงานจริง:
| บท | หัวข้อ | Skill หลักที่เจอ |
|---|---|---|
| MP-0 | ภาพรวม + ติดตั้ง (บทนี้) | setup-matt-pocock-skills |
| MP-1 | Alignment — ตกลงกันก่อนเริ่ม | grill-me, grill-with-docs, ubiquitous language |
| MP-2 | Spec & Tickets — แปลงบทสนทนาเป็นงาน | to-spec, to-tickets, triage, wayfinder |
| MP-3 | Implement — ลงมือเขียนอย่างมีวินัย | implement, tdd, diagnosing-bugs, code-review |
| MP-4 | Design — กันไม่ให้เป็นโคลน | codebase-design, domain-modeling, improve-codebase-architecture, prototype |
| MP-5 | Productivity — เครื่องมือรอบข้าง | grill-me/grilling, handoff, teach, writing-great-skills |
| MP-6 | Real-world — ประกอบทุกอย่างเข้าด้วยกัน | ask-matt (router) และ workflow แบบครบวงจร |
Pitfall ที่พบบ่อย: รีบข้าม /setup-matt-pocock-skills ไปใช้ skill อื่นเลย
ทั้งที่ SKILL.md ของมันเขียนชัดว่า "Run once per repo before using the other
engineering skills" — ถ้าไม่ตั้งค่า issue tracker ไว้ก่อน skill อย่าง to-tickets
หรือ triage จะไม่รู้ว่าต้องเขียน issue ไปที่ไหน
- จับคู่ 4 failure mode กับ skill ที่ใช้แก้ ให้ถูกต้อง โดยไม่มองอินโฟกราฟิกด้านบน: (misalignment, too verbose, code doesn't work, ball of mud) vs (tdd/diagnosing-bugs, grill-me/grill-with-docs, codebase-design/improve-codebase-architecture, ubiquitous language ผ่าน CONTEXT.md) — พิมพ์คำตอบมาในแชท เดี๋ยวช่วยเช็กให้
- อธิบายด้วยคำพูดตัวเองว่า user-invoked ต่างจาก model-invoked ยังไง พร้อมยกตัวอย่างคนละ 1 skill จาก README (ห้ามซ้ำกับตัวอย่างในตาราง)
-
สมมติคุณรัน
/setup-matt-pocock-skillsใน repo ที่มีCLAUDE.mdอยู่แล้ว (เหมือน repo teach-me-ai นี้) — ทายว่ามันจะแก้ไฟล์ไหน และเพราะกฎอะไรจาก SKILL.md ที่ทำให้ตัดสินใจแบบนั้น