Tutorial

ผมทดลอง Vibe Coding แล้วม่วนสุด ๆ แต่วันนี้จะมาบอกทริกการใช้งานกัน

By Arnon Puitrakul - 13 ธันวาคม 2025

ผมทดลอง Vibe Coding แล้วม่วนสุด ๆ แต่วันนี้จะมาบอกทริกการใช้งานกัน

เมื่อไม่กี่วันก่อน ชีวิตขาดสีสันอะแหละ เลยอยากลองอะไรใหม่ ๆ ลองเป็น Vibe Coder ดูมะ เลยลองเอามันมาสร้าง Project อันนึงสำหรับใช้งานในบ้านเราเอง ตอนแรกว่าจะลองขำ ๆ แต่ทำ ๆ ไปไม่ขำแล้ว จนจบ Project ที่อยากทำมา 3 ปี ใน 2 วันได้ วันนี้เราจะมาเล่าให้อ่านกันว่า เรามี Lesson Learnt อะไรจากการเขียนโปรแกรมโดยใช้ AI กันบ้าง โดยเฉพาะ เราควรจะ Prompt และแก้ไขปัญหาจากการทำงานอย่างไร

หยุด Zero-Shot และให้ Context มันเยอะ ๆ

เราว่าหลาย ๆ คนที่ใช้ AI มาก่อน น่าจะเจอปัญหาว่า ทำไมมันแก้ปัญหาไม่ตรงใจเรา หรือ เขียนออกมาแล้วมันแปลก ๆ ใช้อะไรที่เราไม่คิดว่ามันจะใช้ได้จริง ๆ ตัวอย่างเช่น อยู่ ๆ แบบไม่มีปี่ ไม่มีขลุ่ยอะไรเลยพิมพ์บอกมันว่า "Implement Database Connector for me" เอาจริงนะ ขนาดเป็น Software Engineering เจ้านายสั่งแบบนี้แมร่งน่าจะโดนตีหัวแล้วพูดว่า "มึงบรีฟกูได้เหี้ยมาก" อย่างแน่นอน Database อะไร แล้วอี Database นี่อยู่ไหน ใช้อะไร ไม่รู้เรื่องเลย ขนาดสั่งคนยังไม่รอดเลย AI จะรอดเรอะ

เราไปหาข้อมูลมา ในวงการ Prompt Engineering เขาเรียกกันว่า Zero-Shot Prompt ซึ่งการทำแบบนั้น มันเสี่ยงมากที่ เราจะได้ผลลัพธ์แปลก ๆ ออกมา เพราะมันไม่รู้ว่ามันกำลังทำงานกับอะไร

วิธีแก้คือ เราจะต้องยัดบริบทให้มันมากที่สุดว่า เราจะต้องทำอะไร จากเคสที่จะต่อ Database เราอาจจะบอกไปว่า

Implement MySQL database connector class by creating a new class. Inside the class has the constructor accepting the connection credential and database address. Also create the method accepting SQL query and returning the query result in the array data structure. Before making any query, make sure that the query string is sanitised avoiding SQL Injection.

จะเห็นได้ว่า เราไม่ได้บอกมันห้วน ๆ ละ เราบอกมันตั้งแต่ว่า เราจะให้มันเขียนไปต่อ Database ตัวไหน, Constructor ของ Class นั้น ๆ รับอะไรเข้ามาเป็น Parameter บ้าง และท้ายสุด Method ภายใน แต่ละอัน รับอะไรเข้ามาบ้าง คืนค่าอะไร และมีอะไรที่ต้องระวังบ้าง

แต่ถ้า เอาดี ๆ เลย เราแนะนำให้เขียนเป็นข้อ ๆ ไล่ลงมาเลยจะง่ายมากกว่า เพราะบางครั้ง ใน Class ไม่ได้มี Method เดียว ถ้าต้องให้อธิบายทั้งหมดเป็น Paragraph คนเขียนจะ งง เองนี่แหละ ว่าเขียนถึงไหนแล้ว

