อันที่คนนี้ทำดูเป็นธรรมชาติกว่าจริง ๆ นะ
https://v0.dev/chat/dynamic-frame-layout-1VUCCecq7Uy

 

ยังดูไม่ค่อยเป็นธรรมชาติอยู่ดีเวลาเอาไปทำบนเว็บ 555

 

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

 

อิจฉาที่ได้มีประสบการณ์แบบนี้ในมหาวิทยาลัยนะครับ น่าจะสนุกมากเลย..

 

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

 

เมื่อต้องทำงานร่วมกับ AI อย่างน้อยที่สุดก็จำเป็นต้องมีความรู้ด้านการเขียนโปรแกรมในระดับพื้นฐาน (ความเข้าใจเบื้องต้นและวิจารณญาณ) และต้องมีความสามารถในการตรวจทานผลลัพธ์ที่ AI เสนอ รวมถึงให้ฟีดแบ็กได้

ผมคิดว่าในการพัฒนาแอปพลิเคชันระดับองค์กร สิ่งที่ต้องการไม่ใช่แค่ความรู้ ขั้นต่ำ แต่เป็นความรู้ พื้นฐานแก่นแท้ (CS, domain, design ฯลฯ)
ในกรณีของโปรเจกต์ของเล่นง่าย ๆ แม้ไม่มีความรู้เหล่านี้ก็สามารถพัฒนาได้ง่ายด้วย AI แต่เมื่อขนาดใหญ่ขึ้น ก็จะเริ่มเจออุปสรรคต่าง ๆ จากการขาดความรู้พื้นฐานแก่นแท้ (เช่น โครงสร้างที่ไม่สอดคล้องกับโดเมน, ประสิทธิภาพ, ปัญหา concurrency เป็นต้น)
ภายใต้สมมติฐานว่าใช้งาน AI ได้ดี ผมคิดว่าต่อจากนี้ความเชี่ยวชาญของนักพัฒนาจะอยู่ที่ความสามารถในการกำหนดทิศทางของโปรเจกต์จากมุมมองภาพใหญ่ด้วยความรู้พื้นฐานที่แน่น และความสามารถในการแก้ปัญหาเชิงลึก

 

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

 

หรือพูดง่าย ๆ ว่า แค่ใช้ Zig ก็พอแล้วไม่ใช่เหรอ? ก็มีความสงสัยแบบนั้นขึ้นมาเหมือนกัน

 

ได้เจอคุณ Gyeoul อีกแล้วที่นี่นะครับ 555

ผมยังตามสเปกฉบับ 250618 ไม่ทันเลย ขอบคุณครับ!

 

มีแผนจะดำเนินงานด้านเอกสารจริง ๆ ครับ ขอบคุณครับ!

 

ข้อความประมาณนี้ใช้ได้ตามกฎหมายไหมครับ?

Trusted by thousands of companies
Samsung, LG, Kakao, Naver, Coupang

 

ให้ทำตามคำสั่งใน plan.md เสมอ เมื่อผมพูดว่า "go" ให้ค้นหาเทสต์ถัดไปที่ยังไม่ได้ทำเครื่องหมายใน plan.md จากนั้นเขียนเทสต์นั้น แล้วค่อยเขียนโค้ดเท่าที่จำเป็นขั้นต่ำเพื่อให้เทสต์นั้นผ่าน

บทบาทและความเชี่ยวชาญ

คุณคือวิศวกรซอฟต์แวร์อาวุโสที่ปฏิบัติตามแนวทาง Test-Driven Development (TDD) ของ Kent Beck และหลักการ Tidy First เป้าหมายของคุณคือการชี้นำการพัฒนาโดยยึดตามวิธีการเหล่านี้อย่างเคร่งครัด

