📐 UX/UI Principles — ตัดสินงาน AI ให้เป็น
หน้านี้ "ไม่ใช่" design school · เป็นพื้นฐานแค่พอ "อ่าน UI ที่ AI สร้างให้แล้วบอกได้ว่าดี/แย่" · AI เขียน UI ที่ "ดูเสร็จ" ได้ใน 30 วินาที — แต่ "ใช้จริงไม่ได้" · งานของคุณคือ จับให้ทัน
📑 สารบัญ
- เลือก UI Technology ให้ตรงงาน 🎯
- รู้จัก user ก่อนเขียน UI
- ลำดับความสำคัญ (Hierarchy)
- 5 States ที่ AI ลืมเสมอ
- Feedback & Confirmation
- Forms ที่ใช้ได้จริง
- Tables & Lists
- Layout Patterns ที่ใช้บ่อย
- คิดถึงมือถือ
- สี · ไอคอน · ความหมาย
- 10 ข้อ "อย่าทำ"
- Accessibility พื้นฐาน
- ⚠️ AI-Era UX Traps
- Checklist ก่อนส่งงาน
0. เลือก UI Technology ให้ตรงงาน 🎯
"คำถามแรก ก่อนพูดถึง design — UI ของคุณจะรันที่ไหน?" · ถ้าตอบผิดตรงนี้ → design ดีแค่ไหนก็ "ใช้ไม่ได้" · ตัวอย่างคลาสสิก: นักศึกษาสร้าง tkinter app สวย ๆ แล้วอยาก "deploy ขึ้น cloud" → ทำไม่ได้
🤔 ตอบ 3 คำถามนี้ก่อนเลือก tech
- user จะใช้ที่ไหน? — เครื่องเดียวกับคุณ / เครื่องคนละเครื่อง / มือถือ / ที่ไหนก็ได้ที่มีเน็ต
- user จะเปิดยังไง? — double-click .exe / เปิด browser แล้ว URL / chat กับ bot ใน LINE
- มีกี่คนใช้พร้อมกัน? — แค่ฉัน / 5 คน / 100 คน / 10,000 คน
📊 7 UI Technologies — เปรียบเทียบ
| Technology | เหมาะกับ | รันที่ | Deploy cloud? | Learning curve |
|---|---|---|---|---|
CLIinput(), click, argparse |
tool ของตัวเอง · script · automation · workshop W07 | terminal บนเครื่อง user | ❌ no | ⭐ ง่ายสุด |
| Tkinter / PyQt (Desktop GUI) |
app เครื่องเดียว · ออฟไลน์ · ใช้กับ hardware · kiosk | desktop ของ user | ❌ NO — ส่งเป็น .exe เท่านั้น | ⭐⭐ ปานกลาง |
| Streamlit | data dashboard · prototype · internal tool · W09/W10/W12 | browser ของ user (server-rendered) | ✅ yes (Streamlit Cloud · Cloud Run) | ⭐⭐ ง่าย-ปานกลาง |
| Gradio | demo ML model · quick form · share link | browser | ✅ yes (Hugging Face Spaces) | ⭐⭐ ง่าย |
| Flask / FastAPI + HTML | web app จริงจัง · multi-page · login · DB · W12+ | browser (server-rendered) | ✅ yes (Cloud Run · Render · Fly.io) | ⭐⭐⭐ ปานกลาง-ยาก |
| HTML/JS frontend + Python API | web app ที่ต้องการ UI ขั้นสูง · real-time · mobile-feel | browser + cloud server | ✅ yes (frontend: Cloudflare/Vercel · backend: Cloud Run) | ⭐⭐⭐⭐ ยาก |
| LINE / Discord Bot | command via chat · notification · ส่งภาพ · ใช้บนมือถือ | chat client (LINE/Discord) ของ user | ✅ yes (webhook + Cloud Run/Lambda) | ⭐⭐⭐ ปานกลาง |
🌳 Decision Tree — "ฉันควรใช้อะไร?"
ใครจะใช้ + ที่ไหน?
│
├─ แค่ฉัน · บนเครื่องฉัน · ออฟไลน์ก็ได้
│ ├─ งานสั้น · ใช้ครั้งเดียว → CLI (W07)
│ ├─ ต้องมี GUI ปุ่มกด · ต่อ hardware → Tkinter
│ └─ data analysis · plot → Jupyter / Colab
│
├─ คน 5–50 คน · มือถือ/desktop · ต้องการ URL
│ ├─ data dashboard · quick proto → Streamlit (W09–W12)
│ ├─ form + DB + login + multi-page → Flask + HTML (W12+)
│ └─ ML demo · share link → Gradio
│
├─ command บนมือถือ · ส่งข้อความ
│ └─ → LINE / Discord Bot
│
└─ คน 1,000+ · UI ขั้นสูง · real-time
└─ → HTML/JS frontend + Python API
(เกินขอบเขตคอร์สนี้ · เป็นเป้าหมายปี 2-3)
⚠️ Common Mismatches — กับดักที่นักศึกษาเจอบ่อย
| ทำ | แล้วอยาก | ปัญหา | ทำยังไง |
|---|---|---|---|
| Tkinter app | "deploy บน Cloud Run" | ❌ ทำไม่ได้ · Tkinter รันใน browser ไม่ได้ | เขียนใหม่เป็น Streamlit / Flask · หรือสร้างเป็น .exe ส่งให้ติดตั้ง |
| Tkinter app | "เพื่อนเปิดบนมือถือ" | ❌ ทำไม่ได้ · ไม่มี Python บนมือถือ · ไม่มี windowing | เขียนเป็น web app (Streamlit/Flask) → URL → มือถือเปิดได้ |
| Streamlit | "รับ user 10,000 คน" | ⚠️ ช้า + แพง · Streamlit ออกแบบสำหรับ internal tool | เขียนเป็น Flask/FastAPI + HTML/JS · scale ได้ดีกว่า |
| Flask + HTML | "แค่ทำ chart ดู" | ⚠️ over-engineering · ใช้เวลา 1 อาทิตย์ทั้งที่ Streamlit ทำได้ใน 30 นาที | ใช้ Streamlit ก่อน · ถ้าจำเป็นค่อยย้ายไป Flask |
| CLI | "ส่งคุณยายใช้" | ❌ คุณยายเปิด terminal ไม่เป็น | ทำเป็น web app หรือ bot |
| LINE Bot | "admin panel แก้ database" | ⚠️ Bot UI จำกัด · table ใหญ่ใส่ไม่ได้ | ใช้ web app สำหรับ admin · bot เก็บไว้ใช้กับ end-user |
| Jupyter Notebook | "ให้คนกดใช้งาน" | ❌ Notebook = environment ของ developer · ไม่ใช่ของ user | เขียน code ใน .py → ใส่ใน Streamlit / Flask |
🚢 Deployment Reality Check
เลือก tech แล้ว · ตรวจว่า "จริง ๆ deploy ยังไง" ก่อนใช้เวลาเขียน:
| Tech | วิธี distribute | ค่าใช้จ่าย |
|---|---|---|
| Tkinter / PyQt | PyInstaller → .exe · ส่งไฟล์ให้ user / USB / เซิร์ฟเวอร์ download | ฟรี · ใช้ disk บนเครื่อง user |
| Streamlit | Streamlit Cloud (ฟรี · เชื่อม GitHub) · หรือ Cloud Run | ฟรี-เริ่มต้น · เพิ่มขึ้นถ้าใช้เยอะ |
| Flask | Cloud Run (Google) · Render · Fly.io · Heroku | ฟรี-เริ่มต้น (มี free tier · จำกัด) |
| HTML/JS + API | Frontend: Cloudflare Pages / Vercel · Backend: Cloud Run | ฟรี-เริ่มต้น (มี free tier เยอะ) |
| LINE Bot | Webhook URL บน Cloud Run + LINE Developers Console | ฟรี (LINE ไม่คิดเงิน webhook) |
| CLI | user ลง Python + รัน pip install ของฉัน หรือใช้ pipx |
ฟรี |
💪 ในคอร์สนี้เน้นอะไร
- W07: CLI tools (3 ตัว · ไม่มี GUI)
- W09–W10: Jupyter/Colab notebook (data analysis)
- W12: Streamlit (เริ่มต้น) + Flask (ถ้าต้องการ)
- W14: Deploy Streamlit/Flask ขึ้น Cloud Run / Streamlit Cloud
- W15 Final Project: ใช้อันไหนก็ได้ที่เหมาะกับ user persona
1. รู้จัก user ก่อนเขียน UI
ก่อนถาม AI ว่า "ทำหน้านี้ให้หน่อย" — ตอบ 4 คำถามนี้ในใจก่อน:
- user ใช้บนอะไร? — มือถือ / desktop / tablet / TV / kiosk
- user มีเวลาแค่ไหน? — อ่านยาวได้ / 3 วินาทีต้องเข้าใจ
- user ทำสำเร็จเมื่อไหร่? — กดอะไรเสร็จ → success?
- user พลาดเมื่อไหร่? — กดผิด / ใส่ผิด → จะเสียอะไร?
2. ลำดับความสำคัญ — Information Hierarchy
UI ที่ดี = "มองครั้งแรกรู้ทันทีว่าต้องกดอะไร"
กฎ 1-2-3 ของ primary action
- 1 หน้า = 1 primary action · มากกว่านี้ user สับสน
- 2 ปุ่มรอง (cancel + 1 อื่น) · เกินนั้นต้องคิดใหม่
- 3 วินาที · ถ้ามองหน้าครั้งแรกแล้วยังไม่รู้ว่ากดอะไร → ปรับ hierarchy
3. 5 States ที่ AI ลืมเสมอ 🔥
"#1 จุดที่ AI สร้าง UI ผิดบ่อยที่สุด" · AI สมมุติว่า data มีเสมอ · มีถูกต้อง · โหลดเสร็จ · ไม่มี error · realtime · — โลกจริงไม่ใช่
State ที่ทุก UI ต้องคิด
| State | เกิดเมื่อ | ต้องโชว์อะไร |
|---|---|---|
| Loading | กำลังโหลด data | spinner / skeleton · บอก "กี่วินาที" ถ้าได้ |
| Empty | data ว่าง (เพิ่งเริ่ม / ลบหมด) | คำอธิบาย + ปุ่ม "เพิ่มอันแรก" |
| Error | โหลดผิด · ไม่มี internet · 403 | error message ภาษาคน + ปุ่ม "ลองใหม่" |
| Partial | โหลดบางส่วน · บางช่องว่าง | โชว์ของที่มี + dim ของที่ขาด · ไม่ใช่ blank ทั้งหน้า |
| Success | data มา · กดสำเร็จ | feedback ชัด · ไม่ใช่หน้าเดิมเฉย ๆ |
4. Feedback & Confirmation
4 กฎ "ตอบกลับ user"
- การกระทำที่ใช้เวลา >0.5 วินาที ต้องโชว์ loading · ไม่ใช่ปล่อยให้นั่งงง
- การกระทำที่กลับไม่ได้ (ลบ, ส่ง email, จ่ายเงิน) ต้องถาม confirm ก่อน
- การกระทำที่กลับได้ (toggle, edit) ไม่ต้องถาม · ทำเลย · ถ้าผิด user กดกลับ
- หลังกดสำเร็จ ต้องมี feedback (toast, change color, redirect) · ไม่ใช่หน้าเงียบ
5. Forms ที่ใช้ได้จริง
กฎพื้นฐาน 8 ข้อ
- Label อยู่บนช่อง (ไม่ใช่ข้างใน) — ช่อง placeholder ไม่ใช่ label
- Required ใส่ * หรือบอก "(จำเป็น)" · optional ใส่ "(ไม่จำเป็น)"
- Validate ใต้ช่อง (ไม่ใช่ alert popup)
- Validate ตอนกด Submit (ไม่ใช่ขณะพิมพ์) · ยกเว้น email/password ที่มี rule ชัด
- Error message บอก "ทำยังไงต่อ" · ไม่ใช่แค่ "ผิด"
- Default value ดี ๆ · ลด typing — user ไม่ต้องเดาว่าใส่อะไร
- เรียง field ตามลำดับธรรมชาติ · ชื่อ → email → เบอร์ (ไม่ใช่ตรงข้าม)
- กลุ่ม field ที่เกี่ยวกัน (ที่อยู่ทุก field ติดกัน · ไม่ใช่กระจาย)
6. Tables & Lists
ตาราง = 80% ของ admin panel
AI ชอบทำ table แบบ vanilla — ไม่มี sort, filter, empty state · ของจริงต้องมี:
- คอลัมน์ที่จำเป็นเท่านั้น · 5-7 คอลัมน์เกินไป → ซ่อนใน "detail view"
- Sort ได้ (คลิก header)
- Filter / Search · ถ้ามี >20 แถว · ขาดไม่ได้
- Pagination หรือ infinite scroll · ถ้ามี >100 แถว
- Empty state ถ้าตารางว่าง (filter หาไม่เจอ ก็ empty)
- Loading skeleton ตอนโหลด · ไม่ใช่ blank table
- Action ของแต่ละแถว · ปุ่มเดียวต่อแถว · ลึก ๆ ในเมนู ⋮
- Bulk action ถ้าต้องทำหลายแถวพร้อมกัน (checkbox + bar ขึ้นมา)
7. Layout Patterns ที่ใช้บ่อย
มี ~6 layout ที่ครอบ 95% ของแอปที่จะทำในคอร์สนี้ · เลือกให้ตรง "ก่อนสั่ง AI"
(a) List-Detail
ซ้าย = list · ขวา = detail ของที่เลือก · เหมาะกับ email, chat, file manager
┌─────────────┬──────────────────────┐ │ ▸ Ploy │ Ploy │ │ ▾ Nat │ ID: 640002 │ │ Mint │ Email: nat@ubu... │ │ Pim │ Scores: 85, 72, 91 │ │ │ [Edit] [Mail] │ └─────────────┴──────────────────────┘
(b) Dashboard / Cards
กลุ่ม metric / status · เหมาะกับ overview · "ระวัง — อย่าใส่ dashboard ถ้าไม่จำเป็น"
┌─────────┬─────────┬─────────┐ │ Total │ Passed │ Failed │ │ 42 │ 35 │ 7 │ └─────────┴─────────┴─────────┘ ┌────────────────────────────┐ │ Recent Activity │ │ • Ploy submitted lab 3 │ │ • Nat updated profile │ └────────────────────────────┘
(c) Wizard / Stepper
สำหรับ workflow หลายขั้น · บังคับลำดับ · ใช้กับ form ยาว, registration, checkout
┌─────────────────────────────────┐ │ ●─────●─────○─────○ │ │ Info Course Submit Confirm │ ├─────────────────────────────────┤ │ Step 2: Choose course │ │ [ ] ENG101 │ │ [ ] ENG102 │ │ [x] CPM 101 │ │ │ │ [Back] [Next →] │ └─────────────────────────────────┘
(d) Settings / Tabs
เมนูซ้าย / tab บน · เปลี่ยน content ขวา · เหมาะกับ admin / preferences
┌─────────┬──────────────────────┐ │ Profile │ ▸ Account │ │ Account │ │ │ Security│ Username: ploy │ │ Notifs │ Email: ____ │ │ │ [Save] │ └─────────┴──────────────────────┘
(e) Public landing
หน้าโฮม · hero + features + call-to-action · เหมาะกับ marketing / portfolio
┌─────────────────────────────────┐ │ [Logo] [Sign in] │ ├─────────────────────────────────┤ │ │ │ Big Headline Here │ │ Subtitle explaining what │ │ [Get Started] │ │ │ ├─────────────────────────────────┤ │ Feature 1 Feature 2 Feature 3│ └─────────────────────────────────┘
(f) Single-action page
1 ปุ่มใหญ่กลางจอ · เหมาะกับ kiosk, quick action, mobile-first
┌─────────────────────────────────┐ │ │ │ │ │ Scan QR │ │ ┏━━━━━━━━━━━┓ │ │ ┃ ▢▢▢▢ ┃ │ │ ┗━━━━━━━━━━━┛ │ │ │ │ [Open Camera] │ │ │ └─────────────────────────────────┘
8. คิดถึงมือถือ
"นักศึกษาส่วนใหญ่เปิด web app บนมือถือ" · ถ้าไม่ทดสอบบนมือถือ → AI สร้าง UI ที่ใช้บนมือถือไม่ได้
5 กฎพื้นฐานมือถือ
- ปุ่มอย่างน้อย 44×44 px · นิ้วต้องกดได้
- font ≥ 16 px · ไม่งั้น iOS จะ zoom ทุกครั้งที่กรอก
- 1 column · อย่ายัด 2-3 column บนหน้าจอแคบ
- Form fields ใช้
typeที่ถูก ·type="email",type="tel"· มือถือเปลี่ยน keyboard ให้ - ไม่ต้อง hover · มือถือไม่มี · ทำให้ทุกอย่างกดได้
9. สี · ไอคอน · ความหมาย
สีมีความหมาย — อย่าใช้สุ่ม
| สี | หมายถึง | ตัวอย่างใช้ |
|---|---|---|
| 🔴 แดง | danger · destructive | ปุ่ม Delete · error message |
| 🟢 เขียว | success · positive | "บันทึกสำเร็จ" · ผ่าน |
| 🟡 เหลือง / ส้ม | warning · ต้องระวัง | "คุณยังไม่ได้ save" · เตือน |
| 🔵 ฟ้า / น้ำเงิน | info · primary · neutral | ปุ่มหลัก · ลิงก์ · ข้อมูล |
| ⬜ เทา | disabled · secondary | ปุ่มที่กดไม่ได้ตอนนี้ |
3 กฎสี
- 1 สี primary · 1 สี accent · neutral grayscale 4-5 ระดับ — มากกว่านี้จะดูเหมือนรุ้ง
- contrast พอ — text สีเทาบนพื้นเทา = อ่านไม่ออก · ใช้ contrast checker
- ใช้สีให้ตรงความหมาย — แดง = อันตราย · ไม่ใช่แดง = ปุ่มหลักเพราะเด่นดี (สับสน)
ไอคอน — ใช้ที่ user รู้
- 🔍 = search · ⚙️ = settings · 🗑️ = delete · ✏️ = edit · ➕ = add — มาตรฐาน · ใช้ได้
- ไอคอนแปลก ๆ → ใส่ label คู่ด้วย · อย่าให้ user เดา
- หลีกเลี่ยง icon-only buttons ถ้าไม่จำเป็น · text + icon ดีกว่า icon เปล่า
10. ❌ 10 ข้อ "อย่าทำ"
| อย่า | เพราะ | ทำแทน |
|---|---|---|
| Modal popup ทุกอย่าง | กระทบ flow · มือถือใช้ไม่สะดวก | inline edit · drawer · navigate page ใหม่ |
| ซ่อน action สำคัญในเมนู ⋮ | user หาไม่เจอ | primary action เห็นทันที |
| ใส่ dashboard ที่ user ไม่ดู | เสียพื้นที่ · AI ชอบเสริมเข้ามาเอง | ถาม user ว่าต้องการดู metric อะไรจริง |
| Form ยาว 30 ช่อง | user ทิ้ง | แบ่งเป็น wizard / เก็บแค่จำเป็น |
| auto-save ที่ไม่บอก | user ไม่รู้ว่า save แล้วหรือยัง | มี indicator "Saved · 3s ago" |
| Color-only signal | color-blind มองไม่ออก | ใส่ icon + text + color |
| Disable ปุ่มเงียบ ๆ | user ไม่รู้ว่าทำไมกดไม่ได้ | tooltip บอกเหตุผล · หรือบอกเงื่อนไขข้างปุ่ม |
| Error "Something went wrong" | ไม่ช่วยอะไร | บอกว่าผิดอะไร + ทำยังไงต่อ |
| Carousel/slider บน landing | คนกดดูจริงน้อยมาก · เสีย performance | โชว์ทุก feature เรียง · ให้ scroll |
| Animation 1+ วินาที | ช้า · annoying | animation ≤ 300ms · functional ไม่ใช่ decorative |
11. Accessibility พื้นฐาน
"a11y" = accessibility · ทำให้ user ที่ตาบอด/หูหนวก/มือไม่สะดวก ใช้ได้ · "ไม่ใช่แค่จริยธรรม · ส่วนหนึ่งของกฎหมายในหลายประเทศ"
6 ข้อขั้นต่ำ (เริ่มได้ทันที)
- contrast ≥ 4.5:1 สำหรับ text · ตรวจที่ WebAIM Contrast Checker
altattribute ใน<img>ทุกรูป · ถ้าเป็น decorative ใส่alt=""- Button ใช้
<button>ไม่ใช่<div onclick>· screen reader อ่านออก · keyboard ใช้ได้ - Form ทุกช่องมี
<label>· ผูกกับ<input>ด้วยfor+id - ใช้
<h1> <h2> <h3>ตามลำดับ · ไม่ใช่ใช้ขนาด font อย่างเดียว - Keyboard navigation ใช้ได้ — Tab ผ่านทุกปุ่ม · กด Enter / Space ทำงาน · ทดสอบ: ปิด mouse, ใช้ Tab อย่างเดียว
12. ⚠️ AI-Era UX Traps — กับดักที่เจอบ่อย
AI สร้าง UI ที่ "ดูดี ใช้ไม่ได้" ในรูปแบบเหล่านี้:
Trap 1 — Dashboard syndrome
ถาม AI ให้ทำ "หน้าแรก" → ออกมาเป็น dashboard เต็มไปด้วย metric ที่ user ไม่ดู · AI default ทำแบบนี้เพราะเห็นใน training data เยอะ
Trap 2 — Feature creep
ขอ AI ทำ form login · มันใส่ "remember me" + "social login" + "magic link" + "2FA" + "captcha" ทั้งที่ไม่ได้ขอ
Trap 3 — State-less UI
AI สร้าง UI ที่ "ดูเสร็จ" แต่ไม่มี loading / empty / error state · ใช้กับ real data ไม่ได้
Trap 4 — Pretty placeholder data
AI ใส่ name "Lorem Ipsum", score "85, 92, 78" สวย ๆ · พอใช้ data จริง — ชื่อยาว 60 ตัวอักษร, score 0/null → layout พัง
Trap 5 — Desktop-first design
AI default ออกแบบบน desktop ก่อน · มือถือกลายเป็นของแถม · ของจริง 70% user อยู่บนมือถือ
Trap 6 — Over-animated
AI ชอบใส่ transition, fade-in, hover effect ทุกที่ · ของจริง animation นาน > 300ms = annoying
Trap 7 — Color = signal alone
AI ใช้สีบอกความหมาย (เขียว=success, แดง=fail) แต่ไม่มี icon/text ประกอบ · color-blind user เห็นเทาเหมือนกัน
13. ✅ Checklist ก่อนส่งงาน (W12 / W14 / W15)
ก่อนคิดว่า UI "เสร็จ" — เช็คตามนี้:
🧑 User
- ☐ มี user persona ชัด · "user ของหน้านี้คือใคร · มาทำอะไร"
- ☐ Primary action ของแต่ละหน้าชัด · มองครั้งแรกเห็นทันที
📐 Layout
- ☐ เลือก layout pattern ที่ตรงงาน (list-detail / dashboard / wizard / ...)
- ☐ Hierarchy ชัด — primary > secondary > tertiary
- ☐ ลอง responsive: desktop / tablet / mobile (375px) ใช้ได้
🔄 States
- ☐ Loading state ทุก async
- ☐ Empty state ทุก list / table
- ☐ Error state — บอกผิดอะไร + ทำยังไงต่อ
- ☐ Success feedback หลังกด action
- ☐ Partial / loading-some state
📝 Forms
- ☐ Label บนช่อง · required ระบุ
- ☐ Validation ใต้ช่อง · message ภาษาคน
- ☐ Default value ที่ดี · ลด typing
- ☐ ทดสอบด้วย: input ว่าง / ยาวมาก / มี emoji / มีภาษาไทย
♻️ Reversibility
- ☐ Destructive action มี confirm + undo
- ☐ ไม่มี action ที่กลับไม่ได้โดยไม่ถาม
♿ Accessibility
- ☐ Contrast ≥ 4.5:1
- ☐ ทุก image มี
alt - ☐ Keyboard nav ใช้ได้ (Tab + Enter)
- ☐ ใช้
<button>ไม่ใช่<div onclick>
📱 Mobile
- ☐ ปุ่ม ≥ 44×44 px
- ☐ font ≥ 16 px ใน input
- ☐ 1 column บนมือถือ
- ☐ ทดสอบบนมือถือจริง · ไม่ใช่แค่ devtools
🤖 AI Output Review
- ☐ ตัด feature ที่ AI ใส่เกินมา
- ☐ เพิ่ม state ที่ AI ลืม (loading/empty/error)
- ☐ ทดสอบด้วย data extreme · ไม่ใช่แค่ Lorem Ipsum
- ☐ ตรวจ accessibility
📚 อ่านเพิ่ม (Optional)
- Nielsen Norman Group — usability research ที่อ้างอิงได้
- Refactoring UI — หนังสือสั้น ๆ ใช้ได้ทันที (Tailwind authors)
- Smashing Magazine — บทความ UX/UI ใหม่ ๆ
- checklist.design — UX/UI checklist ตามประเภทของแอป