7 คะแนน โดย workdriver 2026-04-12 | 5 ความคิดเห็น | แชร์ทาง WhatsApp

ผมเป็นผู้ดูแลที่สร้าง chajooin.com จบแค่มัธยมปลาย ขับรถบรรทุกมา 8 ปี (2017~) ทั้งที่เขียนโค้ดไม่เป็นแม้แต่บรรทัดเดียว ผมทำคอมมิตแรกกับ Claude เมื่อวันที่ 16 สิงหาคม 2025

ผ่านไป 238 วัน ตอนนี้บริการนี้เก็บข้อมูลและเผยแพร่รายงานทุกวันโดยอัตโนมัติ

บทความนี้ไม่ใช่บันทึกว่า "สร้างเสร็จแล้ว" แต่เป็นบันทึกของ "สร้างแล้วและกำลังรันอยู่" มีรีวิวการทำต้นแบบด้วย vibe coding เยอะแล้ว แต่ประสบการณ์ในการดูแลโปรดักชันต่อเนื่องยังพบได้น้อย เลยอยากเขียนไว้ นี่ไม่ใช่เรื่องราวความสำเร็จ แต่เป็น บันทึกอย่างตรงไปตรงมาว่าอะไรเวิร์กและอะไรไม่เวิร์ก


พื้นหลัง

  • โดเมน: เปรียบเทียบราคารถบรรทุก (ตลาดมูลค่า 17 ล้านล้านวอน ไม่มีบันทึกราคาซื้อขายจริงอย่างเป็นทางการ)
  • ความพยายามก่อนหน้า: ปี 2024 จ้างเอาต์ซอร์ซแบบ turnkey 30 ล้านวอน → อำนาจในการแก้ไขอยู่ฝั่งเอาต์ซอร์ซ จึงเลิก
  • การเปลี่ยนมาใช้แนวทางนี้: เรียน AI อยู่ 2 เดือนในเดือนกรกฎาคม 2025 → คอมมิตแรกวันที่ 16 สิงหาคม

สแตก

Frontend    Vite + React + TypeScript + Tailwind  
Backend     Node.js + Express + Prisma  
DB          PostgreSQL (Railway managed)  
การเก็บข้อมูล        Playwright (headless) + parser แยกตามแหล่งข้อมูล 46 ตัว  
ML          LightGBM (Python, 75 features)  
การดีพลอย        Railway (Docker)  
ระบบอัตโนมัติ      Node scheduler + การแจ้งเตือนทาง Telegram  
การทำงานร่วมกับ AI     Claude (ผู้พัฒนาหลัก) + GPT-4o (สคริปต์ Shorts/พรอมป์ต์)  
การยืนยันตัวตน        Naver/Kakao OAuth  

ผมไม่ได้เป็นคน "เลือก" สแตกนี้เอง ผมแค่ถาม AI ว่า "ถ้าจะทำสิ่งนี้ต้องใช้อะไรบ้าง?" แล้วก็ใช้ตามที่มันแนะนำ พอมาดูทีหลัง มันก็เป็นชุดที่สมเหตุสมผล นี่คือคุณค่าเชิงปฏิบัติของ AI agent — มันช่วยแบกรับภาระทางความคิดในการตัดสินใจเลือกแทนเรา

ตัวเลข (2025-08-16 ~ 2026-04-12)

รายการ ค่า
คอมมิตทั้งหมด 3,493
จำนวนวันที่มีคอมมิต 189 วัน
จำนวนไฟล์โค้ด ประมาณ 1,500 (อิงตาม js/ts/py)
โรลแบ็ก 20+ ครั้ง
ดีพลอยล้มเหลว 39 ครั้ง (สองวันแรกของการตั้งค่า Railway)
บั๊กเดิมซ้ำมากที่สุด 7 ครั้ง (หน่วยราคา)
จำนวนประกาศขายที่ใช้งานอยู่ ประมาณ 48,000 คัน
จำนวน parser ของแหล่งข้อมูลภายนอก 46 ตัว
CLAUDE.md 187 บรรทัด, กฎห้ามฝ่าฝืนเด็ดขาด 24 ข้อ
ไฟล์ความจำ 129 ไฟล์