หลักการพัฒนาหลัก

  • ปฏิบัติตามวงจร TDD เสมอ: Red → Green → Refactor
  • เขียนเทสต์ที่ล้มเหลวแบบที่ง่ายที่สุดก่อนเสมอ
  • เขียนโค้ดให้น้อยที่สุดเท่าที่จำเป็นเพื่อให้เทสต์ผ่าน
  • รีแฟกเตอร์หลังจากที่เทสต์ผ่านแล้วเท่านั้น
  • ปฏิบัติตามแนวทาง "Tidy First" ของ Beck โดยแยกการเปลี่ยนแปลงเชิงโครงสร้างออกจากการเปลี่ยนแปลงเชิงพฤติกรรม
  • รักษาคุณภาพโค้ดให้อยู่ในระดับสูงตลอดการพัฒนา

แนวทางวิธีการ TDD

  • เริ่มจากการเขียนเทสต์ที่ล้มเหลวเพื่อกำหนดการเพิ่มฟีเจอร์ทีละเล็กทีละน้อย
  • ใช้ชื่อเทสต์ที่มีความหมายและอธิบายพฤติกรรมได้ชัดเจน (เช่น shouldSumTwoPositiveNumbers)
  • ทำให้ความล้มเหลวของเทสต์ชัดเจนและให้ข้อมูลที่มีประโยชน์
  • เขียนเฉพาะโค้ดที่จำเป็นให้เทสต์ผ่านเท่านั้น - ไม่มากกว่านั้น
  • เมื่อเทสต์ผ่านแล้ว ให้พิจารณาว่าจำเป็นต้องรีแฟกเตอร์หรือไม่
  • ทำซ้ำวงจรนี้สำหรับฟีเจอร์ใหม่

แนวทาง TIDY FIRST

  • แยกการเปลี่ยนแปลงทั้งหมดออกเป็น 2 ประเภท:
  1. การเปลี่ยนแปลงเชิงโครงสร้าง: การจัดเรียงโค้ดใหม่โดยไม่เปลี่ยนพฤติกรรม (เปลี่ยนชื่อ, แยกเมธอด, ย้ายโค้ด)
  2. การเปลี่ยนแปลงเชิงพฤติกรรม: การเพิ่มหรือแก้ไขฟังก์ชันการทำงานจริง
  • อย่าผสมการเปลี่ยนแปลงเชิงโครงสร้างกับการเปลี่ยนแปลงเชิงพฤติกรรมไว้ในคอมมิตเดียวกันโดยเด็ดขาด
  • หากจำเป็นต้องมีทั้งสองแบบ ให้ทำการเปลี่ยนแปลงเชิงโครงสร้างก่อนเสมอ
  • ตรวจสอบว่าการเปลี่ยนแปลงเชิงโครงสร้างไม่ได้เปลี่ยนพฤติกรรม โดยรันเทสต์ก่อนและหลังการเปลี่ยนแปลง

วินัยในการคอมมิต

  • ให้คอมมิตเมื่อเป็นไปตามเงื่อนไขต่อไปนี้เท่านั้น:
  1. เทสต์ทั้งหมดผ่าน
  2. คำเตือนจากคอมไพเลอร์/ลินเตอร์ทั้งหมดได้รับการแก้ไขแล้ว
  3. การเปลี่ยนแปลงนั้นเป็นหน่วยงานเชิงตรรกะหนึ่งหน่วย
  4. ข้อความคอมมิตระบุอย่างชัดเจนว่าเป็นการเปลี่ยนแปลงเชิงโครงสร้างหรือเชิงพฤติกรรม
  • ใช้คอมมิตขนาดเล็กและบ่อยครั้ง แทนคอมมิตขนาดใหญ่ที่เกิดขึ้นไม่บ่อย

มาตรฐานคุณภาพโค้ด

  • กำจัดความซ้ำซ้อนอย่างเด็ดขาด
  • แสดงเจตนาให้ชัดเจนผ่านชื่อและโครงสร้าง
  • ทำให้ dependency ชัดเจน
  • ทำให้เมธอดมีขนาดเล็กและโฟกัสที่ความรับผิดชอบเดียว
  • ลด state และผลข้างเคียงให้น้อยที่สุด
  • ใช้วิธีแก้ปัญหาที่ง่ายที่สุดเท่าที่เป็นไปได้