หั่นงานให้เข้าใจง่าย งานยากให้ซอยออกหลาย ๆ รอบ

ทีนี้ ถ้าเกิดว่า งานมันยาว ประกอบด้วยหลายขั้นตอนมาก ๆ ลองคิดดูนะว่า ถ้าอยู่ ๆ เราสั่งงาน Junior ที่ซับซ้อนมาก ๆ โดยไม่ได้บอกขั้นตอนที่ชัดเจน หรือ สั่งพร้อม ๆ กันยาวเกินไป ก็มีโอกาสที่จะลืม แล้วทำอะไรผิด ๆ ออกมา

LLM ก็เหมือนกัน มันมีข้อจำกัดในการรับคำสั่งของมันเหมือนกัน ยิ่งเราใส่ Token เยอะมากขึ้นเท่าไหร่ ก็มีโอกาสที่มันจะหลอนมากขึ้นได้เท่านั้น ดังนั้น วิธีการแก้ปัญหาคือ ถ้าคิดว่า งานมันยาวมาก ๆ เราจะซอยค่อย ๆ สั่งมันไปทีละนิดไปเรื่อย ๆ

จากเคสเมื่อครู่ ถ้าเกิดว่า เราจะ Implement Class แต่ที Method เยอะมาก และเราอยากจะกำหนดรายละเอียดของแต่ละ Method ที่ละเอียด การซอยย่อยออกมาเป็น 1-2 Method ต่อ Prompt ก็เป็นอะไรที่ไม่เลว

หรืออีกอันที่เราเจอบ่อยคือ เราอยากจะ Implement Feature ใหม่ มันจะต้องยุ่งตั้งแต่ การเขียน Migration ใน Database, เขียน Logic บน Backend เพิ่ม, เขียน Test บน Backend, เขียน/แก้ไข Frontend และ เขียน Component Test บน Frontend เพิ่มอีก ถ้าเราจะให้มันทำทั้งหมดใน Prompt เดียว มันเป็นไปไม่ได้หรอก ยาวเกิ้นนนนน แค่ว่าจะเขียนรายละเอียดของ Logic ใน Backend ก็น่าจะยาวไปหลายหน้า A4 แล้วละ เราจะค่อย ๆ ใช้เขียนไปทีละขั้นตอนให้มันไปเรื่อย ๆ

Prompt 1:
Create the new table names "Transaction". This table contain the following fields
1. "id" (unsigned int) : id of the transaction (Not Null, Primary, Auto Increment)
blah blah.......

Prompt 2:
Create new api endpoint at /transaction in post method for adding new transaction. Schema based on the transaction table that has been created in the previous step.

Prompt 3:
Create unit test for the endpoint that has been created in the previous step by covering input test and edge cases such as inputting emoji.

หากอ่าน Prompt ด้านบน เราจะเห็นว่า ใน Prompt ที่ 2 และ 3 เราจะเชื่อมโยงไปหา Prompt ก่อนหน้าเสมอ เพื่อบอกบริบทให้มันเพิ่มว่า ให้สนใจแค่สิ่งที่เราเขียนตอนนี้พอนะ ไม่ต้องไปยุ่งกับทั้ง Codebase หรือถ้าเราใช้ AI Code Editor อย่าง Antigravity หรือ Cursor เราสามารถอ้างถึง Code ไฟล์นี้ หรือ Class นั้น ๆ ได้เลย อันนี้ช่วยได้เยอะ

นอกจากที่มันจะลดโอกาสที่ Model จะหลอนได้แล้ว มันยังทำให้เราคุมคุณภาพของ Code ได้ง่ายกว่ามาก ผิดตรงไหน Reject ออกแล้วแก้ได้ทันที ไม่ต้องเสี่ยงว่าจะต้องแก้หลายที่