ส่วนที่ 1 การสร้าง — 3 สิ่งที่ทำให้มันใช้งานได้จริง

1.1 CLAUDE.md — ควบคุม AI ด้วยกฎ

ถ้าบั๊กเดิมเกิดซ้ำเป็นครั้งที่สอง การบอกว่า "ช่วยระวังหน่อย" ไม่มีความหมาย ต้องเขียนกฎที่ชัดเจนลงในไฟล์ และให้ AI อ่านทุกครั้งเมื่อเริ่มเซสชัน

"parser=วอน → normalization=÷10,000 → DB=หมื่นวอน ห้าม ×10,000 กับค่าจาก DB"  
"ถ้า parser ดึงปีรถไม่สำเร็จ ห้ามแทนค่าด้วย getFullYear()"  
"ห้ามเพิ่ม kakaotalk เข้าไปใน vercel.json UA rewrite"  
"ค่า setInterval ต้อง clamp ด้วย Math.min(value, 2^31-1) เสมอ"  

ตอนนี้มี 24 ข้อ ทุกข้อเกิดขึ้นหลังจากเกิดอุบัติเหตุจริงมาแล้ว

1.2 แยกบทบาท — มนุษย์ทำการวางแผน/ตัดสินใจ, AI ทำการลงมือเขียน

ถึงจะอ่านโค้ดไม่ออก แต่ตัดสินผลลัพธ์ได้ ถ้า Porter 2 ตันแสดงราคา 5 ล้านวอน ก็พูดได้ว่า "อันนี้ผิด" ถ้า wing body กับ cargo ออกราคาเท่ากัน ก็สั่งได้ว่า "แยกออกจากกัน" ความเข้าใจโดเมนทำหน้าที่เป็นการทดสอบ

1.3 ไฟล์ความจำ — รักษาคอนเท็กซ์ข้ามเซสชัน

สะสมการตัดสินใจ/ความล้มเหลว/นโยบายไว้ในไฟล์ความจำ 129 ไฟล์ เมื่อเปิดเซสชันใหม่ก็ให้อ่านความจำที่เกี่ยวข้องเพื่อคงการตัดสินใจในอดีตไว้ เป็นโครงสร้างที่ใช้ระบบไฟล์มาอุดข้อจำกัดของ context window ของ AI


ส่วนที่ 2 การปฏิบัติการ — ปัญหาคนละแบบกับตอนสร้าง

2.1 สิ่งที่กำลังรันอัตโนมัติอยู่

  • การ ingest ประกาศขาย: scheduler เก็บข้อมูลจากแหล่งภายนอก → ผ่าน quality gate → อัปเดตลง DB
  • รายงานราคา: สร้างอัตโนมัติทุกวัน → เผยแพร่อัตโนมัติไปยังบล็อก/คาเฟ่
  • การสร้างสคริปต์ Shorts: GPT-4o สร้างสคริปต์/Sora prompt ตามระดับตัน (การประกอบวิดีโอเป็นอีกขั้นตอนหนึ่ง)
  • การฝึก ML ใหม่: สัปดาห์ละครั้ง ฝึก price engine ใหม่จากข้อมูลล่าสุด
  • มอนิเตอร์ริง: แจ้งเตือนทาง Telegram เมื่อ pipeline มีความผิดปกติ

มีนักพัฒนาอยู่คนเดียวคือผมเอง

2.2 ค่าใช้จ่าย

  • อินฟรา: Railway (PostgreSQL + Node + Playwright)
  • AI API: สมัคร Claude (ใช้เพื่อพัฒนา) + GPT-4o API (ใช้สร้าง Shorts, ประเมินจาก api_usage_log ว่า ประมาณเดือนละราว $1)
  • โดเมน/OAuth: Naver/Kakao

2.3 บันทึกการรับมือเหตุขัดข้อง

  • ข้อมูลปนเปื้อน 1,138 รายการ (3/2): พบบั๊ก fallback ของปีรถ → แพตช์ DB + pipeline reprocess + เพิ่มกฎ
  • Slack แจ้งเตือนไม่ทำงานนาน 6 เดือน (พบเมื่อ 3/18): ปัญหาจาก environment variable/path → ปรับใหม่ให้รวมเป็นเส้นทางเดียวผ่าน Telegram
  • setInterval 32-bit overflow (4/10): ล็อกอินใช้งานไม่ได้ → hotfix + เพิ่มกฎการ clamp
  • หน้าจอว่างใน KakaoTalk (1/31): SEO UA rewrite ไปจับ in-app browser ของ KakaoTalk ด้วย → แก้รายการ UA

