วิธีเขียนโค้ดด้วย Cursor
(arguingwithalgorithms.com)Cursor คืออะไร
- Cursor เป็นฟอร์กของ Visual Studio Code (VS Code) ที่ผสานฟีเจอร์บนพื้นฐาน Large Language Model (LLM) เข้ากับ UI หลัก
- เป็นผลิตภัณฑ์แบบปิดซอร์ส และมีทั้งแพ็กเกจฟรีกับตัวเลือกแบบสมัครสมาชิก
- ฟีเจอร์หลัก:
- การเติมโค้ดอัตโนมัติด้วย Tab: โมเดลปรับแต่งเฉพาะทางแบบปิดที่ใช้สำหรับเติมโค้ดอัตโนมัติ และย้ายไปยังการกระทำถัดไปที่แนะนำ ซึ่งมีให้เฉพาะผู้สมัครสมาชิก
- การแก้ไขแบบอินไลน์: อินเทอร์เฟซแบบแชตสำหรับผู้ใช้ฟรีและผู้จ่ายเงิน ใช้แก้ไขโค้ดที่เลือกผ่านมุมมอง diff
- แถบด้านข้างแชต: อินเทอร์เฟซแบบแชตสำหรับผู้ใช้ฟรีและผู้จ่ายเงิน ให้พื้นที่สำหรับการสนทนาที่ยาวขึ้น
- Composer: อินเทอร์เฟซแบบแชตที่ออกแบบมาสำหรับการรีแฟกเตอร์ครั้งใหญ่ครอบคลุมหลายไฟล์ ใช้ได้ทั้งผู้ใช้ฟรีและผู้จ่ายเงิน
การเติมโค้ดอัตโนมัติด้วย Tab
- เป็นฟีเจอร์ที่ใช้ได้อย่างเป็นธรรมชาติที่สุดระหว่างการเขียนโค้ด และช่วยประหยัดเวลาได้มากที่สุด
- ไม่เพียงเสนอการเติมให้ครบสำหรับหนึ่งบรรทัด หลายบรรทัด หรือทั้งฟังก์ชัน แต่ยังเสนอบรรทัดถัดไปที่จะย้ายไปเพื่อการแก้ไขถัดไปด้วย
- สามารถกดปุ่ม Tab ซ้ำๆ เพื่อเติมการเปลี่ยนแปลงที่เกี่ยวข้องให้ครบโดยอัตโนมัติทั้งไฟล์ได้
- ใช้เป็นเครื่องมือรีแฟกเตอร์โค้ดได้
- บางครั้งยังค้นหาบั๊กได้เองและเสนอวิธีแก้ด้วย
- หากครอบสตริงด้วยเครื่องหมายคำพูด ระบบจะ escape เนื้อหาให้อย่างเหมาะสม
- สามารถเขียนทั้งฟังก์ชันได้จากเพียงฟังก์ชันซิกเนเจอร์และ docstring ที่เป็นทางเลือก
- ข้อเสนอการเติมทำงานเร็วมาก
- ข้อเสีย:
- หากพิมพ์ต่อไปโดยไม่เห็นข้อเสนอให้ทันเวลา ข้อเสนอการเติมจะหายไป
- บางครั้งแม้จะตั้งใจปฏิเสธการเติมที่ผิด แต่ถ้าภายหลังยอมรับการเติมอื่น ข้อเสนอที่เคยปฏิเสธอาจถูกนำมาใช้แบบเงียบๆ
การแก้ไขแบบอินไลน์, แถบด้านข้างแชต, Composer
- การโต้ตอบกับโมเดลพื้นฐาน (ส่วนใหญ่ใช้ Claude 3.5 Sonnet) มีความคล้ายกันมาก โดยต่างกันที่ส่วนติดต่อผู้ใช้
- การแก้ไขแบบอินไลน์เรียกใช้ได้ด้วย Ctrl-K/Cmd-K จากนั้นพิมพ์สิ่งที่ต้องการเปลี่ยน แล้วจะได้ diff ที่สามารถยอมรับหรือปฏิเสธได้
- แถบด้านข้างแชตเปิดได้ด้วย Ctrl+L/Cmd+L และให้พื้นที่มากขึ้นสำหรับสนทนาหลายรอบ
- Composer ออกแบบมาสำหรับการรีแฟกเตอร์ข้ามหลายไฟล์ และมอบประสบการณ์ใช้งานที่ดีกว่าสำหรับการตรวจ diff ของหลายไฟล์ทีละไฟล์
ไฟล์ .cursorrules
- เนื้อหาในไฟล์ .cursorrules ที่อยู่ที่รากของเวิร์กสเปซจะถูกรวมเข้าไปในรูปแบบแชตต่างๆ เสมอ เพื่อให้บริบทเพิ่มเติม
- ใช้เพื่อบอก LLM เกี่ยวกับมาตรฐานการเขียนโค้ดของรีโพซิทอรี แพ็กเกจที่ใช้ร่วมกัน และเอกสารอื่นๆ
- อาจช่วยแก้หนึ่งในอุปสรรคใหญ่ของ Cursor คือปัญหาที่ไม่ทำตามสไตล์และแพตเทิร์นการเขียนโค้ด เว้นแต่สิ่งนั้นจะมีอยู่แล้วในไฟล์ที่กำลังแก้ไข
- ปัจจุบันมีได้เพียงหนึ่งไฟล์ต่อหนึ่งเวิร์กสเปซ ดังนั้น monorepo ที่มีโค้ดหลายภาษาจึงตั้งค่ายากกว่าระบบเก็บโค้ดขนาดเล็กที่มีชุดโค้ดเล็กและมีสไตล์สม่ำเสมอ
- ไฟล์ .cursorrules ใช้กับรูปแบบแชตเท่านั้น ไม่ได้ใช้กับการเติมโค้ดอัตโนมัติด้วย Tab
การเปลี่ยนแปลงของเวิร์กโฟลว์
- สิ่งที่น่าสนใจที่สุดไม่ใช่แค่เขียนโค้ดได้เร็วขึ้น
- ในความเป็นจริง การเขียนโค้ดเองไม่ใช่คอขวด
- คุณค่าที่แท้จริงอยู่ที่การเปลี่ยนวิธีเขียนโค้ด
- สิ่งที่เปลี่ยนไป:
- มีแนวโน้มน้อยลงมากที่จะไปค้นหาไลบรารีหรือเฟรมเวิร์กใหม่
- สำหรับยูทิลิตีขนาดเล็ก การให้ LLM เขียนตามความต้องการเฉพาะมักง่ายกว่าการดึงไลบรารีทั่วไปเข้ามาใช้
- ไลบรารีจำนวนมากมีอยู่เพียงเพื่อลด boilerplate แต่เมื่อ LLM ทำแทนได้ ต้นทุนของมันก็ดูไม่คุ้มค่าเท่าเดิม
- กังวลน้อยลงกับการยึดหลัก DRY (Don't Repeat Yourself) ในโค้ดของตัวเอง
- การกำหนด abstraction เร็วเกินไปอาจก่อหนี้ทางเทคนิคจำนวนมากในภายหลัง
- ทำโค้ดจำนวนมากได้โดยอ้างอิงจากโค้ดอื่น โดยไม่ต้องรีบทำเป็นฟังก์ชันหรือคลาส จึงมีความยืดหยุ่นมากขึ้น
- มีความเต็มใจมากขึ้นอย่างชัดเจนที่จะใช้ภาษาหรือเฟรมเวิร์กที่ไม่คุ้นเคย
- ตัวอย่างเช่น เดิมเคยลำบากกับการใช้ R แต่ตอนนี้เพียงอธิบายภาพข้อมูลที่ต้องการ ก็ได้ทั้งการจัดการข้อมูลที่ถูกต้องและภาพข้อมูลด้วย ggplot
- กำลังทำซ้ำกับคอมโพเนนต์เล็กๆ อย่างรวดเร็วก่อนรวมเข้าไปในโค้ดเบสที่ใหญ่กว่า
- นี่เป็นทั้งวิธีรับมือกับข้อจำกัดของ LLM และยังเปิดวิธีทำงานที่น่าสนใจซึ่งก่อนหน้านี้ไม่เคยนึกถึง
- มีแนวโน้มน้อยลงมากที่จะไปค้นหาไลบรารีหรือเฟรมเวิร์กใหม่
สรุป
- ณ ตอนนี้ Cursor เป็นตัวอย่างที่ดีที่สุดในการแสดงศักยภาพของผู้ช่วยเขียนโค้ดด้วย LLM
- หากอยากสำรวจว่าเครื่องมือประเภทนี้จะมีคุณค่าอย่างไร การลองใช้ Cursor ก็น่าจะเป็นความคิดที่ดี
ความเห็นของ GN⁺
- Cursor ดูเป็นกรณีตัวอย่างที่ดีที่แสดงศักยภาพของเครื่องมือเขียนโค้ดบนพื้นฐาน LLM
- โดยเฉพาะฟีเจอร์เติมโค้ดอัตโนมัติด้วย Tab ที่ใช้งานได้อย่างเป็นธรรมชาติระหว่างเขียนโค้ดและช่วยประหยัดเวลาได้มาก จึงน่าสนใจมาก
- ฟีเจอร์แบบแชตก็ดูจะมีประโยชน์กับงานอย่างการรีแฟกเตอร์หรือการแปลงโค้ด
- อย่างไรก็ตาม เนื่องจากยังอยู่ในระยะเริ่มต้น จึงดูเหมือนยังมีข้อจำกัดอยู่
- การทำให้สไตล์การเขียนโค้ดสม่ำเสมอทำได้ยาก
- ปัญหาด้านการใช้งานกับโครงสร้างโปรเจ็กต์ที่ซับซ้อน เช่น monorepo
- ความแตกต่างของฟีเจอร์ระหว่างผู้ใช้ฟรีกับผู้จ่ายเงินยังไม่ชัดเจน เป็นต้น
- เครื่องมืออื่นที่มีฟีเจอร์คล้ายกัน ได้แก่ GitHub Copilot, Tabnine และ Kite
- แต่ละเครื่องมือมีข้อดีข้อเสียต่างกัน จึงควรเลือกตามลักษณะของโปรเจ็กต์หรือความชอบส่วนบุคคล
- เมื่อนำเครื่องมือเขียนโค้ดบนพื้นฐาน LLM มาใช้ ก็ควรพิจารณาประเด็นต่อไปนี้
- การยอมรับของทีมพัฒนา: มีแรงต้านต่อการนำเครื่องมือใหม่มาใช้หรือไม่
- ต้นทุนการเรียนรู้: ต้องใช้เวลามากแค่ไหนในการทำความคุ้นเคยกับวิธีใช้เครื่องมือ
- ความสามารถในการบำรุงรักษา: เข้าใจและบำรุงรักษาโค้ดที่เครื่องมือสร้างได้ง่ายหรือไม่
- คุณภาพโค้ด: ช่วยยกระดับคุณภาพโค้ดจริงหรือไม่
- ความคุ้มค่าต่อค่าใช้จ่าย: ผลด้านผลิตภาพที่เพิ่มขึ้นคุ้มกับต้นทุนในการนำมาใช้และดูแลรักษาหรือไม่
6 ความคิดเห็น
คีย์สำคัญคือ Cursor chat ครับ/ค่ะ มันสะดวกมากตรงที่ช่วยสร้าง docstring ให้ได้
พอลองใช้ cursor แล้วก็รู้สึกว่าการเติมโค้ดอัตโนมัติของ copilot ช้าไปเลย ฮือฮือ
การเติมข้อความอัตโนมัติด้วยแท็บใช้ได้เฉพาะคนที่จ่ายเงินเท่านั้นเหรอ?
จริงอยู่ว่าใช้ได้เฉพาะผู้สมัครสมาชิก แต่มีแพ็กเกจสมัครสมาชิกฟรี และให้การเติมโค้ดอัตโนมัติ 2,000 ครั้งต่อเดือน ผมใช้แบบนั้นมา 3 เดือนแล้ว
https://www.cursor.com/pricing
ครับ
เขียนไว้ในบทความแล้ว 555