สิ่งที่คุณสร้างขึ้นมา
สิ่งที่เราสร้าง
หัวข้อที่มีชื่อว่า “สิ่งที่เราสร้าง”คุณเริ่มคอร์สนี้ด้วย repo เปล่า ๆ และไฟล์ .env หนึ่งไฟล์ และกำลังจะจบด้วย บอร์ด Kanban แบบเรียลไทม์รองรับผู้ใช้หลายคน ที่รันได้ครบวงจรจากคำสั่ง docker compose up --build เพียงคำสั่งเดียว — และที่สำคัญกว่านั้น คุณเขียนทุกเลเยอร์ด้วยตัวเอง
ลองไล่เส้นทางที่ card ใบเดียวเดินทางผ่าน แล้วคุณจะเห็นทั้งระบบพร้อมกัน ผู้ใช้ล็อกอิน แล้ว passwords ตรวจสอบ hash แบบ argon2 ของเขา ขณะที่ jwt ออก token ที่ middleware จะเช็คกับ Redis allowlist ในทุก ๆ request ต่อจากนั้น เขาเปิดบอร์ดขึ้นมา แล้ว apiFetch แบบมี type ของ boards-list ก็เรียก REST API ที่คุณออกแบบไว้ใน design — การเรียกที่ เมื่อบอร์ดอุ่นอยู่แล้ว จะไม่แตะ Postgres เลย เพราะ cache-reads เสิร์ฟจาก entry แบบ cache-aside ใน Redis เขาลาก card จากคอลัมน์หนึ่งไปอีกคอลัมน์ แล้ว optimistic update ของ drag-drop ก็เลื่อน card บนหน้าจอทันที ขณะที่ PATCH คำนวณ fractional position จาก move-reorder บันทึกลงฐานข้อมูล แล้ว invalidation ก็ลบ cache key ที่ล้าสมัยไปแล้วทิ้ง การเขียนเดียวกันนั้นก็ publish event card.moved ขึ้นบน Redis channel board:{id} จาก redis-backplane ซึ่ง ws-endpoint กระจายต่อไปยังทุก WebSocket ที่เปิดอยู่ แล้ว live-sync ของผู้ใช้ คนที่สอง ก็ reconcile การย้ายนั้นเข้าบอร์ดของเขาโดยไม่ต้องรีโหลด card ใบเดียว แต่ได้ใช้งานทั้ง auth, REST API, cache, ฐานข้อมูล, realtime backplane และ frontend client อิสระสองตัว
นั่นแหละคือสิ่งที่คอร์สนี้สอนจริง ๆ ไม่ใช่เครื่องมือสิบเอ็ดตัวแบบแยกส่วน แต่คือวิธีที่ทุกตัวเชื่อมโยงกัน ทุกชิ้นส่วนมีอยู่เพราะโปรดักต์ต้องการจริง ๆ และทุกโมดูลด้านล่างก็ปรับเนื้อหาจากคอร์ส Learn Hub หนึ่งคอร์สมาสร้างชิ้นส่วนนั้นขึ้นจริง
สิ่งที่คุณได้ฝึก
หัวข้อที่มีชื่อว่า “สิ่งที่คุณได้ฝึก”นี่คือการสร้างทั้งหมด ไล่ทีละโมดูล — สิ่งที่คุณได้ฝึกจริง ๆ ในแต่ละโมดูล และคอร์ส Learn Hub ต้นทางที่นำมาปรับใช้
| โมดูล | สิ่งที่คุณได้ฝึก | คอร์สใน Learn Hub ที่อ้างอิง |
|---|---|---|
| 1 · Setup & Tooling | Installing the Rust/Node/Docker toolchain, scaffolding a Cargo workspace and an Astro app, and standing up db + redis in Compose | Docker / Rust |
| 2 · Database Design | Modeling users, boards, columns, cards, and labels in PostgreSQL with SQL migrations, indexes, and an ordering strategy | PostgreSQL |
| 3 · Backend Foundations | Wiring an Axum server: config loading, tracing, a typed AppError, a PgPool + Redis pool, and a shared AppState | Rust / Rust for TypeScript developers |
| 4 · Authentication | argon2 password hashing, JWT issuing and verification, and a Redis-backed token allowlist enforced in middleware | Rust + Redis + REST API Design |
| 5 · REST API | CRUD handlers for boards, columns, cards, and labels, plus fractional-position card moves across columns | REST API Design |
| 6 · Caching | A Redis cache-aside read path, key invalidation on writes, and a fixed-window rate limiter | Redis |
| 7 · Realtime | A WebSocket endpoint and a Redis board:{id} pub/sub backplane fanning changes out to every connected client | WebSocket Design |
| 8 · Frontend | An Astro shell — typed apiFetch, auth pages, and a boards list — that talks to your REST API | Astro |
| 9 · The Kanban Island | A Preact island with HTML5 drag-and-drop, optimistic UI, live WebSocket sync, and reconnect | Astro |
| 10 · Testing | Rust #[sqlx::test] integration tests against a real database, plus vitest reducer tests on the frontend | Rust testing |
| 11 · Docker & Compose | Multi-stage images for backend and frontend, and a healthcheck-gated Compose stack that comes up with one command | Docker |
ทำไมทุกชิ้นถึงประกอบกันได้
หัวข้อที่มีชื่อว่า “ทำไมทุกชิ้นถึงประกอบกันได้”สังเกตว่าส่วนที่ยากของแต่ละโมดูลมีความหมายขึ้นมาได้ก็เพราะโมดูลรอบข้างเท่านั้น fractional position จาก move-reorder มีอยู่เพื่อให้การลากไม่ต้องเรียงเลขคอลัมน์ใหม่ทั้งคอลัมน์ — ซึ่งสำคัญพอดีเพราะการเรียงเลขใหม่นั้นจะต้อง broadcast ไปยังทุก client และให้ live-sync reconcile ตาม Redis allowlist จาก middleware คือสิ่งที่ทำให้การ logout ทำให้ token ใช้ไม่ได้ทันที บน Redis instance ตัวเดียวกับที่รองรับทั้ง cache ของ cache-reads และ pub/sub ของ redis-backplane cache invalidation และ realtime event ยิงออกมาจากเส้นทางการเขียน เดียวกัน ดังนั้น cache ที่อุ่นอยู่กับบอร์ดที่สดอยู่จึงไม่มีทางขัดแย้งกัน นี่คือสิ่งที่การสร้างโปรดักต์เดียวที่กลมกลืนกันให้คุณ ซึ่งทูทอเรียลแยกกันสิบเอ็ดตัวให้ไม่ได้ นั่นคือ รอยต่อคือที่ที่งานวิศวกรรมจริง ๆ อยู่ และคุณสร้างทุกรอยต่อด้วยตัวเอง
คุณสร้าง TaskFlow แบบครบวงจร — auth บน Redis allowlist, REST API พร้อม fractional-position moves, Redis cache พร้อม invalidation และ rate limiting, เลเยอร์ realtime แบบ WebSocket บน Redis backplane, frontend ด้วย Astro พร้อม Kanban island แบบ drag-and-drop, การทดสอบทั้งสองฝั่ง และสแตก Docker Compose ที่รันด้วยคำสั่งเดียว — ตลอดสิบเอ็ดโมดูล แต่ละโมดูลปรับเนื้อหาจากคอร์ส Learn Hub มาใช้กับส่วนหนึ่งของโปรดักต์จริง ต่อไป: วิธีที่เป็นรูปธรรมในการต่อยอดจากตรงนี้