โปรเจกต์ส่วนตัว·2026·Web App · Education · Data Visualization
graph.phatphum.me — แผนที่ความรู้เชิงภาพ
ความรู้ชุดเดียว มองได้หลายแบบ: กราฟพึ่งพา โรดแมป เอาต์ไลน์ และมุมมองโฟกัส — พร้อมหลักสูตร Frontend, Computer Networks และ Cybersecurity ที่ผมเขียนและตรวจสอบเอง

- บทบาท
- นักพัฒนาเดี่ยว — โมเดลข้อมูล หลักสูตร (เนื้อหาและเอกสารวิจัย) Frontend การเข้าถึง และการทดสอบ
- ทีม
- งานเดี่ยว
- ระยะเวลา
- 4–6 ต.ค. 2026
- ปี
- 2026
ตัวเลขสำคัญ
- 146
- แผนที่ทั้งหมด (เผยแพร่ 21 + เร็ว ๆ นี้ 125)
- 699
- หัวข้อ canonical
- 7,012
- ความสัมพันธ์เชิงความหมาย (edges)
- 404
- resource ทางการ
- 92
- unit tests ที่ผ่าน (17 ไฟล์)
graph.phatphum.me เป็นเว็บแผนที่ความรู้ที่ตั้งใจให้ “เห็นว่าเรื่องต่าง ๆ เชื่อมกันอย่างไร” แทนรายการหัวข้อยาว ๆ หัวข้อหนึ่งเป็นความรู้ canonical ชิ้นเดียว (สรุป เหตุผลที่สำคัญ ระดับความยาก) แล้วไปปรากฏในหลายแผนที่ได้โดยไม่ซ้ำเนื้อหาและความคืบหน้า ผู้เรียนเลือกดูเป็นกราฟ โรดแมป เอาต์ไลน์ หรือ Focus ที่คัดเฉพาะสิ่งที่ต้องรู้ก่อนและสิ่งที่ปลดล็อกต่อ ข้อมูลเป็นหลักสูตรที่ผมเขียนเอง 146 แผนที่ (เผยแพร่แล้ว 21 แผนที่: Frontend, Computer Networks และ Cybersecurity พร้อมแผนที่ย่อย) หัวข้อ 699 เรื่อง และ resource ทางการ 404 รายการ ความคืบหน้าของผู้เรียนเก็บในเบราว์เซอร์เท่านั้น ไม่มีบัญชีผู้ใช้
โจทย์และปัญหา
- 01รายการหัวข้อยาว ๆ บอกไม่ได้ว่าอะไรต้องเรียนก่อน อะไรเป็นทางเลือก และเรื่องหนึ่งไปเกี่ยวกับอีกเรื่องอย่างไร
- 02แผนที่แบบภาพนิ่งหรือกราฟอย่างเดียวอ่านยากบนมือถือและสำหรับผู้ใช้คีย์บอร์ดหรือโปรแกรมอ่านหน้าจอ
- 03หัวข้อเดียวกัน (เช่น HTTP หรือ accessibility) ปรากฏในหลายหลักสูตร ถ้าคัดลอกเนื้อหาไปทุกที่ก็แก้ยากและความคืบหน้าไม่ตรงกัน
- 04หลักสูตรขนาดใหญ่เขียนผิดพลาดง่าย: cycle ของ prerequisite, เส้นเชื่อมที่ชี้ข้ามแผนที่ หรือหัวข้อพื้นฐานที่ถูกตัดทิ้งเงียบ ๆ
วิธีแก้
- 01โมเดลข้อมูล 7 ตาราง: Topic คือความรู้ canonical ส่วน GraphNode คือ “การปรากฏของหัวข้อในแผนที่หนึ่ง” จึงใช้ซ้ำข้ามแผนที่ได้ทั้งเนื้อหาและความคืบหน้า GraphEdge มี composite foreign key กันไม่ให้ปลายเส้นอยู่คนละแผนที่ และ Resource ผูกกับหัวข้อผ่าน TopicResource
- 02ความสัมพันธ์ 5 ชนิดที่วาดต่างกัน: PREREQUISITE (ต้องเป็น DAG), RECOMMENDED, RELATED, ALTERNATIVE และ UNLOCKS การไล่ย้อนหา ancestor/descendant, เส้นทางสั้นที่สุด และการเรียง topological ใช้เฉพาะ PREREQUISITE
- 03สี่มุมมองจากข้อมูลชุดเดียว: Graph (React Flow พร้อมโหนดแบบ semantic zoom และ MiniMap), Roadmap (หัวข้อใหญ่เป็นหลักไมล์พร้อมแถบความคืบหน้าและแบนเนอร์ “You are here”), Outline (รายการที่ขยายได้) และ Focus (จัดเลย์เอาต์ใหม่เฉพาะหัวข้อที่เกี่ยวข้องด้วย dagre)
- 04ความคืบหน้า Not started / Learning / Understood เก็บใน localStorage แบบมีเวอร์ชันโดยอิง ID ของหัวข้อ canonical มีปุ่ม Undo, ปุ่ม “I already know these” และเปลี่ยนทั้งหมวดได้ในครั้งเดียว ไม่มีการส่งขึ้นเซิร์ฟเวอร์หรือใส่ใน URL
- 05หลักสูตรที่ผมเขียนเอง: Frontend Developer (14 หัวข้อใหญ่ พร้อมแผนที่ย่อย JavaScript, CSS, React), Computer Networks (26 หัวข้อใหญ่ 215 หัวข้อ 15 โปรเจกต์ 7 แผนที่ย่อย) และ Cybersecurity Foundations (28 หัวข้อใหญ่ 229 หัวข้อ 25 โปรเจกต์ 8 แผนที่ย่อย โดยอิง OWASP Top 10:2025 เป็นเกณฑ์พื้นฐานด้านความตระหนักรู้) พร้อมเอกสารวิจัยและรายการอ้างอิงใน prisma/seeds
- 06แค็ตตาล็อก Computer Science มีแผนที่ที่ยังไม่เปิด 125 รายการที่ระบุสถานะ COMING_SOON ชัดเจน ไม่มีโหนดหรือลิงก์ปลอม และมีหน้า domain ที่รองรับโดเมนใหม่โดยแค่เพิ่มข้อมูล seed
- 07Seed ทำใน transaction เดียวด้วย ID ที่คงที่ ตรวจความถูกต้องก่อนเขียน (หา cycle, endpoint ที่หาย, slug/path ซ้ำ, resource ที่ไม่ผูกกับหัวข้อใด) และมีคำสั่ง db:validate ตรวจซ้ำกับฐานข้อมูลจริง
- 08มือถือ (ต่ำกว่า 768px) ออกแบบใหม่: เริ่มที่ Outline, กราฟเป็นรายการทีละหัวข้อใหญ่แบ่งเป็นระดับ, และแผง Inspector/Focus เป็น bottom sheet ส่วนแผงด้านข้างอื่นเปิดได้ทีละแผง
ผลลัพธ์
- 01ได้เว็บที่เปิดแผนที่เดียวกันได้ 4 แบบ และผู้เรียนเห็นตลอดว่าอยู่ตรงไหน ควรไปต่อที่ไหน โดยไม่ต้องมีบัญชี
- 02ชุดทดสอบหน่วย 92 รายการใน 17 ไฟล์ผ่านทั้งหมด ครอบคลุมอัลกอริทึมของกราฟ เลย์เอาต์ โรดแมป การตรวจสอบข้อมูล seed, progress, markdown, ข้อจำกัดของ SQLite จริง และการเขียน CSS (ห้าม !important ห้ามใช้สี hex นอก tokens)
- 03ชุด E2E ด้วย Playwright (เดสก์ท็อปและมือถือ) พร้อมสแกน axe-core ทุกหน้าทั้งธีมสว่างและมืด ตรวจขนาดตัวอักษรขั้นต่ำ ขนาดพื้นที่แตะ และ layout shift
- 04รองรับการเข้าถึงครบ: คีย์บอร์ดครอบคลุมแผนที่ (กด Tab หยุดที่แผนที่ครั้งเดียว), reduced motion, forced-colors และ high-contrast
สิ่งที่ส่งมอบ
- เว็บ Next.js 16 + React 19 พร้อมสี่มุมมอง (Graph, Roadmap, Outline, Focus) และ Topic Inspector
- โมเดลข้อมูล Prisma 7 + SQLite (7 ตาราง) พร้อม migration, seed แบบ idempotent และตัวตรวจ db:validate
- หลักสูตร Frontend, Computer Networks และ Cybersecurity พร้อมเอกสารวิจัยและรายการอ้างอิง
- ระบบธีมจาก design tokens (สว่าง มืด และ high-contrast) และ CSS เขียนเอง ไม่ใช้เฟรมเวิร์ก
- ชุดทดสอบ Vitest และ Playwright + axe-core
แกลเลอรี
จากหน้าแรกสู่แผนที่ความรู้
16:9 / LG
หน้าแรก “Knowledge is connected.” เลือกโดเมนความรู้ (เปิดแล้ว 1 จาก 5) พร้อมตัวอย่างกราฟที่ดึงจากฐานข้อมูลจริง ไม่ใช่ภาพนิ่ง