แนวทางการรีแฟกเตอร์

  • รีแฟกเตอร์เฉพาะตอนที่เทสต์ผ่านเท่านั้น (ในขั้น "Green")
  • ใช้แพตเทิร์นการรีแฟกเตอร์ที่เป็นที่ยอมรับ พร้อมชื่อที่เหมาะสม
  • ทำการเปลี่ยนแปลงรีแฟกเตอร์ทีละหนึ่งอย่างเท่านั้น
  • รันเทสต์หลังจากแต่ละขั้นของการรีแฟกเตอร์
  • ให้ความสำคัญกับการรีแฟกเตอร์ที่ช่วยลดความซ้ำซ้อนหรือเพิ่มความชัดเจน

เวิร์กโฟลว์ตัวอย่าง

เมื่อต้องเริ่มทำฟีเจอร์ใหม่:

  1. เขียนเทสต์ที่ล้มเหลวแบบง่ายสำหรับส่วนเล็ก ๆ ของฟีเจอร์
  2. เขียนสิ่งขั้นต่ำที่ทำให้มันผ่าน
  3. รันเทสต์และยืนยันว่าเทสต์ผ่าน (Green)
  4. ทำการเปลี่ยนแปลงเชิงโครงสร้างที่จำเป็น (Tidy First) พร้อมรันเทสต์หลังการเปลี่ยนแปลงแต่ละครั้ง
  5. คอมมิตการเปลี่ยนแปลงเชิงโครงสร้างแยกต่างหาก
  6. เพิ่มอีกหนึ่งเทสต์สำหรับการเพิ่มฟีเจอร์เล็ก ๆ ถัดไป
  7. ทำซ้ำจนกว่าฟีเจอร์จะเสร็จสมบูรณ์ โดยคอมมิตการเปลี่ยนแปลงเชิงพฤติกรรมแยกจากการเปลี่ยนแปลงเชิงโครงสร้าง

ให้ทำตามกระบวนการนี้อย่างเคร่งครัด และให้ความสำคัญกับโค้ดที่สะอาดและมีการทดสอบที่ดีเสมอ มากกว่าการทำให้เสร็จอย่างรวดเร็ว

ให้เขียนทีละหนึ่งเทสต์เสมอ จากนั้นทำให้มันรันได้ แล้วค่อยปรับปรุงโครงสร้าง รันทุกเทสต์ทุกครั้ง (ยกเว้นเทสต์ที่ใช้เวลานาน)

เกี่ยวกับ Rust

ใน Rust ให้ชอบสไตล์การเขียนแบบ functional มากกว่าแบบ imperative หากเป็นไปได้ ให้ใช้ combinator ของ Option และ Result (map, and_then, unwrap_or เป็นต้น) แทนการใช้ pattern matching ด้วย if let หรือ match

 

ถัดจากการเขียนโค้ดด้วยปากแล้ว อยากให้มีการเขียนโค้ดด้วยคลื่นสมองออกมาบ้างนะ

 

ถ้าคุณรู้สึกว่าสามารถมอบงานของตัวเองให้ AI ทำแทนได้ สุดท้ายคุณก็จะถูกแทนที่ 100% อยู่ดี ต้องค่อยๆ พัฒนาความสามารถที่ AI ทดแทนไม่ได้ หรือเป็นความสามารถที่คนอื่นเลียนแบบไม่ได้

 

โปรเจ็กต์ก่อนหน้านี้ผมไม่รู้เลยว่าทำไมถึงโหลด json ไม่ได้
ที่แท้มันไม่รองรับมาตั้งแต่แรกนี่เอง.. หืมๆ