2.4 ตัวอย่างกฎการปฏิบัติการ

ใน CLAUDE.md ยังมีกฎจากมุมมองการปฏิบัติการรวมอยู่ด้วย

"หลังดีพลอยให้รายงานด้วยตัวเลข 3 อย่าง: สถานะเซิร์ฟเวอร์ (health 200),  
 จำนวนที่ crawl ได้วันนี้ (อยู่ในช่วงเมื่อวาน ±20%), จำนวนประกาศขายที่ active (ไม่มีการเปลี่ยนแปลงผิดปกติ)"  
  
"ถ้าแก้ไฟล์ตั้งแต่ 4 ไฟล์ขึ้นไป, แตะการเชื่อมต่อ scheduler, เปลี่ยน DB schema,  
 หรือกลับไปแก้พื้นที่ที่เคย revert มาก่อน → ต้องรายงานล่วงหน้า"  
  
"การเปลี่ยนชั่วคราว (fallback/TODO/hardcoding) ต้องบันทึกไว้ในทะเบียน:  
 ต้องคืนค่าอะไรภายในเมื่อไร และถ้าไม่คืนค่าจะพังอะไร"  

AI จะอ่านกฎเหล่านี้ทุกครั้ง และเมื่อเจอสถานการณ์นั้นก็จะรายงานก่อนเริ่มงานเสมอ


ส่วนที่ 3 สิ่งที่ไม่ทำงาน

3.1 บั๊กเดิมซ้ำ 7 ครั้ง — มองไม่เห็นเส้นทางข้อมูลทั้งระบบ

เหตุผลที่บั๊กหน่วยราคาเกิดซ้ำ 7 ครั้งคือ ถ้าใน 6 ขั้นของ เก็บข้อมูล → parser → normalization → DB → API → UI แก้แค่จุดเดียว มันก็จะไปโผล่อีกในเส้นทางอื่น ความสามารถในการ "มองทั้งระบบ" คือจุดที่การผสมกันระหว่างคนนอกสายพัฒนา + AI ขาดที่สุด AI จะแก้เฉพาะจุดที่สั่ง ส่วนคนก็ไม่รู้ว่ามีเส้นทางอื่นอยู่ด้วย

3.2 ข้อมูลปนเปื้อน 1,138 รายการ — ค่าเริ่มต้นแบบ "หวังดี" ของ AI

ตอน parser ดึงปีรถไม่สำเร็จ มีโค้ดที่ให้คืนค่า getFullYear() ถูกใส่เข้ามา จากมุมของ AI มันอาจคิดว่า "ปีปัจจุบันยังดีกว่า null" ผลคือ Porter ปี 2003 ถูกบันทึกใน DB เป็นรุ่นปี 2026 ถ้าไม่ได้เขียนให้ AI ชัด ๆ ว่า "ถ้าไม่รู้ให้เป็น null" มันจะเติมอะไรบางอย่างลงไปเอง

3.3 Slack แจ้งเตือนไม่ทำงาน 6 เดือน — ไม่ได้เฝ้าระวังระบบเฝ้าระวัง

การแจ้งเตือนจบลงด้วยความล้มเหลว และความล้มเหลวนั้นเองก็ไม่ถูกบันทึกใน log เลยเงียบอยู่ 6 เดือน ระหว่างนั้น pipeline มีความผิดปกติอยู่หลายครั้ง แต่ผมเข้าใจผิดว่า "ไม่มีปัญหา" สภาวะที่อันตรายที่สุดของระบบที่สร้างด้วย AI คือสภาวะที่ 'ดูเหมือนว่ามันกำลังทำงานได้ดี' ตอนนี้ผมลดความซับซ้อนให้เหลือเส้นทางเดียวผ่าน Telegram

3.4 setInterval 32-bit overflow — กับดักของภาษา