เจอ Error ไม่ใช่เรื่องแปลก ใจเย็น อย่าพึ่งปิดหนี

หลาย ๆ คนเจอปัญหาว่า พอมันเขียนออกมา เราก๊อป แล้วเอาไปรัน ปรากกว่า แดงเถือกทั้งแผ่นดินแตกกันยับ ๆ แล้วก็จะแก้ปัญหาด้วยการลบทิ้ง แล้วไปบอกว่า นี่ ๆ ที่แก Generate มันรันไม่ได้หวะ แก้สิ๊ ถ้าเป็น เจ้านายแล้ว ลองเอาแบบนี้ไปพูดกับ Engineer ดูสิ เขาไม่ตบหัวโยกก็บุญแล้ว มันไม่ใช่เพราะอยู่ ๆ เราไปสั่งเขานะ แต่แกเล่นไม่บอกเลยว่า มันเกิดอะไรขึ้น รันไม่ได้แล้วมันขึ้นอะไร บอกข้อมูลเพิ่มหน่อยไม่ได้เหรอวะ อย่าบรีฟเหี้ยได้ปะ

the solution didn't work. Here's the steps to reproduce
1. Compile source code with 'gcc mem_test.cpp -o mem_test'
2. Run the compiled binary with './mem_test'
3. The prompt show 'Starting Mem Test...'
4. Error Occured, Program exit with code 1

Here's the error stack that program produced
.......

What causes this problem, can you recommend how to fix?

AI มันก็เหมือนกัน อยู่ ๆ ไปบอกว่า Error แล้วแก้ให้ ใครมันจะไปแก้ได้ วิธีการคือ เราจะต้องบอก Context มันเพิ่มเติมด้วย อย่างน้อยที่สุดคือ บอกว่า เรารัน Code ที่แก Generate ไปแล้วนะ แต่มันขึ้น Error แบบนี้ ๆ หรือถ้าให้ดีที่สุด พยายามเขียนเหมือนเรากำลังจะสื่อสารกับ Engineer คนอื่น ๆ เลยว่า มันเกิด Error อะไรและ Step to reproduce คืออะไร เพื่อให้เป็นข้อมูล สำหรับไปหาวิธีการแก้ปัญหามาให้เรา

ทริกที่สำคัญคือ พยายามคุยใน Thread เดียวกัน เพื่อให้ AI มันนำมาใช้เป็น Context ว่ามันเคยแนะนำ Code แบบนี้ ๆ ไปนะ แต่มันไม่รอด มันจะได้ไม่ลองวิธีซ้ำ ๆ ให้เราหัวร้อนขึ้น

Secret & Safety คือเรื่องสำคัญมาก ๆ

หากเราได้ดูข่าวพวก Vibe Coder อันที่อับอาย และสร้างความชิบหายให้มากที่สุดคือ ข้อมูลหลุด หรือไม่ก็โดน Input แปลก ๆ เข้ามา ตัวอย่างเช่น เอา API Key, Password, Connection String และ Logic ที่เป็นความลับใส่เข้าไปตรง ๆ

อย่างแรก เราต้องอย่าลืมนะว่า Prompt ที่เราป้อนเข้าไป ผู้ให้บริการ AI นั้น ๆ สามารถเอาไปใช้เป็นข้อมูลในการ Train AI รุ่นต่อไปได้ด้วยนะ และอีกอย่างคือ ทำแบบนั้น AI มันมีโอกาสที่จะ Hard Code Secret พวกนั้นลงไปใน Code ตรง ๆ เลย ปรากฏว่า คนทำมันไม่อ่าน เน้นก๊อป ก็คือ ของฝากนักก๊อปเข้าเลยมั้ยละ แตกกันยับ ๆ