หน้าโดเมน Computer Science: แผนที่ที่เผยแพร่แล้วแสดงความคืบหน้าและแผนที่ย่อย (JavaScript, CSS, React) ส่วนแผนที่ที่ยังไม่เปิดระบุว่า Coming soon ตามจริง

มุมมอง Graph ของ Frontend Developer: การ์ดหัวข้อจัดเป็นกลุ่มตามหัวข้อใหญ่ เส้นแสดงชนิดความสัมพันธ์ และเครื่องหมายถูกคือสิ่งที่เข้าใจแล้ว (เก็บในเบราว์เซอร์)
ทบทวนโปรเจกต์
ความท้าทาย
- ทำให้กราฟอ่านออกที่ทุกระดับซูม: ใช้โหนดแบบ semantic zoom (การ์ดแสดงสรุปตั้งแต่ซูม 80%, ตัวอักษรไม่เล็กกว่า 12px) จัดเลย์เอาต์เป็นกลุ่มหัวข้อใหญ่ด้วย dagre และให้ Focus คัดเฉพาะที่เกี่ยวข้อง แทนการวาดกราฟทั้งแผนที่ทับกัน
- หัวข้อเดียวอยู่ในหลายแผนที่แต่แผนที่ย่อยต้องรวม prerequisite ที่เป็นบรรพบุรุษมาด้วย ไม่ตัดพื้นฐานทิ้งเงียบ ๆ จึงต้องมีตัวตรวจ cycle และ endpoint ที่ครอบทั้งตอน seed และตอนรันกับฐานข้อมูล
- ใช้ Prisma 7 กับ SQLite ผ่าน adapter (better-sqlite3): ต้องล็อกเวอร์ชัน CLI, client และ adapter ให้ตรงกัน (7.10.0) และแก้ path ของไฟล์ฐานข้อมูลให้ทำงานเหมือนกันทั้ง CLI และตอนรัน
- แต่ละธีมต้องคอนทราสต์เพียงพอ (เส้นเชื่อม ≥ 3:1) โดยไม่มีสีฮาร์ดโค้ดในคอมโพเนนต์ จึงเขียนเทสต์ให้บิลด์ล้มเมื่อเจอสี hex, !important หรือ token ที่ไม่ได้นิยาม
สิ่งที่เรียนรู้
- แยก “ความรู้” ออกจาก “การปรากฏในแผนที่” ทำให้เพิ่มแผนที่ใหม่ได้โดยไม่ต้องคัดลอกเนื้อหา และความคืบหน้าตามผู้เรียนไปทุกแผนที่
- ให้ข้อมูลที่เขียนมือผ่านตัวตรวจอัตโนมัติ (cycle, อ้างอิง, ซ้ำ) ก่อนเขียนลงฐานข้อมูล ช่วยให้ขยายหลักสูตรได้โดยไม่กลัวพัง
- ทดสอบการเข้าถึงด้วยเครื่องมืออัตโนมัติ (axe-core) ควบคู่กับเกณฑ์ที่วัดได้ (ขนาดตัวอักษร พื้นที่แตะ) จับปัญหาได้เร็วกว่าตรวจด้วยตา
เทคโนโลยี
สนใจงานแนวนี้?
เล่าโจทย์ของคุณให้ผมฟัง ตอบกลับภายใน 24 ชั่วโมง