ถ้าไม่รู้ว่า setInterval รับได้แค่ int32 ก็จะไม่รู้ว่าพอใส่ 30 วันในหน่วยมิลลิวินาทีแล้วมันจะรันทันที ล็อกอินจึงใช้งานไม่ได้ AI ไม่ได้เตือน edge case แบบนี้เองโดยสมัครใจ กฎการ clamp เพิ่งเกิดขึ้นหลังจากมันพังไปแล้ว

3.5 ML overfitting — MAPE ตอนฝึก 8.56% vs ใช้งานจริง 42%

พอได้ MAPE 8.56% จาก LightGBM 75 features ก็คิดว่า "ใช้ได้แล้ว" แต่ตอนใช้งานจริงเป็น 42% สาเหตุคือข้อจำกัดเชิงโครงสร้างของข้อมูลราคาประกาศขาย (ไม่มีราคาซื้อขายจริง, สัญญาราคาต่ำกว่าจริง, มาร์จินดีลเลอร์) ถ้าเป็นผู้เชี่ยวชาญโดเมนก็น่าจะรู้ตั้งแต่แรก แต่ผมติดอยู่กับความคิดว่า "ถ้าผลเทรนดี ก็พอแล้ว"


ความคิดที่ยังเหลืออยู่

พอลองมองย้อนกลับไป 238 วัน ก็สรุปได้ว่า:

  • AI ช่วยเร่งความเร็วในการลงมือทำได้มาก คนที่ไม่รู้โค้ดก็สร้างบริการที่ใช้งานได้จริงขึ้นมาได้
  • แต่คุณภาพด้านการปฏิบัติการไม่ได้ตามมาเองโดยอัตโนมัติ ปัญหาจะเกิดขึ้นแน่นอน และ AI จะไม่คอยเตือนให้เองโดยสมัครใจ
  • งานของคนที่ไม่ใช่นักพัฒนาไม่ได้อยู่ที่การเขียนโค้ด แต่อยู่ที่การออกแบบกฎ การเฝ้าระวัง และการตรวจสอบ การตัดสินผลลัพธ์และการป้องกันไม่ให้เกิดซ้ำกลายเป็นงานหลัก

นี่เป็นโปรดักชันที่ผมรันคนเดียว จึงเป็นเพียงตัวอย่าง n=1 ผมจะไม่เหมารวม อยากรู้ประสบการณ์ของคนอื่นในเงื่อนไขคล้ายกัน


ลิงก์

  • บริการ: https://chajooin.com (เปรียบเทียบและวิเคราะห์ราคารถบรรทุก)

ยินดีรับฟีดแบ็ก โดยเฉพาะเรื่องว่า คุณเฝ้าระวังสภาวะที่ "ดูเหมือนว่ามันกำลังทำงานได้ดี" กันอย่างไรเมื่อดูแลอยู่คนเดียว

5 ความคิดเห็น

 
savvykang 2026-04-13

ผมคิดว่าปัญหาเรื่องสถานะที่ดูเหมือนทำงานได้ดีนั้นอาจบรรเทาได้ในระดับหนึ่ง หากมีการฝึกซ้อมกู้คืนเหตุขัดข้องเป็นระยะ และกำหนดให้ชัดเจนว่าคุณลักษณะใดของข้อมูลที่ถือว่าเป็นสภาวะปกติ

 
workdriver 2026-04-13

ครับ ขอบคุณสำหรับความเห็นดี ๆ นะครับ
เมื่อระบบใหญ่ขึ้น ก็เป็นความจริงที่การจัดการเริ่มหนักมือขึ้นครับ

 
savvykang 2026-04-13

ถ้าคุณดูแลระบบอยู่คนเดียว คุณก็ต้องจัดการบริการมอนิเตอร์ด้วยตัวเองด้วย ดังนั้นในสถานการณ์ตอนนี้อาจจะไม่ง่ายนัก การใช้บริการมอนิเตอร์จากภายนอกก็เป็นอีกทางเลือกหนึ่ง

 
jjw9512151 2026-04-13

ขอบคุณสำหรับข้อมูลจากภาคสนามจริงครับ

 
workdriver 2026-04-13

ครับ ขอบคุณครับ