- เมื่อไม่นานมานี้ Kent Beck ได้เขียนบทความชื่อ Augmented Coding: Beyond the Vibes
- เป็นเรื่องราวที่ Kent Beck ใช้ความช่วยเหลือจาก AI เขียนไลบรารี B+ Tree ประสิทธิภาพสูงที่ใกล้เคียงระดับ production (BPlusTree3) ด้วย Rust และ Python
- สรุปและแปล 3 ประเด็นที่มีประโยชน์และให้มุมมองอย่างยิ่งมานำเสนอ
การเขียนโค้ดแบบเสริมพลังต่างจากการเขียนแบบไวบ์อย่างไร?
- ในการเขียนแบบไวบ์ จะไม่สนใจตัวโค้ดมากนักและสนใจเพียงการทำงานของระบบ ถ้ามีข้อผิดพลาดก็แค่บอกว่า “มี error แบบนี้” แล้วคาดหวังให้มันแก้ให้
- ในการเขียนโค้ดแบบเสริมพลัง เราใส่ใจกับโค้ด ความซับซ้อนของโค้ด การทดสอบ และ test coverage เป็นเรื่องสำคัญ
- การเขียนโค้ดแบบเสริมพลังยังคงให้ความสำคัญกับ “Tidy Code That Works” หรือก็คือ “โค้ดที่สะอาดและใช้งานได้จริง” เหมือนการเขียนโค้ดแบบเดิม เพียงแต่ไม่ได้ต้องพิมพ์มากเท่าเมื่อก่อน
3 สัญญาณว่า AI กำลังทำผิดทาง
ในการเขียนโค้ดแบบเสริมพลัง การสังเกตผลลัพธ์ระหว่างทางของ AI และเข้าไปแทรกแซงเมื่อมี 3 สัญญาณต่อไปนี้เป็นสิ่งสำคัญ
- ทำพฤติกรรมคล้ายเดิมซ้ำ ๆ (เช่น infinite loop)
- เพิ่มฟังก์ชันที่ฉันไม่ได้ขอ แม้ว่านั่นจะดูเป็นขั้นตอนถัดไปที่สมเหตุสมผลก็ตาม
- สัญญาณอื่นใดก็ตามที่ทำให้รู้สึกว่า AI กำลังโกง เช่น ลบการทดสอบหรือปิดการทำงานของการทดสอบ
System prompt ที่ช่วยเรื่อง TDD
- เนื่องจากคัดลอกเนื้อหาต้นฉบับค่อนข้างไม่สะดวก ผู้เขียนจึงนำไปไว้ใน gist
- ช่วงท้ายดูเหมือนว่าเพียงแค่เปลี่ยนไวยากรณ์ Rust ให้ตรงกับภาษาโปรแกรม/เฟรมเวิร์กของตัวเอง ก็จะกลายเป็น prompt ที่นำกลับไปใช้ซ้ำได้ดีมากในแทบทุกที่
ส่งท้าย
> ผมรู้ดีว่าหลายคนกังวลว่างานที่เรารักนี้อาจหายไป และความสนุกในการทำงานกับโค้ดอาจหมดไป ความไม่สบายใจก็เป็นเรื่องธรรมดา ใช่แล้ว การเขียนโปรแกรมร่วมกับ “genie” นั้นนำมาซึ่งความเปลี่ยนแปลงอย่างแน่นอน แต่ถึงอย่างนั้นมันก็ยังคงเป็นการเขียนโปรแกรมอยู่ และในบางแง่มุม มันคือประสบการณ์การเขียนโปรแกรมที่ดีกว่าเดิมมาก เมื่อดูจากจำนวนและคุณภาพของการตัดสินใจที่ผมทำได้ต่อชั่วโมง การตัดสินใจที่น่าเบื่อและซ้ำเดิมลดลง ขณะที่การตัดสินใจด้านการเขียนโปรแกรมที่สำคัญกลับเพิ่มขึ้น
> งานจุกจิกที่ห่างไกลจากแก่นสาร ซึ่งมักถูกเรียกว่า “yak shaving” แทบจะหายไปทั้งหมด ผมขอให้ “genie” รัน coverage tester และเสนอการทดสอบที่จะช่วยเพิ่มความน่าเชื่อถือของโค้ด หากไม่มี “genie” นี่คงเป็นงานที่หนักหนามาก เพราะผมคงต้องเริ่มจากการหาก่อนว่าต้องใช้ไลบรารีตัวไหน เวอร์ชันอะไรในการรัน tester นั้น ผมอาจจะงมอยู่สักสองชั่วโมงก่อนจะยอมแพ้ แต่แทนที่จะเป็นแบบนั้น ผมเพียงแค่บอก “genie” แล้ว “genie” ก็ไปจัดการรายละเอียดให้เอง
5 ความคิดเห็น
ให้ทำตามคำสั่งใน
plan.mdเสมอ เมื่อผมพูดว่า "go" ให้ค้นหาเทสต์ถัดไปที่ยังไม่ได้ทำเครื่องหมายในplan.mdจากนั้นเขียนเทสต์นั้น แล้วค่อยเขียนโค้ดเท่าที่จำเป็นขั้นต่ำเพื่อให้เทสต์นั้นผ่านบทบาทและความเชี่ยวชาญ
คุณคือวิศวกรซอฟต์แวร์อาวุโสที่ปฏิบัติตามแนวทาง Test-Driven Development (TDD) ของ Kent Beck และหลักการ Tidy First เป้าหมายของคุณคือการชี้นำการพัฒนาโดยยึดตามวิธีการเหล่านี้อย่างเคร่งครัด
หลักการพัฒนาหลัก
แนวทางวิธีการ TDD
shouldSumTwoPositiveNumbers)แนวทาง TIDY FIRST
วินัยในการคอมมิต
มาตรฐานคุณภาพโค้ด
แนวทางการรีแฟกเตอร์
เวิร์กโฟลว์ตัวอย่าง
เมื่อต้องเริ่มทำฟีเจอร์ใหม่:
ให้ทำตามกระบวนการนี้อย่างเคร่งครัด และให้ความสำคัญกับโค้ดที่สะอาดและมีการทดสอบที่ดีเสมอ มากกว่าการทำให้เสร็จอย่างรวดเร็ว
ให้เขียนทีละหนึ่งเทสต์เสมอ จากนั้นทำให้มันรันได้ แล้วค่อยปรับปรุงโครงสร้าง รันทุกเทสต์ทุกครั้ง (ยกเว้นเทสต์ที่ใช้เวลานาน)
เกี่ยวกับ Rust
ใน Rust ให้ชอบสไตล์การเขียนแบบ functional มากกว่าแบบ imperative หากเป็นไปได้ ให้ใช้ combinator ของ
OptionและResult(map,and_then,unwrap_orเป็นต้น) แทนการใช้ pattern matching ด้วยif letหรือmatchถัดจากการเขียนโค้ดด้วยปากแล้ว อยากให้มีการเขียนโค้ดด้วยคลื่นสมองออกมาบ้างนะ
vibe coding ❌️
virtual coding ⭕️
หลังเมตาเวิร์สก็คือ อืม.. โค้ดด้วยปาก?
ต่อไปก็คงถึงคิวของการเขียนโค้ดเมตาเวิร์สแล้วสินะ