หน้าล็อกอินแสดงผลได้อย่างถูกต้อง REST API ส่งค่ากลับมาเป็น 200 OK SaaS boilerplate รันขึ้นมาได้โดยไม่มีแม้แต่ข้อผิดพลาดจากการ lint เพียงข้อเดียว ภายในเวลาเพียงบ่ายวันเดียว คุณก็ทำงานที่เคยต้องใช้เวลาเป็นสัปดาห์เสร็จสิ้นลง ผู้ช่วยเขียนโค้ดด้วย AI ได้เปลี่ยนโฉมหน้าการพัฒนาซอฟต์แวร์ไปอย่างสิ้นเชิง จนการสร้างฟีเจอร์ใหม่ๆ ให้ความรู้สึกเหมือนการสั่งอาหารจากเมนูมากกว่าการทำวิศวกรรม ความสะดวกสบายนั้นเป็นเรื่องจริง แต่มันมีราคาที่ต้องจ่ายซึ่งจะปรากฏให้เห็นในภายหลัง โดยเฉพาะในช่วงเวลาที่เดิมพันสูงที่สุด นักพัฒนาเริ่มเรียกกับดักนี้ว่า Vibe Coding และชื่อนี้ก็สะท้อนถึงปัญหาได้อย่างสมบูรณ์แบบ
The Copy-Paste Loop
นี่คือสิ่งที่วงจรนี้เป็นจริงๆ คุณวางเคอร์เซอร์ในช่องแชทแล้วอธิบายฟีเจอร์ด้วยภาษาอังกฤษธรรมดา บล็อกของโค้ดจะปรากฏขึ้นมาทันที คุณไฮไลต์มัน คัดลอก สลับกลับไปที่เอดิเตอร์ วาง และบันทึก เทอร์มินัลไม่แสดงข้อผิดพลาด เบราว์เซอร์แสดงเลย์เอาต์ที่ถูกต้อง คุณคอมมิตการเปลี่ยนแปลงและเปิดตั๋ว (ticket) ใบถัดไป ไม่มีการหยุดเพื่อไล่ดูตรรกะ (logic) ไม่มีการตรวจสอบ dependencies ที่นำเข้ามา ไม่มีการตั้งคำถามว่าไลบรารีภายนอกนั้นจำเป็นจริงๆ หรือไม่ หรือเครื่องมือใน standard library จะใช้งานแทนได้ไหม เวิร์กโฟลว์เป็นเพียงแค่ ถาม, คัดลอก, วาง, รัน หากหน้าตาภายนอกดูถูกต้อง ก็จะทึกทักเอาว่าส่วนลึกข้างในก็ต้องถูกต้องด้วย นี่ไม่ใช่การเขียนโค้ดในความหมายที่แท้จริง แต่มันคือการประกอบชิ้นส่วนสำเร็จรูปโดยไม่อ่านคู่มือ เช่นเดียวกับทางลัดอื่นๆ มันจะใช้งานได้ดีจนกระทั่งถึงวินาทีที่มันใช้งานไม่ได้
Losing Control at the Worst Time
เมื่อบั๊กเกิดขึ้นในระบบ production มันจะตกมาอยู่ที่โต๊ะของคุณ ไม่ใช่ของ AI ในเวลาตีสอง แชทบอตไม่ได้ล็อกอินอยู่ในแพลตฟอร์ม observability ของคุณ แต่คุณต่างหากที่ทำอยู่ หากคุณไม่เคยอ่านโค้ดที่คุณส่งขึ้นไปเลย คุณก็ไม่สามารถวิเคราะห์สาเหตุความล้มเหลวของมันได้ คุณจะต้องไล่ grep ผ่านไฟล์ที่คุณไม่เข้าใจ พยายามแก้ไขตรรกะที่คุณไม่เคยเรียนรู้ ความรู้สึกนั้นจะทำให้คุณสับสน นักพัฒนาที่เขียนโครงสร้างขึ้นมาเองจะสร้างแผนที่ในใจ (mental map) ของระบบ พวกเขารู้ว่าจุดไหนที่มีความเสี่ยง และสมมติฐานใดที่ช่วยยึดโยงระบบไว้ด้วยกัน Vibe Coding จะลบแผนที่นั้นทิ้งไป คุณจะกลายเป็นเพียงผู้ควบคุมกล่องดำ (black boxes) ไวยากรณ์ (syntax) นั้นถูกต้อง การสาธิต (demo) สร้างความประทับใจให้ลูกค้า แต่ระบบนั้นไม่ใช่ของคุณอย่างแท้จริง ความเป็นเจ้าของต้องมาพร้อมกับความเข้าใจ และความเข้าใจต้องใช้เวลา การข้ามขั้นตอนนั้นไม่ได้ช่วยลดต้นทุน แต่มันแค่ย้ายต้นทุนไปไว้ในเวลาที่แพงที่สุดเท่าที่จะเป็นไปได้
Working Code Is Not Safe Code
โมเดล AI สร้างคำตอบโดยอิงจากรูปแบบที่พบในข้อมูลที่ใช้ฝึกฝน รูปแบบเหล่านั้นรวมถึงตัวอย่างที่ล้าสมัยและไม่ปลอดภัยมากมาย ฟังก์ชันล็อกอินที่คุณคัดลอกมาอาจจัดเก็บรหัสผ่านโดยใช้การแฮช (hash) ที่รวดเร็วแต่ล้าสมัย แทนที่จะใช้ salted slow hash เพราะข้อมูลที่ใช้ฝึกฝนเน้นไปที่ตัวอย่างจากฟอรัมเก่าๆ API endpoint อาจนำ input ของผู้ใช้ไปต่อเข้ากับสตริง SQL โดยตรง เพราะคุณขอตัวอย่างแบบง่ายๆ และโมเดลก็จัดให้ตามนั้น ข้อมูลประจำตัวของฐานข้อมูลของคุณอาจรั่วไหลไปยัง JavaScript ฝั่งไคลเอนต์ เพราะ AI ไม่รู้ว่าคุณกำลังสร้าง serverless frontend ไม่ใช่ backend route
การขาดการตรวจสอบ input (input validation) เป็นเรื่องที่พบได้บ่อย ตัวจัดการฟอร์มที่ถูกสร้างขึ้นมามักจะสมมติว่าผู้ใช้สุภาพและล้มเหลวในการตรวจสอบความยาวสตริง ช่วงตัวเลข หรือประเภทไฟล์ ก่อนที่จะส่งข้อมูลลึกลงไปใน stack การตรวจสอบการยืนยันตัวตน (authentication) อาจพึ่งพาโทเคนฝั่งไคลเอนต์โดยไม่มีการตรวจสอบที่ฝั่งเซิร์ฟเวอร์อย่างเหมาะสม ซึ่งสร้างความรู้สึกปลอดภัยที่ผิดพลาด AI อาจสร้าง session cookie โดยไม่มีแฟล็ก HttpOnly หรือ Secure เพราะข้อมูลที่ใช้ฝึกฝนรวมถึงคำตอบเก่าๆ จาก Stack Overflow ปัญหาแต่ละอย่างจะมองไม่เห็นในระหว่างการสาธิต แอปทำงานได้ ผู้ใช้ล็อกอินได้ ข้อมูลไหลเวียนได้ แต่ผู้โจมตีต้องการเพียงจุดเข้าใช้งานที่ไม่ได้ป้องกันเพียงจุดเดียวเท่านั้น การตรวจสอบผลลัพธ์จาก AI ด้วยมุมมองด้านความปลอดภัยไม่ใช่ความระแวง แต่มันคือมาตรฐานพื้นฐานสำหรับซอฟต์แวร์ระดับมืออาชีพ
The Inconsistency Tax
ชุดโค้ด (codebase) ยังเป็นเหมือนเรื่องเล่าเรื่องหนึ่ง มันสอนสมาชิกใหม่ในทีมว่าสิ่งต่างๆ ควรทำอย่างไร Vibe Coding ทำให้เรื่องเล่านั้นแตกกระจายเป็นสำเนียงที่ขัดแย้งกันนับสิบ ฟีเจอร์ที่คุณสร้างเมื่อวานใช้ functional React hooks พร้อมกับ explicit state reducers แต่ฟีเจอร์ของวันนี้ ซึ่งสร้างจาก prompt ที่ต่างไปเล็กน้อย กลับใช้ class components เพราะโมเดลเลือกใช้รูปแบบเก่าเป็นค่าเริ่มต้น เลเยอร์ของ API สลับไปมาระหว่าง OpenAPI-generated stubs กับ route handlers ที่เขียนด้วยมือ รูปแบบการตั้งชื่อ (naming conventions) เลื่อนไหลไปมาระหว่าง camelCase และ snake_case การจัดการข้อผิดพลาด (error handling) หายไปในไฟล์หนึ่ง และกลับมาในรูปแบบของ try-catch blocks ที่ซ้อนกันอย่างยุ่งเหยิงในอีกไฟล์หนึ่ง
เมื่อเวลาผ่านไปหลายสัปดาห์ โปรเจกต์จะกลายเป็นการขุดค้นทางโบราณคดี คุณไม่สามารถเปลี่ยนโมดูลหนึ่งได้อย่างปลอดภัย เพราะคุณไม่รู้ว่าโมดูลข้างเคียงที่สร้างโดย AI นั้นมีข้อสันนิษฐานอย่างไร การทำ Refactoring จะกลายเป็นเกมตีตัวตุ่นที่ทั้งช้าและเสี่ยง ระบบอาจจะคอมไพล์ผ่าน แต่ความสอดคล้องภายในกลับหายไป ความสามารถในการบำรุงรักษา (Maintainability) กำลังค่อยๆ ตายลงจากการคัดลอกโค้ดมาวางทีละเล็กทีละน้อย
เปลี่ยน AI ให้เป็นครูผู้สอน
การเรียนรู้ที่แท้จริงเกิดขึ้นเมื่อคุณซักถามผลลัพธ์ที่ได้ ให้ปฏิบัติกับ AI เหมือนเป็น senior developer ที่เขียนโค้ดได้รวดเร็ว แต่ยังคงต้องผ่านการ code review ลองถามว่าทำไมมันถึงเลือกใช้ recursion แทนที่จะเป็น iteration สำหรับการทำ tree traversal นั้น ถามว่ามีแนวทางที่ประหยัดหน่วยความจำมากกว่านี้ไหมที่สามารถจัดการกับ edge cases ได้ดีกว่าเดิม ถามว่าจะเกิดอะไรขึ้นเมื่อ input เป็น null, เมื่อ network request หมดเวลา หรือเมื่อผู้ใช้สองคนเรียกใช้ฟังก์ชันพร้อมกัน ให้มันอธิบายตรรกะทีละบรรทัด ราวกับว่าคุณกำลังรีวิว pull request ของเพื่อนร่วมทีมระดับ junior
เมื่อคุณบีบให้โมเดลต้องให้เหตุผลประกอบการตัดสินใจ คุณก็กำลังบีบให้ตัวเองต้องทำความเข้าใจสิ่งเหล่านั้นด้วย สิ่งนี้จะเปลี่ยนรูปแบบความสัมพันธ์ไปอย่างสิ้นเชิง AI จะเลิกเป็น autopilot และกลายเป็นติวเตอร์แทน เป้าหมายไม่ใช่การที่คุณไม่ต้องเขียนโค้ดเลย แต่คือการส่งมอบเฉพาะโค้ดที่คุณเข้าใจอย่างถ่องแท้เท่านั้น แม้ว่าผู้ช่วย AI จะเป็นคนร่างเวอร์ชันแรกขึ้นมาก็ตาม
ทักษะที่สำคัญจริงๆ ในตอนนี้
การเขียน syntax กำลังมีราคาถูกลงทุกวัน การอ่านและการใช้เหตุผลคือ