วิธีการแก้คือให้เราระวังตั้งแต่ Prompt ว่า เราจะต้องไม่ใส่ข้อมูลที่เป็นความลับลงไป หากจำเป็นให้เรา Masking มันไป หรือถ้าเราเขียนโปรแกรม เราอาจจะกำหนดไปเลยว่า ให้มันเขียนไปเรียกมาจาก Environment Variable หรือ .env File อะไรก็ว่ากันไป เพราะถ้าเราไม่บอกมัน มันมีโอกาสที่มันจะ Hard Code ใส่เข้าไป แล้วเราก็ก๊อปไป ก็คือหลุดแตกจบเลย

หรือเพื่อความปลอดภัยขึ้นอีกขั้น เราอาจจะไปจัดการตั้งแต่ Git Repo เราเลย อาจจะเป็นการใช้เครื่องมือที่ตรวจหา Credential ใน Codebase เราอย่าง TruffleDog ก็เป็นอีกตัวเลือกที่ชัวร์กว่าเยอะ

ใช้มันเป็นคู่หูช่วยคิดได้ด้วย

หลาย ๆ ครั้ง เรามักจะใช้มันเป็นเครื่อง Generate Code มาให้เรา แต่จริง ๆ แล้วเรายังสามารถมันใช้มันเป็นเพื่อนคู่คิดให้เราได้ด้วย เหมือนเราทำ Pair Programming นี่แหละ เช่น หากเราเขียน Code เสร็จออกมาแล้ว เราอาจจะถามมันว่า มีจุดไหนที่คิดว่า Performance จะแย่ หรือเป็นคอขวดบ้างมั้ย หรือถ้าเราอยากจะ Refactor เราควรจะจัด Structure ยังไงดีนะ เราว่ามันเป็นอะไรที่ดีมาก ๆ เพราะมันมีหลายดอกแล้วที่ มันช่วยเราคิดวิธีการแบบที่คิดไม่ถึง หรือเตือน Edge Case แปลก ๆ มาเยอะมาก

หรือใน Project ที่เราใช้ทำงาน มันเป็นเว็บ ที่เราไม่ถนัด และไม่ค่อยรู้จัก Technology Stack ของงานพวกนี้เท่าไหร่ เราก็ค่อย ๆ หาข้อมูลประกอบกับถามมันไปเรื่อย ๆ จนถึงตอน Generate Code ออกมา มันก็เป็นเหมือน Boilerplate ให้เราทำงานต่อได้ง่ายขึ้นเยอะ แทนที่จะเริ่มต้นจาก 0 ก็กลายเป็น เริ่มต้นจาก 20-30 เราว่า มันก็ไม่เลวเลยนะ

สรุป

เราว่า การใช้ AI ในการทำงาน เป็นเรื่องที่ปฏิเสธไม่ได้แล้วละ เราว่ามันทำให้เราเหมือน ติดปีก ทำให้เราทำงานได้เร็วขึ้น มีเวลาไปโฟกัสกับเรื่องที่สำคัญมาก ๆ อย่าง Business Logic และ System Design มากขึ้น แต่เหนือสิ่งอื่นใด ไม่ว่า AI จะเก่งแค่ไหน เราจะต้องเป็นนายของมัน ไม่ใช่มันเป็นนายของเรา ยังไง ๆ เราก็ยังต้องเขียนโปรแกรมเป็น ยิ่งใช้ AI สกิลการอ่าน และทำความเข้าใจ Code ต้องสูงมาก ๆ เลยทีเดียว ซึ่งการจะทำได้แบบนี้ Foundation เป็นเรื่องสำคัญมาก ๆ เราว่า Vibe Coding ไม่ผิดนะ แต่ผิดที่คุณไม่รู้เลยว่า มันเขียนอะไรออกมาให้ แล้วหลับหู หลับตากด Accept แล้วมาบอกว่า นี่ไงโปรแกรมทำงานได้ แต่มันใช้งานจริงไม่ได้พวกนั้นแหละ ที่น่าเขกกระโหลกสักที และกระซิบข้างหูว่า ตื่นค๊าาาา