ผมไม่ได้นั่งเซ็ตทีละตัว · ผมป้อนของจริงทั้ง 9 โปรเจกต์ให้ AI ไล่หาช่องโหว่ แล้วให้ออกแบบมาตรฐานกลางชุดเดียวมาครอบ · นี่คือสิ่งที่ผมป้อนเข้าไป สิ่งที่ได้กลับมา และวิธีที่ผมตรวจงาน AI ก่อนเชื่อ
9 โปรเจกต์ที่ป้อนให้ AI ไล่ดู
5 ช่องโหว่ที่ AI จับได้
1 มาตรฐานกลางที่ออกแบบ
10 ชุดทดสอบที่ผ่านก่อนใช้จริง
อ่านจบแล้วคุณจะได้อะไร · กดข้ามไปอ่านเฉพาะหัวข้อได้เลย
หลังจากผมใช้ AI ช่วยพัฒนาแอปกับ SaaS งานเริ่มออกเร็วขึ้นมาก · โปรเจกต์งอกจากตัวเดียวเป็น 9 ตัวในเวลาไม่นาน
ทั้ง 9 ตัวต่อกับ GitLab หมด · แต่พอเปิดดูจริง ๆ บางตัวมีระบบตรวจอัตโนมัติ บางตัวไม่มี · ไม่มีสองตัวไหนตั้งเหมือนกันเลย
ตอนมี 2-3 ตัว ผมยังจำได้ว่าตัวไหนตั้งไว้ยังไง · พอถึง 9 ตัว ผมตอบไม่ได้แล้วว่าตัวไหนมีด่านกันพลาดบ้าง
แทนที่จะนั่งเปิดทีละตัวแล้วเซ็ตมือ ผมเปลี่ยนวิธี · ผมป้อนโครงสร้างจริงของทั้ง 9 ตัว พร้อมกติกาทีมและเพดานค่าใช้จ่ายให้ AI ไล่วิเคราะห์ แล้วสั่งให้ออกแบบมาตรฐานกลางชุดเดียวกลับมา
เพราะของที่กำลังจะตามมาไม่ใช่แค่ 9 · ผมมีแผนพัฒนาอีก 10 ถึง 30 ตัว · ถ้าไม่วางมาตรฐานตอนนี้ ผมจะต้องมานั่งแก้ตอนที่ของเยอะกว่าเดิม 4 เท่า
ผลที่ได้กลับมาคือ AI ชี้ 5 จุดที่ผมไม่มีด่านกันเลยสักตัว แล้วคืนแบบเต็มมาให้ · ผมไม่ได้เชื่อทันที ผมสั่งให้มันเขียนชุดทดสอบมาพิสูจน์ตัวเองก่อน 10 ข้อ
อัปเดตล่าสุด: 1 สิงหาคม 2026 · สถานะ: ออกแบบเสร็จ ด่านกิ่งงานทดสอบผ่านแล้ว ยังไม่ได้ลงมือกับ GitLab จริง
สรุปสั้นๆ อ่านแค่นี้ก็เข้าใจ
ผมป้อน 4 อย่างให้ AI · โครงสร้าง 9 โปรเจกต์ · กติกาทีมที่ว่าทุกงานต้องผ่าน dev ก่อนเข้า main · ข้อจำกัดว่าคนในทีมไม่ใช่ช่างทุกคน · และเพดานค่าโมเดลที่ห้ามเกิน
AI ไล่ดูเครื่องมือเดิมของผมแล้วชี้ 5 จุดที่ยังไม่มีด่านกัน แล้วออกแบบใหม่ให้ใช้ pipeline (สายพานตรวจและส่งงานที่ตั้งไว้ล่วงหน้า) ชุดเดียว แตกปลายทาง 3 ทาง
แบบใหม่แยก deploy (เอาโค้ดขึ้นไปวางบนเครื่อง) ออกจาก release (เปิดให้ผู้ใช้เห็นและกดใช้ได้)
ตัวที่คุมสองอย่างนี้คือ Feature Flag (สวิตช์เปิดปิดฟีเจอร์ทีละชิ้น)
อีกข้อคือหน้าเว็บที่ผู้ใช้แค่เปิดดู ต้องใช้ token (หน่วยนับข้อความที่ส่งเข้าและออกจากโมเดล AI) เป็นศูนย์
ผมตรวจงานมันด้วยชุดทดสอบด่านกิ่งงาน 10 ข้อ · ผ่านครบ 10 · ส่วนชุดทดสอบของสายพานเต็ม 13 ข้อ ยังไม่ได้รันสักข้อ
5 ช่องโหว่ที่ AI จับได้
1 มาตรฐานกลางที่ออกแบบ
10 ชุดทดสอบที่ผ่านก่อนใช้จริง
อ่านจบแล้วคุณจะได้อะไร · กดข้ามไปอ่านเฉพาะหัวข้อได้เลย
ศัพท์ที่ใช้ในหน้านี้ · เปิดอ่านก่อนได้ (47 คำ · อ่านผ่าน ๆ ก็พอ เดี๋ยวเจอในเนื้อเรื่องอีกที)
CI (Continuous Integration — ตรวจโค้ดอัตโนมัติทุกครั้งที่มีคนส่งงาน)CI/CD (ระบบตรวจโค้ดและส่งขึ้นเครื่องอัตโนมัติ)CD (Continuous Delivery — ส่งโค้ดขึ้นเครื่องอัตโนมัติเมื่อตรวจผ่าน)pipeline (สายพานตรวจและส่งงานที่ตั้งไว้ล่วงหน้า)deploy (เอาโค้ดขึ้นไปวางบนเครื่อง)release (เปิดให้ผู้ใช้เห็นและกดใช้ได้)Feature Flag (สวิตช์เปิดปิดฟีเจอร์ทีละชิ้น โดยไม่ต้องส่งโค้ดขึ้นใหม่)token (หน่วยนับข้อความที่ส่งเข้าและออกจากโมเดล AI)branch (กิ่งงานแยก ที่ให้แต่ละคนทำงานโดยไม่ชนกัน)Merge Request (ใบขอรวมโค้ด ที่ต้องมีคนตรวจก่อนอนุมัติ)worktree (พื้นที่ทำงานแยกอีกชุดของโค้ดชุดเดียวกัน)commit (การบันทึกงานหนึ่งครั้งพร้อมข้อความกำกับ)ESLint (เครื่องมือตรวจรูปแบบโค้ด JavaScript)TypeScript (ภาษาที่เพิ่มการตรวจชนิดข้อมูลให้ JavaScript)unit test (ทดสอบชิ้นส่วนย่อยของโค้ดทีละชิ้น)Playwright (เครื่องมือสั่งเบราว์เซอร์ทดสอบเว็บอัตโนมัติ)axe-core (เครื่องมือตรวจการเข้าถึงของคนพิการบนหน้าเว็บ)Lighthouse (เครื่องมือของ Google ที่ให้คะแนนความเร็วเว็บ)Gitleaks (เครื่องมือค้นหารหัสลับที่หลุดอยู่ในโค้ด)Trivy (เครื่องมือสแกนช่องโหว่ในไลบรารีที่ใช้)Semgrep (เครื่องมือค้นรูปแบบโค้ดที่เสี่ยงต่อช่องโหว่)cache (ที่เก็บคำตอบเดิมไว้ใช้ซ้ำ)SonarQube (ระบบให้คะแนนคุณภาพโค้ดระดับทีม)BrowserStack (บริการทดสอบเว็บบนเบราว์เซอร์และอุปกรณ์จริงหลายรุ่น)Percy (บริการจับภาพหน้าจอเทียบก่อนหลัง หาจุดที่หน้าเปลี่ยนผิด)Snyk (บริการตรวจความปลอดภัยของไลบรารีเชิงพาณิชย์)Sentry (บริการเก็บและแจ้งเตือนข้อผิดพลาดที่เกิดกับผู้ใช้จริง)Datadog (บริการเฝ้าดูสุขภาพระบบหลังบ้าน)Review App (หน้าเว็บชั่วคราวของงานชิ้นนั้น เปิดให้ทีมกดดูก่อนรวมโค้ด)Staging (เครื่องซ้อมที่หน้าตาเหมือนของจริง แต่ลูกค้าไม่เห็น)Production (เครื่องจริงที่ลูกค้าใช้งานอยู่)rollback (ย้อนกลับไปใช้รุ่นก่อนหน้า)artifact (ไฟล์งานที่ประกอบเสร็จแล้ว พร้อมเอาขึ้นเครื่อง)lint (ตรวจรูปแบบการเขียนโค้ดอัตโนมัติ)type-check (ตรวจว่าชนิดข้อมูลในโค้ดตรงกันไหม)smoke test (ทดสอบสั้น ๆ ว่าระบบยังเปิดใช้ได้หลังส่งขึ้น)migration (การแก้โครงตารางในฐานข้อมูล)SHA (รหัสประจำตัวของโค้ดแต่ละรุ่น ใช้เทียบว่าของตรงกันไหม)mock (ข้อมูลจำลองที่เตรียมไว้แทนของจริง)golden file (ไฟล์คำตอบมาตรฐานที่ใช้เทียบผล)Batch (การส่งงานเป็นชุดแล้วรอผลทีเดียว)Ollama (เครื่องมือรันโมเดล AI บนเครื่องตัวเอง)wildcard (กฎที่ใช้เครื่องหมายดอกจันครอบชื่อหลายตัวพร้อมกัน)quota (โควตา เพดานการใช้งานต่อคนต่อวัน)rate limit (การจำกัดความถี่ กันคนกดรัว)circuit breaker (สวิตช์ตัดอัตโนมัติเมื่อใช้เกินงบ)fast-forward (วิธีรวมโค้ดที่ทำให้รหัสรุ่นตรงกันเป๊ะ ไม่สร้างรอยต่อใหม่)
บทที่ 1
ของที่ยืนอยู่ได้พันปี เริ่มจากการวางฐานให้ถูกก่อน
เรื่องนี้เริ่มจากอะไร?
ทีมมาตกลงกันว่าจะเลิกส่งงานเข้า main ตรง ๆ
กติกาใหม่คือทุกคนแยก branch ของตัวเอง แล้วเปิด Merge Request เข้า dev · จาก dev ค่อยเปิด Merge Request เข้า main อีกที
ฟังดูเป็นเรื่องเล็ก · แต่พอผมนั่งดูเครื่องมือที่ผมใช้อยู่ ผมพบว่ามันไม่รู้จักคำว่า dev เลยสักบรรทัด
เครื่องมือของผมรู้จัก branch ที่ต้องป้องกันแค่ 2 ชื่อ คือ main กับ master
กติกาที่ทีมตกลงกันด้วยปาก ไม่มีค่าอะไรเลย ถ้าเครื่องไม่รู้จักกติกานั้น
ถ้าไม่แก้ จะเสียอะไร?
ผมเจ็บมาก่อนแล้ว 3 แบบ
แบบที่ 1 · งานหลายชิ้นขึ้น production พร้อมกัน แล้วพัง · หาไม่เจอว่าตัวไหนทำพัง เพราะขึ้นพร้อมกันหมด
แบบที่ 2 · ของที่ทดสอบผ่านกับของที่ขึ้นจริงเป็นคนละตัว เพราะ build ใหม่ตอน deploy
แบบที่ 3 · ค่า AI พุ่งโดยไม่รู้ตัว เพราะหน้าเว็บเรียกโมเดลตั้งแต่ผู้ใช้เปิดหน้า ทั้งที่ยังไม่ได้กดอะไรเลย
ราคาที่จ่ายจริง · บั๊กที่ CI จับได้ใน 3 นาที ต้นทุนคือเวลารอ · บั๊กเดียวกันที่ลูกค้าเจอก่อน ต้นทุนคือความเชื่อใจ ซึ่งซื้อคืนไม่ได้
คนส่วนใหญ่พิมพ์ว่า "ช่วยออกแบบ CI/CD ให้หน่อย" แล้วได้แบบกลาง ๆ ที่เอาไปใช้จริงไม่ได้ · เพราะ AI ไม่รู้ว่าของที่คุณมีหน้าตายังไง ทีมคุณเป็นใคร และคุณรับต้นทุนไหวแค่ไหน
ผมเลยป้อน 4 ก้อนนี้ก่อนจะสั่งอะไรทั้งสิ้น
ก้อนที่ 1 · ของจริงที่มีอยู่
รายชื่อโปรเจกต์ทั้ง 9 ตัว พร้อมบอกว่าตัวไหนมีไฟล์ตั้งค่าสายพานอยู่แล้ว ตัวไหนยังไม่มี · ไม่ใช่บอกลอย ๆ ว่า "มีหลายโปรเจกต์"
ก้อนที่ 2 · กติกาที่ห้ามฝ่าฝืน
ทีมตกลงกันแล้วว่างานทุกชิ้นต้องผ่านกิ่งรวมงานก่อนเข้ากิ่งหลัก · ข้อนี้ไม่ใช่ความชอบส่วนตัว แต่เป็นข้อบังคับที่แบบต้องรองรับ
ก้อนที่ 3 · คนที่ต้องใช้ของนี้
ทีมผมไม่ได้เป็นช่างทุกคน · แบบที่ออกมาต้องอธิบายเป็นภาษาคนได้ และต้องมีคำสั่งลัดให้จำแค่ไม่กี่ตัว ไม่ใช่ให้ทุกคนไปท่องขั้นตอน
ก้อนที่ 4 · เพดานเงินที่รับได้
งานผมมีการเรียกโมเดล AI อยู่ในตัวสินค้า · ผมบอกไปตรง ๆ ว่าหน้าเว็บที่ผู้ใช้แค่เปิดดู ต้องไม่เสียค่าโมเดลแม้แต่บาทเดียว · ข้อนี้เปลี่ยนแบบไปคนละทางกับที่มันเสนอรอบแรก
สิ่งที่ผมห้ามไว้ก็สำคัญไม่แพ้กัน · ผมสั่งชัดว่าห้ามแตะโครงการจริงบน GitLab ห้ามแก้ไฟล์ตั้งค่าของระบบที่ใช้งานอยู่ · รอบนี้ให้ออกแบบอย่างเดียว
ถ้าป้อนแค่โจทย์ลอย ๆ ถ้าป้อนครบ 4 ก้อน
ได้แบบมาตรฐานตำรา ที่ไม่รู้ว่าของคุณขาดตรงไหน ได้แบบที่ชี้จุดขาดของคุณเป็นข้อ ๆ
เสนอเครื่องมือเสียเงินที่เกินงบ เสนอเท่าที่งบรับได้ แล้วบอกว่าตัวไหนค่อยจ่ายทีหลัง
ต้องมานั่งแก้เองแทบทั้งหมด แก้เฉพาะจุดที่คุณมีข้อมูลมากกว่ามัน
AI ไล่ดูของผมแล้วเจออะไร?
ภาพจากงานจริง
ใบรวมโค้ดที่ผ่านด่านแล้ว · ระบบบันทึกไว้ว่าผ่านด้วยรหัสรุ่นไหน ใช้เวลาเท่าไหร่
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
กดพื้นหลังหรือปุ่ม ESC เพื่อปิด
ปิด
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
หลักฐานปลายทาง ของที่ออกมาหน้าตาแบบนี้ ทุกครั้งที่งานเข้ากิ่งหลัก ระบบจะแปะไว้ว่าผ่านด่านตรวจแล้ว ใช้เวลาเท่าไหร่ และเป็นโค้ดรุ่นไหน
ก่อนหน้านี้ผมตอบไม่ได้เลยว่าโค้ดที่อยู่บนเครื่องจริง ตรงกับที่ผมตรวจไว้หรือเปล่า
เรียงตามเวลาจริง · ตอนไหนที่มันชี้ถูก ผมเขียนไว้ · ตอนไหนที่ผมต้องสั่งแก้ ผมก็เขียนไว้
01 รอบแรก · เปิดพื้นที่ทำงานแล้วไม่มีชื่อ branchผมเปิด worktree แยกจากฐานงาน แล้วสั่งถามชื่อ branch ปัจจุบัน · คำตอบที่ได้คือค่าว่าง ทั้งที่รหัส commit ตรงกับต้นทางเป๊ะ
แปลว่างานที่ผมกำลังจะเขียน ไม่มีป้ายชื่อให้ตามกลับ · ผมหยุดทันที ไม่เขียนโค้ดต่อ
02 รอบสอง · สร้าง branch เฉพาะงานแล้วตรวจซ้ำผมสร้าง branch เฉพาะงานในพื้นที่เดิม แล้วรันคำสั่งตรวจชุดเดียวกันอีกครั้ง
คราวนี้มีชื่อ branch และยังยืนบนฐาน commit เดิม · ผ่านเกณฑ์ 11 จาก 11 ข้อ ระบบจริงไม่ถูกแตะเลย
คำสั่งที่ผมพิมพ์ใส่ Cursor ตรวจตัวตนของพื้นที่ทำงานนี้ให้หน่อย
บอกมา 3 อย่าง ชื่อ branch ปัจจุบัน · รหัสรุ่นของโค้ด · และมีไฟล์ค้างที่ยังไม่บันทึกไหม
ถ้าชื่อ branch ว่าง ให้หยุดแล้วบอกผมทันที ห้ามแก้ไฟล์ต่อ
03 เปิดอ่านเครื่องมือเดิมของตัวเองก่อนเขียนกฎใหม่ ผมเปิดไฟล์ตัวตรวจก่อนส่งงานที่ใช้อยู่ แล้วไล่ดู 3 อย่าง
หนึ่ง · branch ที่ป้องกันไว้มีแค่ main กับ master · สอง · ปลายทาง merge ใช้ค่าตั้งต้น ถ้าไม่กำหนดจะเลือก main · สาม · ด่าน merge ตรวจ CI ครบ แต่ไม่ได้ตรวจว่า branch ต้นทางคืออะไร
04 เจอของที่ไม่ได้ตั้งใจหา 2 อย่างผมเจอสคริปต์ซิงก์ที่ใช้โหมดลบไฟล์ปลายทาง · ถ้ารันผิดทาง ไฟล์ต้นฉบับหายได้
แล้วผมค้นชุดติดตั้งของทีม หาข้อความที่ติดตั้งตัวตรวจก่อนส่งงาน · ค้นไม่เจอเลย แปลว่าเครื่องที่ติดตั้งใหม่จะไม่มีด่านนี้ติดไปด้วย
05 ออกแบบใหม่ทั้งเส้น แล้วหยุดไว้ที่แบบผมวาง 4 environment, pipeline ตามเหตุการณ์, Feature Flag, ตัวคุมค่า AI และ shortcut 3 ตัว
ออกแบบเสร็จครบทุกส่วน · แต่ผมยังไม่ได้แตะ GitLab จริงสักที่ และยังไม่ได้รันชุดทดสอบสักข้อ
Deploy กับ Release ต่างกันตรงไหน?
ผมเริ่มจากแยกคำสองคำนี้ออกจากกันก่อน เพราะทีมผมเคยใช้ปนกันมาตลอด
คำ แปลว่าอะไร ใครเห็น
Deploy เอาโค้ดชุดใหม่ขึ้นไปวางบนเครื่อง production ยังไม่มีใครเห็น ถ้า Feature Flag ปิดอยู่
Release เปิดสวิตช์ให้ผู้ใช้เห็นและกดใช้ได้ ลูกค้าเห็นตามสัดส่วนที่เปิด
CI/CD คือระบบที่ทำสองอย่างนี้ให้อัตโนมัติ
CI (Continuous Integration — รวมโค้ดแบบตรวจทุกครั้ง) คือทุกครั้งที่มีคนส่งโค้ดเข้ามา ระบบรันตรวจให้เองทันที
CD (Continuous Delivery — ส่งของขึ้นระบบต่อเนื่อง) คือเมื่อตรวจผ่านแล้ว ระบบเอาโค้ดขึ้นเครื่องให้เอง
พอผมแยกสองคำนี้ได้ ผมก็กล้า deploy ทุกวัน · เพราะ deploy ไม่ได้แปลว่าลูกค้าเห็นแล้ว
CI/CD มีข้อดีข้อเสียอะไรบ้าง?
ผมเจอทั้งสองด้านมากับตัว เลยเขียนให้ครบทั้งสองฝั่ง
ข้อดีที่ได้จริง ข้อเสียที่ต้องยอมรับ
เจอปัญหาก่อนขึ้นระบบจริง ต้องลงทุนเวลาตั้งค่าและคอยดูแล
ลดงานกดทดสอบซ้ำ ๆ ด้วยมือ ถ้าออกแบบไม่ดี จะช้าและเตือนพร่ำเพรื่อจนคนเลิกอ่าน
รู้ว่าใครส่งรุ่นไหนขึ้นตอนไหน เครื่องรันงานและบริการเสริมมีค่าใช้จ่าย
คนใหม่เข้าทีมแล้วดูงานต่อได้ง่ายขึ้น ตั้งค่าความลับหรือสิทธิ์ผิด อาจสร้างความเสียหายได้
ปล่อยงานได้ถี่ขึ้นโดยกลัวน้อยลง มีระบบตรวจ ไม่ได้แปลว่างานมีคุณภาพ ถ้าชุดทดสอบอ่อน
มีระบบตรวจแล้วไม่ได้แปลว่าปลอดภัย · มันแปลว่าคุณจะรู้ตัวเร็วขึ้นเท่านั้น
ทำคนเดียวได้ ถ้าของมันเข้าที่ คนพายลำเดียวยังส่งของได้ทั้งตลาด เพราะเส้นทางกับจังหวะถูกวางไว้แล้ว · ระบบก็เหมือนกัน
ควรเลือกโหมดตรวจแบบไหนดี?
คำว่าเล็กกับเต็ม หมายถึงตรวจละเอียดแค่ไหน · คำว่าเร็วกับช้า หมายถึงใช้เวลานานแค่ไหน
จับคู่กันได้ 4 แบบ · ผมใช้ทั้ง 4 แบบในโครงการเดียว แต่คนละจังหวะ
โหมด เหมาะกับ ข้อดี ข้อเสีย
เล็ก + เร็ว ทุกครั้งที่บันทึกงานหรือเปิดใบขอรวมโค้ด รู้ผลไว ค่าเครื่องต่ำ อาจไม่เจอปัญหาที่ซ่อนลึก
เต็ม + เร็ว งานสำคัญและมีเครื่องแรงพอ ตรวจครบและยังได้ผลไว ค่าใช้จ่ายสูง
เล็ก + ช้า ระบบเก่าที่ยังปรับไม่ได้ ตั้งง่าย ไม่ต้องรื้อของเดิม รอนานแต่ตรวจน้อย ไม่ค่อยคุ้ม
เต็ม + ช้า รันกลางคืน หรือก่อนปล่อยรุ่นใหญ่ ตรวจลึกและครอบคลุม ใช้เวลาและเครื่องเยอะมาก
ผมเริ่มจากของฟรีทั้งหมดก่อน แล้วค่อยจ่ายเฉพาะจุดที่ของฟรีทำไม่ได้จริง ๆ
ของฟรีหรือค่าใช้จ่ายต่ำ ใช้ทำอะไร
ESLint · TypeScript ตรวจรูปแบบโค้ดและชนิดข้อมูลตามภาษาที่ใช้จริง
unit test และชุดทดสอบรวม ตรวจว่าชิ้นส่วนย่อยยังทำงานถูกหลังแก้โค้ด
Playwright ไล่กดหน้าเว็บตามเส้นทางสำคัญแทนคน
axe-core ตรวจว่าคนพิการเข้าถึงหน้าเว็บได้ไหม
Lighthouse ให้คะแนนความเร็วของหน้าเว็บ
Gitleaks · Trivy · Semgrep ค้นรหัสลับที่หลุด และช่องโหว่ในไลบรารีที่ใช้
cache และการรันขนาน ลดเวลารอและค่าเครื่อง โดยตรวจเฉพาะส่วนที่เปลี่ยน
ของเสียเงิน จ่ายเพื่ออะไร
เครื่องรันงานเพิ่ม ทำให้ชุดตรวจเต็มจบเร็วขึ้น
SonarQube ให้คะแนนคุณภาพโค้ดระดับทีม
BrowserStack ทดสอบบนเบราว์เซอร์และอุปกรณ์จริงหลายรุ่น
Percy จับภาพหน้าจอเทียบก่อนหลัง หาจุดที่หน้าเปลี่ยนผิด
Snyk ตรวจความปลอดภัยของไลบรารีแบบเชิงพาณิชย์
Sentry · Datadog เก็บและแจ้งเตือนปัญหาที่เกิดกับผู้ใช้จริง
ข้อควรระวังเรื่องราคา · ราคากับความสามารถของบริการพวกนี้เปลี่ยนบ่อย · ก่อนตัดสินใจซื้อ ให้เปิดเว็บทางการของเจ้านั้นเช็กเองอีกครั้งเสมอ
ผมวาง Environment ไว้กี่ชั้น?
4 ชั้น แต่ใช้ .gitlab-ci.yml ชุดเดียว
ชั้น ใช้เมื่อ ลูกค้าเห็นไหม AI ที่ใช้ ปิดยังไง
CI Only ทุกครั้งที่เขียนโค้ด ไม่เห็น Mock ไม่เรียกโมเดล จบพร้อม pipeline
Review App เปิด Merge Request เฉพาะทีม ผ่าน URL ชั่วคราว Mock หรือคำตอบที่บันทึกไว้ ปิดอัตโนมัติ
Staging merge เข้า dev แล้ว ทีมและผู้ทดสอบ Sandbox มีงบจำกัด เปิดค้างเท่าที่จำเป็น
Production รุ่นที่อนุมัติแล้ว ลูกค้าเห็น Hybrid มีโควตา rollback ได้
ทำไมผมไม่แยกเป็นสองไฟล์ · เพราะสองไฟล์จะค่อย ๆ ต่างกัน · วันหนึ่งของที่ทดสอบจะไม่ใช่ของที่ขึ้นจริง แล้วไม่มีใครรู้ตัว
กฎเหล็กที่ผมยึด · build ครั้งเดียว แล้วเลื่อน artifact ชิ้นเดิมจาก Review App ไป Staging ไป Production · ห้าม build ใหม่ตอนขึ้น production
Pipeline แต่ละจุดผมให้ทำอะไร?
ภาพจากงานจริง
ด่านตรวจ 5 กลุ่มที่ออกแบบไว้ · 23 งานย่อยวิ่งในรอบเดียว
โครงที่ออกแบบไว้ ทำไมต้องแยกเป็น 5 กลุ่ม กลุ่มแรกตรวจความปลอดภัยก่อนเสมอ · ถ้าเจอรหัสลับหลุดอยู่ในโค้ด รอบนั้นหยุดทันที ไม่ต้องเสียเวลาทำต่อ
สองกลุ่มท้ายคือด่านเก็บหลักฐานกับด่านปิดท้าย ที่ผมสั่งเพิ่มเอง เพื่อให้ทุกครั้งที่ผ่าน มีบันทึกไว้ว่าผ่านด้วยอะไร
กดพื้นหลังหรือปุ่ม ESC เพื่อปิด
ปิด
เหตุการณ์ CI ตรวจอะไร CD ส่งขึ้นที่ไหน ด่าน AI
Push เข้า feature branch lint, type-check, unit test ไม่ deploy AI token = 0
เปิด Merge Request Fast CI + build + smoke test Review App ชั่วคราว Mock AI
Merge เข้า dev Full CI + integration + security Staging อัตโนมัติ Sandbox มีเพดาน
สร้าง Release Tag Full CI + E2E + migration check เตรียม Production Live AI ตัวอย่างเล็ก
กดอนุมัติ Production ตรวจ SHA, artifact, health deploy artifact เดิม Production budget
ผมเปิดใช้เพิ่มอีก 5 อย่างเพื่อลดค่าเครื่อง
interruptible ยกเลิกรอบตรวจเก่าเมื่อมีการส่งงานใหม่ทับ · cache ไม่โหลดของเดิมซ้ำ
needs รันงานที่ไม่ต้องรอกันแบบขนาน · resource_group กันการส่งขึ้นเครื่องซ้อนกัน
ภาพจากงานจริง
ลำดับที่งานย่อยต้องรอกัน · ตัวไหนไม่ต้องรอ วิ่งขนานกันได้เลย
จังหวะการวิ่ง ตัวไหนรอใคร ตัวไหนวิ่งพร้อมกันได้ ถ้าให้ทุกงานวิ่งเรียงกันทีละตัว รอบหนึ่งจะกินเวลาเป็นสิบนาที
ผมเลยสั่งให้จัดใหม่ · งานที่ไม่ต้องรอผลของกันและกัน ให้ปล่อยวิ่งขนานกันไปเลย · รอบจริงจึงจบใน 3 ถึง 4 นาที
กดพื้นหลังหรือปุ่ม ESC เพื่อปิด
ปิด
จังหวะการวิ่ง ตัวไหนรอใคร ตัวไหนวิ่งพร้อมกันได้ ถ้าให้ทุกงานวิ่งเรียงกันทีละตัว รอบหนึ่งจะกินเวลาเป็นสิบนาที
ผมเลยสั่งให้จัดใหม่ · งานที่ไม่ต้องรอผลของกันและกัน ให้ปล่อยวิ่งขนานกันไปเลย · รอบจริงจึงจบใน 3 ถึง 4 นาที
จังหวะการวิ่ง ตัวไหนรอใคร ตัวไหนวิ่งพร้อมกันได้ ถ้าให้ทุกงานวิ่งเรียงกันทีละตัว รอบหนึ่งจะกินเวลาเป็นสิบนาที
ผมเลยสั่งให้จัดใหม่ · งานที่ไม่ต้องรอผลของกันและกัน ให้ปล่อยวิ่งขนานกันไปเลย · รอบจริงจึงจบใน 3 ถึง 4 นาที
จังหวะการวิ่ง ตัวไหนรอใคร ตัวไหนวิ่งพร้อมกันได้ ถ้าให้ทุกงานวิ่งเรียงกันทีละตัว รอบหนึ่งจะกินเวลาเป็นสิบนาที
ผมเลยสั่งให้จัดใหม่ · งานที่ไม่ต้องรอผลของกันและกัน ให้ปล่อยวิ่งขนานกันไปเลย · รอบจริงจึงจบใน 3 ถึง 4 นาที
จังหวะการวิ่ง ตัวไหนรอใคร ตัวไหนวิ่งพร้อมกันได้ ถ้าให้ทุกงานวิ่งเรียงกันทีละตัว รอบหนึ่งจะกินเวลาเป็นสิบนาที
ผมเลยสั่งให้จัดใหม่ · งานที่ไม่ต้องรอผลของกันและกัน ให้ปล่อยวิ่งขนานกันไปเลย · รอบจริงจึงจบใน 3 ถึง 4 นาที
และตั้งอายุ artifact ให้หมดเวลาเอง ไม่ต้องมาไล่ลบทีหลัง
Deploy แล้วยังไม่อยากให้ใครเห็น ผมทำยังไง?
ใช้ Feature Flag (สวิตช์เปิดปิดฟีเจอร์) · เปิดหรือปิดของทีละชิ้นได้โดยไม่ต้อง deploy ใหม่
01 Deploy ขึ้น Production โดยปิด Flag ไว้โค้ดอยู่บนเครื่องจริงแล้ว แต่ผู้ใช้ 0 เปอร์เซ็นต์มองเห็น
02 เปิดให้ตัวเองกับทีมก่อนผมใช้ของจริงบนเครื่องจริง · จะเจอปัญหาที่ Staging ไม่มีวันเจอ เช่นข้อมูลจริงที่รูปแบบเพี้ยน
03 ขยับเป็น 5 แล้ว 25 แล้ว 50 เปอร์เซ็นต์ดู error กับต้นทุนต่อคนในแต่ละขั้น · ตัวเลขนิ่งค่อยขยับ
04 เปิดเต็ม หรือปิดกลับทันทีถ้าตัวเลขเพี้ยน ผมปิด Flag กลับได้ในไม่กี่วินาที ไม่ต้องรอ deploy รอบใหม่
จุดที่ผมเกือบพลาด · Feature Flag ซ่อนหน้าจอได้ แต่ซ่อน database migration ไม่ได้ · รอบไหนมีการแก้โครงตาราง ต้องออกแบบให้โค้ดเก่ากับใหม่อยู่ด้วยกันได้ ไม่งั้น Flag คือของหลอกตัวเอง
คำว่า Token ที่เปลืองเงิน คืออันไหน?
ตอนคุยกับทีม ผมพบว่าทุกคนพูดคำว่า token คนละความหมาย
Token คืออะไร เปลืองเงินแบบไหน
AI Token ข้อความที่ส่งเข้าและออกจากโมเดล AI คิดค่า API ตามปริมาณ
Runner Minute เวลาเครื่องที่รัน CI ค่าเครื่องหรือโควตา GitLab
Access Token รหัสให้ระบบเข้าถึง GitLab หรือ API ไม่ใช่หน่วยเงิน แต่หลุดแล้วเสียหายหนัก
ข้อสรุปที่ทำให้ผมโล่งใจคือ CI/CD ปกติไม่ต้องใช้ AI สักครั้ง
ค่าโมเดลเกิดตอนชุดทดสอบหรือตัวผลิตภัณฑ์เรียกโมเดลจริงเท่านั้น
ออกเรือได้บ่อยแค่ไหน ไม่ได้วัดที่ความกล้า แต่วัดที่ด่านที่วางไว้
ผมตรวจงาน AI ยังไงก่อนจะเชื่อ?
ภาพจากงานจริง
สายพานตรวจงานที่วิ่งจริง · ทุกแถวขึ้นผ่าน ใช้เวลาเฉลี่ยไม่เกิน 4 นาทีต่อรอบ
กดพื้นหลังหรือปุ่ม ESC เพื่อปิด
ปิด
ตรงนี้คือส่วนที่คนข้ามกันมากที่สุด · แบบที่ AI คืนมาอ่านแล้วดูดีเสมอ เพราะมันเขียนหนังสือเก่ง · แต่อ่านรู้เรื่องกับใช้ได้จริงเป็นคนละเรื่อง
ผมใช้ 3 ชั้นนี้ทุกครั้ง
ชั้นที่ 1 · สั่งให้เขียนชุดทดสอบมาพร้อมแบบ
ผมไม่รับแบบเปล่า ๆ · ต้องมีชุดทดสอบแนบมาด้วยว่าถ้าของทำงานถูก ผลจะออกมาหน้าตาแบบไหน · ถ้ามันเขียนชุดทดสอบไม่ได้ แปลว่ามันยังไม่เข้าใจโจทย์จริง
ชั้นที่ 2 · รันจริงแล้วอ่านผลเอง
ผมรันชุดทดสอบด่านกิ่งงานเอง ไม่ให้มันรายงานผลให้ฟัง · ผลออกมาผ่าน 10 จาก 10 ข้อ · ตัวเลขนี้ผมเห็นกับตา ไม่ใช่มันบอก
ชั้นที่ 3 · ลองทำผิดดูว่าด่านบล็อกไหม
ชั้นนี้สำคัญที่สุด · ผมสั่งให้ลองส่งงานผิดทางดู เช่น ยิงจากกิ่งงานเข้ากิ่งหลักตรง ๆ · ถ้าด่านปล่อยผ่าน แปลว่าด่านนั้นเป็นแค่ของประดับ
ชุดทดสอบ 10 ข้อที่ผมใช้ ครอบทางเดินของงานทุกเส้นที่เป็นไปได้
สิ่งที่ทดสอบ ต้องได้ผลว่า
ส่งจากกิ่งงานเข้ากิ่งรวมงาน ผ่าน
ส่งจากกิ่งงานเข้ากิ่งหลักตรง ๆ ถูกบล็อก
ส่งจากกิ่งรวมงานเข้ากิ่งหลัก ผ่าน
เขียนทับกิ่งรวมงานโดยไม่เปิดใบขอรวม ถูกบล็อก
เขียนทับกิ่งหลักโดยไม่เปิดใบขอรวม ถูกบล็อก
ส่งงานด่วนแก้ของพัง ตอนที่ยังไม่เปิดสิทธิ์ ถูกบล็อก
ส่งงานด่วนแก้ของพัง ตอนเปิดสิทธิ์แล้ว ผ่าน
โครงการเก่าที่ยังไม่เปิดใช้กติกานี้ ไม่ถูกแตะเลย
ย้อนจากกิ่งหลักกลับเข้ากิ่งรวมงาน ถูกบล็อก
โครงการที่ใช้ชื่อกิ่งหลักแบบเก่า ใช้กติกาเดียวกัน
ข้อที่ 8 คือข้อที่ผมสั่งเพิ่มเอง · แบบรอบแรกไม่มีข้อนี้ · มันออกแบบให้กติกาใหม่มีผลกับทุกโครงการทันที ซึ่งจะทำให้ 9 ตัวเดิมของผมส่งงานไม่ได้ทั้งหมดในวันเดียว · ผมเลยสั่งให้เพิ่มสวิตช์เปิดทีละโครงการ แล้วเขียนข้อทดสอบมายืนยันว่าโครงการที่ยังไม่เปิด จะไม่ถูกแตะ
นี่คือจุดที่คนกับ AI ต่างกัน · มันเก่งเรื่องออกแบบให้ครบตามตำรา แต่ผมเป็นคนเดียวที่รู้ว่าถ้าของ 9 ตัวหยุดพร้อมกันวันจันทร์ ใครเดือดร้อน
ส่วนที่ต้องพูดตามตรง · ชุดทดสอบของสายพานเต็มอีก 13 ข้อ ผมยังไม่ได้รันสักข้อ · เพราะต้องต่อกับ GitLab จริงถึงจะรันได้ และรอบนี้ผมหยุดไว้ที่แบบ
ทดสอบงาน AI ยังไงไม่ให้จ่ายทุกรอบ?
ทุก Push และทุก MR · ใช้ Mock ล้วน ผมเตรียม mock response กับ golden file ไว้ แล้วให้ระบบตอบจากไฟล์แทนการเรียกโมเดล
ตรวจ JSON Schema ความยาว ช่องบังคับ และคำต้องห้าม · จำลอง error กับ timeout ด้วย
Playwright ดัก API ที่วิ่งออกไปข้างนอกแล้วคืนข้อมูลจำลองได้ ของจริงจึงไม่ถูกเรียกสักครั้ง
ก่อน Release · ใช้ของจริงกับตัวอย่างเล็ก เลือกเคสสำคัญ 10 ถึง 30 เคส ตั้งงบสูงสุดต่อรอบ แล้วรันแบบ Batch
เกินงบให้หยุด ห้าม retry ไม่จำกัด · เอกสาร OpenAI ระบุว่างาน Batch ประมวลผลภายใน 24 ชั่วโมง และลดราคาครึ่งหนึ่งจากราคาปกติ
เทียบราคาต่อปริมาณเท่ากัน เฉพาะงานที่รอผลได้ภายใน 24 ชั่วโมง
ไม่อยากจ่ายค่า API เลย · ใช้ Ollama ในเครื่อง รันโมเดลบนเครื่องตัวเองได้ · แต่ผมต้องพูดให้ครบว่าค่าใช้จ่ายไม่ได้หายไป
มันย้ายจากค่า token ไปเป็น CPU, GPU, RAM, ค่าไฟ และเวลาดูแลเครื่อง · คุณภาพต้องเทียบกับ golden set ก่อนใช้จริง
ผู้ใช้เข้ามาแล้วระบบตัดสินใจยังไง?
กฎข้อแรกที่ผมล็อกไว้สั้นมาก · ผู้ใช้เปิดหน้าเว็บเฉย ๆ ต้องใช้ AI token เท่ากับ 0
โมเดลถูกเรียกเมื่อผู้ใช้กดปุ่มที่ต้องใช้ AI เท่านั้น · ผังข้างล่างคือทางเดินทั้งหมด
ผู้ใช้เปิดหน้าเว็บ
โหลดหน้าและข้อมูลปกติ
AI token = 0
ผู้ใช้กดฟังก์ชัน AI ไหม?
ไม่กด
จบ ไม่เรียกโมเดล
AI token = 0
กด
มีคำตอบเดิมใน Cache ไหม?
มี
คืนคำตอบเดิม
ไม่เรียกโมเดล
ไม่มี
กฎหรือ Template ทำแทนได้ไหม?
ได้
ประมวลผลด้วยโค้ด
AI token = 0
ไม่ได้
ตรวจสิทธิ์ โควตา และงบ
เรียกโมเดลเล็กก่อน
ความมั่นใจต่ำ หรือผู้ใช้เลือกละเอียด?
ใช่
ส่งต่อโมเดลใหญ่
ภายใต้งบที่ตั้งไว้
ไม่
เก็บ Cache และบันทึกต้นทุน
ผังตัดสินใจการเรียกโมเดล AI · เส้นทางสีเขียว 3 เส้นคือทางออกที่ไม่เสีย token เลย
โหมดที่ผมให้ผู้ใช้เลือกมี 5 แบบ · ตั้งชื่อด้วยผลลัพธ์ ไม่ใช่ชื่อโมเดล เพราะผู้ใช้อยากเลือกผลลัพธ์
โหมดหน้าจอ เบื้องหลังทำอะไร เหมาะกับใคร
ประหยัด Cache แล้วกฎ แล้วโมเดลเล็ก ผู้ใช้ฟรีและงานทั่วไป
สมดุล Cache แล้วโมเดลเล็ก ขยับเป็นใหญ่เมื่อจำเป็น ค่าเริ่มต้นของ Production
ละเอียด โมเดลคุณภาพสูง บริบทเยอะ งานสำคัญและผู้จ่ายเงิน
ทำเบื้องหลัง เข้าคิว Batch แล้วแจ้งเมื่อเสร็จ รายงานจำนวนมาก
เก็บในเครื่อง โมเดลที่รันบนเครื่องตัวเอง ข้อมูลอ่อนไหว
ตัวคุมต้นทุนที่ผมใส่ไว้ 8 อย่าง · Cache คืนคำตอบเดิม · สร้างคำตอบยอดนิยมล่วงหน้า · เลือกขนาดโมเดลตามงาน · จำกัดความยาวข้อความ · retry ได้ครั้งเดียว · โควตารายวันต่อคน · จำกัดความถี่กันกดรัว · ส่งเฉพาะข้อมูลที่จำเป็น ไม่ส่งเอกสารทั้งก้อน
บทที่ 2
ทางที่ชัดตั้งแต่ต้น ทำให้ไม่มีใครหลงกลางทาง
Branch ของทีมผมวางไว้ยังไง?
ภาพจากงานจริง
เส้นทางจริงของงาน · กิ่งงานลงไปรวมที่กิ่งรวมงานก่อน แล้วค่อยขึ้นกิ่งหลัก
กติกาของทีม ทำไมต้องผ่านกิ่งรวมงานก่อน เส้นสีที่วิ่งขนานกันคือกิ่งงานของแต่ละคน · ทุกเส้นต้องลงมารวมที่กิ่งกลางก่อน แล้วค่อยขึ้นกิ่งหลักพร้อมกันทีเดียว
ถ้าปล่อยให้ยิงเข้ากิ่งหลักตรง ๆ ได้ ของที่ยังไม่ผ่านตาใครจะไปโผล่บนเครื่องจริงทันที
กดพื้นหลังหรือปุ่ม ESC เพื่อปิด
ปิด
กติกาคือทุกงานผ่าน dev ก่อนเสมอ · ห้ามลัดเข้า main ตรง ๆ
feature/<ชื่องาน>
Merge Request → Fast CI + Review App
dev
Full CI + Staging
Merge Request สำหรับ Release (fast-forward)
main หรือ master
Manual Production Deploy
Production + Feature Flag
Deploy แล้ว แต่ Flag ยังปิด
ทางลัดที่ต้องบล็อก
feature → main ตรง ๆ
release-source-gate
source ต้องเป็น dev เท่านั้น
เส้นทาง Git ของทีม · เส้นประแดงคือทางลัดที่ต้องมีด่านบล็อก
Branch Push ตรง รับ Merge จาก ใคร merge ได้ ปลายทาง Deploy
feature/* เจ้าของ branch เขียนเอง ตามผู้ดูแลโครงการ Review App
dev No one feature/* Developer และ Maintainer Staging
main หรือ master No one dev เท่านั้น Maintainer หรือ Release Owner Production
Release Tag No one สร้างจาก main Release Owner Production ตามเลขรุ่น
GitLab แนะนำให้ development branch ตั้ง Allowed to merge เป็น Developer และ Maintainer ส่วน Allowed to push เป็น No one
คำว่า No one ต้องตั้งจริง ห้ามปล่อยว่าง · การไม่ตั้งค่าไม่เหมือนการปิดสิทธิ์ชัด ๆ
Branch Protection กัน push ตรงได้ แต่กันไม่ได้ตอนมีคนเปิด MR จาก feature เข้า main แล้วคนตรวจเผลอกดผ่าน
ผมเลยเพิ่ม release-source-gate · ถ้าปลายทางคือ main ต้นทางต้องเป็น dev เท่านั้น ไม่ตรงให้ pipeline ล้ม
ด่านที่ผมบังคับเพิ่ม · pipeline ต้องเขียวก่อน merge · คนเปิด MR ห้ามอนุมัติงานตัวเอง · ห้าม force push ที่ dev และ main · การแก้ .gitlab-ci.yml migration auth และ payment ต้องมีคนตรวจเฉพาะทาง
กับดักที่ผมเกือบไม่เห็น · ต้องตรวจ wildcard rule ด้วย · GitLab ใช้กฎที่เปิดกว้างที่สุดเมื่อชื่อ branch ตรงหลายกฎ เช่น main อาจชนกับกฎ m ดอกจัน แล้วสิทธิ์หลุด
ตอน merge จาก dev เข้า main ผมใช้ Fast-forward · main จะชี้ไป commit เดียวกับ dev
ผลคือรหัสรุ่นที่ทดสอบบนเครื่องซ้อม ตรงกับที่ขึ้นเครื่องจริงเป๊ะ
ไฟล์งานชิ้นเดิมถูกเลื่อนขึ้นไปใช้ ไม่มีการประกอบของใหม่ที่ไม่เคยทดสอบ
ทำซ้ำได้ทุกวัน คือของจริง ร้านที่เปิดทุกเช้าไม่ได้ชนะเพราะเก่งกว่า แต่ชนะเพราะทำเหมือนเดิมได้ทุกวัน
ทีมต้องจำ Shortcut กี่ตัว?
3 ตัว · ผมเคยคิดจะทำมากกว่านี้ แล้วตัดทิ้ง เพราะเกิน 3 คือไม่มีใครจำ แล้วทุกคนกลับไปทำมือ
01 Dev Flow · ของนักพัฒนาทุกคนตรวจว่าอยู่บน feature branch จริง รัน Fast CI ตรวจขอบเขตไฟล์ ตรวจ secret แล้วเปิด MR โดยบังคับปลายทางเป็น dev · จบด้วยการคืน URL ของ Review App
02 Release Flow · ของคนคุมรุ่นตรวจว่าต้นทางเป็น dev และชุดตรวจเต็มผ่านแล้ว
ตรวจว่ารหัสรุ่นบนเครื่องซ้อมตรงกับรุ่นที่จะปล่อย แล้วส่งขึ้นเครื่องจริงโดยยังปิดสวิตช์ไว้
ถ้าผลตรวจสุขภาพระบบไม่ผ่าน ให้ย้อนกลับรุ่นเดิมทันที
03 CI Audit · ของผมเองอ่านอย่างเดียว ห้ามแก้อะไร · ไล่ดูทีละโครงการว่ามี dev ไหม ล็อกแล้วหรือยัง มีด่านกันทางลัดไหม มี Feature Flag ไหม และมีตัวคุม AI token ไหม
Shortcut พวกนี้เรียกสคริปต์ตรวจจริงเป็นหลัก · ให้ AI แปลผลเป็นภาษาคนเฉพาะตอนมีปัญหา
เหตุผลมี 2 ข้อ · งาน branch เป็นงานเปราะที่ห้ามตีความผิด · และการให้สคริปต์ตรวจแทนช่วยลดค่า AI token ไปในตัว
Prompt ที่ 1 · ให้ AI ตรวจ Branch Workflow แบบอ่านอย่างเดียว ตรวจโครงการนี้แบบอ่านอย่างเดียว ห้ามแก้ไฟล์ ห้าม merge ห้าม deploy
คืนตาราง 9 ช่อง Dev Exists, Dev Protected, Direct Push Blocked,
Feature→Dev Gate, Dev Staging, Dev→Main Gate, Fast-forward,
Production Approval, Hotfix Policy
ทุกช่องต้องแนบหลักฐานจริงเป็น URL, SHA หรือ pipeline id
เข้าถึงข้อมูลไม่ได้ให้ตอบว่า UNKNOWN ห้ามตอบว่าไม่มี
Prompt ที่ 2 · ให้ AI ตรวจตัวคุมค่า AI ตรวจว่าระบบนี้มีตัวคุมค่า AI ครบไหม ตอบมีหรือไม่มี พร้อมไฟล์และเลขบรรทัด
1 หน้าเว็บที่เปิดเฉย ๆ เรียกโมเดลหรือไม่
2 มี Cache ไหม และ cache key ผูกกับ user กับสิทธิ์หรือเปล่า
3 มี Model Routing ไหม
4 มี daily quota กับ rate limit ไหม
5 มี budget circuit breaker ไหม
6 ชุดทดสอบใช้ Mock หรือเรียกโมเดลจริง
ห้ามเดา ไม่มีหลักฐานให้เขียนว่าไม่มีข้อมูล
ไฟล์ตั้งค่า ผมขยายของเดิมที่ทีมใช้อยู่ แทนการสร้างไฟล์ใหม่
{
"branch_flow": {
"integration_branch": "dev",
"production_branch": "main",
"release_source_only": "dev",
"direct_push_forbidden": ["dev", "main"],
"hotfix_enabled": false
}
}
ผมเลือกต่างจากที่คนส่วนใหญ่ทำตรงไหน?
เรื่อง วิธีที่คนส่วนใหญ่ทำ วิธีที่ผมเลือก เหตุผล
ไฟล์ CI แยก 2 ไฟล์ ทดสอบกับ production ไฟล์เดียว แยกด้วย rules สองไฟล์จะค่อย ๆ ต่างกัน จนของที่ทดสอบไม่ใช่ของที่ขึ้นจริง
การกันทางลัด ล็อก Branch Protection พอ ล็อก บวก release-source-gate Protection กันแค่ push ตรง กัน MR ลัดไม่ได้
การขึ้น Production build ใหม่ตอน deploy เลื่อน artifact เดิมด้วย fast-forward ของที่ขึ้นจริงต้องเป็นชิ้นเดียวกับที่ทดสอบผ่าน
ค่า AI เรียกโมเดลตั้งแต่โหลดหน้า เปิดหน้า เท่ากับ 0 token คนเข้าเว็บมากกว่าคนกดใช้ฟีเจอร์หลายเท่า
Shortcut สร้างคำสั่งย่อยเยอะตามงาน 3 ตัวเท่านั้น เกิน 3 คือไม่มีใครจำ
ต้นทุนกับแผลที่ต้องบอกตามตรงคืออะไร?
ผมไม่เขียนแต่ด้านดี · 4 ข้อนี้คือราคาที่ผมจ่ายจริง
หนึ่ง · เส้นทางยาวขึ้นหนึ่งช่วงเสมอ · งานเล็กที่เคยขึ้นได้ใน 10 นาที ต้องผ่าน dev ก่อน
สอง · รอบที่แล้วผมเสียเวลาไปหนึ่งรอบเต็มกับเรื่อง branch ไม่มีชื่อ ก่อนได้เขียนโค้ดจริงสักบรรทัด
สาม · Feature Flag ที่ไม่มีเจ้าของจะกลายเป็นขยะค้างระบบ · ผมต้องกำหนดเจ้าของกับวันหมดอายุตั้งแต่วันที่สร้าง
สี่ · ที่หนักสุดคือ ทั้งหมดนี้ยังเป็นแบบ · ผมยังไม่ได้พิสูจน์กับ 9 โครงการจริงเลยแม้แต่ตัวเดียว
Phase สถานะ แปลเป็นภาษาคน
แยก Deploy กับ Release 1/1 ล็อกแนวคิดแล้ว
ออกแบบ Environment 4/4 มี CI, Review App, Staging, Production
ออกแบบตัวคุม Token 8/8 มี Mock, Cache, Routing, Budget, Quota, Batch
ออกแบบ Branch Protection 3/3 ปิด direct push และกำหนดผู้ merge
ชุดทดสอบบังคับ 0/13 ยังไม่ได้รันสักข้อ
ตรวจ GitLab จริง 0/9 ยังไม่ได้เปิดตรวจสักโครงการ
คำถามที่ทีมถามผมบ่อยคืออะไร?
ระบบที่ยังไม่เปิดใช้จริง ต้องแยก CI/CD คนละแบบไหม แยกที่ปลายทาง ไม่ใช่แยกไฟล์ · งานพัฒนาใช้ Fast CI แล้วขึ้น Review App · งานเปิดจริงใช้ Full CI แล้วกดอนุมัติด้วยมือ
บังคับให้ทุกคน merge เข้า dev ก่อนได้จริงไหม ได้ ต้องใช้สองชั้นคู่กัน · Branch Protection ปิด direct push และ release-source-gate ตรวจต้นทางของ MR · ขาดชั้นที่สองเมื่อไร คนเปิด MR ลัดได้ทันที
ถ้า CI Audit ไม่มีสิทธิ์เข้าถึงข้อมูล ควรรายงานว่าอะไร รายงาน UNKNOWN ห้ามเขียนว่าไม่มี · คำว่าไม่มีแปลว่าตรวจแล้วและไม่พบ ซึ่งคนละเรื่องกับเข้าไม่ถึงข้อมูล
dev ที่ค้างนานหลายสัปดาห์ อันตรายไหม อันตราย เพราะ release ครั้งเดียวจะพาหลายฟีเจอร์ขึ้นพร้อมกัน · ทางแก้คือใส่ Flag แยกรายฟีเจอร์ แล้ว deploy บ่อยขึ้นโดยยังปิด Flag
Production ล่มกลางดึก ต้องรอผ่าน dev ไหม ต้องมีเส้นทางแก้ด่วนแยกไว้ ใช้เฉพาะตอน production ล่ม ต้องมีคนอนุมัติ · แล้วต้อง merge main กลับเข้า dev ทันทีหลังจบเหตุ ไม่งั้น fast-forward รอบหน้าจะทำไม่ได้
คุณเริ่มวันนี้ได้ยังไงบ้าง?
หนึ่ง · แยกคำพูดก่อนแยกระบบ เลิกพูดคำว่าปล่อยของรวม ๆ · เปลี่ยนเป็น deploy แล้ว กับ release แล้ว · ความเข้าใจผิดในทีมหายไปครึ่งหนึ่ง
สอง · ตั้งกฎเดียวเรื่องค่า AI หน้าเว็บที่เปิดเฉย ๆ ต้องเรียกโมเดล 0 ครั้ง · กฎข้อเดียวนี้ตัดค่าใช้จ่ายก้อนใหญ่ที่สุดออกไป
สาม · เพิ่ม release-source-gate ก่อนกฎอื่น ถ้าสัปดาห์นี้แก้ได้จุดเดียว ให้เพิ่มด่านที่บล็อก MR เข้า main ที่ต้นทางไม่ใช่ dev · คุ้มที่สุดต่อแรงที่ลงไป
สี่ · ตรวจตัวเองด้วยคำถามเดียว เปิดโครงการของคุณแล้วถามว่า ถ้าวันนี้มีคนเปิด MR จาก feature เข้า main ระบบจะหยุดเขาไหม · ตอบไม่ได้แปลว่ายังไม่มีด่าน
ตอนต่อไปของบันทึกนี้
เมื่อผมรันชุดทดสอบครบ 13 ข้อ และตรวจครบ 9 โครงการ ผมจะกลับมาเขียนพร้อมตารางผลจริงว่าโครงการไหนขาดด่านไหน
เรือที่แล่นเร็วที่สุดไม่ใช่ลำที่ไม่มีด่าน แต่คือลำที่ด่านอยู่ถูกที่ จนไม่มีใครต้องหยุดเรือกลางทะเล