Full Walkthrough: Workflow for AI Coding — Matt Pocock
สรุปย่อ
ประเด็นสำคัญจากวิดีโอ
- **ช่อง:** AI Engineer · **ความยาว:** ~96 นาที · **ลิงก์:** https://www.youtube.com/watch?v=-QFHIoCo-Ko
# สรุป: Full Walkthrough: Workflow for AI Coding — Matt Pocock - **ช่อง:** AI Engineer · **ความยาว:** ~96 นาที · **ลิงก์:** https://www.youtube.com/watch?v=-QFHIoCo-Ko ## ประเด็นหลัก - **โซนฉลาด vs โซนโง่ (smart zone / dumb zone):** LLM จะทำงานได้ดีที่สุดตอนเริ่มคอนเวอร์เซชันใหม่ ยิ่งใส่ token เข้าไปใน context window มากเท่าไหร่ (ราว 100K ขึ้นไป) มันยิ่งโง่ลงเรื่อยๆ — ต้องแบ่งงานให้เล็กพอที่จะอยู่ในโซนฉลาดเสมอ - **LLM ลืมเหมือนพระเอก Memento:** แทนที่จะใช้การ compact บทสนทนาให้ยืดเยื้อ ควรล้าง context แล้วเริ่มใหม่ เพื่อให้ทุกเซสชันกลับสู่สภาวะฐานที่เหมือนเดิมเสมอ - **grill me skill:** ทักษะที่ให้ AI สัมภาษณ์เราอย่างไม่ลดละทีละคำถาม พร้อมคำแนะนำ เพื่อสร้าง "shared understanding" หรือ design concept ร่วมกันก่อนลงมือ — ป้องกันปัญหา misalignment ตั้งแต่ต้น - **PRD คือเอกสารจุดหมายปลายทาง:** หลังจบ grilling session ให้นำสรุปมาเขียน PRD (product requirements document) แต่ไม่ต้องอ่านมันซ้ำ เพราะ LLM เก่งเรื่องการสรุปอยู่แล้ว จุดสำคัญคือความเข้าใจตรงกัน ไม่ใช่ตัวเอกสาร - **Kanban board + vertical slices:** แตก PRD เป็นการ์ดงานที่มีความสัมพันธ์แบบ block กัน (ไม่ใช่แผนหลายเฟสแบบเรียงลำดับ) เพื่อให้เอเจนต์หลายตัวทำงานแบบขนานได้ และใช้หลัก traceable bullets — ตัดชิ้นงานแนวตั้งที่ทะลุทุกเลเยอร์ เพื่อให้ได้ feedback เร็ว ไม่ใช่ทำงานทีละเลเยอร์แบบแนวนอน - **งานสองประเภท:** human in the loop (การวางแผน/การหาความเข้าใจตรงกัน ต้องมีมนุษย์นั่งทำ) vs AFK (implementation ที่ส่งให้เอเจนต์ทำงานห่างจากคีย์บอร์ดได้) — เปรียบเหมือนกะกลางวันกับกะกลางคืน - **Ralph loop:** พรอมป์ที่ให้เอเจนต์หยิบงานจาก backlog ไป implement ทีละงานแบบ AFK ใน Docker sandbox พร้อม feedback loops (test, type check) — ตัวอย่างสคริปต์ once.sh และโปรเจกต์ Sandcastle สำหรับรันแบบขนาน (planner → implementer → reviewer → merger) - **TDD (red-green-refactor):** ให้ AI เขียนเทสต์ที่ล้มเหลวก่อนแล้วค่อย implement ทำให้ AI โกงเทสต์ยากขึ้น และเพิ่มคุณภาพของโค้ดเบส - **feedback loops คือเพดานคุณภาพ:** ถ้าโค้ดเบสไม่มีระบบตรวจสอบที่ดี AI จะเขียนโค้ดแบบมืดบอด — คุณภาพของ feedback loops กำหนดว่า AI เขียนโค้ดได้ดีแค่ไหน - **deep modules ดีกว่า shallow modules:** โมดูลที่มีอินเทอร์เฟซเล็กแต่ฟังก์ชันภายในเยอะ ทดสอบง่ายและเอเจนต์นำทางได้ — ใช้ skill improve code base architecture หาจุดที่ควรปรับปรุง ออกแบบอินเทอร์เฟซแล้วมอบหมาย implementation (แนวคิด gray box) เพื่อรักษาความเข้าใจโค้ดเบสโดยไม่ต้องรู้ทุกบรรทัด - **push vs pull:** มาตรฐานการเขียนโค้ดควรเป็นแบบ pull (ให้เอเจนต์ดึงจาก skills เมื่อต้องการ) ในขั้น implementer แต่เป็นแบบ push (ยัดใส่พรอมป์) ในขั้น reviewer อัตโนมัติ - **QA และ code review ยังเป็นงานของมนุษย์:** อย่าทำให้ทุกขั้นตอนอัตโนมัติจนขาดรสนิยม (slop) — QA คือช่องทางที่มนุษย์ยัดเยียดรสนิยมกลับเข้าสู่โค้ด และสร้าง issues ใหม่กลับเข้าบอร์ดได้ไม่รู้จบ ## ความเห็นสรุป แมตต์นำเสนอปรัชญาที่ชัดเจนมาก: AI เปลี่ยนวิธีทำงานแต่ไม่ได้ทิ้งหลักวิศวกรรมซอฟต์แวร์ดั้งเดิม — กลับยิ่งต้องยึดหลักเหล่านั้นให้แน่นขึ้น (งานเล็ก ฟีดแบ็กลูปดี โมดูลลึก การทบทวนโค้ด) สิ่งที่โดดเด่นคือการย้ำว่า "โค้ดคือสนามรบ" คุณต้องเข้าใจและควบคุมโค้ดเบสตลอดเวลา ไม่ใช่เมินโค้ดแล้วสั่งสเปกไปเรื่อยๆ แบบ vibe coding และการวางแผนระยะสร้างความเข้าใจตรงกัน (grilling) คือสิ่งที่มนุษย์ต้องทำเองเสมอ ไม่สามารถ delegate ให้ AI ได้
คำแปลเต็ม
แปลตามบทสนทนาต้นฉบับ ปรับเป็นภาษาไทยธรรมชาติ
[เสียงดนตรี] >> ครับ เราพร้อมแล้ว ทุกคนครับ เรามาเต็มความจุแล้ว มาเริ่มกันเลยดีกว่า ผมไม่อยากให้ทุกคนต้องมารออยู่ตรงนี้อีก 25 นาทีเพื่อรอเส้นตายอะไรก็ตาม ขอต้อนรับครับ ผมชื่อแมตต์ เป็นครู และตอนนี้ก็สอนเรื่อง AI ด้วยครับ เรามีลิงก์อยู่ตรงนี้ ถ้ายังไม่ได้เข้าไปดู ก็จะมีแบบฝึกหัดสำหรับสิ่งที่เราจะทำวันนี้ครับ งานนี้จะใช้เวลาราวๆ 2 ชั่วโมง เราอาจจะเริ่มกันแบบนี้ไปอีก 2 ชั่วโมงข้างหน้า โอเคไหมไมค์? ครับ เยี่ยมเลย
แนวคิดเบื้องหลังทอล์กนี้ หรืออย่างน้อยก็ข้อเสนอหลักที่ผมใช้ดำเนินงานมาในช่วง 6 เดือนที่ผ่านมา คือการที่เราทุกคนคิดว่า AI เป็นกระบวนทัศน์ใหม่ใช่ไหมครับ? AI กำลังเปลี่ยนแปลงหลายอย่างแน่นอน พวกคุณก็สนใจเรื่องนี้อยู่แล้ว และนั่นคือเหตุผลที่มาฟังทอล์กนี้ และผมรู้สึกว่าเวลาพูดถึง AI ว่าเป็นกระบวนทัศน์ใหม่ เรามักลืมไปว่า จริงๆ แล้วพื้นฐานวิศวกรรมซอฟต์แวร์ สิ่งที่สำคัญมากในการทำงานร่วมกับมนุษย์ ก็ทำงานได้ดีสุดๆ กับ AI ด้วยเหมือนกัน และนี่คือสิ่งที่คีย์โน้ตของผมพรุ่งนี้จะพูดถึงจริงๆ ครับ ผมจะลงรายละเอียดเรื่องนี้ให้มากกว่านี้
ในเวิร์กช็อปนี้ ผมหวังว่าจะได้ชี้ให้พวกคุณเห็นสิ่งเหล่านั้น และหวังว่าจะพิสูจน์ให้เห็นว่าผมพูดถูก แต่ค่อยว่ากันอีกทีครับ เอาล่ะ ขอสำรวจคร่าวๆ ก่อนได้ไหมครับ? มีใครบ้างที่เคยเขียนโค้ดกับ AI? ยกมือขึ้นถ้าเคยเขียนโค้ดกับ AI ครับ เยี่ยม โอเค เก็บมือไว้แบบนั้นนะครับ ให้โลกได้เห็นรักแร้ของเรากันหน่อย มีใครเขียนโค้ดกับ AI ทุกวันบ้าง? เจ๋ง โอเค เก็บมือไว้ ถ้าเคยหงุดหงิดกับ AI ให้ยกมือขึ้นนะครับ โอเค ดีมาก
วางมือลงได้ครับ ขอบคุณที่เชื่อฟังกันขนาดนี้ ผมซาบซึ้งมาก และตอนนี้เรากำลังถ่ายทอดสดไปยังห้อง Gilgood ด้วยนะครับ ผมยังไม่ได้... เราส่งใครไปที่ห้อง Gilgood เพื่อเช็กว่าเขาสบายดีไหมหรือเปล่า? ไม่รู้เหมือนกัน แต่ผมเห็นพวกคุณ และมีวิธีที่คุณจะร่วมสนุกได้ คือเรามีช่วงถาม-ตอบครับ เราจะทำแบบที่ไม่ค่อยชอบ Q&A ทั่วไป เพราะมันไม่ค่อยเป็นประชาธิปไตย ส่วนใหญ่คนที่พูดเก่งๆ เท่านั้นแหละที่ได้มีส่วนร่วมและได้แชร์ ดังนั้นเราจะใช้ระบบ Q&A แบบนี้กัน
แล้วทำไมเราต้องรอถึง 3:45 ล่ะ? ห้องเต็มแล้ว ประตูปิดแล้ว เห็นด้วย 100% ดังนั้นถ้าอยากถามคำถาม ผมอยากให้ทุกคนเข้าไปถามในแอป async นี้ แล้วเราก็โหวตคำถามของกันและกัน หวังว่าคำถามที่ดีที่สุดจะถูกโหวตขึ้นมาให้ทั้งห้องได้ enjoy กัน ผมอยากพูดถึงข้อจำกัดแปลกๆ ของ LLM ก่อน และข้อจำกัดแปลกๆ เหล่านั้นคือสิ่งที่เราต้องใช้เป็นฐานในการทำงานส่วนใหญ่
มีคนชื่อ Dex Hardy บริหารบริษัทชื่อ Human Layer เขาเสนอแนวคิดว่าเวลาทำงานกับ LLM พวกมันมีโซนฉลาด (smart zone) กับโซนโง่ (dumb zone) ตอนที่คุณเริ่มทำงานกับ LLM ครั้งแรก เหมือนเพิ่งเริ่มคอนเวอร์เซชันใหม่ เริ่มจากศูนย์ นั่นคือตอนที่ LLM จะทำงานได้ดีที่สุด เพราะในสถานการณ์นั้น ความสัมพันธ์ของ attention (attention relationships) ถูกบีบรัดน้อยที่สุด ทุกครั้งที่คุณเพิ่ม token ให้ LLM มันเหมือนกับการเพิ่มทีมใหม่เข้าไปในลีกฟุตบอล
ลองคิดดูว่าจำนวนแมตช์เพิ่มขึ้นแค่ไหนทุกครั้งที่เพิ่มทีมใหม่ในลีกฟุตบอล มันขยายตัวแบบกำลังสอง (quadratic) เพราะมีความสัมพันธ์ของ attention ระหว่างทุก token กับ token อื่นๆ ทั้งในเชิงตำแหน่งและความหมายของแต่ละ token ดังนั้น พอถึงราวๆ 40% หรือผมว่าที่ประมาณ 100K คือจุดวัดใหม่ของผมสำหรับเรื่องนี้ เพราะไม่สำคัญว่าคุณจะใช้ context window ขนาด 1 ล้าน หรือ 200K ผลมันจะประมาณนี้เสมอ เริ่มโง่ลงเรื่อยๆ
ยิ่งคุณเติมของเข้าไปใน context window เดิมเรื่อยๆ มันก็ยิ่งโง่ลงเรื่อยๆ จนกระทั่งตัดสินใจโง่ๆ ยกมือขึ้นถ้ารู้สึกคุ้นเคยกับอาการนี้ ใช่ เจ๋ง นี่แปลว่าเราควรแบ่งขนาดงานให้อยู่ในโซนฉลาด ใช่ไหมครับ? เราไม่อยากให้ AI รับปากเกินตัว คำแนะนำเก่าๆ อย่าง Martin Fowler ในหนังสือ Refactoring หรือ The Pragmatic Programmer ก็พูดถึงเรื่องนี้ อย่ากัดเกินคำเคี้ยว
ทำงานเล็กๆ ไว้ เพื่อที่ตัวคุณในฐานะนักพัฒนา จะได้ไม่เครียดจนทำอะไรไม่ถูกและตกไปอยู่ในโซนโง่ แต่จะจัดการงานใหญ่ยังไงล่ะ? ถ้ามีงานใหญ่ๆ แบบว่า... ไม่รู้สิ อย่างการลอกเลียนบริษัททั้งบริษัท หรือทำอะไรที่บ้าบอ จะแบ่งมันเป็นงานย่อยๆ ยังไงให้ทุกส่วนอยู่ในโซนฉลาด? วิธีหนึ่งที่คุณทำได้ คือแบบที่บริษัท AI อาจอยากให้คุณทำ หรือวิธีธรรมชาติก็คือทำไปเรื่อยๆ ไปเรื่อยๆ จนสุดท้ายคุณก็ตกไปอยู่ในโซนโง่ เสีย token เต็มจำนวนต่อทุก request
แล้วก็ compact (บีบอัด) กลับลงมา เดี๋ยวเราจะพูดถึงการ compact อย่างจริงจังในอีกสักครู่ แล้วก็ทำต่อไปเรื่อยๆ compact ลงมา ทำต่อไปเรื่อยๆ ผมว่าวิธีนั้นไม่ค่อยเวิร์คเท่าไหร่ เพราะยิ่ง... [ฟังไม่ชัด] เดี๋ยวจะพูดถึงอีกที ทฤษฎีของผมตอนนี้ และที่ผมทำมาสักพัก คือการใช้แผนแบบหลายเฟส (multi-phase plan) คือผมจะบอกว่า "โอเค เรามีงานใหญ่ๆ อยู่งานนึงตรงนี้
มาแบ่งเป็นส่วนเล็กๆ กัน แล้วค่อยๆ แยกย่อยทำงานทีละนิดในโซนฉลาด" ยกมือขึ้นถ้าเคยใช้แผนแบบหลายเฟส ใช่ เป็นวิธีปฏิบัติที่ธรรมดามากใช่ไหมครับ? นี่คือวิธีที่เราทำกันมา จริงๆ แล้วนี่คือวิธีที่ผมทำมาจนถึงธันวาคมปีที่แล้วเลยแหละ และนักพัฒนาที่เก่งจริงๆ จะมองแล้วบอกว่า "นี่มัน loop ชัดๆ" ใช่ไหม? นี่คือ loop เรามีเฟสหนึ่ง สอง สาม สี่ แล้วทำไมเราไม่ใช้แค่เฟส N ล่ะ? เฟส N
คือเราจะพูดประมาณว่า "โอเค เรามีแผนทำงานอยู่เบื้องหลัง แล้วเราก็วน loop ทับมันไปเรื่อยๆ จนกว่าจะเสร็จ" และนี่คือจุดที่... ยกมือขึ้นถ้าเคยได้ยินคำว่า Ralph Wiggum ในฐานะแนวปฏิบัติด้านซอฟต์แวร์ โอเค เจ๋ง ทีนี้ยกมือขึ้นถ้าไม่เคยได้ยิน Ralph Wiggum ในฐานะแนวปฏิบัติด้านซอฟต์แวร์ อันนั้นดูสมจริงกว่า โอเค
มีแนวคิดที่ชื่อว่า Ralph Wiggum ซึ่งมีพื้นฐานมาจากเรื่องนี้ คือสิ่งที่คุณต้องทำก็แค่ระบุจุดหมายปลายทางของการเดินทาง คือคุณแค่บอกว่า "โอเค เราสร้าง PRD หรือ product requirements document (เอกสารข้อกำหนดผลิตภัณฑ์) ขึ้นมา เพื่ออธิบายว่าเราจะไปทางไหน" จากนั้นก็บอก AI ว่า "แก้เล็กๆ น้อยๆ หน่อย แก้ทีละนิดที่จะพาเราเข้าใกล้เป้าหมายนั้นมากขึ้นเรื่อยๆ" Ralph ใช้ได้โอเค ครับ แต่ผมชอบอะไรที่มีโครงสร้างมากกว่านี้หน่อย
นี่คือจุดที่เราคุยกันเรื่องโซนฉลาด และนี่คือจุดแรกที่ผมอยากให้คุณเริ่มคิดถึง อีกหนึ่งข้อจำกัดแปลกๆ ของ LLM คือ LLM เป็นเหมือนพระเอกในหนัง Memento (จดจำไม่ได้สักที) คือมันลืมตลอดเวลา มันรีเซ็ตกลับไปสู่สถานะพื้นฐานได้ตลอด ขอเปิดไดอะแกรมนี้หน่อย ผมควรใช้สไลด์จริงๆ แต่ผมชอบเลื่อนดูไปเรื่อยๆ บนแคนวาส tldraw แบบไม่มีที่สิ้นสุดมากกว่า ขอบคุณ Steve
อีกแนวคิดที่อยากให้คุณจำไว้ คือทุกเซสชันกับ LLM จะผ่านขั้นตอนเดิมๆ เหมือนกัน อย่างแรกคือ system prompt (พรอมป์ระบบ) ตรงนี้ กล่องสีเทานี้คือสิ่งที่อยู่ใน context ของคุณตลอดเวลา คุณอยากให้มันเล็กที่สุดเท่าที่จะทำได้ เพราะถ้ามีของเยอะแยะในนี้ ถ้ามี 250K tokens ซึ่งผมเคยเห็นคนใส่เข้าไปขนาดนั้น คุณจะพุ่งเข้าโซนโง่ทันทีโดยไม่ต้องทำอะไรเลย ดังนั้นอยากให้มันจิ๋วที่สุด >> [หัวเราะเบาๆ] >> จากนั้นก็เข้าสู่ช่วงสำรวจ (exploratory phase)
ส่วนสีฟ้านี้คือตอนที่ coding agent (เอเจนต์เขียนโค้ด) ออกไปสำรวจโค้ดเบส แล้วก็เข้าสู่การ implement (ลงมือทำ) จากนั้นก็การทดสอบ ตรวจสอบว่ามันทำงานได้ วิ่ง feedback loop (วงจรป้อนกลับ) อะไรแบบนี้ ยกมือขึ้นถ้ารู้สึกคุ้นเคยกับสิ่งที่ตัวเองเคยทำ ใช่ นี่คือเสาหลักของทุกเซสชัน และเมื่อคุณล้าง context คุณก็กลับไปที่ system prompt ทันที โอ๊ย กลับไปตรงนั้นเลย คือลบทุกอย่างที่ผ่านมาแล้ว ยกมือขึ้นถ้าเคยได้ยินคำว่า compacting (การบีบอัด) ด้วย ใช่ โอเค
บางคนอาจยังไม่เคยได้ยินเรื่อง compacting เดี๋ยวขอสาธิตให้ดูเร็วๆ ว่ามันคืออะไร เช่น ผมเพิ่งคุยกับ LLM ของผมไปนิดหน่อย ผมอยากให้แน่ใจว่าเรา cover พื้นฐานกันแล้วจะได้เข้าใจตรงกัน ผมเพิ่งคุยกับ LLM เรื่องสิ่งที่อยากจะสร้าง แบบอักษรเป็นยังไงบ้าง? ควรเพิ่มขนาดไหม? คนแถวหลังว่าไง? เพิ่ม เพิ่ม เพิ่ม เพิ่ม เพิ่ม โอเค ผมใช้ Claude Code (เครื่องมือเขียนโค้ดด้วย AI) ในเซสชันนี้ แต่คุณไม่จำเป็นต้องใช้ Claude Code ที่จริงแล้ว การไม่ใช้ Claude Code ก็มักจะดีเหมือนกัน
ผมเพิ่งคุยกับ LLM เรื่องวางแผนว่าต่อไปจะทำอะไร มันถามคำถามผมหลายข้อ และผมแนะนำให้คุณทำแบบนี้มากๆ ตรงนี้มีสเตตัสไลน์เล็กๆ ที่บอกว่าผมใช้ token ไปกี่ตัว จำนวน token ที่แน่นอนที่ผมใช้ ผมมีบทความบนเว็บ AI Hero ถ้าอยากลอกโค้ดไปใช้ อุ๊ย ว้าว มันสั่นนะเนี่ย? นี่คือข้อมูลจำเป็นของทุกโค้ดดิ้งเซสชัน เพราะคุณต้องรู้ว่ากำลังใช้ token ไปเท่าไหร่ เพื่อจะได้รู้ว่าคุณใกล้โซนโง่แค่ไหน
สำคัญมากๆ เลย มาดูกัน ผมมีสองตัวเลือก คือล้างทั้งหมดแล้วกลับไปเริ่มจากศูนย์ หรือไม่ก็ compact และเมื่อผม compact มันจะบีบการสนทนาทั้งหมด ซึ่งจริงๆ ก็ไม่มากเท่าไหร่ ให้ไปอยู่ในพื้นที่ที่เล็กลงมาก ถ้าเป็นแผนภาพก็จะประมาณนี้ คือคุณนำข้อมูลทั้งหมดจากเซสชันมาสร้างเป็น history (ประวัติ) บันทึกเป็นลายลักษณ์อักษรว่าเกิดอะไรขึ้นบ้าง นักพัฒนาเนี่ยชอบ compacting ด้วยเหตุผลบางอย่าง แต่ผมเกลียดมัน
ผมชอบให้ AI ของผม behave แบบพระเอกใน Memento มากกว่า เพราะสเตตัสนี้จะเหมือนเดิมเสมอ เหมือนเดิมทุกครั้งที่ทำ คุณล้างแล้วกลับไปจุดเริ่มต้น ถ้าคุณทำแบบนั้นได้และ optimize เพื่อมันได้ คุณก็อยู่ในจุดที่ยอดเยี่ยม นี่คือสองสิ่งที่อยากให้คิดถึงกับ LLM ซึ่งเป็นข้อจำกัดสองอย่างที่เราทำงานด้วย พวกมันมีโซนฉลาดกับโซนโง่ และเป็นเหมือนพระเอก Memento งั้นมาดูแบบฝึกหัดแรกกัน
และระหว่างที่ผมทำ วิธีที่อยากให้เป็นคือ ผมจะสาธิตให้ดูบนจอ และอยากให้พวกคุณลงมือพิมพ์ตามไปด้วย นั่นเป็นแค่ส่วนบรรยายเล็กน้อย ต่อไปมาลงมือเขียนโค้ดกันจริงๆ สำหรับใครที่มาสาย หรือใครที่อยู่ในห้อง Gilgood ให้ไปที่ลิงก์นี้ ลิงก์ด้านบนนี้ เพื่อดูแบบฝึกหัดและ clone โค้ด repo (ที่เก็บโค้ด) ไป ไม่จำเป็นต้องทำตามก็ได้ จะนั่งดูผมทำอย่างเดียวก็ได้ถ้าชอบ แต่ผมจะเข้าไปดูเองก่อน ว่าแบบฝึกหัดอะไรรอเราอยู่
จริงๆ แล้วผมสร้างแพลตฟอร์มนี้มาจากคอร์สของผม มันคือแพลตฟอร์มจัดการคอร์สเรียน เป็น CMS (ระบบจัดการเนื้อหา) สำหรับผู้สอนและผู้เรียน และนี่คือสิ่งที่เราจะสร้างฟีเจอร์ใหม่ให้ วันนี้ผมจะพาคุณจากไอเดียของฟีเจอร์ ไปจนถึงการสร้าง PRD สำหรับฟีเจอร์นั้น ไปจนถึงการ implement ฟีเจอร์จริง และหวังว่าคุณจะได้แรงบันดาลใจจากกระบวนการนี้ไปใช้กับงานตัวเอง เริ่มกันเลย เราจะเริ่มด้วยการใช้ skill (ทักษะ) ที่ผมผูกพันมากเป็นพิเศษ มันคือ grill me skill
grill me skill นี้เล็กมาก เล็กสุดๆ และช่วยป้องกันหนึ่งในปัญหาหลักที่ผมคิดว่าเกิดขึ้นเวลาทำงานกับ AI นั่นคือการเข้าใจผิดกัน (misalignment) แนวคิดที่ผมกำลังเถียงด้วยอยู่นี่ คือกระแส specs to code (เขียนสเปกแล้วแปลงเป็นโค้ด) มีใครเคยได้ยินกระแส specs to code บ้าง? ยกมือหน่อย มันไม่เชิงเป็นกระแสขนาดนั้นหรอก มันก็แค่คนพูดกันว่า specs to code
มันคือการที่คนพูดว่า "โอเค คุณจะเขียนโปรแกรม หรืออยากสร้างแอป วิธีที่ดีที่สุดคือการเขียนสเปกหรือเอกสารอะไรสักอย่าง แล้วก็แปลงเอกสารนั้นเป็นโค้ด" แล้วก็แปลงเป็นโค้ดเลย จะทำยังไง? ส่งให้ AI ทำ ถ้าโค้ดที่ได้มีปัญหา คุณไม่ดูที่โค้ด แต่กลับไปดูที่สเปก แก้สเปก แล้วก็ทำวนแบบนี้ไปเรื่อยๆ นี่มันคือ vibe coding (เขียนโค้ดแบบมั่วๆ ตามอารมณ์) อีกชื่อหนึ่ง ที่จริงๆ แล้วคุณกำลังเมินโค้ดทิ้ง
คุณไม่ต้องกังวลกับโค้ด แค่แก้สเปกไปเรื่อยๆ แล้วก็ทำต่อไป ผมลองแล้วนะ ลองจริงๆ และมันแย่มาก ไม่เวิร์ค เพราะคุณต้องควบคุมโค้ดไว้ คุณต้องเข้าใจว่ามีอะไรอยู่ในนั้น คุณต้องปั้นมัน เพราะโค้ดคือสนามรบของคุณ และนี่คือจุดที่เรากำลังจะไปกัน มาดูแบบฝึกหัดกัน สิ่งที่อยากให้ทำคือไปที่หน้านี้ grill me skill แล้วใน repo นี้ เรามี slack message (ข้อความใน Slack) จากเพื่อนเรา อยู่ไหนนะ?
มันอยู่ที่ root ของ repo อยู่ใน... อ่า อยู่ไหนนะ? อืม client brief.md มันคือ slack message จาก Sarah Chen ด้วยเหตุผลบางอย่าง Claude ชอบเลือกชื่อ Sarah Chen เสมอ ไม่รู้ทำไม เนื้อหาประมาณว่า บนแพลตฟอร์มคอร์สเรียนของเราที่ชื่อ Cadence ตัวเลข retention (การรักษาผู้ใช้ให้อยู่ต่อ) ไม่ค่อยดี นักเรียนสมัครเรียนสองสามบทเรียนแล้วก็หายไป อยากเพิ่ม gamification (การทำให้เป็นเกม) เข้าไปในแพลตฟอร์ม และเมื่อคุณเจอไอเดียแบบนี้ คุณต้องหาทางทำให้มันเป็นจริง
สมมติว่า Sarah Chen เป็นลูกค้าของคุณ งบจำกัด ต้องทำให้เสร็จเร็ว จะเริ่มยังไงดี? ยกมือขึ้นถ้าจะเข้าโหมด plan mode (โหมดวางแผน) ตอนทำเรื่องนี้ มีใครใช้ plan mode ตัวหนักๆ บ้าง? ใช่ อีก ใครมีไอเดียอื่นว่าจะทำยังไงกับเรื่องนี้ ยกมือขึ้น อย่างแรกที่คุณจะทำคืออะไร? ใช่ ขอข้อมูลเพิ่มเติม อะไรนะ? ขอข้อมูลเพิ่มเติมเพื่อยืนยันว่าจุดประสงค์คืออะไร และสถานะตอนนี้เราอยู่ตรงไหน ใช่ ถูกต้อง ลองจินตนาการว่า Sarah Chen ไปเที่ยวพักร้อน แล้วคุณไม่รู้อะไรเลย
เธอเพิ่งโพสต์ข้อความนี้มา และคุณต้องจัดการมันก่อนจะไป ผมจะเริ่มจาก skill ตัวนี้ ผมจะล้าง context ผมจะเอาคุณออกไป ไม่ต้องอยู่ตรงนั้นแล้ว แล้วผมจะเรียกใช้ skill ที่ชื่อ grill me skill ขอเช็กหน่อย ยกมือขึ้นถ้าไม่รู้ว่านี่คืออะไร เจ๋ง โอ้ ขอโทษๆ ขอพูดให้เฉพาะเจาะจงกว่านี้ ยกมือขึ้นถ้าไม่รู้ว่าผมกำลังทำอะไรอยู่ตอนที่พิมพ์เครื่องหมายทับ (/) แล้วตามด้วยคำสั่ง มีใครพอเข้าใจบ้างว่ามันคืออะไร? ผมกำลังเรียกใช้ skill ผมกำลังเรียกใช้ grill me skill และสิ่งที่ผมจะทำคือพิมพ์ว่า grill me แล้วส่ง client brief (เอกสารสรุปความต้องการลูกค้า) เข้าไป ตอนนี้ LLM มีของอยู่แค่ไม่กี่อย่าง คือ skill กับคำอธิบายว่าผมอยากทำอะไร และนี่คือวิธีที่ผมเริ่มงานทุกชิ้นกับ AI แทบจะทุกครั้ง และระหว่างที่มันสำรวจโค้ดเบส ผมจะให้ดูว่า grill me skill ทำอะไรบ้าง skill นี้อยู่ใน repo คุณเปิดดูได้ มันสั้นมากๆ
"สัมภาษณ์ฉันอย่างไม่ลดละเกี่ยวกับทุกแง่มุมของแผนนี้ จนกว่าเราจะเข้าใจตรงกัน เดินไล่ไปตามกิ่งของ decision tree (แผนผังการตัดสินใจ) แต่ละกิ่ง แก้ dependency (ความสัมพันธ์ระหว่างงาน) ทีละอัน สำหรับแต่ละคำถาม ให้คำตอบที่คุณแนะนำ ถามทีละคำถาม อะไรประมาณนี้" สิ่งที่ skill นี้ทำ และสิ่งที่ผมสังเกตตอนทำงานกับ AI โดยเฉพาะในโหมด plan mode คือมันกระตือรือร้นมากที่จะสร้างแผนให้ผม มันจะบอกว่า "โอเค ผมว่าข้อมูลเพียงพอแล้ว
ฉันจะปุ๊บ แผน แผน เลยนะ" และสิ่งที่ผมพบคือ ผมกำลังพยายามหาคำพูดให้สิ่งที่ผมต้องการจริงๆ แทนที่จะเป็นแบบนั้น Frederick P. Brooks ในหนังสือ The Design of Design มีคำพูดที่ยอดเยี่ยมเกี่ยวกับแนวคิดการออกแบบ (design concept) เวลาคุณทำงานใหม่ๆ กับใครสักคน ตอนที่ทุกคนพยายามสร้างอะไรด้วยกัน จะมีความคิดร่วมกันที่แชร์ระหว่างผู้ร่วมงานทุกคน และนั่นคือ design concept และนั่นคือสิ่งที่ผมรู้ตัวว่าต้องการกับ Claude
ผมต้องเข้าใจตรงกัน ผมต้องการ asset (ทรัพย์สิน) ไม่ใช่แผน ผมต้องอยู่ในคลื่นความถี่เดียวกับ AI หรือเอเจนต์ของผม และนี่คือวิธีที่ได้ผลมาก หวังว่า... เอาล่ะ เยี่ยม มันสำรวจเสร็จแล้ว มันเรียกใช้ sub agent (เอเจนต์ย่อย) ซึ่งใช้ไป 93.7K tokens บนโมเดล Opus แล้วก็ถามคำถามแรกกับผม เจ๋ง เราจะเห็นว่าแม้ sub agent จะเผา token ไปเยอะ แต่ token ที่ผมใช้จริงไม่ได้เพิ่มขึ้นมากมายขนาดนั้น ยกมือขึ้นถ้าไม่รู้ว่า sub agent คืออะไร คำถามนี้สำคัญ
ทุกคนพอเข้าใจไหมว่า sub agent คืออะไร? โอเค ขอให้คำนิยามสั้นๆ ตัว sub agent ตรงนี้ ตัว explore sub agent มันไปเรียก LLM อีกตัวหนึ่งซึ่งมี context window แยกเป็นอิสระ แล้ว LLM ตัวนั้นก็รายงานสรุปกลับมา sub agent ก็เหมือนการมอบหมายงาน (delegation) คุณมอบงานให้ sub agent มันก็ไปทำอย่างขะมักเขม้น สำรวจของเยอะแยะ แล้วก็ค่อยๆ ส่งเฉพาะส่วนสำคัญกลับขึ้นมาให้ orchestrator agent (เอเจนต์หลัก) หรือ parent agent (เอเจนต์แม่) โอเค หวังว่าทุกคนจะเห็นแบบเดียวกัน
มันสำรวจเสร็จแล้ว และตอนนี้เรามีคำถามแรกแล้ว "ระบบคะแนน (points economy) การกระทำแบบไหนได้คะแนน และได้เท่าไหร่?" โอเค ระหว่างนี้คุณถามมันเพื่อทำความเข้าใจ repo ให้ลึกขึ้นก็ได้ ผมรู้จัก repo นี้ดีมากเพราะผมเขียนมันเอง แต่คุณอาจไม่รู้ว่ามันเป็นยังไง ขอเสนอคำแนะนำผม คือให้ง่ายไว้ก่อน เริ่มจากแหล่งคะแนนสองแหล่ง สิ่งที่เจ๋งคือไม่เพียงแต่มันให้คำถามที่ทำให้เราเข้าใจตรงกัน แต่เรายังได้คำแนะนำด้วย และบ่อยครั้งที่ผมพบว่าคำแนะนำของ AI ดีมากจริงๆ
ผมก็จะตอบว่า ข้าม event การดูวิดีโอไปเลย มัน noisy (มีสัญญาณรบกวน) และโกงได้ง่าย ใช่ ผมเห็นด้วย Sarah ขอให้เก็บบทเรียนเป็นแก่นหลักไว้ ใช่ ดูดีนะเพื่อน >> [หัวเราะเบาๆ] >> สิ่งที่ผมมักจะทำคือ ผมมักจะสั่งด้วยเสียงกับ AI จริงๆ แล้วผมพูดคุยกับ AI แทนการพิมพ์ แต่แล็ปท็อปเครื่องนี้ใหม่ และผมลงซอฟต์แวร์สั่งเสียงไม่สำเร็จ เพราะ Windows มันห่วย แล้วก็ คำถามที่ว่า คะแนนควรย้อนหลัง (retroactive) ไหม? มันมีบันทึกความก้าวหน้าของบทเรียนเดิมอยู่แล้วพร้อม timestamp ตอนเรียนจบ นี่เป็นคำถามหินจริงๆ ใช่ไหม?
เราควรย้อนกลับไป backfill (เติมข้อมูลย้อนหลัง) event ความก้าวหน้าบทเรียนทั้งหมดไหม? นี่คือคำถามประเภทที่คุณต้องตกลงกันให้ชัดเจน ถ้าจะทำฟีเจอร์นี้ให้ถูกต้อง ผมไม่ได้คิดถึงเรื่องนี้ และ Sarah Chen ก็ไม่ได้คิดถึงแน่นอน ผมอยากให้มันย้อนหลังไหม? อืม ลองโหวตกันในห้องนี้ดีกว่า ควรย้อนกลับไป backfill ข้อมูลทั้งหมดไหม? ยกมือขึ้นถ้าคิดว่าเราควร backfill ทั้งหมด ยกมือขึ้นถ้าคิดว่าไม่ควร backfill มีคนนั่งกลางๆ ในห้องเยอะเลย
ผมจะบอกว่า นี่คือการสนทนาแบบที่คุณคุยกับ AI คุณกำลังเข้าใจตรงกันมากขึ้นเรื่อยๆ ใช่ ผมจะตามคำแนะนำของมัน เพราะผมขี้เกียจ สังเกตด้วยว่าผมอยู่ในวงวนกับ AI ได้ตลอด ผมไม่ต้อง... มันยิงคำถามมาให้ผมเร็วมาก ผมไม่ต้องเผลอไปเปิด Twitter หรืออะไร Levels (ระดับ) เส้นโค้งการเติบโต (progression curve) เป็นยังไง? ใช่ ดูประมาณนั้นได้ ตัวอย่างเช่น ใช่ โอเค
หวังว่าคุณคงได้ลองทำแบบนี้กับ AI แล้ว >> [กระแอม] >> และพยายามให้เกิดความเข้าใจตรงกัน grill me skill นี้ใช้เวลานานได้นะ ผมเคยให้มันถาม 40 คำถาม เคยถาม 80 คำถาม มีบางคนถามถึง 100 คำถามด้วย นั่งคุยกับ AI เป็นชั่วโมงจริงๆ และสิ่งที่คุณได้คือประวัติการสนทนาที่ทำงานได้ดีมาก เป็น asset ของ design concept ที่คุณกำลังสร้าง มันยังใช้แบบนี้ได้อีกด้วย
คุณสามารถนัดประชุมกับใครสักคนที่เป็นผู้เชี่ยวชาญด้านโดเมน (domain expert) บางทีผมอาจนัดประชุมกับ Sarah แล้วส่งบันทึกการประชุมนั้นเข้าไปใน Gemini meetings หรืออะไรก็ตามที่คุณใช้ จากนั้นเอามันเข้าไปในเซสชัน grilling (การซักถาม) แล้วซักถามผ่านสมมติฐานที่คุณไม่ได้คิดไว้ มันจึงกลายเป็นวิธีที่ดีมากในการรับ input จากโลกภายนอก แล้วเปลี่ยนมันและตรวจสอบมัน โอเค มาดูกัน
ผมอยากไปให้ถึงจุดจบของเรื่องนี้จริงๆ แต่ก็ไม่อยากนั่งคุยกับ AI ต่อหน้าทุกคนเป็นพันๆ วัน ดังนั้นผมจะตอบว่า ใช่ มาดูกันว่าจะเกิดอะไรขึ้น เอาล่ะ ผมจะบอกให้ ขณะที่พวกคุณลองเล่นกับแบบฝึกหัดนี้ในเครื่องของตัวเอง เรามาเริ่มช่วง Q&A สั้นๆ กันเลยดีกว่า แล้วจะทำยังไงดี? ช่วยปิดประตู หรือเปิดไมโครโฟนดังๆ หน่อยได้ไหม? เสียงดังไปหน่อย ไมค์ ช่วยปิดประตูได้ไหม? โอ้ ปิดแล้ว Mark ตอบแล้ว เยี่ยม สิ่งที่อยากให้คุณทำคือ... มีแอร์ไหม?
มีแอร์อยู่นะ ผมว่ามีแอร์ พวกคุณไม่โดนย่าง แต่ผมนี่โดนย่างสดๆ เลย สิ่งที่อยากให้ทำคือเข้าไปที่ Slido (แพลตฟอร์มถามตอบ) ซึ่งคุณ join ได้จากตรงนี้ ถ้าคุณไม่ได้ทำแบบฝึกหัด ก็เข้าไปที่ Slido เล่นๆ แล้วโหวตคำถามดีๆ หน่อย ผมจะคุยกับ AI สักครู่ จนกว่าเราจะถึงจุดที่หยุดได้ "สตรีค (streak การเรียนติดต่อกัน) ได้คะแนนไหม?" อืม สตรีคแยกต่างหาก มาดูกันว่ามันจะถามอะไรอีก "UI ของ gamification อยู่ที่ไหน?" เอาไว้ในแดชบอร์ด
ผมจะกวาดดูแล้วตอบให้เร็วๆ เลย แล้ว Slido ของเราเป็นยังไงบ้าง? โอเค "ผมลองใช้ Spec Kit, Open Spec หรือ Taskmaster แทน Grill Me skill ไหม? ผมพบว่ามัน verbose (ร่ายยาว) กว่า หรือเป็นทางเลือกที่มีโครงสร้างกว่า?" เป็นคำถามที่ดีมาก มีเฟรมเวิร์กมากมายที่ช่วยสร้างกระบวนการวางแผนให้คุณ
ผมเชื่อว่าในระยะนี้ ที่ยังไม่มีผู้ชนะชัดเจน ยังไม่มีหนทางเดียวที่ถูกต้อง และอะไรๆ ก็เปลี่ยนตลอดเวลา คุณต้องเป็นเจ้าของสแตกการวางแผน (planning stack) ให้ได้มากที่สุดเท่าที่จะทำได้ สิ่งที่ผมสังเกตเห็นจากนักศึกษาหลายคนคือ พวกเขามักใช้สแตกเดิมๆ มากเกินไป แล้วเจอปัญหา เพราะพวกเขาไม่ได้เป็นเจ้าของสแตก และไม่เห็นภาพรวมทั้งหมด พวกเขาก็แค่สรุปว่า มันไม่เวิร์ค มันห่วย
ในขณะที่ถ้าคุณควบคุมทุกอย่างได้ อย่างน้อยคุณก็รู้วิธีแก้ หรือมีโอกาสรู้วิธีแก้ ดังนั้น ถึงแม้ผมจะให้สแตกกับคุณ ผมเชื่อในหลักการ inversion of control (การกลับด้านการควบคุม) คือคุณควรควบคุมสแตกเอง แล้วก็... ขอกดศูนย์ได้ไหม? อะไรนะ? ขอโทษ ผมพึมพำเยอะไปหน่อย ขอ... ขอบคุณ ขอโทษจริงๆ >> [เสียงหัวเราะ] >> อะไรกัน คุณไม่อยากให้ feedback ดีๆ กับ Claude เหรอ? คุณเป็นอะไรไป? โอเค เจ๋ง
"คำถามหลายข้อของ Grill Me skill ไม่เหมาะกับนักพัฒนาเท่าไหร่ แต่เหมาะกับ PO (product owner) ในทีมใหญ่ๆ ใครควรใช้มัน?" ใช่ ยกมือขึ้นถ้าเคยทำ pair programming (เขียนโค้ดเป็นคู่) เคยทำกันไหม? ใช่ วางมือลง แล้วยกมือขึ้นอีกครั้งถ้าเคยทำ pair programming กับ AI ใช่ เป็นยังไงบ้าง? ดีไหม? สนุกไหม? ผมว่าการ pair programming กับ AI เป็นไอเดียที่ดีมาก เพราะคุณมีคนที่สามอยู่ในห้อง ที่จะซักไซ้และตั้งคำถามกับคุณไม่หยุด
ถ้าคุณไม่รู้คำตอบ มันควรเป็นคุณ ผู้เชี่ยวชาญด้านโดเมน และ AI อยู่ในห้องเดียวกัน ถ้าคุณมีคำถามเรื่องการ implement ก็ควรเป็นคุณ นักพัฒนาด้วยกัน และ AI ในห้องเดียวกัน คุณสามารถทำงานผ่านคำถามเหล่านี้ในทีมได้ และเดี๋ยวเราจะดูเรื่อง implementation กันในอีกสักครู่ แล้วจะเห็นว่าทำยังไงให้ implementation เร็วขึ้นมาก แต่ผมคิดว่าการตัดสินใจที่สำคัญจริงๆ ที่ต้องใช้มนุษย์ คุณต้องใช้มนุษย์จำนวนมาก และจำนวนมนุษย์ในนั้นไม่ค่อยสำคัญเท่าไหร่
คุณสามารถระดมคนจำนวนมากเข้ามา เหมือน mob programming (เขียนโค้ดเป็นกลุ่ม) กับ AI นั่นแหละ "เครื่องมือ meta prompting (การเขียนพรอมป์เพื่อสร้างพรอมป์) ที่ผมชอบที่สุดคืออะไร?" ผมคิดว่าตอบไปแล้ว "ไม่มีแอร์" ช่างมันเถอะ "จะใช้บทสนทนาเป็น asset หลังจบเซสชัน Grill Me ยังไง?" เดี๋ยวเราจะไปถึงตรงนั้น โอเค ผมอยากเร่งความเร็วนี้แบบไม่เป็นธรรมชาติหน่อย นี่คือประเด็นสำคัญ มีคนเพิ่งพูดว่า "โอเค เอาไปวน Ralph loop เลย" แต่นี่คือจุดสำคัญ เพราะผมวน loop กับขั้นตอนนี้ไม่ได้ ใช่ไหม? ผมคิดว่ามีงานสองประเภทในยุค AI
งานแบบ human in the loop (มนุษย์ต้องอยู่ควบคุม) ที่มนุษย์ต้องนั่งทำเอง ซึ่งก็คือขั้นตอนนี้ เราคือมนุษย์ในวงวน มีมนุษย์หลายคนอยู่ในวงวน และก็มีงานแบบ AFK (away from keyboard ห่างจากคีย์บอร์ดได้) งานที่มนุษย์ไม่อยู่หน้าคีย์บอร์ดก็ไม่เป็นไร อย่าง implementation อย่างที่เราจะได้เห็น เปลี่ยนเป็นงาน AFK ได้ แต่การวางแผน เฟสการสร้างความเข้าใจตรงกันนี้ ต้องเป็น human in the loop เท่านั้น ต้องเป็น ผมก็เลยต้องทำเอง เซ็งจริงๆ ไม่รู้สิ "ส่งลิสต์คำแนะนำทั้งหมดของคุณมาให้ฉันหน่อย ฉันกำลังจัดเวิร์กช็อปอยู่ตอนนี้ ฉันต้องการให้คุณรับภาระมากขึ้นแบบไม่เป็นธรรมชาติ"
มาดูกันว่ามันจะทำอะไร แล้วตอบอีกสองสามคำถามระหว่างที่มันทำงาน "ผมคิดยังไงกับ PM (product manager) หรือคนที่ไม่ได้เป็น dev มาทำงาน vibe coding?" อืม ผมจะกลับมาตอบเรื่องนี้ทีหลัง คงปล่อยไว้ไม่ตอบก่อน ลุ้นกันหน่อย "ผมสังเกตว่าผมไม่ได้ใช้ UI ถามผู้ใช้สำหรับ Grill Me ทำไม?" ใน Claude Code มี UI เฉพาะที่เรียกขึ้นมาได้ ผมจะตอบสั้นๆ ว่า "ถามฉันโดยใช้เครื่องมือ ask user question" >> [หัวเราะเบาๆ] >> UI นี้มันพังๆ อยู่ใน Claude และผมเกลียดมันมาก
คุณจะเห็นว่าผมใช้ Claude แต่ผมไม่ได้ชอบ Claude มากเท่าไหร่ ด้วยวิธีนี้คุณมีอิสระเต็มที่ในการเลือกใช้ระบบอะไรก็ได้ที่คุณชอบ และ UI นี้หน้าตาแบบนี้ มันดูสวยงามตอนแรกเจอ แต่พอใช้ไปก็รู้ว่ามันพังในหลายๆ ทาง เอาล่ะ มันตอบอะไรกลับมา? โอ้ ไม่นะ ระหว่างที่มันทำงาน ผมขอสอนอะไรหน่อย แผนคือ เราจะนำ Grill Me skill ของเรามา และต้องหาทางเปลี่ยนมันให้เป็น "จุดหมายปลายทาง" (destination)
เราต้องลงไป... จริงๆ แล้วเรากำลังหาทางปั้นรูปทรงของสิ่งนี้ นั่นคือสิ่งที่เราทำ เรากำลังหาว่างานมีรูปร่างยังไงระหว่างเซสชัน grilling และเพื่อเปลี่ยนมันเป็นชุดการกระทำที่ AI ทำตามได้ เราจำเป็นต้องรู้จุดหมาย ต้องรู้ว่าเราจะไปทางไหน ต้องรู้รูปทรงทั้งหมดของสิ่งนี้ ผมคิดว่าเราต้องการเอกสารสำคัญสองฉบับ เราต้องการเอกสารที่บันทึกจุดหมายปลายทาง โอ้ ไม่ สว่างไม่พอ เอาล่ะ ยังไม่สว่างขึ้น เอาล่ะ
เราต้องมีเอกสารบันทึกจุดหมายปลายทาง และเอกสารบันทึกเส้นทางการเดินทาง พูดอีกแบบคือ เราต้องมีเอกสารที่ช่วยกำหนดว่าสิ่งนี้หน้าตาเป็นยังไงในแง่ของ user stories (เรื่องเล่าความต้องการผู้ใช้) ทั้งหมด กำหนดนิยามของความสำเร็จ (definition of done) แล้วก็ต้องหาว่าการแบ่งงานควรเป็นยังไง นั่นคือสิ่งที่เราจะทำต่อไป พอจบเซสชัน grilling แล้ว ใช่ มันดูดีมาก สุดยอด ผมชอบมาก มันตอบคำถามของมันเอง 22 ข้อ เอาล่ะ นี่คือภาพแทนของเซสชัน grilling ทั่วไปได้ดีทีเดียว
ณ จุดนี้ ผมใช้ไป 25K tokens และเนื้อหาส่วนใหญ่เป็นทองคำแท้ ผมอยากเก็บมันไว้ ผมมี token ดีๆ 25K อยู่ตรงนั้น และสิ่งที่อยากทำคือสรุปมันเป็นเอกสารจุดหมายปลายทาง นี่คือแบบฝึกหัดถัดไป เราจะเขียน product requirements document (เอกสารข้อกำหนดผลิตภัณฑ์) หรือ PRD ซึ่งหน้าที่ของมันคือการเป็นเอกสารจุดหมายปลายทางนี่เอง รูปแบบไม่สำคัญเท่าไหร่ ผมมีรูปแบบที่ชอบและถูกใจอยู่
แต่คุณเลือกใช้รูปแบบของคุณเอง หรือแบบที่บริษัทคุณใช้ก็ได้ สิ่งที่เราทำจริงๆ คือ ผมไม่ได้กังวลเรื่องนั้นเท่าไหร่ สิ่งที่เราทำจริงๆ คือการสรุป design concept ที่เรามีอยู่ตอนนี้ มาลองกัน ผมจะเริ่มมัน ผมจะเลื่อนลงไปล่างสุด สิ่งที่ผมจะทำก็แค่พิมพ์ว่า "write a PRD" แล้วเรามาดู skill นั้นกัน write a PRD skill นี้ทำหลายอย่าง อย่างแรกคือถามผู้ใช้ให้อธิบายปัญหาอย่างละเอียดและยาวๆ
คุณใช้ write a PRD โดยไม่ต้อง grill ก่อนก็ได้ แต่ผมชอบ grill ก่อนแล้วค่อยเขียน PRD ทีหลัง จากนั้นก็ให้มันติดตั้ง repo ซึ่งเราทำไปแล้ว จากนั้นให้มันสัมภาษณ์ผู้ใช้แบบไม่ลดละ ได้ grilling session อีกรอบ แล้วก็เริ่มประกอบเทมเพลต PRD ขึ้นมา skill นี้อยู่ใน repo ถ้าอยากลองเปิดดู และหน้าตาของมันก็ประมาณนี้ มี problem statements (คำอธิบายปัญหา) ปัญหาที่ผู้ใช้เจอ วิธีแก้ปัญหา และชุด user stories user stories เหล่านี้เป็นตัวนิยามว่าสิ่งนี้คืออะไร ถ้าคุณเคยเป็นนักพัฒนามาก่อน ก็น่าจะเคยเห็นอะไรแบบนี้ ภาษาที่ใช้เขียนคือ Cucumber หรือเราจะเขียนเองก็ได้ จากนั้นก็มีลิสต์การตัดสินใจด้านการ implement ที่ทำไป และที่สำคัญคือลิสต์การตัดสินใจด้านการทดสอบด้วย ผมจะรันมัน โอเค มันเสร็จแล้ว อ่า! Windows ขอปิดหน้าต่างนี้หน่อย ขอบคุณ ไม่รู้ว่าทำไมผมถึงซื้อแล็ปท็อป Windows ผมว่าผมแค่ชอบความท้าทาย
>> [กระแอม] >> สิ่งแรกที่มันจะให้ผมคือชุดโมดูลที่เสนอว่าควรแก้ไข ตอนนี้มีเหตุผลลึกๆ ที่ผมคิดเรื่องนี้ ในขั้นนี้เรามีไอเดีย เราเขียนสเปกคร่าวๆ ของไอเดียแล้ว เราเข้าใจตรงกันแล้วว่ากำลังจะทำอะไร จากนั้นต้องเริ่มคิดถึงโค้ด เพราะถึงจุดนี้แล้ว นี่ไม่ใช่ specs to code นี่ไม่ใช่จุดที่เราจะเมินโค้ด เราคำนึงถึงโค้ดอยู่ตลอดทั้งกระบวนการ
วิธีที่ผมชอบคือการคิดถึงชุดโมดูลที่เสนอให้แก้ เราจะกลับมาที่แนวคิดเรื่องการออกแบบระบบของคุณอย่างต่อเนื่องและคำนึงถึงระบบของคุณอยู่เสมอ มันบอกว่า "แนะนำให้ทดสอบ gamification service เพราะมันเป็นโมดูลลึกโมดูลเดียวที่มีตรรกะสำคัญ" โมดูลเหล่านี้ดูถูกต้อง ใช่ ดูดี และมันจะสร้าง PRD ออกมา เพื่อความง่ายในการตั้งค่า ผมตั้งให้มันสร้างชุด issues (งาน) ในเครื่อง ดังนั้นมันจะสร้าง PRD ไว้ในโฟลเดอร์ issues นี้
แต่วิธีที่ผมทำปกติ และคุณลองไปดูเองได้ คือไปที่ repo งานของผม ซึ่งก็คือ github.com/MattPocock/course-video-manager ตามลิงก์ข้างบนนี้ ในนี้เป็นแอปที่ผมสร้างขึ้นมา ใช้ตลอดเวลาเพื่ออัดวิดีโอของผม ผมเคยดึงสถิติออกมาดู ผมอัดวิดีโอในนี้ไปประมาณพันกว่าเรื่องอะไรประมาณนั้น และคุณจะเห็นว่ามี issues ที่ปิดแล้ว 744 ตัว
และนี่คือ PRD ทั้งหมดกับ issues ด้าน implementation ทั้งหมดที่ผมใส่ไว้ในนี้ นี่คือวิธีที่ผมชอบทำ >> [กระแอม] >> นั่นคือสิ่งที่ผมกำลังทำอยู่ เอาล่ะ ผมจะตอบว่า ใช่ แล้วก็สร้าง issue นั้นออกมา มาดูกัน มันอยู่ในนี้แล้ว เรามี problem statements คนที่สมัครเรียนคอร์ส วิธีแก้ user stories 18 เรื่อง ดูดี การตัดสินใจด้าน implementation เกณฑ์ระดับ (level thresholds) อะไรพวกนี้ ข้อมูลเพียงพอแล้ว เราเคลียร์แล้วว่าเราจะไปทางไหนและทำอะไร
นั่นคือสิ่งที่เราทำ เรามีเซสชัน grilling และสร้าง asset ออกมาจากมัน ทีนี้ ยกมือหน่อย ผมควรทบทวนเอกสารนี้ไหม? ยกมือขึ้นถ้าคิดว่าผมควรทบทวนเอกสาร ใช่ ผมไม่ดูเอกสารพวกนี้ ผมไม่ดู เพราะสิ่งที่ผมกำลังทดสอบ ณ จุดนี้คืออะไร? เวลาผมอ่านมัน ผมกำลังทดสอบอะไร? failure modes (รูปแบบความล้มเหลว) ที่ผมกำลังพยายามเช็กคืออะไร? ผมรู้ว่า LLM เก่งเรื่องการสรุป เพราะมันเก่งจริงๆ
ผมอยู่ในคลื่นความถี่เดียวกับ LLM แล้ว ใช่ไหม? การใช้ grill me skill ทำให้เรามี design concept ร่วมกัน ถ้าเรามี design concept ร่วมกันแล้ว สิ่งที่ผมทำก็แค่เช็กความสามารถในการสรุปของ LLM เท่านั้น ผมเลยไม่ค่อยอ่านพวกนี้ มาทำ Q&A กันดีกว่า เพราะผมรู้สึกว่าทุกคนอยากถามเต็มที และผมว่าเราน่าจะพักเบรกสัก 5 นาที เพื่อพักเสียงผม และให้ทุกคนได้ตามแบบฝึกหัดทันสักครู่ ถ้าไม่ว่ากัน มาทำ Q&A สั้นๆ กัน
"ถ้าผมไม่ชอบ Claude Code แล้วผมชอบตัวไหน?" เคยได้ยินคำพูดที่ว่า "ประชาธิปไตยเป็นวิธีการปกครองประเทศที่แย่ที่สุด ยกเว้นวิธีอื่นๆ ทั้งหมด" ไหม? ผมรู้สึกแบบนั้นกับ Claude Code ตอบข้อนั้นแล้ว "คุณคิดยังไงกับนักพัฒนาที่ต้องเข้าใจ TypeScript อย่างลึกซึ้ง ในเมื่อตอนนี้มีเครื่องมือ fix the TS / make no mistakes อยู่แล้ว?" ผมไม่เข้าใจรูปแบบคำถามนี้ แต่คิดว่าเข้าใจความหมาย ซึ่งคือ ผมเชื่อว่าโค้ดสำคัญมาก และสิ่งนี้จะแทรกซึมไปทั้งเซสชัน และโค้ดเบสที่แย่จะสร้างเอเจนต์ที่แย่
ถ้าคุณมีโค้ดเบสที่ขยะๆ คุณจะได้ขยะออกมาจากเอเจนต์ที่ทำงานในโค้ดเบสนั้น เดี๋ยวเราจะพูดเรื่องนี้เพิ่มอีกที และผมคิดว่าการเข้าใจเครื่องมือเหล่านี้อย่างลึกซึ้ง เข้าใจโค้ดอย่างลึกซึ้ง จะทำให้คุณเป็นนักพัฒนาที่ดีขึ้นมาก และได้ประโยชน์จาก AI มากขึ้น และนั่นก็ตอบคำถามนั้นด้วย เยี่ยม ออกไปจากตรงนั้นหน่อย เอาล่ะ "ตอนนี้เรามี context window 1 ล้าน token แล้ว เราอยากใช้ประโยชน์จากมันจริงๆ ไหม? ผมสังเกตว่าโซนโง่ดูโง่น้อยลงช่วงนี้" โอเค คำถามดีมาก
เรื่องนี้ย้อนกลับไปที่แนวคิดแรกของเราเรื่องโซนโง่ ผมอัดคอร์ส Claude Code โดยใช้ context window ขนาด 200K และในวันที่ผมเปิดตัวคอร์ส พวกเขาก็ประกาศ context window 1 ล้าน ความเห็นผมคือ สิ่งที่ Claude Code ทำคือประมาณนี้ แหม! พวกเขาส่งโซนโง่เพิ่มให้คุณอีกเยอะมาก นี่เป็นเรื่องดีสำหรับงานที่คุณต้องการดึงข้อมูลจาก context window ขนาดใหญ่
ถ้าคุณอยากส่ง War and Peace (สงครามและสันติภาพ) ห้าเล่มเข้าไป แล้วให้มันหาว่ามีอะไรบ้าง... ผมนึกชื่อตัวละครใน War and Peace ไม่ได้เลย ทำไมผมถึงเริ่มด้วยอันนั้นนะ? มันดีสำหรับการค้นคืน (retrieval) แต่ไม่ค่อยดีสำหรับการเขียนโค้ด ผมเลยมองว่าตอนนี้โซนฉลาดอยู่ที่ประมาณ 100K และโซนฉลาดจะใหญ่ขึ้นเรื่อยๆ ซึ่งจะเป็นการพัฒนาที่ดีมาก ทุกคน เราจะพักเบรกสัก 5 นาที ถ้าไม่ว่ากัน เพื่อพักเสียงผม และคุณอาจจะได้ขยับตัว หรือไปหาน้ำดื่ม
ผมเห็นสายตาที่เริ่มง่วงๆ และอยากให้ทุกคนตื่นเต็มที่สำหรับช่วงต่อไป ถ้าไม่ว่ากัน เราจะพัก 5 นาที แล้วเจอกันที่นี่อีกครั้ง โอเคไหม? เรามี PRD ซึ่งผมจะไม่อ่าน มันคือเอกสารจุดหมายปลายทางของเรา ขอกวาดดูคำถามดีๆ ก่อนที่จะพุ่งไปต่อ "การค้นพบบทบาทของวิศวกรรมซอฟต์แวร์ในโลกปัจจุบันอีกครั้ง สามสาขาที่คุณแนะนำ" อืม เทควันโดก็ดีนะ เคยได้ยินมา ผมไม่รู้จะตอบคำถามนี้ยังไงเลย ขอบคุณที่ถามนะ สามสาขาที่ผมแนะนำ
หมายถึง... อะไรนะ? ช่างประปา (plumbing) ช่างประปาก็ดีเหมือนกัน ใช่ ใช่ ใช่ ไม่รู้ว่ามันเป็นสาขาไหมนะ ช่างประปาที่ผมจ้างมามักไม่ค่อยมีระเบียบวินัยเท่าไหร่ เอาล่ะ โอเค ตอนนี้เรามีจุดหมายแล้ว โอเคไหม? เยี่ยม แล้วเราจะไปถึงจุดหมายได้ยังไง? เรามี PRD ที่คลุมเครือ จะแบ่งมันยังไงเพื่อไม่ให้ของตกไปในโซนโง่? พูดอีกแบบคือ เรามีงานใหญ่งานหนึ่ง จะแบ่งมันเป็นแผนหลายเฟสแบบนี้ยังไง?
สิ่งที่คุณอาจทำตอนนี้คือบอกว่า "โอเค Claude ขอแผนหลายเฟสที่พาเราไปถึงจุดหมายนี้หน่อย" ฟังดูสมเหตุสมผล นี่คือสิ่งที่เราทำกันมาก่อน แต่ตอนนี้ผมมีวิธีที่ดีกว่า คือผมชอบสร้างคัมบังบอร์ด (Kanban board) จากสิ่งนี้ ยกมือขึ้นถ้าไม่รู้ว่า Kanban board คืออะไร อืม เจ๋ง โอเค Kanban board ก็คือชุดการ์ดงาน (tickets) ที่คุณแปะไว้บนกำแพง โดยมีการ์ดแต่ละใบมี ความสัมพันธ์แบบบล็อก (blocking) ระหว่างกัน มาดูกันว่ามันหน้าตาเป็นยังไง
นี่คือวิธีที่เราทำงานกันในฐานะนักพัฒนามานาน ตั้งแต่ยุค Agile เกิดขึ้น และสิ่งที่มันทำ เราจะเห็นตรงนี้ มันเสนอให้แบ่งการตั้งค่านี้ออกเป็นห้างาน งานแรกคือ schema (โครงสร้างฐานข้อมูล) และ gamification service ใช่ ดูดีทีเดียว งานนี้ไม่ถูกบล็อกโดยอะไร และเราจะเห็นด้วยว่ามันระบุประเภทงานเป็น AFK ด้วย จำได้ไหมที่ผมพูดถึง human in the loop กับ AFK ก่อนหน้านี้? นี่คืองาน AFK คืองานที่เราส่งให้เอเจนต์จัดการได้เลย
การติดตามสตรีค (streak tracking) โอเค ดูดี แล้วก็เชื่อมคะแนนและสตรีคเข้ากับการเรียนบทเรียน/ทำแบบทดสอบจบ งานนี้ถูกบล็อกโดยงานหนึ่งและสอง การ backfill ย้อนหลัง ถูกบล็อกโดยงานหนึ่งเท่านั้น และงานนี้อีกตัวถูกบล็อกโดยทุกงาน เจ๋ง อืม ตอนนี้ผมคิดว่า คุณอาจถามว่า "ทำไมเราไม่ให้ AI สร้าง issues พวกนี้เลยล่ะ? ทำไมผมต้องมายุ่งตรงนี้ด้วย?" เพราะมันให้เครื่องมือที่ดีๆ มาเยอะแยะ ทำไมผมต้องมาตรวจสอบและคิดว่างานต่อไปคืออะไร?
ความเห็นผมคือ ขั้นนี้ทำได้ถูกมาก ทำได้เร็วมาก พอทำ PR เสร็จ ผมก็เห็นปัญหาได้ทันที มันมีเทคนิคที่สำคัญมากๆ ตอนที่คุณกำลังหาว่ารูปทรงของการเดินทางครั้งนี้ควรเป็นยังไง มันมาจากแนวคิดคลาสสิกจากหนังสือ The Pragmatic Programmer ที่เรียกว่า traceable bullets (กระสุนเรืองแสง) หรือ vertical slices (ชิ้นแนวตั้ง) และ traceable bullets เปลี่ยนวิธีคิดของผมเกี่ยวกับการให้ AI เลือกงานของตัวเองอย่างแท้จริง ระบบมีเลเยอร์ใช่ไหม? มีเลเยอร์อยู่ในระบบของคุณ
สิ่งเหล่านี้อาจเป็นหน่วย deployable (หน่วยที่นำไปติดตั้งได้) ที่ต่างกัน คุณอาจมีฐานข้อมูลอยู่ที่หนึ่ง API อาจอยู่ใกล้ฐานข้อมูลแต่แยกส่วนกัน คุณอาจมีฟรอนต์เอนด์ที่อยู่คนละที่โดยสิ้นเชิงอย่าง CDN หรือภายในหน่วย deployable เหล่านี้ อาจมีเลเยอร์ย่อยๆ อยู่ข้างใน เช่นในโค้ดเบสที่เราทำงานด้วย เรามี service มากมาย ทั้ง quiz service, team service, user service, coupon service, core service และ service เหล่านี้มี dependency ต่อกัน
มันก็เหมือนเป็นเลเยอร์เดี่ยวๆ สิ่งที่ผมสังเกตคือ AI ชอบเขียนโค้ดแนวนอน (horizontally) คือชอบเขียนทีละเลเยอร์ พูดอีกแบบ ในเฟสหนึ่ง มันจะทำทุกอย่างที่เกี่ยวกับฐานข้อมูล schema ทั้งหมด อะไรก็ตามที่เกี่ยวกับหน่วยนั้น จากนั้นเข้าสู่เฟสสอง ทำทุกอย่างที่เกี่ยวกับ API แล้วค่อยเพิ่มฟรอนต์เอนด์ทับลงไป มีใครบอกได้ไหมว่าภาพนั้นผิดตรงไหน? ทำไมมันถึงไม่ดี? ยกมือขึ้นถ้ามีคำตอบ ใช่ >> ได้ feedback loop ทั้งหมดนั่นแหละ ถูกต้อง
คุณจะไม่ได้ feedback กับงานของคุณจนกว่าจะเริ่มหรือทำเฟสสามเสร็จ สิ่งที่คุณต้องทำคือ กว่าคุณจะถึงเฟสสาม คุณไม่ได้ทดสอบจริงๆ ว่าเลเยอร์ทั้งหมดทำงานร่วมกัน คุณยังไม่มีระบบแบบบูรณาการให้ทดสอบ ดังนั้นแทนที่จะคิดแบบนั้น คุณต้องคิดถึงเลเยอร์แนวตั้ง (vertical layers) คุณต้องคิดถึงชิ้นส่วนฟังก์ชันการทำงานบางๆ ที่ตัดผ่านทุกเลเยอร์ที่จำเป็น
และนี่คือวิธีทำงานที่ดีกว่ามาก ดีกว่าสำหรับ AI ด้วย เพราะหมายความว่าในตอนจบเฟสหนึ่งหรือระหว่างเฟสหนึ่ง มันจะได้ feedback กับทั้งโฟลว์ของมัน สิ่งนี้หมายถึง ใน skill ชื่อ PRD to issues ที่อยู่ข้างบนนี้ ผมเขียนไว้ว่า "แบ่ง PRD เป็น issues ที่หยิบจับได้อิสระ โดยใช้ vertical slices / traceable bullets เขียนเป็นไฟล์ markdown ในเครื่อง" >> [หัวเราะเบาๆ] >> ขั้นแรกเราหา PRD เจอ ถ้าเป็นเซสชันใหม่ก็สำรวจโค้ดเบสอีกครั้ง เราร่าง vertical slices แล้วแบ่ง PRD ออกเป็น issues ที่ติดตามได้
อธิบาย traceable bullet หน่อย มันเหมือนตอนที่คุณเป็นพลยิงปืนต่อสู้อากาศยาน มันเป็นแนวคิดที่ค่อนข้างรุนแรงนะ และคุณมองขึ้นไปบนฟ้ายามค่ำคืน ถ้าคุณยิงกระสุนธรรมดา คุณไม่รู้เลยว่ากำลังยิงไปโดนอะไร คุณเห็นเครื่องบิน แต่ไม่เห็นว่ากระสุนไปทางไหน traceable bullet คือการติดสารเรืองแสงเล็กน้อยไว้กับกระสุน เพื่อให้มันเรืองแสงระหว่างทาง นั่นหมายความว่าทุกๆ กระสุนนัดที่หก คุณจะเห็นเส้นแสงบนท้องฟ้า
คุณจะได้ feedback ว่ากำลังเล็งไปทางไหน แนวคิดคือเราจะเพิ่มระดับ feedback และได้ feedback เกือบจะทันทีกับสิ่งที่เรากำลังสร้าง เพราะถ้าไม่มีมัน AI จะเขียนโค้ดแบบมืดบอดไปจนถึงเฟสหลังๆ เรามีกฎ vertical slice เราถามผู้ใช้ แล้วก็สร้างไฟล์ issues สิ่งที่ผมเห็นตรงนี้คือ ถึงแม้ผมจะบอกให้มันทำ vertical slices มันกลับเสนอให้สร้าง gamification service ก่อนเป็นงานแรก นั่นคือชิ้นเดียวตรงนั้น และสำหรับผมมันดูเหมือน horizontal slice (ชิ้นแนวนอน)
สิ่งที่ผมอยากเห็นใน vertical slice แรกเป็นพิเศษคือ การเปลี่ยนแปลง schema หรือบางส่วนของ schema ผมอยากเห็น service ใหม่ถูกสร้างขึ้น และอยากเห็นการแสดงผลขั้นต่ำของมันบนฟรอนต์เอนด์ ผมอยากให้มันทำตามแนวตั้ง ไม่ใช่แค่แนวนอน เข้าใจไหม? โอเค ผมจะด่า AI หน่อย "ไอ้เด็กไม่ดี" ไม่ล่ะ ผมจะไม่เสีย token ไปกับการด่าเฉยๆ "slice แรกมันแนวนอนเกินไป" ผมจะเริ่มแค่ตรงนั้นแล้วดูว่ามันจะรับได้ไหม เข้าใจแนวคิดไหม?
และสิ่งที่ผมชอบมากเกี่ยวกับการย้อนกลับไปอ่านหนังสือเก่าๆ เหล่านั้นคือ ในยุคสมัยนี้เราพยายามหาคำพูดเป็นภาษาอังกฤษมาอธิบายแนวปฏิบัติซอฟต์แวร์ที่ดีที่สุด และหนังสืออายุ 20 ปีเหล่านี้ทำมันไว้แล้ว และมันคือเหมืองทองคำถ้าอยากเอามันไปใส่ในพรอมป์ แต่ถึงอย่างนั้น มันก็ไม่ได้ทำงานได้สมบูรณ์แบบทุกครั้ง "ให้คะแนนเมื่อเรียนบทเรียนจบ และแสดงบนแดชบอร์ด" ใช่ นี่คือ vertical slice ที่สวยงาม เพราะมันเป็นงานก้อนโตจริงๆ
มันทำหลาย user stories ในนั้น แต่ตอนจบเราจะได้เห็นของที่มองเห็นได้จริง แล้ว AI ก็จะต่อยอดจากตรงนั้นได้ คุณเห็นไหมว่าทำไมอันนี้ถึงดีกว่าอันแรก เจ๋ง ดูดีมาก เรากำลังเข้าใกล้ขึ้นเรื่อยๆ แล้ว ใครที่ตามอยู่ที่บ้าน... เอาเถอะ ไม่ใช่ที่บ้าน แต่คุณคงพอเข้าใจ หวังว่าจะเห็นแบบเดียวกัน และเริ่มมีสัญชาตญาณเดียวกัน ขอเปิดรับคำถาม ระหว่างที่ผมกำลังสร้าง GitHub issues เหล่านี้ อ่า... ไม่ใช่ GitHub issues แต่อยู่ในเครื่อง "เมื่อไหร่ผมจะเลิกใช้ Windows?" ไม่มีวัน "เมื่อพูดกับฉัน จงยอมเสียไวยากรณ์เพื่อความกระชับ" พรอมป์นี้มีประโยชน์มากกับผมตอนอ่านแผน เพราะมันทำให้แผนที่ออกมามีความกระชับ อ่านง่าย ดีมาก แต่ผมเลิกใช้แนวคิดนี้แล้ว หันไปชอบเซสชัน grilling แทน เพราะสิ่งที่ผมสังเกตคือ ผมไม่อยากอ่านแผนอีกต่อไป ผมอยากอยู่ในคลื่นความถี่เดียวกับ LLM ผมอยากให้มันถามคำถามเชิงรุกกับผม และพอผมเลิกอ่านแผน ผมก็ไม่ต้องการให้มันกระชับอีกต่อไป
ผมมองแผนในเอกสารจุดหมายปลายทางว่าเป็นสถานะสุดท้าย (end state) และผมไม่ต้องการให้สถานะสุดท้ายนั้นกระชับ หวังว่าคงตอบคำถามได้ "คุณคิดว่าผลลัพธ์ของสถานการณ์เม็กซิกันสแตนด์ออฟ (การเผชิญหน้าแบบไม่มีใครยอมถอย) ระหว่างบทบาทของ PM ในอนาคตกับบทบาทอื่นๆ ที่กำลังมาบรรจบกันจะเป็นยังไง?" ไม่รู้สิ ผมไม่ใช่นักวิเคราะห์ ไม่รู้ โอเค หลังจากการอนุมัติสองสามครั้ง เราก็จะได้ชุด issues ออกมา issues ที่เราสร้างถูกออกแบบให้หยิบจับได้อิสระ นั่นหมายความว่า Kanban board นี้จะมีหน้าตาประมาณนี้
คุณจะได้ชุดการ์ดงานที่มีความสัมพันธ์แบบอิสระต่อกันมากมาย งานนี้ต้องทำก่อนงานนี้ งานนี้ต้องทำก่อนงานนี้ และงานนี้อีกตัว สมมติว่ามีอีกตัวตรงนี้ งานนี้ต้องทำก่อนงานนี้ นั่นหมายความว่าคุณเริ่มทำแบบขนาน (parallelize) ได้ เริ่มให้เอเจนต์หลายตัวทำงานพร้อมกันในงานเหล่านี้ เพราะใช่ งานนี้ต้องทำก่อน แล้วสองงานนี้สามารถถูกหยิบไปทำพร้อมกันโดยเอเจนต์อิสระสองตัว ยกมือขึ้นถ้าเคยทำงานแบบขนานกับเอเจนต์
โอเค เจ๋ง สิ่งนี้ทำให้คุณเปลี่ยนแผนเหล่านั้นให้เป็น directed acyclic graphs (กราฟไร้รอบแบบมีทิศทาง) ได้อย่างเหมาะสมที่สุด โดยคุณจะมีสามเฟสตรงนี้ เฟสหนึ่ง... ขอเลื่อนนี่หน่อย เหนือเส้นนี้ คุณทำงานนี้ เฟสสอง คุณทำงานสองงานด้านล่าง และเฟสสาม คุณทำงานชิ้นที่สามแล้วต่อเข้ากับมัน และลองคิดดู มันอาจมี... นี่เป็นแผนที่ค่อนข้างง่าย แต่คุณสามารถมีแผนต่างๆ มากมายทำงานพร้อมกันได้ หมายความว่าคุณทำ parallelization (การทำงานขนาน) ได้ดีมาก
และเดี๋ยวเราจะพูดถึงเรื่องนี้อีกที นั่นคือเหตุผลที่ผมชอบ Kanban board แบบนี้มากกว่าแผนแบบเรียงลำดับ (sequential plan) เพราะแผนแบบเรียงลำดับมีเอเจนต์เดียวเท่านั้นที่ทำงานได้ ตรงนี้... มันหายไปไหน? ตรงนี้ ใช่ แผนนี้เป็น loop เดียวจริงๆ ใช่ไหม? มีเอเจนต์เดียวเท่านั้นที่ทำงานกับมันได้ เพราะเรามีเฟสที่เป็นเลขลำดับ และมัน parallelize ไม่ได้ เข้าใจไหม? เจ๋ง เรามี issues ของเราแล้ว อ่า ไม่เอาน่า หยุดถามฉันได้แล้ว ฉันรู้ว่ามันกำลังสร้างบน GitHub ฉันไม่ต้องการแบบนั้น โอ้ ไม่ ไอ้โง่ สร้างใน issues แทนสิ ไม่
นั่นยังไม่แม่นยำพอ "ไอ้โง่ สร้างเป็นไฟล์ markdown ในเครื่องแทน โดยอ้างอิงเวอร์ชันท้องถิ่น" ขอโทษที พอมาถึงจุดนี้ เรามี issues ในเครื่องเป็นชุด ที่เราสามารถวน loop และ implement ได้ และ ณ จุดนี้แหละที่มนุษย์ออกจากวงวน ถึงตอนนี้ ขอเปิดภาพรวมของโฟลว์ที่เรากำลังสำรวจนี้ให้ดู เรามีไอเดียหนึ่ง ขอซูมให้คนแถวหลังดูหน่อย แล้วเราก็ซักถามตัวเองเกี่ยวกับไอเดียนั้น
เราข้ามงานวิจัยและโปรโตไทป์ไปได้ แต่เราเปลี่ยนไอเดียเป็น PRD เป็นเอกสารจุดหมายปลายทาง จากนั้นเปลี่ยน PRD เป็น Kanban board และทุกขั้นตอนเหล่านั้นผ่านการตรวจสอบโดยมนุษย์ และตอนนี้ถึงขั้น implementation เราถอยออกมา และปล่อยให้เอเจนต์ทำงานผ่าน Kanban board นั้น หรือเอเจนต์หลายตัวทำงานผ่าน Kanban board นี่หมายความว่า ใช่ เราทุ่มเวลาไปกับการวางแผนเยอะมาก แต่หมายความว่าเราได้จัดคิวงานให้เอเจนต์ไว้เพียบ เรามองมันได้เหมือนกะกลางวันกับกะกลางคืน นี่คือกะกลางวันของมนุษย์ ใช่ไหม?
วางแผนทุกอย่าง เตรียมของให้พร้อม แล้วพอเราส่งต่อให้กะกลางคืน AI ก็ทำงานแบบ AFK ได้เลย แต่หน้าตามันเป็นยังไง? ผมจะ... โอ้ ใช่ ปล่อยมันไปเถอะ สมบูรณ์แบบ นี่คือหน้าตาของมัน ถ้าเราไปที่แบบฝึกหัดถัดไป ซึ่งจริงๆ แล้วเป็นแบบฝึกหัดสุดท้าย คือการรัน AFK agent ของคุณ ผมตั้งชื่อมันว่า Ralph เพราะมันคือ Ralph loop จริงๆ และพรอมป์นี้ ผมอยากไล่ดูอย่างละเอียด
สิ่งแรกที่มันทำคือ เราจะรัน Claude และพยายามกระตุ้นให้มันทำงานแบบ AFK เต็มรูปแบบ เดี๋ยวผมจะให้ดูสคริปต์ของมัน ถ้าคุณดูในไฟล์ once.sh ใน repo เราจะเห็นว่ามันเป็นแค่ bash script ที่เราดึง issues ทั้งหมด ซึ่งอยู่ในไฟล์ markdown มาวางรวมไว้ในตัวแปรท้องถิ่น
ตัวแปร issues นั้นเก็บ issues ทั้งหมดใน backlog (คิวงานค้าง) ของเรา จากนั้นดึงห้า commits ล่าสุด เดี๋ยวจะอธิบายว่าทำไม แล้วก็ดึงพรอมป์มา แล้วรัน Claude Code ด้วยโหมดสิทธิ์ accept edits แล้วก็ส่งข้อมูลทั้งหมดให้มัน นี่คือหน้าตาของ implementer (ตัวลงมือทำ) นี่คือเวอร์ชันที่เรียบง่ายมากของ loop แบบนี้ และแน่นอนว่านี่ไม่ใช่ loop นี่คือการรันครั้งเดียว loop อยู่ในเวอร์ชัน AFK ด้านบน ซึ่งซับซ้อนกว่าเยอะ
และส่วนสำคัญคือ เรารันมันใน Docker sandbox (แซนด์บ็อกซ์ Docker) ด้วย ผมไม่อยากให้คุณติดตั้ง Docker บนแล็ปท็อป เพราะเราจะต้องดาวน์โหลดอิมเมจพิเศษ และเราจะทำให้ Wi-Fi ของงานประชุมล่มถ้าทำแบบนั้น ผมจะสาธิตให้ดู แต่คุณไม่จำเป็นต้องรันเอง ผมจะอธิบายในอีกสักครู่ โดยพื้นฐานแล้ว once loop ตรงนี้ แบ้มๆๆๆ คือเราแค่รันเวอร์ชันหนึ่งของสิ่งที่เราจะวน loop ซ้ำแล้วซ้ำเล่า
นี่คือเวอร์ชัน human in the loop และมันจำเป็นมาก การรันซ้ำแล้วซ้ำเล่าเป็นสิ่งจำเป็น เพราะคุณจะได้เห็นว่าเอเจนต์ทำอะไร และทำงานจบยังไง และถ้าต้องปรับแต่งพรอมป์เพิ่มเติม คุณก็ทำได้ มาดูพรอมป์กัน "ไฟล์ issues ในเครื่องถูกส่งเข้ามา คุณจะทำงานเฉพาะ issues แบบ AFK เท่านั้น" สมเหตุสมผล "ถ้างาน AFK ทั้งหมดเสร็จสิ้น ให้ output ข้อความว่าไม่มีงานเหลือ" และสิ่งถัดไปคือ เลือกงานถัดไป
สิ่งที่เราทำตรงนี้คือการรัน backlog หรือคัดสรร backlog ที่ AFK agent ของเราจะมาหยิบงานไป นั่นคือจุดประสงค์ของการตั้งค่าทั้งหมดตั้งแต่แรก ตั้งแต่ต้นจนถึง Kanban board ตรงนี้ เราแค่สร้าง backlog ของงานสำหรับกะกลางคืนมาหยิบ และกะกลางคืน หรือพรอมป์ Ralph นี้ มีแนวคิดของตัวเองว่างานแบบไหนที่ดีควรหยิบต่อไป ผมพูดถึงเรื่อง parallelization ไปแล้ว และเดี๋ยวจะโชว์ให้ดูทีหลัง แต่นี่คือ loop แบบเรียงลำดับ
เราจะรันทีละหนึ่ง coding agent นี่เป็นวิธีที่ดีในการเริ่มหัดลงน้ำ เอเจนต์จะจัดลำดับความสำคัญเป็น การแก้บั๊กวิกฤต โครงสร้างพื้นฐานสำหรับพัฒนา จากนั้น trace bullets ตามด้วยการขัดเกลา งานที่ได้เร็ว (quick wins) และ refactor (การปรับโครงสร้างโค้ด) จากนั้นก็มีคำสั่งง่ายๆ เกี่ยวกับวิธีทำงานให้เสร็จ "สำรวจ repo ใช้ TDD เพื่อทำงานให้เสร็จ" เดี๋ยวจะพูดถึงเรื่องนั้นทีหลัง แล้วเราก็รัน feedback loop บางอย่าง มาลองกัน ดูว่าจะเกิดอะไรขึ้น ดี มันสร้างไฟล์ issues แล้ว พร้อมไปต่อได้เลย
ผมจะยกเลิกอันนี้ ล้างแล้วรัน... อยู่ไหนนะ? Ralph once.sh และถ้าคุณกำลังทำตามอยู่ ก็ทำแบบเดียวกันได้เลย เราจะเห็นว่ามันรัน Claude ในนี้พร้อมพรอมป์และ issues ทั้งหมดที่ส่งเข้าไป ระหว่างที่มันทำงาน คุณอาจมีคำถามเกี่ยวกับการตั้งค่านี้ และการตัดสินใจของผมที่จะมอบหมายงานเขียนโค้ดทั้งหมดให้ AI ใช่ไหม? มาทำ Q&A เร็วๆ ระหว่างที่มันเริ่มทำงานกัน โอเค อ่าๆๆ ผมจะลบพวกนั้นทิ้ง
"คุณเก็บการตัดสินใจเชิงลบ สิ่งที่คุณตัดสินใจไม่เอา และเหตุผล ไว้ยังไง ตอนที่บันทึกผลจากเซสชัน grill me?" คำถามดีมาก คำตอบง่ายมาก คือในส่วน write a PRD ของ PRD จะมีหัวข้ออยู่ด้านล่าง เป็นส่วนของสิ่งที่อยู่นอกขอบเขต (out of scope) คือสิ่งที่เราจะไม่จัดการใน PRD นี้ ซึ่งสำคัญมากสำหรับการให้นิยามความสำเร็จ ถ้ามีคำถามเพิ่มเติมก็ถามใน Slido ได้เลย "เวิร์กโฟลว์ฟรอนต์เอนด์ของผมคืออะไร?" โอเค คำถามดีมาก
ผมจะตอบคำถามนั้นในอีกสักครู่ "จะจัดการยังไงกับเอเจนต์ที่สร้างโค้ดมากเกินกว่าที่เราจะ review ไหว? จะ parallelize และใช้เอเจนต์หลายตัวอย่างถูกวิธีแยกกันยังไง?" โอเค นั่นเป็นสองคำถาม ยกมือขึ้นถ้ารู้สึกว่าตอนนี้คุณทำ code review (ทบทวนโค้ด) มากกว่าเดิม ใช่ แน่นอน ผมไม่คิดว่ามีทางเลี่ยง ถ้าเรามอบหมายงานเขียนโค้ดทั้งหมดให้เอเจนต์ คุณจะสังเกตว่า implementation คือส่วน AFK เพียงส่วนเดียวจริงๆ เรายังต้อง QA งานและ code review งานด้วย ใช่ไหม?
และถ้าเรารัน loop แบบนี้ ที่มันจะ implement สี่ issues ในรอบเดียว มันก็ขัดกับหลักที่ว่า pull requests ควรเล็กและเป็นอิสระต่อกัน ใช่ไหม? pull requests เล็กๆ ที่เป็นอิสระต่อกัน หมายความว่าคุณต้องวน loop น้อยลง หรือ loop สั้นลง หรือบางทีอาจทำ PR เป็นกองใหญ่ๆ แต่ก็ดูแย่เหมือนกัน นั่นก็ยังเป็นโค้ดที่แยกกันให้ review เพิ่มขึ้น ผมยังไม่รู้คำตอบของเรื่องนี้จริงๆ ผมคิดว่าเราต้องเตรียมใจที่จะทำ code review มากขึ้น ซึ่งไม่สนุกเลย
การพูดแบบนั้นไม่สนุกเลย ผมไม่รู้สิ ผมไม่ค่อยสบายใจที่พูดแบบนั้น แต่ผมคิดว่าน่าจะเป็นทิศทางที่กำลังไป คำถามดีมาก ขอถามจากในห้องบ้างได้ไหม? เราไม่ใช้ไมค์ แต่ยกมือถ้ามีคำถามถามผมตอนนี้ ใช่ "แนวทางนี้เป็นเส้นตรงมาก ตั้งแต่ไอเดียไปจนถึง QA และ code review แน่นอนว่าโลกความจริงมันยุ่งเหยิงกว่านั้นมาก คุณมีไอเดียหลายอย่างที่ดำเนินคู่ขนานกัน และไม่มีใครเห็นภาพทั้งหมด"
และระหว่างที่คุณทำงานบางอย่างอยู่ ก็มีอย่างอื่นเข้ามาเป็นบั๊ก คุณจัดการกับความยุ่งเหยิงยังไง? ทำยังไงให้ feedback loop แน่นขึ้น? คำถามดีมาก คำถามคือ ถ้าเรื่องนี้ดูดีสำหรับนักพัฒนาคนเดียว แต่จะ implement ในทีมยังไง? จะรวบรวม feedback จากทีมยังไง? คำตอบของผมคือ ถ้าคุณมีไอเดียอยู่บนนั้น เส้นทางจากไอเดียไปสู่จุดหมายเป็นสิ่งที่คุณต้องคิดร่วมกับทีม ใช่ไหม?
ทุกอย่างที่อยู่บนนี้ มันเป็นเรื่องของทีม เข้าใจที่ผมหมายถึงไหม? ถ้าคุณมีไอเดีย แล้วทำเซสชัน grilling กับมัน แล้วมีคำถามที่ตอบไม่ได้ คุณต้องดึงทีมเข้ามาในวงวนอย่างที่เราอธิบายไปก่อนหน้า บางทีคุณอาจต้องบอกว่า "โอเค เราต้องสร้างโปรโตไทป์ของสิ่งนี้ เราต้องลองทำจริง เราต้องการของที่ผู้เชี่ยวชาญโดเมนจะได้ลองเล่น" หรือ "โอเค เราอาจต้อง integrate ไลบรารีของบริษัทอื่นเข้ามา เราอาจต้องทำงานวิจัย"
เราอาจต้องโยนความคิดไปมา และหา service ของบริษัทที่สามที่เราใช้ประโยชน์ได้มากที่สุด เราอาจต้องนำข้อมูลที่เก็บได้กลับไปที่เฟสไอเดีย ดังนั้น ตลอดเส้นทางจนถึง PRD นั่นคือสิ่งที่คุณต้องให้ทีมมีส่วนร่วม นั่นคือจุดที่ asset เหล่านี้จะถูกแชร์ต่อ และจะมีคำขอความคิดเห็น (requests for comments) กับมัน และ loop นั้นก็จะบดไปเรื่อยๆ จนกว่าคุณจะรู้ว่าจะไปทางไหน
พอคุณรู้ว่าจะไปทางไหนแล้ว คุณถึงเริ่มทำ Kanban board และ implementation ได้ แต่นี่เป็นเรื่องที่ถกเถียงกันได้มาก และคุณจะเด้งไปมาระหว่างเฟสต่างๆ เข้าใจไหม? ใช่ "คุณไม่ต้องการ PRD สำหรับโปรโตไทป์เหรอ?" พูดอีกทีได้ไหม ขอโทษ "คุณไม่อยากมี PRD สำหรับโปรโตไทป์ของคุณเหรอ?" คำถามคือ คุณอยากผ่านกระบวนการทั้งหมดนี้เพื่อสร้างโปรโตไทป์เฉยๆ เหรอ? คุณไม่จำเป็นต้องมี PRD สำหรับโปรโตไทป์ ขอพูดถึงโปรโตไทป์สักครู่
มีคำถามว่า ทำยังไงให้วิธีนี้ใช้กับฟรอนต์เอนด์ได้? เพราะฟรอนต์เอนด์ไวต่อสายตามนุษย์มาก คุณต้องมีสายตามนุษย์มองฟรอนต์เอนด์ตลอดเวลาเพื่อให้แน่ใจว่ามันดูดี AI ไม่มีตา มันดูโค้ดได้ แต่ฟรอนต์เอนด์เป็นสิ่งที่ต้องมองหลายมิติ (multimodal)
จากประสบการณ์ของผมในการลองต่อ AI เข้ากับ agent browser หรือ Playwright MCP (โปรโตคอลที่ให้โมเดลเรียกใช้เครื่องมือ) เพื่อให้มันมีเครื่องมือมองผ่านฟรอนต์เอนด์และดูภาพ แต่จากประสบการณ์ มันยังไม่เก่งเรื่องนั้นเท่าไหร่ และมันสร้างฟรอนต์เอนด์ที่สวยงามในโค้ดเบสที่โตเต็มที่ไม่ได้ มันทำได้แค่พ่นๆ ออกมา แต่สิ่งที่มันทำได้คือ คุณบอกว่า "โอเค ผมอยากได้ไอเดียว่าฟรอนต์เอนด์นี้ควรหน้าตาเป็นยังไง
สร้างโปรโตไทป์สามแบบให้ฉัน สลับดูได้ใน route แบบทิ้งขว้าง (throwaway route) แล้วฉันจะตัดสินใจว่าอันไหนสวยที่สุด" แล้วคุณก็นำ asset ของโปรโตไทป์นั้นกลับเข้าไปในเซสชัน grilling หรือขอ feedback กับมัน อะไรแบบนั้น ตอบคำถามคุณได้ไหม? โปรโตไทป์มันก็แค่ของที่เละๆ มันมีไว้เพื่อให้คุณได้ feedback เร็วขึ้นในกระบวนการ นั่นคือวิธีที่ดีในการทำงานกับโค้ดฟรอนต์เอนด์ และเป็นวิธีที่ดีในการมองสถาปัตยกรรมซอฟต์แวร์โดยรวม ขออีกหนึ่งคำถาม
ใช่ >> [กระแอม] >> "ในระบบของคุณ คุณ integrate การเคารพสถาปัตยกรรมและการออกแบบกับ API contracts (สัญญา API) และการเข้ากับระบบที่ใหญ่กว่าได้ยังไง? ข้อจำกัดด้านความปลอดภัย ข้อจำกัดทุกประเภทแบบนั้น" ใช่ คำถามนี้มีอะไรเยอะแยะ คำถามคือ คุณทำให้มันสอดคล้องกับสถาปัตยกรรมเดิมยังไง? ทำยังไงให้มันเป็นไปตามมาตรฐานโค้ดของโค้ดเบสคุณ หรือสถาปัตยกรรม การออกแบบ API กฎความปลอดภัยที่จำกัดการออกแบบของคุณ ใช่ ผมจะตอบเรื่องนั้นอีกสักครู่ โอเค
หวังว่าเราจะเริ่มมีอะไรเดือดปุดๆ แล้ว มันกำลังอยู่ในเฟสสำรวจ อืม อยากเริ่มรันแบบ AFK เลยจัง บางทีอาจทำ บางทีอาจไม่ทำ สิ่งที่มันทำคือสำรวจ repo จากนั้นจะเริ่ม implement ตามที่เราต้องการ ขออีกหนึ่งคำถามระหว่างที่มันรันอยู่ ใช่ "ทำไมไม่ให้ AI QA ทุกอย่างเลยล่ะ?" คำถามคือ ทำไมคุณไม่ให้ AI ทำ QA? AI มาทำ QA ผมเพิ่งเจอศัพท์เทคนิคทะลักเข้าหัวไปแป๊บหนึ่ง ทำไมคุณไม่ให้ AI ทดสอบโค้ดของตัวเอง? แน่นอนว่าคุณทำได้ และระหว่างที่มันกำลังทำ ระหว่างที่มันเดือดปุดๆ อยู่ตรงนี้ โอเค มันเห็นภาพโค้ดเบสชัดเจนแล้ว มันกำลังประเมิน issues มันเลือกทำ issue 02 เป็นงานถัดไป เดี๋ยวผมจะโชว์ให้ดูอีกที เพราะคุณควรทำขั้นตอน review แบบอัตโนมัติเป็นส่วนหนึ่งของ implementation อย่างแน่นอน พอมี implementation แล้ว เพราะ token ราคาถูกและ AI เก่งเรื่องการ review มาก คุณควรให้มัน review โค้ดของตัวเองก่อน แล้วค่อย QA
ผมพบว่ามันจับบั๊กได้เยอะมาก และวิธีที่มันทำงานคือ ขอวาดไดอะแกรมเล็กๆ ถ้าคุณมีการ implement ที่ใช้ token ไปเยอะในโซนฉลาด แล้วให้มันลอง review ต่อเนื่อง มันจะ review ในโซนโง่ ดังนั้นผู้ review จะโง่กว่าตัวที่ implement จริงๆ ถ้าเราจินตนาการว่านี่คือ... ขอให้สอดคล้องกันหน่อย นั่นคือ review นั่นคือ implementation
ในขณะที่ถ้าคุณล้าง context คุณจะสามารถ review ในโซนฉลาดได้ ซึ่งเป็นที่ที่คุณอยากอยู่ มาดูกันว่า implementation ของเราเป็นยังไง โอเค ดี มันกำลังสร้าง migration (ไฟล์ย้ายฐานข้อมูล) ดูดีทีเดียว เราได้โค้ดพ่นออกมาแล้ว และระหว่างที่ผม... อ่า เอาล่ะ TDD มาพูดถึง TDD กัน แล้วคิดว่าเราจะพักเบรกอีกสักหน่อย TDD ผมพบว่าจำเป็นสุดๆ ในการดึงศักยภาพจากเอเจนต์ ยกมือขึ้นถ้ารู้ว่า TDD คืออะไร เจ๋ง โอเค TDD คือ test-driven development (การพัฒนาแบบเขียนเทสต์ก่อน)
สิ่งที่มันทำคือสิ่งที่เรียกว่า red-green-refactor (แดง-เขียว-รีแฟกเตอร์) และถ้าคุณดูในโค้ดเบส คุณจะพบ skill ที่อธิบายวิธีทำ red green refactor และสอน AI ว่าต้องทำยังไง สิ่งที่มันทำคือเขียนเทสต์ที่ต้องล้มเหลวก่อน มันบอกว่า "โอเค ผมแยกย่อยแนวคิดที่กำลังทำ แล้วจะเขียนเทสต์เดี่ยวๆ ที่ล้มเหลว จากนั้นต้องทำให้ implementation ผ่านเทสต์" ผมพบว่า อย่างแรก มันเพิ่มเทสต์เข้าไปในโค้ดเบส และมักเป็นเทสต์ที่ดี
เรามี gamification service แบบนี้ มันดูเหมือนใช้ของเดิมที่มีอยู่เพื่อสร้างเทสต์ฐานข้อมูล เทสต์ล้มเหลวเพราะโมดูลยังไม่มี โอเค เรายืนยันสถานะแดงแล้ว จากนั้นมันก็ไปรันและหวังว่ามันจะผ่าน ยกมือขึ้นถ้าเคยเจอ AI เขียนเทสต์ห่วยๆ ใช่ มันมักจะพยายามโกงเทสต์ เพราะมันทำแบบเป็นชั้นๆ มันจะทำ implementation ทั้งหมดก่อน แล้วค่อยทำเลเยอร์เทสต์ทั้งหมดตามลงมา ผมจะตอบว่า ใช่ คุณใช้ NPX vitest ได้
และด้วยเทคนิคนี้ การโกงทำได้ยากขึ้นมาก เพราะมันต้องสร้างเครื่องมือวัด (instrument) โค้ดก่อน แล้วค่อยเขียนโค้ด ผมเลยพบว่า TDD ดีมากๆ สำหรับที่ที่ทำได้จริง ที่จริงมันดีขนาดที่ผมบิดเทคนิคทั้งหมดของผมเพื่อให้ TDD ทำงานได้ดีขึ้น ผมเห็นสายตาที่เริ่มเคลิ้ม มันร้อนมากในนี้ คุณนึกภาพไม่ออกว่าบนเวทีร้อนแค่ไหน พักเบรกอีก 5 นาทีดีกว่า กลับมาเวลาสี่สิบห้านาที น่าจะได้ พักให้เต็มที่เลย
แล้วเราจะกลับมาอีกทีในราว 6-7 นาที แล้วผมจะพูดถึงวิธีคิดเรื่องโมดูล การสร้างโค้ดเบสให้สิ่งนี้เป็นไปได้ ผมเพิ่งเล่นกับ AI ตรงนี้ และเราได้ commit มาหนึ่งอัน มีของให้ทดสอบแล้ว issue หมายเลขสองเสร็จแล้ว นี่คือสิ่งที่ทำไป นี่คือหน้าตาตอน Ralph loop เสร็จสมบูรณ์ คือคุณจะได้บทสรุปเล็กๆ และตอนนี้เรามีของที่สามารถ QA ได้
เพราะเราทำ feedback loops เพราะเราทำ trace bullets เพราะเราบอกว่า "โอเค ให้ของที่ review ได้ตอนจบหน่อย" เราก็เข้าไป QA ได้ทันที ไม่มีอะไรน่าเบื่อเท่าการดูคนอื่น QA แล้ว หวังว่าเราจะได้ลองเล่นกันบ้าง ขอเช็กว่ามันทำงานได้ไหม ที่จริง ก่อนไปตรงนั้น ผมอยากไล่ดูว่าเกิดอะไรขึ้นบ้าง คือเราเห็นว่ามันสร้างของบางอย่างบนแดชบอร์ด แล้วมันก็รัน feedback loops คือรันเทสต์และเช็ก types
TDD สำคัญมากแน่นอน และมันสำคัญเพราะ feedback loops เหล่านี้จำเป็นต่อ AI จำเป็นต่อการให้ AI ผลิตอะไรที่สมเหตุสมผล เพราะถ้าไม่มีมัน AI จะเขียนโค้ดแบบมืดบอดสนิท ถ้าโค้ดเบสของคุณไม่มี feedback loops คุณจะไม่มีวันได้ output ที่ดีจาก AI และบ่อยครั้งคุณจะพบว่า คุณภาพของ feedback loops คือตัวกำหนดว่า AI เขียนโค้ดได้ดีแค่ไหน นั่นคือเพดาน
ถ้าคุณได้ output แย่ๆ จาก AI คุณมักต้องเพิ่มคุณภาพของ feedback loops เดี๋ยวเราจะพูดถึงวิธีทำในอีกสักครู่ ตอนนี้มันรัน npm run test และ npm run type check มันเจอ type error หนึ่งตัว และต้องแก้ด้วย TypeScript magic สักหน่อย ดีมาก ใช่ type ของ level threshold เป็น number โอเค คุณเห็นไหมว่าทำไมผมถึงเลิกสอน TypeScript เพราะตอนนี้ AI รู้ทุกอย่างแล้ว มันรันเทสต์แล้วผ่าน ดูดีมาก ตอนนี้เรามีเทสต์ 284 ตัวใน repo นี้ ดีทีเดียว ผมพบว่าฟรอนต์เอนด์ทดสอบยากจริงๆ ในโครงการนี้
เราทดสอบแค่ service เป็นหลัก เราสร้าง gamification service ขึ้นมา ถ้าดูตรงนี้ แล้วก็มีเทสต์สำหรับ service นั้น คุณจะเห็น service กับเทสต์ของมัน ถ้าผมกำลังทำ code review ผมจะเริ่มจาก review เทสต์ก่อน ให้แน่ใจว่าเทสต์ตรวจสอบสิ่งที่สมเหตุสมผล แล้วค่อย review ตัวโค้ดเพื่อให้แน่ใจว่ามันไม่ได้ทำอะไรเพี้ยนเกินไป สิ่งสำคัญคือผมต้องดูแดชบอร์ดจริงๆ ผมจะล็อกอินเป็นนักเรียน โอ้ ถ้ามันยอมให้ล็อกอิน
บางทีมันอาจไม่ยอม ไม่เอาน่าเพื่อน เอาล่ะ ล็อกอินเป็น Emma Wilson เข้าไปที่ courses สมมติว่าผมมีคอร์ส Introduction to TypeScript กดเรียนต่อ ใช่ ผมเรียนบทเรียนนี้จบแล้ว แล้วมีอะไรบางอย่างผิดพลาด ผมเดาว่าเพราะผมไม่มี... เออเร่อ SQLite ผมไม่มีตารางที่ถูกต้อง ผมต้องมีตาราง point events point events เป็นชื่อตารางที่แปลกมาก ไม่รู้ว่ามันคิดอะไรอยู่ ขอพักก่อน รัน npm db:migrate หรือ push ผมจำไม่ได้ว่าอันไหน แต่คุณคงพอเข้าใจใช่ไหม?
ผมจะไม่ทรมานคุณด้วยการดูผมทำ QA เพราะมันน่าเบื่อมาก แต่ ณ จุดนี้ ผมจะกลับเข้าไป ขอเปิดโปรเจกต์กลับมา และผมจะ... นี่คือช่วงเวลาสำคัญ และสำคัญมากที่จะต้อง QA ด้วยมือตรงนี้ เพราะ QA โอ้ ไม่ๆ เกิดอะไรขึ้น? เอาล่ะ QA คือวิธีที่ผมยัดเยียดความคิดเห็นของผมกลับเข้าไปในโค้ดเบส วิธีที่ผมยัดเยียดรสนิยมของผม สิ่งที่คุณมักพบคือ มีทีมที่พยายามทำให้ทุกอย่างอัตโนมัติ ทุกส่วนของกระบวนการนี้
และถ้าคุณลองทำให้การสร้างไอเดียอัตโนมัติ ทำให้ QA อัตโนมัติ ทำให้งานวิจัยอัตโนมัติ ทำให้โปรโตไทป์อัตโนมัติ คุณจะได้แอปที่ผมรู้สึกว่าขาดรสนิยมและแย่ บางทีมันไม่ทำงาน หรือทำงานไม่ตรงตามที่ตั้งใจ หรือมันไม่มี... คุณต้องมีสัมผัสของมนุษย์ในการสร้างสิ่งเหล่านี้ เพราะถ้าไม่มี คุณจะได้แค่ของเละๆ (slop) และเราที่นี่ไม่ได้ผลิตของเละๆ เราพยายามผลิตของที่มีคุณภาพสูง นั่นคือจุดประสงค์ของ QA ในส่วนสุดท้ายนี้ผมจะทำสองอย่าง
อย่างแรกคือ ผมจะบอกวิธี... ในใจคุณอาจมีคำถามว่า สมมติผมมีโค้ดเบสที่กำลังทำงานด้วย และมันเป็นโค้ดเบสที่แย่ ซับซ้อนมาก AI ไม่เคยทำงานในนั้นได้ดี และจริงๆ แล้วมนุษย์ส่วนใหญ่ที่เข้าไปในโค้ดเบสนั้นก็ทำงานไม่ดีเหมือนกัน จะปรับปรุงโค้ดเบสนั้นยังไง? และอย่างที่สองคือ ผมจะโชว์การตั้งค่าสำหรับ parallelization ของผม เริ่มจากโค้ดที่แย่ก่อน อยู่ไหนนะ? ไดอะแกรมอยู่ไหน? นี่ไง
ในหนังสือ The Philosophy of Software Design ของ John Ousterhout เขาพูดถึงโมดูลในอุดมคติ ลองจินตนาการว่าคุณมีโค้ดเบสหน้าตาแบบนี้ แต่ละบล็อกคือไฟล์เดี่ยวๆ และไฟล์เหล่านี้ export สิ่งต่างๆ ออกมา มีสิ่งที่คุณดึงจากไฟล์ไปใช้ในสิ่งอื่น คุณอาจมี dependency แปลกๆ ที่ไฟล์นี้พึ่งพาไฟล์นี้ หรือพึ่งพาไฟล์นั้น
ถ้าไฟล์เหล่านี้เล็กและไม่ค่อย export อะไรมากมาย John Ousterhout จะเรียกมันว่า shallow modules (โมดูลตื้น) พวกมันจะดูประมาณนี้... ไม่ ไม่ใช่ ฉันวาดไดอะแกรมสวยๆ ไม่ได้ พวกมันคือก้อนเล็กๆ มากมายมหาศาล ซึ่งยากที่ AI จะสำรวจ เพราะมันไม่เข้าใจความสัมพันธ์ระหว่างทุกสิ่งจริงๆ มันหาว่าอะไรอยู่ตรงไหนไม่เจอ มันต้องไล่ตามกราฟทั้งหมดด้วยมือ แล้วบอกว่า "โอเค อันนี้พึ่งพาอันนี้
อันนี้พึ่งพาอันนี้ อันนี้พึ่งพาอันนี้" แล้วมันก็ยากที่จะทดสอบด้วย เพราะคุณจะขีดเส้นขอบเขตการทดสอบ (test boundaries) ตรงไหน? คุณจะทดสอบแต่ละโมดูลแยกกันไหม? ขีดเส้นขอบเขตการทดสอบ... ไม่ อย่าทำแบบนั้น รอบอันนี้? แล้วก็เส้นอีกอันรอบอันถัดไป แล้วก็อันถัดไป? หรือคุณควรรวมกลุ่มใหญ่ๆ?
คุณจะบอกว่า "โอเค เราจะทดสอบโมดูลที่เกี่ยวข้องกันทั้งหมดนี้ด้วยกัน แล้วก็หวังและอธิษฐานว่ามันจะทำงาน" >> [ถอนหายใจ] >> นี่หมายความว่า ถ้าผมคิดว่าเทสต์ที่แย่ๆ ส่วนใหญ่หน้าตาแบบนั้น คือ AI พยายามห่อทุกฟังก์ชันเล็กๆ ด้วยขอบเขตการทดสอบของมันเอง แล้วก็แค่ทดสอบว่ามันทำงานเดี่ยวๆ
แต่ผลที่ตามมาคือ สมมติว่าโมดูลตรงนี้เรียกสองโมดูลนั้น มันพึ่งพาทั้งสองตัว โมดูลนี้อาจเรียกใช้ฟังก์ชันผิดลำดับ หรืออาจมีอะไรในโมดูลที่น่าสงสารนั้นที่ควรทดสอบแยกต่างหาก แล้วถ้าคุณห่อมันด้วยขอบเขตการทดสอบ คุณจะทำยังไง? คุณจะ mock (จำลอง) อีกสองโมดูลไหม? มันทำงานยังไง? ดังนั้น การหาวิธีสร้างโค้ดเบสที่ทดสอบง่ายจึงเป็นสิ่งจำเป็น
เพราะถ้าโค้ดเบสทดสอบง่าย feedback loops ของเราจะดีขึ้น และ AI จะทำงานได้ดีขึ้นในโค้ดเบสของเรา เข้าใจไหม? แล้วโค้ดเบสที่ดีหน้าตาเป็นยังไง? ไม่ใช่แบบนั้น มันเป็นแบบนี้ คือมีสิ่งที่ John Ousterhout เรียกว่า deep modules (โมดูลลึก) โมดูลที่มีอินเทอร์เฟซเล็กๆ ข้างนอก เปิดเผยอินเทอร์เฟซที่เล็กและเรียบง่าย แต่ข้างในมีฟังก์ชันการทำงานมากมาย นี่หมายความว่าพวกมันทดสอบง่าย เพราะคุณแค่... สมมติว่ามี dependency ระหว่างอันนี้กับอันนี้
ลูกศรผมใช้ได้ไหม? ใช่ เอาล่ะ แล้วสิ่งที่คุณทำคือ ขีดเส้นขอบเขตการทดสอบขนาดใหญ่รอบโมดูลนั้น รอบอันนี้ข้างบน แล้วคุณจะจับของดีๆ ได้เยอะ เพราะมีฟังก์ชันการทำงานมากมายที่คุณทดสอบ และผู้เรียกใช้ (caller) คนที่เรียกโมดูล จะมีอินเทอร์เฟซง่ายๆ ให้ใช้งาน ไม่ยากเกินไป เข้าใจไหม? deep modules เทียบกับ shallow modules อันนี้ดี เวอร์ชันตื้นๆ แบบนี้แย่
และสิ่งที่ผมพบคือ ถ้าไม่มีการช่วยเหลือ หรือถ้าคุณไม่จับตาดู AI อย่างใกล้ชิด มันจะผลิตโค้ดเบสหน้าตาแบบนี้ คุณต้องระวังให้มากๆ ตอนที่คุมมัน และนั่นคือเหตุผลที่ ถ้าเรามองเข้าไปใน PRD PRD หายไปไหน? มันอยู่ใน issues ใน gamification system หาไม่เจอ แน่นอนสิว่าหาไม่เจอ นี่ไง แล้วในนี้ผมมี data model โมดูลต่างๆ มันระบุชัดเจนว่า "โอเค gamification service นี้เป็น deep module ใหม่ ซึ่งเราจะทดสอบรอบมัน
มันจะมีอินเทอร์เฟซแบบนี้โดยเฉพาะ และมันจะมี... โอเค เรากำลังแก้ progress service ด้วย กำลังแก้ lesson route กำลังแก้ dashboard route อะไรพวกนี้ ผมระบุโมดูลที่กำลังแก้อย่างเฉพาะเจาะจงมาก และทำให้แน่ใจว่าผมเก็บแผนที่โมดูล (module map) ไว้ในหัวตลอดเวลา ทั้งระหว่างวางแผนและระหว่าง implementation เข้าใจไหม? มีประโยชน์มากๆ และยังมีประโยชน์อีกเหตุผลหนึ่งด้วย ไม่เพียงแต่ทำให้แอปของคุณทดสอบง่ายขึ้น แต่คุณยังได้เล่นกลทางความคิดเล็กๆ
ขอเติมน้ำก่อน ในระหว่างที่คุณรอฟังว่ามันคืออะไร ขอถามจากพวกคุณหน่อย ยกมือขึ้นถ้ารู้สึกว่าทำงานหนักกว่าเดิมมากกับ AI ใช่ ยกมือขึ้นถ้ารู้สึกว่ารู้จักโค้ดเบสของตัวเองน้อยกว่าเมื่อก่อน ใช่ นี่คือเรื่องจริง เพราะเราเคลื่อนที่เร็ว เพราะเรามอบหมายงานมากขึ้น เราจึงสูญเสียความรู้สึกต่อโค้ดเบส และถ้าเราสูญเสียความรู้สึกต่อโค้ดเบส เราจะไม่สามารถปรับปรุงมันได้ และเรากำลังมอบรูปร่างของมันให้ AI จริงๆ
ผมไม่คิดว่านั่นเป็นสิ่งที่ดี แล้วเราจะทำยังไงให้เคลื่อนที่เร็วพร้อมกับเก็บพื้นที่ในสมองไว้พอ? ผมว่านี่คือหนทาง เพราะสิ่งที่คุณทำตรงนี้ ไม่เพียงแต่คุณคิดถึงการสร้างรูปทรงใหญ่ๆ ในโค้ดเบส service ใหญ่ๆ สิ่งที่ผมคิดว่าคุณควรทำคือ ออกแบบอินเทอร์เฟซของโมดูลเหล่านี้ แล้วมอบหมายการ implement ให้คนอื่น
พูดอีกแบบคือ โมดูลเหล่านี้กลายเป็นกล่องเทา (gray box) ที่คุณแค่ต้องรู้รูปทรงของมัน ต้องรู้ว่ามันทำอะไร รู้พฤติกรรมของมัน แต่คุณมอบหมายการ implement ภายในมันได้ ผมพบว่านี่ดีมาก ผมไม่จำเป็นต้อง code review ทุกอย่างในโมดูลนั้น ผมไม่จำเป็นต้องรู้ทุกอย่างว่ามันทำอะไร ผมแค่ต้องรู้ว่ามันมีพฤติกรรมแบบหนึ่งภายใต้เงื่อนไขบางอย่าง และมันทำหน้าที่ของมัน มันเหมือนกับว่า โอเค ผมมีภาพรวมใหญ่ของโค้ดเบส เข้าใจรูปทรงต่างๆ ข้างใน เข้าใจว่าอินเทอร์เฟซทั้งหมดทำอะไร แต่ผมสามารถมอบหมายสิ่งที่อยู่ข้างในได้ ผมพบว่านี่เป็นวิธีที่ดีมากในการรักษาความรู้สึกต่อโค้ดเบสไว้พร้อมกับรักษาสติของตัวเอง เข้าใจไหม? คุณอาจถามว่า จะเปลี่ยนโค้ดเบสแบบนี้ให้เป็นโค้ดเบสแบบนี้ยังไง? จะทำให้โมดูลลึกขึ้นยังไง? เรามี... หวังว่ามันจะอยู่ในนี้ ค่อนข้างแน่ใจว่าอยู่ เรามี skill ที่ชื่อว่า improve code base architecture
ตรงไปตรงมาดี มาลองรันกัน skill นี้จะสแกนโค้ดเบสของเราและมองหาว่ามีอะไรอยู่บ้าง ถ้าคุณกำลังทำแบบฝึกหัดอยู่ก็ลองรันได้เลย มันสำรวจสถาปัตยกรรม สำรวจวิธีทำงานในโค้ดเบสนี้ และจะพยายามหาจุดที่ทำให้โมดูลลึกขึ้นได้ ง่ายๆ สิ่งที่เจ๋งมากที่มันเจอตรงนี้คือ ส่วนหนึ่งของแอป course video manager ของผมคือ video editor ตัวตัดต่อวิดีโอที่ทำงานในเบราว์เซอร์ ซึ่งโหดมาก
มันเป็นงานวิศวกรรมที่หนักหน่อย และผมต้องการวิธีห่อฟรอนต์เอนด์ทั้งหมดจนถึงแบ็กเอนด์เป็นโมดูลใหญ่ก้อนเดียว เพื่อที่ผมจะได้ทดสอบว่าการกดอะไรบางอย่างบนฟรอนต์เอนด์แล้วมันส่งผลไปจนถึงแบ็กเอนด์ ผมหาวิธีได้โดยใช้ discriminated union (ยูเนียนแบบแยกแยะ) ระหว่างสอง type ตรงนี้ ผมใช้ skill นี้เพื่อสร้างโมดูลยักษ์ใหญ่ที่ทดสอบจากภายนอกได้ โครงสร้างพื้นฐานของ video editor นี้
และมันหมายความว่า AI เห็นโฟลว์ทั้งหมด ลงมือกับโฟลว์ทั้งหมด และทดสอบกับโฟลว์ทั้งหมดได้ และจริงๆ แล้ว มันต่างกันเหมือนกลางวันกับกลางคืนในแง่ความสามารถของ AI ในการแก้ไขอะไรจริงๆ เพราะ AI ที่ทำงานกับ video editor ค่อนข้างโหดร้ายถ้าคุณไม่ให้เทสต์ดีๆ กับมัน เอาจริงๆ ถ้าจะให้จำอะไรติดตัวไปจากวันนี้หนึ่งอย่าง ก็ลองรัน skill นี้บน repo ของคุณดู แล้วดูว่าเกิดอะไรขึ้น ไปดู Slido กัน ขอเช็กคำถามสองสามข้อระหว่างที่มันรันอยู่ มาดูกัน "คุณลองใช้ auto mode ของ Claude กับคำสั่ง 'enable auto mode' ไหม?"
วิธีนั้นจะช่วยให้คุณเลี่ยงการเช็กสิทธิ์ (permission checks) ที่ชัดเจนหลายอย่างได้ เดี๋ยวจะพูดถึง permission checks อีกสักครู่ "ผมเก็บแผนและ issues แบบ markdown ไว้ใช้อ้างอิงทีหลังไหม?" โอเค คำถามดีมาก สมมติว่าคุณมีไอเดียดีๆ เปลี่ยนมันเป็น PRD ขึ้นมา แล้ว implement PRD นั้น และ PRD เสร็จสมบูรณ์แล้ว ยกมือขึ้นถ้าคุณเก็บข้อมูลนั้นไว้ใน repo โดยแปลงเป็นไฟล์ markdown ยกมือขึ้นถ้าอยากเก็บมันไว้ เจ๋ง โอเค และยกมือขึ้นถ้าไม่อยากเก็บมันไว้
ถ้าอยากกำจัดมันให้เร็วที่สุด ใช่ ผมว่าคำถามนี้ไม่มีคำตอบชัดเจน สิ่งที่ผมกลัวมากเกี่ยวกับการตัดสินใจเรื่องเอกสารคือ สมมติว่าเรามี PRD สำหรับ gamification system นี้ เราเก็บมันไว้ใน repo เราทำงานต่อไปเรื่อยๆ สมมติหนึ่งเดือนต่อมา เราอยากแก้ไข gamification system แล้วเราเข้าไปกับ Claude และมันเจอ PRD เก่านี้แล้วบอกว่า "ใช่ ฉันเจอเอกสารต้นฉบับของระบบ PRD แล้ว"
แล้วปรากฏว่าโค้ดจริงเปลี่ยนไปจาก PRD เดิมมากจนแทบจำไม่ได้ ชื่อของสิ่งต่างๆ เปลี่ยนไป โครงสร้างไฟล์เปลี่ยนไป แม้แต่ความต้องการ (requirements) ก็อาจเปลี่ยนไป เราอาจเอาไปทดสอบกับผู้ใช้จริงแล้ว นี่คือ doc rot (เอกสารเน่า) คือเอกสารของบางอย่างกำลังเน่าเปื่อยอยู่ใน repo ของคุณ และมีอิทธิพลกับ Claude ในทางที่แย่ หรือกับเอเจนต์ในทางที่แย่ ผมเลยมักไม่เก็บมันไว้ ผมมักกำจัดมันทิ้ง และสำหรับผม เพราะการตั้งค่าของผมใช้ GitHub issues ผมก็แค่ mark เป็น closed (ปิดแล้ว)
มันดึงข้อมูลกลับมาได้ถ้าต้องการ แต่มันมีตัวบ่งชี้ว่าจบแล้ว ผมเลยชอบทิ้งพวกมัน "ความคิดเห็นเกี่ยวกับเฟรมเวิร์ก BEADS ของ Steve?" ผมยังไม่ได้ทดสอบมัน แต่ดูเหมือนเป็นอีกวิธีจัดการ Kanban boards และ issues ดูดีมาก แต่ยังไม่ได้ลอง >> [กระแอม] >> ขอเช็กการตั้งค่าตรงนี้หน่อย ขอถามจากในห้องสองสามคำถาม มีใครมีคำถามเกี่ยวกับสิ่งที่เราครอบคลุมมา ถึงตอนนี้ โดยเฉพาะส่วนสุดท้ายนี้ไหม? ใช่
"ผมว่าคำตอบของคุณเรื่องไฟล์ markdown ที่คุณลบเพราะมันสร้าง doc rot น่าสนใจ แล้ว migration ล่ะ? ไฟล์ migration คุณจะ squash (รวม) มันทีหลังไหม? แบบ database migrations (การย้ายฐานข้อมูล)?" ใช่ ไม่รู้สิ หวังว่าคงตอบคำถามคุณได้ ขอโทษที ไม่ๆ ผมคิดว่า database migrations เป็นคนละเรื่องกัน เพราะคุณมีบันทึกต่อเนื่องว่าอะไรเปลี่ยนไปบ้าง และมันกำหนดผลลัพธ์ได้แน่นอนกว่า และผมว่า... ใช่ มันเป็นการเปรียบเทียบที่น่าสนใจ ไม่แน่ใจเหมือนกัน คุยกันทีหลังนะ นั่นคือวิธีพูดอย่างสุภาพว่า "ผมไม่รู้" ใช่
ใช่ "คุณพูดว่าคุณไม่ลบ PRD คุณพูดว่าคุณไม่ทบทวน PRD เมื่อมันเสร็จแล้ว" ขอโทษนะทุกคน ผมกำลังฟังคำถามของคุณผู้ชายคนนี้อยู่ "คุณเคยลองใช้ deep think อย่าง ChatGPT อะไรแบบนี้ ให้มันดู PRD แล้วบอกว่ามัน..." มันใช้เวลาประมาณหนึ่งชั่วโมง ใช่ คำถามคือ ผมควรพยายาม optimize แผนในช่วงวางแผนช่วงแรกไหม? นี่คือสิ่งที่ผมเห็นคนทำกันเยอะ และเป็นไอเดียที่ดีมาก ตอนที่คุณ... กลับไปที่เฟสต่างๆ กัน
สมมติว่าคุณมีเฟสทั้งหมดนี้ แล้วคุณมาถึงจุดที่คิดทุกอย่างกับ LLM แล้ว เข้าใจแล้วว่าจะไปทางไหน สร้างเอกสารจุดหมายปลายทางของการเดินทางแล้ว แล้วคุณควรจะพยายาม optimize PRD ซ้ำแล้วซ้ำเล่าจนกว่าจะเป็น PRD ที่สมบูรณ์แบบที่สุดเท่าที่จะจินตนาการได้ไหม? ผมว่าไม่มีคุณค่ามากนักในนั้น เพราะผมว่าการเดินทางเป็นแค่การบอกทิศทางคร่าวๆ ว่าคุณอยากไปทางไหน และจุดที่คุณควรทุ่มเททำงานคือ QA
และคุณทำแบบ AFK ได้ด้วย ผมว่า แต่จากประสบการณ์ คุณจะไม่ได้ประโยชน์จากมันมากนัก สิ่งที่สำคัญจริงๆ คือการสร้างความเข้าใจตรงกันกับ AI ซึ่งคุณทำในเซสชัน grilling ตั้งแต่แรก ขออีกหนึ่งคำถาม มีใครอีกไหม? ใช่ "ในเวิร์กโฟลว์ของคุณ ทำยังไงให้มันเขียนโค้ดแบบที่คุณอยากให้เขียน เพื่อที่พอถึงขั้น code review มันจะคุ้นเคย ใช้ไลบรารีที่คุณอยากใช้ ใช่"
จริงๆ เรามีคำถามนี้มาก่อนแล้ว คือจะบังคับมาตรฐานการเขียนโค้ดของคุณกับเอเจนต์ยังไง? จะให้มันเขียนโค้ดแบบที่คุณอยากให้เขียนยังไง? มีสองวิธีหลักๆ คือ... ไม่รู้สิ เอาน่า "push" กับ "pull" ผมหมายถึงอะไร? Push คือการผลักคำสั่งไปให้ LLM เช่น ถ้าคุณใส่บางอย่างใน Claude.md อย่าง "พูดเหมือนโจรสลัด" คำสั่งนั้นจะถูกส่งไปให้เอเจนต์ตลอดเวลา นั่นคือ push จริงๆ คุณกำลังผลัก token ไปให้มัน
ส่วน Pull คือการให้โอกาสเอเจนต์ดึงข้อมูลเพิ่มเติมเอง เช่น skill skill คือสิ่งที่อยู่ใน repo และมีส่วนหัวคำอธิบายเล็กๆ บอกว่า "โอเค เอเจนต์ เธอสามารถดึงอันนี้มาใช้ได้เมื่อต้องการ" ความคิดของผมตอนนี้เกี่ยวกับ code review และมาตรฐานการเขียนโค้ดเป็นแบบนี้ เมื่อคุณมี implementer เกิดอะไรขึ้น? เอาล่ะ Implementer เดี๋ยวจะทำให้มันแดงน้อยลงหน่อย คุณต้องการให้มาตรฐานการเขียนโค้ดพร้อมใช้งานผ่าน pull
ถ้ามันมีคำถาม คุณอยากให้มันหาคำตอบได้เอง แต่ถ้าคุณมี automated reviewer (ผู้ตรวจสอบอัตโนมัติ) ตามหลัง คุณอยากให้มัน push คือผลักข้อมูลนั้นไปให้ผู้ review คุณอยากบอกว่า "นี่คือมาตรฐานการเขียนโค้ดของเรา ตรวจสอบให้แน่ใจว่าโค้ดนี้ทำตามมาตรฐาน" ดังนั้นถ้าคุณมี skill เช่น คุณอยาก push สิ่งนั้นไปให้ผู้ review เพื่อให้ผู้ review มีทั้งโค้ดที่เขียนเสร็จและมาตรฐานการเขียนโค้ดไว้เทียบกัน หวังว่าคงตอบคำถามคุณได้ ที่จริงผมโชว์เวอร์ชันอัตโนมัติของเรื่องนี้ให้ดูได้ด้วย
ใช่ มาทำตอนนี้เลย ระหว่างที่ยังจำได้สดๆ เมื่อไม่นานมานี้ ผมใช้เวลาประมาณหนึ่งอาทิตย์สร้างสิ่งที่เรียกว่า Sandcastle Sandcastle คือ... ผมไม่ค่อยพอใจกับตัวเลือกที่มีอยู่สำหรับการรันเอเจนต์แบบ AFK สิ่งที่มันทำคือ มันคือไลบรารี TypeScript สำหรับรัน loop พวกนี้ คุณมีฟังก์ชัน run ที่สร้าง work tree (ต้นไม้งาน) แซนด์บ็อกซ์มันใน Docker container แล้วให้คุณรันพรอมป์ข้างในนั้น และใน work tree นั้น มันก็เป็นแค่ Git branch คุณมีโค้ดนั้น แล้วค่อย merge ทีหลังได้
ถ้าผมเปิด... มันมีวิธีดูผลลัพธ์ที่ดีมาก และมันให้คุณรัน loop อัตโนมัติแบบนี้ และ parallelize ระหว่างเอเจนต์หลายตัวได้ง่ายมาก ผมจะเข้าไปในไฟล์ Sandcastle ไปที่ main.ts ตรงนี้ มาดูกัน นี่คือแบบที่ผมโชว์ให้ดูตอนแรก ซึ่งเป็นเวอร์ชันของ Ralph loop นี่คือจุดที่เราเปลี่ยนจากแบบเรียงลำดับเป็นแบบขนาน
ตรงนี้เรามี planner (ตัววางแผน) ซึ่งมี plan prompt ที่ดู backlog และเลือกจำนวน issues จำนวนหนึ่งเพื่อทำงานแบบขนาน จำได้ไหมที่ผมโชว์ Kanban board ที่มีความสัมพันธ์แบบบล็อกทั้งหมด? มันคำนวณเฟสทั้งหมดออกมา ตัวนี้จะบอกว่า โอเค สมมติว่าเรามี... คุณข้าม glue code (โค้ดเชื่อมต่อ) ทั้งหมดนี้ไปได้ นี่ก็แค่ชุด issues ซึ่งเป็น GitHub issues ที่มีชื่อเรื่องและมี branch ให้คุณทำงาน
จากนั้นสำหรับแต่ละ issue เราสร้าง sandbox แล้วรัน implementer ใน sandbox นั้น โดยส่งหมายเลข issue ชื่อ issue และ branch เข้าไป นี่คือ loop ที่เรารันก่อนหน้านี้ จากนั้นถ้ามันสร้าง commits ขึ้นมา เราก็ review commits เหล่านั้น นี่คือ loop จริงๆ เราจะทำอะไรกับ commits เหล่านั้น? ส่งให้ merger agent (เอเจนต์รวมโค้ด) ซึ่งรับ merge prompt รับ branch ที่ถูกสร้าง รับ issues แล้วก็ merge เข้าด้วยกัน ถ้ามีปัญหากับการ merge อย่างปัญหา types หรือ tests อะไรแบบนั้น มันก็แก้ให้
และนี่คือโฟลว์ของผมมาสักพักใหญ่แล้วสำหรับการทำงานในโปรเจกต์ส่วนใหญ่ มันเวิร์คดีมาก และใช่ ผมแนะนำให้ลองดู Sandcastle ถ้าอยากเรียนรู้เพิ่มเติม และเพื่อตอบคำถามคุณให้ตรง คือ ในผู้ review ผมจะ push มาตรฐานการเขียนโค้ด ส่วนใน implementer ผมจะให้มัน pull ได้เอง และจริงๆ ผมใช้ Sonnet สำหรับการ implement และ Opus สำหรับการ review เพราะผมว่าการ review ต้องใช้ความฉลาดตรงนั้น มีคำถามไหม? เอาแบบนี้ ก่อนที่จะถามคำถามเพิ่ม ขอกลับมาตรงนี้ก่อน โอเค เราอยู่ตรงไหนแล้ว? โอเค
เราซูมไปมาในทอล์กนี้เพราะผมต้องรันอะไรหลายอย่างแบบขนาน กลับไปที่ improve code base architecture กัน มันรันเสร็จแล้ว และเจอตัวเลือกการปรับปรุงสถาปัตยกรรมหลายจุด มันมีคลัสเตอร์ของโมดูลต่างๆ ที่เกี่ยวข้องกัน ซึ่งน่าจะทดสอบเป็นหน่วยเดียวกันได้ อันดับหนึ่งคือ quiz scoring service มีการแยกตรรกะการจัดเรียงลำดับใหม่ด้วย มันให้เหตุผลว่าทำไมมันถึง coupled (ผูกกัน) และมีหมวดหมู่ dependency ด้วย
"ทดแทนได้ในเครื่อง ใน SQLite ฐานข้อมูลทดสอบในหน่วยความจำ" quiz scoring service ตอนนี้มีเทสต์เป็นศูนย์ นี่คือช่องว่างที่ใหญ่ที่สุด นี่คือหน้าตาตอนเรากลับมาของ improve code base architecture โอเค เรามีเวลาเหลือประมาณ 17 นาที ไม่รู้ว่าคุณเป็นยังไง แต่ผมเหนื่อยมาก >> [เสียงหัวเราะ] >> ผมอยาก >> [กระแอม] >> ขอสรุปให้ฟังหน่อย เพราะผมว่าเรากำลังถึงขีดจำกัดความอึดของเราแล้ว ผมจะอยู่ให้ครบเวลา ถ้าใครอยากมาถามคำถาม
ผมอาจจะเช็กสไลด์อีกครั้ง แต่ขอสรุปว่ามาถึงจุดไหนแล้ว นี่คือโฟลว์โดยรวม ตลอดกระบวนการทั้งหมด เราคำนึงถึงรูปทรงของโค้ดเบสอยู่เสมอ นี่ไม่ใช่คอมไพเลอร์แปลงสเปกเป็นโค้ด นี่ไม่ใช่ AI ที่พ่นโค้ดออกมาอย่างเดียว เราตั้งใจมากกับประเภทของโมดูลและรูปทรงของโค้ดเบสที่เราต้องการ เราทำให้แน่ใจว่าเราเข้าใจตรงกันมากที่สุดโดยใช้เซสชัน grilling โดยการตีแผ่ไอเดียของเราอย่างจริงจัง
เราไม่ได้หมกมุ่นกับ PRD มากเกินไป เราไม่ได้พยายามอ่านทุกส่วนของมัน เราไม่ได้คิดถึงมันมากเกินไปด้วยซ้ำ จากนั้นเราก็เปลี่ยนมันเป็นชุด issues ที่ parallelizable ซึ่งเอเจนต์ทำงานคู่ขนานกันได้ เราทำการ implement และ QA และ code review อย่างเอาเป็นเอาตาย แล้วก็วนกลับไปที่ implementation นั้นเรื่อยๆ มีสิ่งหนึ่งที่ผมไม่ได้พูดถึงมากนัก คือในเฟส QA จุดประสงค์ของ QA คือการสร้าง issues เพิ่มเติมให้ Kanban board นั้น ดังนั้นแม้ระหว่างที่มันกำลัง implement คุณก็สามารถ QA ไปพร้อมกัน แล้วกลับไปเพิ่ม issues ได้
และ Kanban board ให้คุณเพิ่ม issues แบบบล็อกได้แทบจะไม่มีที่สิ้นสุด แล้วเมื่อทุกอย่างเสร็จ เมื่อคุณพอใจกับโค้ด เมื่อคุณพอใจกับงานแล้ว คุณก็แชร์ให้ทีมและรับการ review อย่างเต็มรูปแบบ นี่คือตอนที่คุณมาถึงตรงนี้ จะมีนักพัฒนาหนึ่งคนหรือสองสามคนคอยจัดการสิ่งนี้ แล้วก็ขึ้นอยู่กับคุณว่าจะ merge มันกลับเข้าไปยังไง >> [ถอนหายใจ] >> แน่นอนว่าทั้งหมดนี้คุณปรับแต่งได้หมด นี่เป็นเพียงสิ่งที่ผมพบว่ามันเวิร์ค
ผมไม่ได้พยายามขายแนวทางอะไรให้คุณนะ สิ่งที่ผมแนะนำ ถ้าจะให้จำอะไรติดตัวไปจากเซสชันนี้หนึ่งอย่าง คือกลับบ้านไป แล้วไปที่ Amazon ซื้อหนังสือเก่าๆ พวกนั้นมากองหนึ่ง เพราะผมพบว่าการอ่านมันให้ข้อคิดมากมาย งานเขียนยุคก่อน AI อ่านสนุกอยู่แล้ว และในทุกๆ หน้า ผมพบว่ามีอะไรที่มีประโยชน์และน่าสนใจให้อ่านเสมอ ขอบคุณมากๆ ขอบคุณที่ทนกับความร้อนนะ หวังว่าอุณหภูมิร่างกายของคุณจะกลับสู่ปกติในไม่ช้า
ขอบคุณมากครับ >> [เสียงปรบมือ] [เสียงดนตรี]
หมายเหตุการแปล
ความโปร่งใสเกี่ยวกับความไม่แน่นอนในต้นฉบับ
- ## จุดที่ฟังไม่ชัด ([ฟังไม่ชัด])
- 1 จุด:** ย่อหน้าช่วงพูดถึงการ compact ต่อเนื่อง — ประโยค "the more sediment I..." ฟังไม่ชัดในคำบรรยายอัตโนมัติ ใช้ `[ฟังไม่ชัด]` ในตำแหน่งนั้น เนื้อหาหลักของย่อหน้า (การ compact ซ้ำๆ ไม่เวิร์ค) ยังแปลได้ครบถ้วน
- บท Q&A ที่ผู้ฟังถามแล้วเสียงตัด/ฟังไม่ชัด: ยังคงความหมายโดยรวมจากคำตอบของสปีกเกอร์เป็นหลัก
อภิธานศัพท์เทคนิค
คำศัพท์และชื่อผลิตภัณฑ์ที่คงรูปภาษาอังกฤษ
| ศัพท์ | คำแปล / คำอธิบาย |
|---|---|
| --- | --- |
| LLM | Large Language Model — โมเดลภาษาขนาดใหญ่ |
| smart zone / dumb zone | โซนฉลาด / โซนโง่ — ช่วงที่ LLM ทำงานได้ดีที่สุด (context น้อย) กับช่วงที่เริ่มโง่ลง (context เยอะ) |
| token | หน่วยย่อยของข้อความที่โมเดลประมวลผล |
| context window | หน้าต่างบริบท — ปริมาณข้อความสูงสุดที่โมเดลรับเข้าไปได้ในแต่ละครั้ง |
| system prompt | พรอมป์ระบบ — ข้อความสั่งการที่อยู่ใน context ตลอดเวลา |
| compact / compacting | การบีบอัด — ย่อบทสนทนาที่ยาวให้สั้นลงเพื่อใส่กลับเข้า context |
| Claude Code | เครื่องมือเขียนโค้ดด้วย AI ของ Anthropic ที่ทำงานในเทอร์มินัล |
| skill | ทักษะ/ชุดคำสั่งพิเศษที่ให้ AI เรียกใช้ตามสถานการณ์ (เช่น grill me, write a PRD) |
| grill me skill | ทักษะที่ให้ AI สัมภาษณ์ซักถามเราอย่างละเอียดเพื่อสร้างความเข้าใจร่วมกัน |
| sub agent | เอเจนต์ย่อย — LLM ตัวแยกที่มี context window ของตัวเอง รับงานไปทำแล้วสรุปกลับมา |
| orchestrator / parent agent | เอเจนต์หลักที่คอยมอบหมายงานและรวบรวมผลจาก sub agent |
| design concept | แนวคิดการออกแบบร่วมกันระหว่างผู้ร่วมงานทุกฝ่าย |
| misalignment | การเข้าใจไม่ตรงกันระหว่างมนุษย์กับ AI |
| specs to code | แนวคิดการเขียนสเปกแล้วแปลงเป็นโค้ดโดยไม่ดูโค้ดเลย |
| vibe coding | การเขียนโค้ดแบบมั่วๆ สั่งไปเรื่อยโดยไม่เข้าใจโค้ด |
| PRD (product requirements document) | เอกสารข้อกำหนดผลิตภัณฑ์ — เอกสารจุดหมายปลายทางของงาน |
| user story | เรื่องเล่าความต้องการผู้ใช้ในรูปแบบ "ในฐานะ... ฉันต้องการ... เพื่อ..." |
| definition of done | นิยามความสำเร็จ — เกณฑ์ที่ใช้ตัดสินว่างานเสร็จสมบูรณ์ |
| out of scope | สิ่งที่อยู่นอกขอบเขตของงานชิ้นนี้ |
| Kanban board | คัมบังบอร์ด — บอร์ดจัดการงานเป็นใบๆ ที่มีความสัมพันธ์แบบบล็อกกัน |
| blocking relationship | ความสัมพันธ์ที่งานหนึ่งต้องเสร็จก่อนอีกงานหนึ่งจึงเริ่มได้ |
| ticket / issue | ใบงาน/งานย่อยที่เอเจนต์หยิบไปทำได้ |
| vertical slice | ชิ้นงานแนวตั้ง — ชิ้นงานบางๆ ที่ตัดผ่านทุกเลเยอร์ของระบบ |
| traceable bullet | กระสุนเรืองแสง — หลักการทำงานชิ้นเล็กๆ ที่เห็นผลและได้รับ feedback ทันที |
| horizontal coding | การเขียนโค้ดทีละเลเยอร์ (ฐานข้อมูล → API → ฟรอนต์เอนด์) ซึ่งได้ feedback ช้า |
| multi-phase plan | แผนหลายเฟสแบบเรียงลำดับ |
| sequential plan | แผนแบบเรียงลำดับที่เอเจนต์เดียวทำได้ทีละขั้น |
| directed acyclic graph (DAG) | กราฟไร้รอบแบบมีทิศทาง — โครงสร้างที่ใช้แสดงลำดับงานที่ทำขนานกันได้ |
| parallelization | การทำงานแบบขนาน — ให้เอเจนต์หลายตัวทำงานพร้อมกัน |
| human in the loop | งานที่ต้องมีมนุษย์คอยควบคุมอยู่ตลอด |
| AFK (away from keyboard) | งานที่มนุษย์ไม่ต้องอยู่หน้าคีย์บอร์ด ปล่อยให้เอเจนต์ทำเองได้ |
| Ralph loop | วงวนการทำงานที่ให้เอเจนต์หยิบงานจาก backlog มาทำซ้ำจนเสร็จ (ตั้งชื่อตาม Ralph Wiggum) |
| backlog | คิวงานค้างที่รอเอเจนต์มาหยิบไปทำ |
| once.sh | สคริปต์ bash ที่รัน Claude Code หนึ่งรอบพร้อมส่ง issues ทั้งหมดเข้าไป |
| Docker sandbox | สภาพแวดล้อมแยกที่ใช้รันเอเจนต์อย่างปลอดภัย |
| TDD (test-driven development) | การพัฒนาแบบเขียนเทสต์ก่อนแล้วค่อยเขียนโค้ดให้ผ่าน |
| red-green-refactor | วงจรเขียนเทสต์ที่ล้มเหลว (แดง) → ทำให้ผ่าน (เขียว) → ปรับโครงสร้างโค้ด |
| feedback loop | วงจรป้อนกลับ — ระบบตรวจสอบ เช่น เทสต์, type check ที่ให้ AI รู้ผลงานตัวเอง |
| code review | การทบทวนโค้ดโดยมนุษย์หรือเอเจนต์ |
| QA | Quality Assurance — การตรวจสอบคุณภาพ/ทดสอบการใช้งานด้วยมือ |
| npm run test / npm run type check | คำสั่งรันเทสต์และตรวจชนิดข้อมูล (TypeScript) |
| migration | ไฟล์ย้าย/ปรับปรุงโครงสร้างฐานข้อมูล |
| schema | โครงสร้างของฐานข้อมูล (ตาราง, คอลัมน์) |
| gamification service | บริการจัดการระบบคะแนน/สตรีคในแอป |
| deep module | โมดูลลึก — อินเทอร์เฟซเล็กแต่ฟังก์ชันภายในมาก ทดสอบง่าย |
| shallow module | โมดูลตื้น — ไฟล์เล็กๆ แตกกระจาย นำทางและทดสอบยาก |
| gray box | กล่องเทา — โมดูลที่รู้แค่รูปทรง/พฤติกรรม แต่ไม่ต้องรู้รายละเอียดภายใน |
| improve code base architecture | skill ที่สแกนโค้ดเบสเพื่อหาจุดที่ควรทำให้โมดูลลึกขึ้น |
| push / pull | การยัดคำสั่งให้เอเจนต์ (push) กับการให้เอเจนต์ดึงข้อมูลเองเมื่อต้องการ (pull) |
| Claude.md | ไฟล์คำสั่งถาวรที่ Claude Code อ่านทุกครั้ง |
| automated reviewer | ผู้ตรวจสอบโค้ดอัตโนมัติที่รับมาตรฐานโค้ดแบบ push |
| Sandcastle | ไลบรารี TypeScript ของ Matt สำหรับรัน agent loop แบบขนานใน Docker |
| planner / implementer / merger agent | เอเจนต์วางแผน / ลงมือทำ / รวมโค้ดในระบบ Sandcastle |
| work tree | ต้นไม้งาน — โฟลเดอร์ทำงานแยกใน Git branch สำหรับแต่ละงาน |
| pull request (PR) | คำขอรวมโค้ดเข้าสู่ branch หลัก เพื่อให้คนอื่น review |
| doc rot | เอกสารเน่า — เอกสารเก่าที่ไม่ตรงกับโค้ดจริงแล้วสร้างความสับสนให้ AI |
| BEADS | เฟรมเวิร์กจัดการ Kanban board และ issues อีกตัวหนึ่ง |
| Playwright MCP | โปรโตคอลที่ให้ AI ควบคุมเบราว์เซอร์เพื่อดู/ทดสอบฟรอนต์เอนด์ |
| discriminated union | เทคนิค TypeScript ที่ใช้ union ของ type พร้อมตัวแยกแยะ |
| Slido | แพลตฟอร์มถามตอบ/โหวตคำถามออนไลน์ที่ใช้ในงาน |
| Memento | ภาพยนตร์ของคริสโตเฟอร์ โนแลน เกี่ยวกับชายที่จำอะไรไม่ได้ — ใช้เปรียบ LLM ที่ลืมตลอด |
| Ralph Wiggum | ตัวละครใน The Simpsons — ใช้เป็นชื่อแนวปฏิบัติการวนงานเล็กๆ จนถึงเป้าหมาย |
| The Pragmatic Programmer / The Design of Design / The Philosophy of Software Design / Refactoring | หนังสือคลาสสิกด้านวิศวกรรมซอฟต์แวร์ที่แมตต์อ้างถึง |
ซับไตเติ้ลภาษาไทย
ดาวน์โหลดหรือดูซับทั้งหมด
1 00:00:00,000 --> 00:00:05,794 [เสียงดนตรี] >> ครับ เราพร้อมแล้ว ทุกคนครับ เรามาเต็มความจุแล้ว 2 00:00:05,794 --> 00:00:11,128 มาเริ่มกันเลยดีกว่า ผมไม่อยากให้ทุกคนต้องมารออยู่ตรงนี้อีก 3 00:00:11,128 --> 00:00:16,278 25 นาทีเพื่อรอเส้นตายอะไรก็ตาม ขอต้อนรับครับ ผมชื่อแมตต์ 4 00:00:16,278 --> 00:00:21,887 เป็นครู และตอนนี้ก็สอนเรื่อง AI ด้วยครับ เรามีลิงก์อยู่ตรงนี้
เปิดดูซับไตเติ้ลทั้งหมด (1067 segments)
1 00:00:00,000 --> 00:00:05,794 [เสียงดนตรี] >> ครับ เราพร้อมแล้ว ทุกคนครับ เรามาเต็มความจุแล้ว 2 00:00:05,794 --> 00:00:11,128 มาเริ่มกันเลยดีกว่า ผมไม่อยากให้ทุกคนต้องมารออยู่ตรงนี้อีก 3 00:00:11,128 --> 00:00:16,278 25 นาทีเพื่อรอเส้นตายอะไรก็ตาม ขอต้อนรับครับ ผมชื่อแมตต์ 4 00:00:16,278 --> 00:00:21,887 เป็นครู และตอนนี้ก็สอนเรื่อง AI ด้วยครับ เรามีลิงก์อยู่ตรงนี้ 5 00:00:21,887 --> 00:00:27,957 ถ้ายังไม่ได้เข้าไปดู ก็จะมีแบบฝึกหัดสำหรับสิ่งที่เราจะทำวันนี้ครับ 6 00:00:27,957 --> 00:00:33,199 งานนี้จะใช้เวลาราวๆ 2 ชั่วโมง เราอาจจะเริ่มกันแบบนี้ไปอีก 7 00:00:33,199 --> 00:00:39,636 2 ชั่วโมงข้างหน้า โอเคไหมไมค์? ครับ เยี่ยมเลย แนวคิดเบื้องหลังทอล์กนี้ 8 00:00:39,636 --> 00:00:44,327 หรืออย่างน้อยก็ข้อเสนอหลักที่ผมใช้ดำเนินงานมาในช่วง 9 00:00:44,327 --> 00:00:51,132 6 เดือนที่ผ่านมา คือการที่เราทุกคนคิดว่า AI เป็นกระบวนทัศน์ใหม่ใช่ไหมครับ? 10 00:00:51,132 --> 00:00:57,018 AI กำลังเปลี่ยนแปลงหลายอย่างแน่นอน พวกคุณก็สนใจเรื่องนี้อยู่แล้ว 11 00:00:57,018 --> 00:01:02,260 และนั่นคือเหตุผลที่มาฟังทอล์กนี้ และผมรู้สึกว่าเวลาพูดถึง 12 00:01:02,260 --> 00:01:09,157 AI ว่าเป็นกระบวนทัศน์ใหม่ เรามักลืมไปว่า จริงๆ แล้วพื้นฐานวิศวกรรมซอฟต์แวร์ 13 00:01:09,157 --> 00:01:14,215 สิ่งที่สำคัญมากในการทำงานร่วมกับมนุษย์ ก็ทำงานได้ดีสุดๆ 14 00:01:14,215 --> 00:01:20,744 กับ AI ด้วยเหมือนกัน และนี่คือสิ่งที่คีย์โน้ตของผมพรุ่งนี้จะพูดถึงจริงๆ 15 00:01:20,744 --> 00:01:26,170 ครับ ผมจะลงรายละเอียดเรื่องนี้ให้มากกว่านี้ ในเวิร์กช็อปนี้ 16 00:01:26,170 --> 00:01:33,619 ผมหวังว่าจะได้ชี้ให้พวกคุณเห็นสิ่งเหล่านั้น และหวังว่าจะพิสูจน์ให้เห็นว่าผมพูดถูก 17 00:01:33,619 --> 00:01:39,045 แต่ค่อยว่ากันอีกทีครับ เอาล่ะ ขอสำรวจคร่าวๆ ก่อนได้ไหมครับ? 18 00:01:39,045 --> 00:01:44,471 มีใครบ้างที่เคยเขียนโค้ดกับ AI? ยกมือขึ้นถ้าเคยเขียนโค้ดกับ 19 00:01:44,471 --> 00:01:51,552 AI ครับ เยี่ยม โอเค เก็บมือไว้แบบนั้นนะครับ ให้โลกได้เห็นรักแร้ของเรากันหน่อย 20 00:01:51,552 --> 00:01:56,426 มีใครเขียนโค้ดกับ AI ทุกวันบ้าง? เจ๋ง โอเค เก็บมือไว้ 21 00:01:56,426 --> 00:02:01,024 ถ้าเคยหงุดหงิดกับ AI ให้ยกมือขึ้นนะครับ โอเค ดีมาก 22 00:02:01,024 --> 00:02:06,174 วางมือลงได้ครับ ขอบคุณที่เชื่อฟังกันขนาดนี้ ผมซาบซึ้งมาก 23 00:02:06,174 --> 00:02:11,141 และตอนนี้เรากำลังถ่ายทอดสดไปยังห้อง Gilgood ด้วยนะครับ 24 00:02:11,141 --> 00:02:18,130 ผมยังไม่ได้... เราส่งใครไปที่ห้อง Gilgood เพื่อเช็กว่าเขาสบายดีไหมหรือเปล่า? 25 00:02:18,130 --> 00:02:23,648 ไม่รู้เหมือนกัน แต่ผมเห็นพวกคุณ และมีวิธีที่คุณจะร่วมสนุกได้ 26 00:02:23,648 --> 00:02:27,970 คือเรามีช่วงถาม-ตอบครับ เราจะทำแบบที่ไม่ค่อยชอบ 27 00:02:27,970 --> 00:02:33,764 Q&A ทั่วไป เพราะมันไม่ค่อยเป็นประชาธิปไตย ส่วนใหญ่คนที่พูดเก่งๆ 28 00:02:33,764 --> 00:02:39,098 เท่านั้นแหละที่ได้มีส่วนร่วมและได้แชร์ ดังนั้นเราจะใช้ระบบ 29 00:02:39,098 --> 00:02:44,339 Q&A แบบนี้กัน แล้วทำไมเราต้องรอถึง 3:45 ล่ะ? ห้องเต็มแล้ว 30 00:02:44,339 --> 00:02:48,846 ประตูปิดแล้ว เห็นด้วย 100% ดังนั้นถ้าอยากถามคำถาม 31 00:02:48,846 --> 00:02:55,191 ผมอยากให้ทุกคนเข้าไปถามในแอป async นี้ แล้วเราก็โหวตคำถามของกันและกัน 32 00:02:55,191 --> 00:02:59,973 หวังว่าคำถามที่ดีที่สุดจะถูกโหวตขึ้นมาให้ทั้งห้องได้ 33 00:02:59,973 --> 00:03:04,388 enjoy กัน ผมอยากพูดถึงข้อจำกัดแปลกๆ ของ LLM ก่อน 34 00:03:04,388 --> 00:03:10,917 และข้อจำกัดแปลกๆ เหล่านั้นคือสิ่งที่เราต้องใช้เป็นฐานในการทำงานส่วนใหญ่ 35 00:03:10,917 --> 00:03:15,239 มีคนชื่อ Dex Hardy บริหารบริษัทชื่อ Human Layer 36 00:03:15,239 --> 00:03:19,654 เขาเสนอแนวคิดว่าเวลาทำงานกับ LLM พวกมันมีโซนฉลาด 37 00:03:19,654 --> 00:03:24,896 (smart zone) กับโซนโง่ (dumb zone) ตอนที่คุณเริ่มทำงานกับ 38 00:03:24,896 --> 00:03:30,413 LLM ครั้งแรก เหมือนเพิ่งเริ่มคอนเวอร์เซชันใหม่ เริ่มจากศูนย์ 39 00:03:30,413 --> 00:03:35,655 นั่นคือตอนที่ LLM จะทำงานได้ดีที่สุด เพราะในสถานการณ์นั้น 40 00:03:35,655 --> 00:03:40,346 ความสัมพันธ์ของ attention (attention relationships) 41 00:03:40,346 --> 00:03:44,852 ถูกบีบรัดน้อยที่สุด ทุกครั้งที่คุณเพิ่ม token ให้ 42 00:03:44,852 --> 00:03:49,266 LLM มันเหมือนกับการเพิ่มทีมใหม่เข้าไปในลีกฟุตบอล 43 00:03:49,266 --> 00:03:55,703 ลองคิดดูว่าจำนวนแมตช์เพิ่มขึ้นแค่ไหนทุกครั้งที่เพิ่มทีมใหม่ในลีกฟุตบอล 44 00:03:55,703 --> 00:04:00,853 มันขยายตัวแบบกำลังสอง (quadratic) เพราะมีความสัมพันธ์ของ 45 00:04:00,853 --> 00:04:08,119 attention ระหว่างทุก token กับ token อื่นๆ ทั้งในเชิงตำแหน่งและความหมายของแต่ละ 46 00:04:08,119 --> 00:04:12,809 token ดังนั้น พอถึงราวๆ 40% หรือผมว่าที่ประมาณ 100K 47 00:04:12,809 --> 00:04:18,143 คือจุดวัดใหม่ของผมสำหรับเรื่องนี้ เพราะไม่สำคัญว่าคุณจะใช้ 48 00:04:18,143 --> 00:04:23,385 context window ขนาด 1 ล้าน หรือ 200K ผลมันจะประมาณนี้เสมอ 49 00:04:23,385 --> 00:04:27,799 เริ่มโง่ลงเรื่อยๆ ยิ่งคุณเติมของเข้าไปใน context 50 00:04:27,799 --> 00:04:33,501 window เดิมเรื่อยๆ มันก็ยิ่งโง่ลงเรื่อยๆ จนกระทั่งตัดสินใจโง่ๆ 51 00:04:33,501 --> 00:04:41,593 ยกมือขึ้นถ้ารู้สึกคุ้นเคยกับอาการนี้ ใช่ เจ๋ง นี่แปลว่าเราควรแบ่งขนาดงานให้อยู่ในโซนฉลาด 52 00:04:41,593 --> 00:04:46,651 ใช่ไหมครับ? เราไม่อยากให้ AI รับปากเกินตัว คำแนะนำเก่าๆ 53 00:04:46,651 --> 00:04:51,250 อย่าง Martin Fowler ในหนังสือ Refactoring หรือ The 54 00:04:51,250 --> 00:04:56,584 Pragmatic Programmer ก็พูดถึงเรื่องนี้ อย่ากัดเกินคำเคี้ยว 55 00:04:56,584 --> 00:05:04,952 ทำงานเล็กๆ ไว้ เพื่อที่ตัวคุณในฐานะนักพัฒนา จะได้ไม่เครียดจนทำอะไรไม่ถูกและตกไปอยู่ในโซนโง่ 56 00:05:04,952 --> 00:05:09,642 แต่จะจัดการงานใหญ่ยังไงล่ะ? ถ้ามีงานใหญ่ๆ แบบว่า... 57 00:05:09,642 --> 00:05:15,160 ไม่รู้สิ อย่างการลอกเลียนบริษัททั้งบริษัท หรือทำอะไรที่บ้าบอ 58 00:05:15,160 --> 00:05:19,850 จะแบ่งมันเป็นงานย่อยๆ ยังไงให้ทุกส่วนอยู่ในโซนฉลาด? 59 00:05:19,850 --> 00:05:24,908 วิธีหนึ่งที่คุณทำได้ คือแบบที่บริษัท AI อาจอยากให้คุณทำ 60 00:05:24,908 --> 00:05:31,622 หรือวิธีธรรมชาติก็คือทำไปเรื่อยๆ ไปเรื่อยๆ จนสุดท้ายคุณก็ตกไปอยู่ในโซนโง่ 61 00:05:31,622 --> 00:05:36,128 เสีย token เต็มจำนวนต่อทุก request แล้วก็ compact 62 00:05:36,128 --> 00:05:42,657 (บีบอัด) กลับลงมา เดี๋ยวเราจะพูดถึงการ compact อย่างจริงจังในอีกสักครู่ 63 00:05:42,657 --> 00:05:47,072 แล้วก็ทำต่อไปเรื่อยๆ compact ลงมา ทำต่อไปเรื่อยๆ 64 00:05:47,072 --> 00:05:51,394 ผมว่าวิธีนั้นไม่ค่อยเวิร์คเท่าไหร่ เพราะยิ่ง... 65 00:05:51,394 --> 00:05:55,808 [ฟังไม่ชัด] เดี๋ยวจะพูดถึงอีกที ทฤษฎีของผมตอนนี้ 66 00:05:55,808 --> 00:06:00,774 และที่ผมทำมาสักพัก คือการใช้แผนแบบหลายเฟส (multi-phase 67 00:06:00,774 --> 00:06:05,924 plan) คือผมจะบอกว่า "โอเค เรามีงานใหญ่ๆ อยู่งานนึงตรงนี้ 68 00:06:05,924 --> 00:06:11,718 มาแบ่งเป็นส่วนเล็กๆ กัน แล้วค่อยๆ แยกย่อยทำงานทีละนิดในโซนฉลาด" 69 00:06:11,718 --> 00:06:18,523 ยกมือขึ้นถ้าเคยใช้แผนแบบหลายเฟส ใช่ เป็นวิธีปฏิบัติที่ธรรมดามากใช่ไหมครับ? 70 00:06:18,523 --> 00:06:25,972 นี่คือวิธีที่เราทำกันมา จริงๆ แล้วนี่คือวิธีที่ผมทำมาจนถึงธันวาคมปีที่แล้วเลยแหละ 71 00:06:25,972 --> 00:06:30,295 และนักพัฒนาที่เก่งจริงๆ จะมองแล้วบอกว่า "นี่มัน 72 00:06:30,295 --> 00:06:34,709 loop ชัดๆ" ใช่ไหม? นี่คือ loop เรามีเฟสหนึ่ง สอง 73 00:06:34,709 --> 00:06:40,687 สาม สี่ แล้วทำไมเราไม่ใช้แค่เฟส N ล่ะ? เฟส N คือเราจะพูดประมาณว่า 74 00:06:40,687 --> 00:06:45,285 "โอเค เรามีแผนทำงานอยู่เบื้องหลัง แล้วเราก็วน loop 75 00:06:45,285 --> 00:06:49,791 ทับมันไปเรื่อยๆ จนกว่าจะเสร็จ" และนี่คือจุดที่... 76 00:06:49,791 --> 00:06:56,137 ยกมือขึ้นถ้าเคยได้ยินคำว่า Ralph Wiggum ในฐานะแนวปฏิบัติด้านซอฟต์แวร์ 77 00:06:56,137 --> 00:07:00,919 โอเค เจ๋ง ทีนี้ยกมือขึ้นถ้าไม่เคยได้ยิน Ralph Wiggum 78 00:07:00,919 --> 00:07:05,425 ในฐานะแนวปฏิบัติด้านซอฟต์แวร์ อันนั้นดูสมจริงกว่า 79 00:07:05,425 --> 00:07:11,311 โอเค มีแนวคิดที่ชื่อว่า Ralph Wiggum ซึ่งมีพื้นฐานมาจากเรื่องนี้ 80 00:07:11,311 --> 00:07:16,369 คือสิ่งที่คุณต้องทำก็แค่ระบุจุดหมายปลายทางของการเดินทาง 81 00:07:16,369 --> 00:07:20,691 คือคุณแค่บอกว่า "โอเค เราสร้าง PRD หรือ product 82 00:07:20,691 --> 00:07:25,013 requirements document (เอกสารข้อกำหนดผลิตภัณฑ์) 83 00:07:25,013 --> 00:07:29,428 ขึ้นมา เพื่ออธิบายว่าเราจะไปทางไหน" จากนั้นก็บอก 84 00:07:29,428 --> 00:07:37,153 AI ว่า "แก้เล็กๆ น้อยๆ หน่อย แก้ทีละนิดที่จะพาเราเข้าใกล้เป้าหมายนั้นมากขึ้นเรื่อยๆ" 85 00:07:37,153 --> 00:07:42,946 Ralph ใช้ได้โอเค ครับ แต่ผมชอบอะไรที่มีโครงสร้างมากกว่านี้หน่อย 86 00:07:42,946 --> 00:07:49,936 นี่คือจุดที่เราคุยกันเรื่องโซนฉลาด และนี่คือจุดแรกที่ผมอยากให้คุณเริ่มคิดถึง 87 00:07:49,936 --> 00:07:55,453 อีกหนึ่งข้อจำกัดแปลกๆ ของ LLM คือ LLM เป็นเหมือนพระเอกในหนัง 88 00:07:55,453 --> 00:08:02,902 Memento (จดจำไม่ได้สักที) คือมันลืมตลอดเวลา มันรีเซ็ตกลับไปสู่สถานะพื้นฐานได้ตลอด 89 00:08:02,902 --> 00:08:09,064 ขอเปิดไดอะแกรมนี้หน่อย ผมควรใช้สไลด์จริงๆ แต่ผมชอบเลื่อนดูไปเรื่อยๆ 90 00:08:09,064 --> 00:08:13,478 บนแคนวาส tldraw แบบไม่มีที่สิ้นสุดมากกว่า ขอบคุณ 91 00:08:13,478 --> 00:08:17,985 Steve อีกแนวคิดที่อยากให้คุณจำไว้ คือทุกเซสชันกับ 92 00:08:17,985 --> 00:08:22,675 LLM จะผ่านขั้นตอนเดิมๆ เหมือนกัน อย่างแรกคือ system 93 00:08:22,675 --> 00:08:27,825 prompt (พรอมป์ระบบ) ตรงนี้ กล่องสีเทานี้คือสิ่งที่อยู่ใน 94 00:08:27,825 --> 00:08:33,342 context ของคุณตลอดเวลา คุณอยากให้มันเล็กที่สุดเท่าที่จะทำได้ 95 00:08:33,342 --> 00:08:40,332 เพราะถ้ามีของเยอะแยะในนี้ ถ้ามี 250K tokens ซึ่งผมเคยเห็นคนใส่เข้าไปขนาดนั้น 96 00:08:40,332 --> 00:08:46,861 คุณจะพุ่งเข้าโซนโง่ทันทีโดยไม่ต้องทำอะไรเลย ดังนั้นอยากให้มันจิ๋วที่สุด 97 00:08:46,861 --> 00:08:52,195 >> [หัวเราะเบาๆ] >> จากนั้นก็เข้าสู่ช่วงสำรวจ (exploratory 98 00:08:52,195 --> 00:08:57,713 phase) ส่วนสีฟ้านี้คือตอนที่ coding agent (เอเจนต์เขียนโค้ด) 99 00:08:57,713 --> 00:09:02,679 ออกไปสำรวจโค้ดเบส แล้วก็เข้าสู่การ implement (ลงมือทำ) 100 00:09:02,679 --> 00:09:07,553 จากนั้นก็การทดสอบ ตรวจสอบว่ามันทำงานได้ วิ่ง feedback 101 00:09:07,553 --> 00:09:14,634 loop (วงจรป้อนกลับ) อะไรแบบนี้ ยกมือขึ้นถ้ารู้สึกคุ้นเคยกับสิ่งที่ตัวเองเคยทำ 102 00:09:14,634 --> 00:09:19,508 ใช่ นี่คือเสาหลักของทุกเซสชัน และเมื่อคุณล้าง context 103 00:09:19,508 --> 00:09:24,658 คุณก็กลับไปที่ system prompt ทันที โอ๊ย กลับไปตรงนั้นเลย 104 00:09:24,658 --> 00:09:29,532 คือลบทุกอย่างที่ผ่านมาแล้ว ยกมือขึ้นถ้าเคยได้ยินคำว่า 105 00:09:29,532 --> 00:09:35,602 compacting (การบีบอัด) ด้วย ใช่ โอเค บางคนอาจยังไม่เคยได้ยินเรื่อง 106 00:09:35,602 --> 00:09:40,016 compacting เดี๋ยวขอสาธิตให้ดูเร็วๆ ว่ามันคืออะไร 107 00:09:40,016 --> 00:09:45,442 เช่น ผมเพิ่งคุยกับ LLM ของผมไปนิดหน่อย ผมอยากให้แน่ใจว่าเรา 108 00:09:45,442 --> 00:09:50,132 cover พื้นฐานกันแล้วจะได้เข้าใจตรงกัน ผมเพิ่งคุยกับ 109 00:09:50,132 --> 00:09:54,822 LLM เรื่องสิ่งที่อยากจะสร้าง แบบอักษรเป็นยังไงบ้าง? 110 00:09:54,822 --> 00:09:59,421 ควรเพิ่มขนาดไหม? คนแถวหลังว่าไง? เพิ่ม เพิ่ม เพิ่ม 111 00:09:59,421 --> 00:10:04,847 เพิ่ม เพิ่ม โอเค ผมใช้ Claude Code (เครื่องมือเขียนโค้ดด้วย 112 00:10:04,847 --> 00:10:09,445 AI) ในเซสชันนี้ แต่คุณไม่จำเป็นต้องใช้ Claude Code 113 00:10:09,445 --> 00:10:14,227 ที่จริงแล้ว การไม่ใช้ Claude Code ก็มักจะดีเหมือนกัน 114 00:10:14,227 --> 00:10:20,388 ผมเพิ่งคุยกับ LLM เรื่องวางแผนว่าต่อไปจะทำอะไร มันถามคำถามผมหลายข้อ 115 00:10:20,388 --> 00:10:25,171 และผมแนะนำให้คุณทำแบบนี้มากๆ ตรงนี้มีสเตตัสไลน์เล็กๆ 116 00:10:25,171 --> 00:10:30,596 ที่บอกว่าผมใช้ token ไปกี่ตัว จำนวน token ที่แน่นอนที่ผมใช้ 117 00:10:30,596 --> 00:10:35,103 ผมมีบทความบนเว็บ AI Hero ถ้าอยากลอกโค้ดไปใช้ อุ๊ย 118 00:10:35,103 --> 00:10:40,529 ว้าว มันสั่นนะเนี่ย? นี่คือข้อมูลจำเป็นของทุกโค้ดดิ้งเซสชัน 119 00:10:40,529 --> 00:10:47,794 เพราะคุณต้องรู้ว่ากำลังใช้ token ไปเท่าไหร่ เพื่อจะได้รู้ว่าคุณใกล้โซนโง่แค่ไหน 120 00:10:47,794 --> 00:10:54,691 สำคัญมากๆ เลย มาดูกัน ผมมีสองตัวเลือก คือล้างทั้งหมดแล้วกลับไปเริ่มจากศูนย์ 121 00:10:54,691 --> 00:11:00,209 หรือไม่ก็ compact และเมื่อผม compact มันจะบีบการสนทนาทั้งหมด 122 00:11:00,209 --> 00:11:05,451 ซึ่งจริงๆ ก็ไม่มากเท่าไหร่ ให้ไปอยู่ในพื้นที่ที่เล็กลงมาก 123 00:11:05,451 --> 00:11:11,704 ถ้าเป็นแผนภาพก็จะประมาณนี้ คือคุณนำข้อมูลทั้งหมดจากเซสชันมาสร้างเป็น 124 00:11:11,704 --> 00:11:17,314 history (ประวัติ) บันทึกเป็นลายลักษณ์อักษรว่าเกิดอะไรขึ้นบ้าง 125 00:11:17,314 --> 00:11:22,924 นักพัฒนาเนี่ยชอบ compacting ด้วยเหตุผลบางอย่าง แต่ผมเกลียดมัน 126 00:11:22,924 --> 00:11:27,706 ผมชอบให้ AI ของผม behave แบบพระเอกใน Memento มากกว่า 127 00:11:27,706 --> 00:11:32,672 เพราะสเตตัสนี้จะเหมือนเดิมเสมอ เหมือนเดิมทุกครั้งที่ทำ 128 00:11:32,672 --> 00:11:37,270 คุณล้างแล้วกลับไปจุดเริ่มต้น ถ้าคุณทำแบบนั้นได้และ 129 00:11:37,270 --> 00:11:41,593 optimize เพื่อมันได้ คุณก็อยู่ในจุดที่ยอดเยี่ยม 130 00:11:41,593 --> 00:11:48,582 นี่คือสองสิ่งที่อยากให้คิดถึงกับ LLM ซึ่งเป็นข้อจำกัดสองอย่างที่เราทำงานด้วย 131 00:11:48,582 --> 00:11:53,364 พวกมันมีโซนฉลาดกับโซนโง่ และเป็นเหมือนพระเอก Memento 132 00:11:53,364 --> 00:11:59,158 งั้นมาดูแบบฝึกหัดแรกกัน และระหว่างที่ผมทำ วิธีที่อยากให้เป็นคือ 133 00:11:59,158 --> 00:12:04,124 ผมจะสาธิตให้ดูบนจอ และอยากให้พวกคุณลงมือพิมพ์ตามไปด้วย 134 00:12:04,124 --> 00:12:09,550 นั่นเป็นแค่ส่วนบรรยายเล็กน้อย ต่อไปมาลงมือเขียนโค้ดกันจริงๆ 135 00:12:09,550 --> 00:12:15,343 สำหรับใครที่มาสาย หรือใครที่อยู่ในห้อง Gilgood ให้ไปที่ลิงก์นี้ 136 00:12:15,343 --> 00:12:19,942 ลิงก์ด้านบนนี้ เพื่อดูแบบฝึกหัดและ clone โค้ด repo 137 00:12:19,942 --> 00:12:26,747 (ที่เก็บโค้ด) ไป ไม่จำเป็นต้องทำตามก็ได้ จะนั่งดูผมทำอย่างเดียวก็ได้ถ้าชอบ 138 00:12:26,747 --> 00:12:31,161 แต่ผมจะเข้าไปดูเองก่อน ว่าแบบฝึกหัดอะไรรอเราอยู่ 139 00:12:31,161 --> 00:12:38,150 จริงๆ แล้วผมสร้างแพลตฟอร์มนี้มาจากคอร์สของผม มันคือแพลตฟอร์มจัดการคอร์สเรียน 140 00:12:38,150 --> 00:12:42,933 เป็น CMS (ระบบจัดการเนื้อหา) สำหรับผู้สอนและผู้เรียน 141 00:12:42,933 --> 00:12:49,830 และนี่คือสิ่งที่เราจะสร้างฟีเจอร์ใหม่ให้ วันนี้ผมจะพาคุณจากไอเดียของฟีเจอร์ 142 00:12:49,830 --> 00:12:54,244 ไปจนถึงการสร้าง PRD สำหรับฟีเจอร์นั้น ไปจนถึงการ 143 00:12:54,244 --> 00:13:01,877 implement ฟีเจอร์จริง และหวังว่าคุณจะได้แรงบันดาลใจจากกระบวนการนี้ไปใช้กับงานตัวเอง 144 00:13:01,877 --> 00:13:08,315 เริ่มกันเลย เราจะเริ่มด้วยการใช้ skill (ทักษะ) ที่ผมผูกพันมากเป็นพิเศษ 145 00:13:08,315 --> 00:13:12,637 มันคือ grill me skill grill me skill นี้เล็กมาก 146 00:13:12,637 --> 00:13:19,074 เล็กสุดๆ และช่วยป้องกันหนึ่งในปัญหาหลักที่ผมคิดว่าเกิดขึ้นเวลาทำงานกับ 147 00:13:19,074 --> 00:13:25,788 AI นั่นคือการเข้าใจผิดกัน (misalignment) แนวคิดที่ผมกำลังเถียงด้วยอยู่นี่ 148 00:13:25,788 --> 00:13:30,386 คือกระแส specs to code (เขียนสเปกแล้วแปลงเป็นโค้ด) 149 00:13:30,386 --> 00:13:34,984 มีใครเคยได้ยินกระแส specs to code บ้าง? ยกมือหน่อย 150 00:13:34,984 --> 00:13:39,674 มันไม่เชิงเป็นกระแสขนาดนั้นหรอก มันก็แค่คนพูดกันว่า 151 00:13:39,674 --> 00:13:45,008 specs to code มันคือการที่คนพูดว่า "โอเค คุณจะเขียนโปรแกรม 152 00:13:45,008 --> 00:13:51,354 หรืออยากสร้างแอป วิธีที่ดีที่สุดคือการเขียนสเปกหรือเอกสารอะไรสักอย่าง 153 00:13:51,354 --> 00:13:56,044 แล้วก็แปลงเอกสารนั้นเป็นโค้ด" แล้วก็แปลงเป็นโค้ดเลย 154 00:13:56,044 --> 00:14:01,562 จะทำยังไง? ส่งให้ AI ทำ ถ้าโค้ดที่ได้มีปัญหา คุณไม่ดูที่โค้ด 155 00:14:01,562 --> 00:14:06,344 แต่กลับไปดูที่สเปก แก้สเปก แล้วก็ทำวนแบบนี้ไปเรื่อยๆ 156 00:14:06,344 --> 00:14:11,034 นี่มันคือ vibe coding (เขียนโค้ดแบบมั่วๆ ตามอารมณ์) 157 00:14:11,034 --> 00:14:17,379 อีกชื่อหนึ่ง ที่จริงๆ แล้วคุณกำลังเมินโค้ดทิ้ง คุณไม่ต้องกังวลกับโค้ด 158 00:14:17,379 --> 00:14:22,345 แค่แก้สเปกไปเรื่อยๆ แล้วก็ทำต่อไป ผมลองแล้วนะ ลองจริงๆ 159 00:14:22,345 --> 00:14:26,760 และมันแย่มาก ไม่เวิร์ค เพราะคุณต้องควบคุมโค้ดไว้ 160 00:14:26,760 --> 00:14:31,082 คุณต้องเข้าใจว่ามีอะไรอยู่ในนั้น คุณต้องปั้นมัน 161 00:14:31,082 --> 00:14:36,140 เพราะโค้ดคือสนามรบของคุณ และนี่คือจุดที่เรากำลังจะไปกัน 162 00:14:36,140 --> 00:14:40,554 มาดูแบบฝึกหัดกัน สิ่งที่อยากให้ทำคือไปที่หน้านี้ 163 00:14:40,554 --> 00:14:45,153 grill me skill แล้วใน repo นี้ เรามี slack message 164 00:14:45,153 --> 00:14:49,935 (ข้อความใน Slack) จากเพื่อนเรา อยู่ไหนนะ? มันอยู่ที่ 165 00:14:49,935 --> 00:14:54,441 root ของ repo อยู่ใน... อ่า อยู่ไหนนะ? อืม client 166 00:14:54,441 --> 00:15:00,235 brief.md มันคือ slack message จาก Sarah Chen ด้วยเหตุผลบางอย่าง 167 00:15:00,235 --> 00:15:06,028 Claude ชอบเลือกชื่อ Sarah Chen เสมอ ไม่รู้ทำไม เนื้อหาประมาณว่า 168 00:15:06,028 --> 00:15:10,535 บนแพลตฟอร์มคอร์สเรียนของเราที่ชื่อ Cadence ตัวเลข 169 00:15:10,535 --> 00:15:18,719 retention (การรักษาผู้ใช้ให้อยู่ต่อ) ไม่ค่อยดี นักเรียนสมัครเรียนสองสามบทเรียนแล้วก็หายไป 170 00:15:18,719 --> 00:15:24,053 อยากเพิ่ม gamification (การทำให้เป็นเกม) เข้าไปในแพลตฟอร์ม 171 00:15:24,053 --> 00:15:29,111 และเมื่อคุณเจอไอเดียแบบนี้ คุณต้องหาทางทำให้มันเป็นจริง 172 00:15:29,111 --> 00:15:34,905 สมมติว่า Sarah Chen เป็นลูกค้าของคุณ งบจำกัด ต้องทำให้เสร็จเร็ว 173 00:15:34,905 --> 00:15:39,319 จะเริ่มยังไงดี? ยกมือขึ้นถ้าจะเข้าโหมด plan mode 174 00:15:39,319 --> 00:15:44,377 (โหมดวางแผน) ตอนทำเรื่องนี้ มีใครใช้ plan mode ตัวหนักๆ 175 00:15:44,377 --> 00:15:49,251 บ้าง? ใช่ อีก ใครมีไอเดียอื่นว่าจะทำยังไงกับเรื่องนี้ 176 00:15:49,251 --> 00:15:54,585 ยกมือขึ้น อย่างแรกที่คุณจะทำคืออะไร? ใช่ ขอข้อมูลเพิ่มเติม 177 00:15:54,585 --> 00:15:59,735 อะไรนะ? ขอข้อมูลเพิ่มเติมเพื่อยืนยันว่าจุดประสงค์คืออะไร 178 00:15:59,735 --> 00:16:04,793 และสถานะตอนนี้เราอยู่ตรงไหน ใช่ ถูกต้อง ลองจินตนาการว่า 179 00:16:04,793 --> 00:16:09,116 Sarah Chen ไปเที่ยวพักร้อน แล้วคุณไม่รู้อะไรเลย 180 00:16:09,116 --> 00:16:13,990 เธอเพิ่งโพสต์ข้อความนี้มา และคุณต้องจัดการมันก่อนจะไป 181 00:16:13,990 --> 00:16:19,324 ผมจะเริ่มจาก skill ตัวนี้ ผมจะล้าง context ผมจะเอาคุณออกไป 182 00:16:19,324 --> 00:16:24,198 ไม่ต้องอยู่ตรงนั้นแล้ว แล้วผมจะเรียกใช้ skill ที่ชื่อ 183 00:16:24,198 --> 00:16:29,532 grill me skill ขอเช็กหน่อย ยกมือขึ้นถ้าไม่รู้ว่านี่คืออะไร 184 00:16:29,532 --> 00:16:39,280 เจ๋ง โอ้ ขอโทษๆ ขอพูดให้เฉพาะเจาะจงกว่านี้ ยกมือขึ้นถ้าไม่รู้ว่าผมกำลังทำอะไรอยู่ตอนที่พิมพ์เครื่องหมายทับ 185 00:16:39,280 --> 00:16:44,154 (/) แล้วตามด้วยคำสั่ง มีใครพอเข้าใจบ้างว่ามันคืออะไร? 186 00:16:44,154 --> 00:16:48,936 ผมกำลังเรียกใช้ skill ผมกำลังเรียกใช้ grill me skill 187 00:16:48,936 --> 00:16:53,626 และสิ่งที่ผมจะทำคือพิมพ์ว่า grill me แล้วส่ง client 188 00:16:53,626 --> 00:16:58,132 brief (เอกสารสรุปความต้องการลูกค้า) เข้าไป ตอนนี้ 189 00:16:58,132 --> 00:17:04,018 LLM มีของอยู่แค่ไม่กี่อย่าง คือ skill กับคำอธิบายว่าผมอยากทำอะไร 190 00:17:04,018 --> 00:17:08,892 และนี่คือวิธีที่ผมเริ่มงานทุกชิ้นกับ AI แทบจะทุกครั้ง 191 00:17:08,892 --> 00:17:13,214 และระหว่างที่มันสำรวจโค้ดเบส ผมจะให้ดูว่า grill 192 00:17:13,214 --> 00:17:18,088 me skill ทำอะไรบ้าง skill นี้อยู่ใน repo คุณเปิดดูได้ 193 00:17:18,088 --> 00:17:23,882 มันสั้นมากๆ "สัมภาษณ์ฉันอย่างไม่ลดละเกี่ยวกับทุกแง่มุมของแผนนี้ 194 00:17:23,882 --> 00:17:28,664 จนกว่าเราจะเข้าใจตรงกัน เดินไล่ไปตามกิ่งของ decision 195 00:17:28,664 --> 00:17:33,171 tree (แผนผังการตัดสินใจ) แต่ละกิ่ง แก้ dependency 196 00:17:33,171 --> 00:17:37,677 (ความสัมพันธ์ระหว่างงาน) ทีละอัน สำหรับแต่ละคำถาม 197 00:17:37,677 --> 00:17:41,999 ให้คำตอบที่คุณแนะนำ ถามทีละคำถาม อะไรประมาณนี้" 198 00:17:41,999 --> 00:17:46,505 สิ่งที่ skill นี้ทำ และสิ่งที่ผมสังเกตตอนทำงานกับ 199 00:17:46,505 --> 00:17:52,667 AI โดยเฉพาะในโหมด plan mode คือมันกระตือรือร้นมากที่จะสร้างแผนให้ผม 200 00:17:52,667 --> 00:17:57,265 มันจะบอกว่า "โอเค ผมว่าข้อมูลเพียงพอแล้ว ฉันจะปุ๊บ 201 00:17:57,265 --> 00:18:04,346 แผน แผน เลยนะ" และสิ่งที่ผมพบคือ ผมกำลังพยายามหาคำพูดให้สิ่งที่ผมต้องการจริงๆ 202 00:18:04,346 --> 00:18:08,853 แทนที่จะเป็นแบบนั้น Frederick P. Brooks ในหนังสือ 203 00:18:08,853 --> 00:18:14,738 The Design of Design มีคำพูดที่ยอดเยี่ยมเกี่ยวกับแนวคิดการออกแบบ 204 00:18:14,738 --> 00:18:22,095 (design concept) เวลาคุณทำงานใหม่ๆ กับใครสักคน ตอนที่ทุกคนพยายามสร้างอะไรด้วยกัน 205 00:18:22,095 --> 00:18:26,418 จะมีความคิดร่วมกันที่แชร์ระหว่างผู้ร่วมงานทุกคน 206 00:18:26,418 --> 00:18:32,303 และนั่นคือ design concept และนั่นคือสิ่งที่ผมรู้ตัวว่าต้องการกับ 207 00:18:32,303 --> 00:18:37,177 Claude ผมต้องเข้าใจตรงกัน ผมต้องการ asset (ทรัพย์สิน) 208 00:18:37,177 --> 00:18:42,879 ไม่ใช่แผน ผมต้องอยู่ในคลื่นความถี่เดียวกับ AI หรือเอเจนต์ของผม 209 00:18:42,879 --> 00:18:47,385 และนี่คือวิธีที่ได้ผลมาก หวังว่า... เอาล่ะ เยี่ยม 210 00:18:47,385 --> 00:18:52,260 มันสำรวจเสร็จแล้ว มันเรียกใช้ sub agent (เอเจนต์ย่อย) 211 00:18:52,260 --> 00:18:57,593 ซึ่งใช้ไป 93.7K tokens บนโมเดล Opus แล้วก็ถามคำถามแรกกับผม 212 00:18:57,593 --> 00:19:02,100 เจ๋ง เราจะเห็นว่าแม้ sub agent จะเผา token ไปเยอะ 213 00:19:02,100 --> 00:19:06,790 แต่ token ที่ผมใช้จริงไม่ได้เพิ่มขึ้นมากมายขนาดนั้น 214 00:19:06,790 --> 00:19:11,664 ยกมือขึ้นถ้าไม่รู้ว่า sub agent คืออะไร คำถามนี้สำคัญ 215 00:19:11,664 --> 00:19:17,274 ทุกคนพอเข้าใจไหมว่า sub agent คืออะไร? โอเค ขอให้คำนิยามสั้นๆ 216 00:19:17,274 --> 00:19:22,148 ตัว sub agent ตรงนี้ ตัว explore sub agent มันไปเรียก 217 00:19:22,148 --> 00:19:26,654 LLM อีกตัวหนึ่งซึ่งมี context window แยกเป็นอิสระ 218 00:19:26,654 --> 00:19:32,724 แล้ว LLM ตัวนั้นก็รายงานสรุปกลับมา sub agent ก็เหมือนการมอบหมายงาน 219 00:19:32,724 --> 00:19:38,241 (delegation) คุณมอบงานให้ sub agent มันก็ไปทำอย่างขะมักเขม้น 220 00:19:38,241 --> 00:19:43,575 สำรวจของเยอะแยะ แล้วก็ค่อยๆ ส่งเฉพาะส่วนสำคัญกลับขึ้นมาให้ 221 00:19:43,575 --> 00:19:48,174 orchestrator agent (เอเจนต์หลัก) หรือ parent agent 222 00:19:48,174 --> 00:19:52,496 (เอเจนต์แม่) โอเค หวังว่าทุกคนจะเห็นแบบเดียวกัน 223 00:19:52,496 --> 00:19:57,554 มันสำรวจเสร็จแล้ว และตอนนี้เรามีคำถามแรกแล้ว "ระบบคะแนน 224 00:19:57,554 --> 00:20:02,704 (points economy) การกระทำแบบไหนได้คะแนน และได้เท่าไหร่?" 225 00:20:02,704 --> 00:20:08,406 โอเค ระหว่างนี้คุณถามมันเพื่อทำความเข้าใจ repo ให้ลึกขึ้นก็ได้ 226 00:20:08,406 --> 00:20:14,935 ผมรู้จัก repo นี้ดีมากเพราะผมเขียนมันเอง แต่คุณอาจไม่รู้ว่ามันเป็นยังไง 227 00:20:14,935 --> 00:20:20,453 ขอเสนอคำแนะนำผม คือให้ง่ายไว้ก่อน เริ่มจากแหล่งคะแนนสองแหล่ง 228 00:20:20,453 --> 00:20:25,879 สิ่งที่เจ๋งคือไม่เพียงแต่มันให้คำถามที่ทำให้เราเข้าใจตรงกัน 229 00:20:25,879 --> 00:20:31,029 แต่เรายังได้คำแนะนำด้วย และบ่อยครั้งที่ผมพบว่าคำแนะนำของ 230 00:20:31,029 --> 00:20:35,995 AI ดีมากจริงๆ ผมก็จะตอบว่า ข้าม event การดูวิดีโอไปเลย 231 00:20:35,995 --> 00:20:40,961 มัน noisy (มีสัญญาณรบกวน) และโกงได้ง่าย ใช่ ผมเห็นด้วย 232 00:20:40,961 --> 00:20:45,927 Sarah ขอให้เก็บบทเรียนเป็นแก่นหลักไว้ ใช่ ดูดีนะเพื่อน 233 00:20:45,927 --> 00:20:51,721 >> [หัวเราะเบาๆ] >> สิ่งที่ผมมักจะทำคือ ผมมักจะสั่งด้วยเสียงกับ 234 00:20:51,721 --> 00:20:57,698 AI จริงๆ แล้วผมพูดคุยกับ AI แทนการพิมพ์ แต่แล็ปท็อปเครื่องนี้ใหม่ 235 00:20:57,698 --> 00:21:02,113 และผมลงซอฟต์แวร์สั่งเสียงไม่สำเร็จ เพราะ Windows 236 00:21:02,113 --> 00:21:07,354 มันห่วย แล้วก็ คำถามที่ว่า คะแนนควรย้อนหลัง (retroactive) 237 00:21:07,354 --> 00:21:12,412 ไหม? มันมีบันทึกความก้าวหน้าของบทเรียนเดิมอยู่แล้วพร้อม 238 00:21:12,412 --> 00:21:16,919 timestamp ตอนเรียนจบ นี่เป็นคำถามหินจริงๆ ใช่ไหม? 239 00:21:16,919 --> 00:21:21,701 เราควรย้อนกลับไป backfill (เติมข้อมูลย้อนหลัง) event 240 00:21:21,701 --> 00:21:28,506 ความก้าวหน้าบทเรียนทั้งหมดไหม? นี่คือคำถามประเภทที่คุณต้องตกลงกันให้ชัดเจน 241 00:21:28,506 --> 00:21:33,196 ถ้าจะทำฟีเจอร์นี้ให้ถูกต้อง ผมไม่ได้คิดถึงเรื่องนี้ 242 00:21:33,196 --> 00:21:38,714 และ Sarah Chen ก็ไม่ได้คิดถึงแน่นอน ผมอยากให้มันย้อนหลังไหม? 243 00:21:38,714 --> 00:21:43,496 อืม ลองโหวตกันในห้องนี้ดีกว่า ควรย้อนกลับไป backfill 244 00:21:43,496 --> 00:21:48,186 ข้อมูลทั้งหมดไหม? ยกมือขึ้นถ้าคิดว่าเราควร backfill 245 00:21:48,186 --> 00:21:53,244 ทั้งหมด ยกมือขึ้นถ้าคิดว่าไม่ควร backfill มีคนนั่งกลางๆ 246 00:21:53,244 --> 00:21:58,211 ในห้องเยอะเลย ผมจะบอกว่า นี่คือการสนทนาแบบที่คุณคุยกับ 247 00:21:58,211 --> 00:22:03,912 AI คุณกำลังเข้าใจตรงกันมากขึ้นเรื่อยๆ ใช่ ผมจะตามคำแนะนำของมัน 248 00:22:03,912 --> 00:22:08,235 เพราะผมขี้เกียจ สังเกตด้วยว่าผมอยู่ในวงวนกับ AI 249 00:22:08,235 --> 00:22:14,304 ได้ตลอด ผมไม่ต้อง... มันยิงคำถามมาให้ผมเร็วมาก ผมไม่ต้องเผลอไปเปิด 250 00:22:14,304 --> 00:22:18,810 Twitter หรืออะไร Levels (ระดับ) เส้นโค้งการเติบโต 251 00:22:18,810 --> 00:22:23,409 (progression curve) เป็นยังไง? ใช่ ดูประมาณนั้นได้ 252 00:22:23,409 --> 00:22:28,099 ตัวอย่างเช่น ใช่ โอเค หวังว่าคุณคงได้ลองทำแบบนี้กับ 253 00:22:28,099 --> 00:22:33,157 AI แล้ว >> [กระแอม] >> และพยายามให้เกิดความเข้าใจตรงกัน 254 00:22:33,157 --> 00:22:37,571 grill me skill นี้ใช้เวลานานได้นะ ผมเคยให้มันถาม 255 00:22:37,571 --> 00:22:42,353 40 คำถาม เคยถาม 80 คำถาม มีบางคนถามถึง 100 คำถามด้วย 256 00:22:42,353 --> 00:22:49,802 นั่งคุยกับ AI เป็นชั่วโมงจริงๆ และสิ่งที่คุณได้คือประวัติการสนทนาที่ทำงานได้ดีมาก 257 00:22:49,802 --> 00:22:56,424 เป็น asset ของ design concept ที่คุณกำลังสร้าง มันยังใช้แบบนี้ได้อีกด้วย 258 00:22:56,424 --> 00:23:01,666 คุณสามารถนัดประชุมกับใครสักคนที่เป็นผู้เชี่ยวชาญด้านโดเมน 259 00:23:01,666 --> 00:23:08,931 (domain expert) บางทีผมอาจนัดประชุมกับ Sarah แล้วส่งบันทึกการประชุมนั้นเข้าไปใน 260 00:23:08,931 --> 00:23:15,000 Gemini meetings หรืออะไรก็ตามที่คุณใช้ จากนั้นเอามันเข้าไปในเซสชัน 261 00:23:15,000 --> 00:23:20,610 grilling (การซักถาม) แล้วซักถามผ่านสมมติฐานที่คุณไม่ได้คิดไว้ 262 00:23:20,610 --> 00:23:25,484 มันจึงกลายเป็นวิธีที่ดีมากในการรับ input จากโลกภายนอก 263 00:23:25,484 --> 00:23:32,565 แล้วเปลี่ยนมันและตรวจสอบมัน โอเค มาดูกัน ผมอยากไปให้ถึงจุดจบของเรื่องนี้จริงๆ 264 00:23:32,565 --> 00:23:37,164 แต่ก็ไม่อยากนั่งคุยกับ AI ต่อหน้าทุกคนเป็นพันๆ วัน 265 00:23:37,164 --> 00:23:42,038 ดังนั้นผมจะตอบว่า ใช่ มาดูกันว่าจะเกิดอะไรขึ้น เอาล่ะ 266 00:23:42,038 --> 00:23:47,831 ผมจะบอกให้ ขณะที่พวกคุณลองเล่นกับแบบฝึกหัดนี้ในเครื่องของตัวเอง 267 00:23:47,831 --> 00:23:52,798 เรามาเริ่มช่วง Q&A สั้นๆ กันเลยดีกว่า แล้วจะทำยังไงดี? 268 00:23:52,798 --> 00:23:58,499 ช่วยปิดประตู หรือเปิดไมโครโฟนดังๆ หน่อยได้ไหม? เสียงดังไปหน่อย 269 00:23:58,499 --> 00:24:03,006 ไมค์ ช่วยปิดประตูได้ไหม? โอ้ ปิดแล้ว Mark ตอบแล้ว 270 00:24:03,006 --> 00:24:08,156 เยี่ยม สิ่งที่อยากให้คุณทำคือ... มีแอร์ไหม? มีแอร์อยู่นะ 271 00:24:08,156 --> 00:24:12,478 ผมว่ามีแอร์ พวกคุณไม่โดนย่าง แต่ผมนี่โดนย่างสดๆ 272 00:24:12,478 --> 00:24:17,628 เลย สิ่งที่อยากให้ทำคือเข้าไปที่ Slido (แพลตฟอร์มถามตอบ) 273 00:24:17,628 --> 00:24:22,134 ซึ่งคุณ join ได้จากตรงนี้ ถ้าคุณไม่ได้ทำแบบฝึกหัด 274 00:24:22,134 --> 00:24:27,376 ก็เข้าไปที่ Slido เล่นๆ แล้วโหวตคำถามดีๆ หน่อย ผมจะคุยกับ 275 00:24:27,376 --> 00:24:32,250 AI สักครู่ จนกว่าเราจะถึงจุดที่หยุดได้ "สตรีค (streak 276 00:24:32,250 --> 00:24:37,032 การเรียนติดต่อกัน) ได้คะแนนไหม?" อืม สตรีคแยกต่างหาก 277 00:24:37,032 --> 00:24:42,458 มาดูกันว่ามันจะถามอะไรอีก "UI ของ gamification อยู่ที่ไหน?" 278 00:24:42,458 --> 00:24:47,148 เอาไว้ในแดชบอร์ด ผมจะกวาดดูแล้วตอบให้เร็วๆ เลย แล้ว 279 00:24:47,148 --> 00:24:51,838 Slido ของเราเป็นยังไงบ้าง? โอเค "ผมลองใช้ Spec Kit, 280 00:24:51,838 --> 00:24:56,345 Open Spec หรือ Taskmaster แทน Grill Me skill ไหม? 281 00:24:56,345 --> 00:25:02,782 ผมพบว่ามัน verbose (ร่ายยาว) กว่า หรือเป็นทางเลือกที่มีโครงสร้างกว่า?" 282 00:25:02,782 --> 00:25:09,128 เป็นคำถามที่ดีมาก มีเฟรมเวิร์กมากมายที่ช่วยสร้างกระบวนการวางแผนให้คุณ 283 00:25:09,128 --> 00:25:15,749 ผมเชื่อว่าในระยะนี้ ที่ยังไม่มีผู้ชนะชัดเจน ยังไม่มีหนทางเดียวที่ถูกต้อง 284 00:25:15,749 --> 00:25:21,083 และอะไรๆ ก็เปลี่ยนตลอดเวลา คุณต้องเป็นเจ้าของสแตกการวางแผน 285 00:25:21,083 --> 00:25:28,992 (planning stack) ให้ได้มากที่สุดเท่าที่จะทำได้ สิ่งที่ผมสังเกตเห็นจากนักศึกษาหลายคนคือ 286 00:25:28,992 --> 00:25:36,073 พวกเขามักใช้สแตกเดิมๆ มากเกินไป แล้วเจอปัญหา เพราะพวกเขาไม่ได้เป็นเจ้าของสแตก 287 00:25:36,073 --> 00:25:41,131 และไม่เห็นภาพรวมทั้งหมด พวกเขาก็แค่สรุปว่า มันไม่เวิร์ค 288 00:25:41,131 --> 00:25:47,017 มันห่วย ในขณะที่ถ้าคุณควบคุมทุกอย่างได้ อย่างน้อยคุณก็รู้วิธีแก้ 289 00:25:47,017 --> 00:25:51,891 หรือมีโอกาสรู้วิธีแก้ ดังนั้น ถึงแม้ผมจะให้สแตกกับคุณ 290 00:25:51,891 --> 00:25:57,409 ผมเชื่อในหลักการ inversion of control (การกลับด้านการควบคุม) 291 00:25:57,409 --> 00:26:01,915 คือคุณควรควบคุมสแตกเอง แล้วก็... ขอกดศูนย์ได้ไหม? 292 00:26:01,915 --> 00:26:07,065 อะไรนะ? ขอโทษ ผมพึมพำเยอะไปหน่อย ขอ... ขอบคุณ ขอโทษจริงๆ 293 00:26:07,065 --> 00:26:11,755 >> [เสียงหัวเราะ] >> อะไรกัน คุณไม่อยากให้ feedback 294 00:26:11,755 --> 00:26:17,457 ดีๆ กับ Claude เหรอ? คุณเป็นอะไรไป? โอเค เจ๋ง "คำถามหลายข้อของ 295 00:26:17,457 --> 00:26:22,423 Grill Me skill ไม่เหมาะกับนักพัฒนาเท่าไหร่ แต่เหมาะกับ 296 00:26:22,423 --> 00:26:26,837 PO (product owner) ในทีมใหญ่ๆ ใครควรใช้มัน?" ใช่ 297 00:26:26,837 --> 00:26:31,711 ยกมือขึ้นถ้าเคยทำ pair programming (เขียนโค้ดเป็นคู่) 298 00:26:31,711 --> 00:26:36,769 เคยทำกันไหม? ใช่ วางมือลง แล้วยกมือขึ้นอีกครั้งถ้าเคยทำ 299 00:26:36,769 --> 00:26:41,275 pair programming กับ AI ใช่ เป็นยังไงบ้าง? ดีไหม? 300 00:26:41,275 --> 00:26:46,793 สนุกไหม? ผมว่าการ pair programming กับ AI เป็นไอเดียที่ดีมาก 301 00:26:46,793 --> 00:26:52,771 เพราะคุณมีคนที่สามอยู่ในห้อง ที่จะซักไซ้และตั้งคำถามกับคุณไม่หยุด 302 00:26:52,771 --> 00:26:57,645 ถ้าคุณไม่รู้คำตอบ มันควรเป็นคุณ ผู้เชี่ยวชาญด้านโดเมน 303 00:26:57,645 --> 00:27:02,059 และ AI อยู่ในห้องเดียวกัน ถ้าคุณมีคำถามเรื่องการ 304 00:27:02,059 --> 00:27:07,577 implement ก็ควรเป็นคุณ นักพัฒนาด้วยกัน และ AI ในห้องเดียวกัน 305 00:27:07,577 --> 00:27:13,279 คุณสามารถทำงานผ่านคำถามเหล่านี้ในทีมได้ และเดี๋ยวเราจะดูเรื่อง 306 00:27:13,279 --> 00:27:18,245 implementation กันในอีกสักครู่ แล้วจะเห็นว่าทำยังไงให้ 307 00:27:18,245 --> 00:27:23,947 implementation เร็วขึ้นมาก แต่ผมคิดว่าการตัดสินใจที่สำคัญจริงๆ 308 00:27:23,947 --> 00:27:31,488 ที่ต้องใช้มนุษย์ คุณต้องใช้มนุษย์จำนวนมาก และจำนวนมนุษย์ในนั้นไม่ค่อยสำคัญเท่าไหร่ 309 00:27:31,488 --> 00:27:36,270 คุณสามารถระดมคนจำนวนมากเข้ามา เหมือน mob programming 310 00:27:36,270 --> 00:27:40,684 (เขียนโค้ดเป็นกลุ่ม) กับ AI นั่นแหละ "เครื่องมือ 311 00:27:40,684 --> 00:27:45,006 meta prompting (การเขียนพรอมป์เพื่อสร้างพรอมป์) 312 00:27:45,006 --> 00:27:49,880 ที่ผมชอบที่สุดคืออะไร?" ผมคิดว่าตอบไปแล้ว "ไม่มีแอร์" 313 00:27:49,880 --> 00:27:54,295 ช่างมันเถอะ "จะใช้บทสนทนาเป็น asset หลังจบเซสชัน 314 00:27:54,295 --> 00:28:02,571 Grill Me ยังไง?" เดี๋ยวเราจะไปถึงตรงนั้น โอเค ผมอยากเร่งความเร็วนี้แบบไม่เป็นธรรมชาติหน่อย 315 00:28:02,571 --> 00:28:06,986 นี่คือประเด็นสำคัญ มีคนเพิ่งพูดว่า "โอเค เอาไปวน 316 00:28:06,986 --> 00:28:11,400 Ralph loop เลย" แต่นี่คือจุดสำคัญ เพราะผมวน loop 317 00:28:11,400 --> 00:28:16,458 กับขั้นตอนนี้ไม่ได้ ใช่ไหม? ผมคิดว่ามีงานสองประเภทในยุค 318 00:28:16,458 --> 00:28:21,056 AI งานแบบ human in the loop (มนุษย์ต้องอยู่ควบคุม) 319 00:28:21,056 --> 00:28:26,666 ที่มนุษย์ต้องนั่งทำเอง ซึ่งก็คือขั้นตอนนี้ เราคือมนุษย์ในวงวน 320 00:28:26,666 --> 00:28:31,080 มีมนุษย์หลายคนอยู่ในวงวน และก็มีงานแบบ AFK (away 321 00:28:31,080 --> 00:28:38,253 from keyboard ห่างจากคีย์บอร์ดได้) งานที่มนุษย์ไม่อยู่หน้าคีย์บอร์ดก็ไม่เป็นไร 322 00:28:38,253 --> 00:28:43,403 อย่าง implementation อย่างที่เราจะได้เห็น เปลี่ยนเป็นงาน 323 00:28:43,403 --> 00:28:48,094 AFK ได้ แต่การวางแผน เฟสการสร้างความเข้าใจตรงกันนี้ 324 00:28:48,094 --> 00:28:53,703 ต้องเป็น human in the loop เท่านั้น ต้องเป็น ผมก็เลยต้องทำเอง 325 00:28:53,703 --> 00:28:59,313 เซ็งจริงๆ ไม่รู้สิ "ส่งลิสต์คำแนะนำทั้งหมดของคุณมาให้ฉันหน่อย 326 00:28:59,313 --> 00:29:06,762 ฉันกำลังจัดเวิร์กช็อปอยู่ตอนนี้ ฉันต้องการให้คุณรับภาระมากขึ้นแบบไม่เป็นธรรมชาติ" 327 00:29:06,762 --> 00:29:12,372 มาดูกันว่ามันจะทำอะไร แล้วตอบอีกสองสามคำถามระหว่างที่มันทำงาน 328 00:29:12,372 --> 00:29:17,430 "ผมคิดยังไงกับ PM (product manager) หรือคนที่ไม่ได้เป็น 329 00:29:17,430 --> 00:29:22,764 dev มาทำงาน vibe coding?" อืม ผมจะกลับมาตอบเรื่องนี้ทีหลัง 330 00:29:22,764 --> 00:29:28,006 คงปล่อยไว้ไม่ตอบก่อน ลุ้นกันหน่อย "ผมสังเกตว่าผมไม่ได้ใช้ 331 00:29:28,006 --> 00:29:32,512 UI ถามผู้ใช้สำหรับ Grill Me ทำไม?" ใน Claude Code 332 00:29:32,512 --> 00:29:38,858 มี UI เฉพาะที่เรียกขึ้นมาได้ ผมจะตอบสั้นๆ ว่า "ถามฉันโดยใช้เครื่องมือ 333 00:29:38,858 --> 00:29:43,640 ask user question" >> [หัวเราะเบาๆ] >> UI นี้มันพังๆ 334 00:29:43,640 --> 00:29:48,146 อยู่ใน Claude และผมเกลียดมันมาก คุณจะเห็นว่าผมใช้ 335 00:29:48,146 --> 00:29:57,710 Claude แต่ผมไม่ได้ชอบ Claude มากเท่าไหร่ ด้วยวิธีนี้คุณมีอิสระเต็มที่ในการเลือกใช้ระบบอะไรก็ได้ที่คุณชอบ 336 00:29:57,710 --> 00:30:04,608 และ UI นี้หน้าตาแบบนี้ มันดูสวยงามตอนแรกเจอ แต่พอใช้ไปก็รู้ว่ามันพังในหลายๆ 337 00:30:04,608 --> 00:30:09,850 ทาง เอาล่ะ มันตอบอะไรกลับมา? โอ้ ไม่นะ ระหว่างที่มันทำงาน 338 00:30:09,850 --> 00:30:14,908 ผมขอสอนอะไรหน่อย แผนคือ เราจะนำ Grill Me skill ของเรามา 339 00:30:14,908 --> 00:30:20,425 และต้องหาทางเปลี่ยนมันให้เป็น "จุดหมายปลายทาง" (destination) 340 00:30:20,425 --> 00:30:25,759 เราต้องลงไป... จริงๆ แล้วเรากำลังหาทางปั้นรูปทรงของสิ่งนี้ 341 00:30:25,759 --> 00:30:31,553 นั่นคือสิ่งที่เราทำ เรากำลังหาว่างานมีรูปร่างยังไงระหว่างเซสชัน 342 00:30:31,553 --> 00:30:35,967 grilling และเพื่อเปลี่ยนมันเป็นชุดการกระทำที่ AI 343 00:30:35,967 --> 00:30:41,117 ทำตามได้ เราจำเป็นต้องรู้จุดหมาย ต้องรู้ว่าเราจะไปทางไหน 344 00:30:41,117 --> 00:30:47,279 ต้องรู้รูปทรงทั้งหมดของสิ่งนี้ ผมคิดว่าเราต้องการเอกสารสำคัญสองฉบับ 345 00:30:47,279 --> 00:30:51,601 เราต้องการเอกสารที่บันทึกจุดหมายปลายทาง โอ้ ไม่ 346 00:30:51,601 --> 00:30:58,590 สว่างไม่พอ เอาล่ะ ยังไม่สว่างขึ้น เอาล่ะ เราต้องมีเอกสารบันทึกจุดหมายปลายทาง 347 00:30:58,590 --> 00:31:08,339 และเอกสารบันทึกเส้นทางการเดินทาง พูดอีกแบบคือ เราต้องมีเอกสารที่ช่วยกำหนดว่าสิ่งนี้หน้าตาเป็นยังไงในแง่ของ 348 00:31:08,339 --> 00:31:12,937 user stories (เรื่องเล่าความต้องการผู้ใช้) ทั้งหมด 349 00:31:12,937 --> 00:31:20,478 กำหนดนิยามของความสำเร็จ (definition of done) แล้วก็ต้องหาว่าการแบ่งงานควรเป็นยังไง 350 00:31:20,478 --> 00:31:25,168 นั่นคือสิ่งที่เราจะทำต่อไป พอจบเซสชัน grilling แล้ว 351 00:31:25,168 --> 00:31:29,858 ใช่ มันดูดีมาก สุดยอด ผมชอบมาก มันตอบคำถามของมันเอง 352 00:31:29,858 --> 00:31:35,652 22 ข้อ เอาล่ะ นี่คือภาพแทนของเซสชัน grilling ทั่วไปได้ดีทีเดียว 353 00:31:35,652 --> 00:31:40,986 ณ จุดนี้ ผมใช้ไป 25K tokens และเนื้อหาส่วนใหญ่เป็นทองคำแท้ 354 00:31:40,986 --> 00:31:45,308 ผมอยากเก็บมันไว้ ผมมี token ดีๆ 25K อยู่ตรงนั้น 355 00:31:45,308 --> 00:31:49,906 และสิ่งที่อยากทำคือสรุปมันเป็นเอกสารจุดหมายปลายทาง 356 00:31:49,906 --> 00:31:54,688 นี่คือแบบฝึกหัดถัดไป เราจะเขียน product requirements 357 00:31:54,688 --> 00:32:03,609 document (เอกสารข้อกำหนดผลิตภัณฑ์) หรือ PRD ซึ่งหน้าที่ของมันคือการเป็นเอกสารจุดหมายปลายทางนี่เอง 358 00:32:03,609 --> 00:32:08,299 รูปแบบไม่สำคัญเท่าไหร่ ผมมีรูปแบบที่ชอบและถูกใจอยู่ 359 00:32:08,299 --> 00:32:13,541 แต่คุณเลือกใช้รูปแบบของคุณเอง หรือแบบที่บริษัทคุณใช้ก็ได้ 360 00:32:13,541 --> 00:32:18,415 สิ่งที่เราทำจริงๆ คือ ผมไม่ได้กังวลเรื่องนั้นเท่าไหร่ 361 00:32:18,415 --> 00:32:24,117 สิ่งที่เราทำจริงๆ คือการสรุป design concept ที่เรามีอยู่ตอนนี้ 362 00:32:24,117 --> 00:32:30,554 มาลองกัน ผมจะเริ่มมัน ผมจะเลื่อนลงไปล่างสุด สิ่งที่ผมจะทำก็แค่พิมพ์ว่า 363 00:32:30,554 --> 00:32:34,877 "write a PRD" แล้วเรามาดู skill นั้นกัน write a 364 00:32:34,877 --> 00:32:42,050 PRD skill นี้ทำหลายอย่าง อย่างแรกคือถามผู้ใช้ให้อธิบายปัญหาอย่างละเอียดและยาวๆ 365 00:32:42,050 --> 00:32:47,016 คุณใช้ write a PRD โดยไม่ต้อง grill ก่อนก็ได้ แต่ผมชอบ 366 00:32:47,016 --> 00:32:52,258 grill ก่อนแล้วค่อยเขียน PRD ทีหลัง จากนั้นก็ให้มันติดตั้ง 367 00:32:52,258 --> 00:32:57,592 repo ซึ่งเราทำไปแล้ว จากนั้นให้มันสัมภาษณ์ผู้ใช้แบบไม่ลดละ 368 00:32:57,592 --> 00:33:02,374 ได้ grilling session อีกรอบ แล้วก็เริ่มประกอบเทมเพลต 369 00:33:02,374 --> 00:33:06,788 PRD ขึ้นมา skill นี้อยู่ใน repo ถ้าอยากลองเปิดดู 370 00:33:06,788 --> 00:33:11,202 และหน้าตาของมันก็ประมาณนี้ มี problem statements 371 00:33:11,202 --> 00:33:16,076 (คำอธิบายปัญหา) ปัญหาที่ผู้ใช้เจอ วิธีแก้ปัญหา และชุด 372 00:33:16,076 --> 00:33:21,870 user stories user stories เหล่านี้เป็นตัวนิยามว่าสิ่งนี้คืออะไร 373 00:33:21,870 --> 00:33:26,652 ถ้าคุณเคยเป็นนักพัฒนามาก่อน ก็น่าจะเคยเห็นอะไรแบบนี้ 374 00:33:26,652 --> 00:33:31,250 ภาษาที่ใช้เขียนคือ Cucumber หรือเราจะเขียนเองก็ได้ 375 00:33:31,250 --> 00:33:36,033 จากนั้นก็มีลิสต์การตัดสินใจด้านการ implement ที่ทำไป 376 00:33:36,033 --> 00:33:41,275 และที่สำคัญคือลิสต์การตัดสินใจด้านการทดสอบด้วย ผมจะรันมัน 377 00:33:41,275 --> 00:33:46,057 โอเค มันเสร็จแล้ว อ่า! Windows ขอปิดหน้าต่างนี้หน่อย 378 00:33:46,057 --> 00:33:52,402 ขอบคุณ ไม่รู้ว่าทำไมผมถึงซื้อแล็ปท็อป Windows ผมว่าผมแค่ชอบความท้าทาย 379 00:33:52,402 --> 00:33:58,288 >> [กระแอม] >> สิ่งแรกที่มันจะให้ผมคือชุดโมดูลที่เสนอว่าควรแก้ไข 380 00:33:58,288 --> 00:34:03,530 ตอนนี้มีเหตุผลลึกๆ ที่ผมคิดเรื่องนี้ ในขั้นนี้เรามีไอเดีย 381 00:34:03,530 --> 00:34:09,783 เราเขียนสเปกคร่าวๆ ของไอเดียแล้ว เราเข้าใจตรงกันแล้วว่ากำลังจะทำอะไร 382 00:34:09,783 --> 00:34:14,841 จากนั้นต้องเริ่มคิดถึงโค้ด เพราะถึงจุดนี้แล้ว นี่ไม่ใช่ 383 00:34:14,841 --> 00:34:22,106 specs to code นี่ไม่ใช่จุดที่เราจะเมินโค้ด เราคำนึงถึงโค้ดอยู่ตลอดทั้งกระบวนการ 384 00:34:22,106 --> 00:34:34,430 วิธีที่ผมชอบคือการคิดถึงชุดโมดูลที่เสนอให้แก้ เราจะกลับมาที่แนวคิดเรื่องการออกแบบระบบของคุณอย่างต่อเนื่องและคำนึงถึงระบบของคุณอยู่เสมอ 385 00:34:34,430 --> 00:34:42,890 มันบอกว่า "แนะนำให้ทดสอบ gamification service เพราะมันเป็นโมดูลลึกโมดูลเดียวที่มีตรรกะสำคัญ" 386 00:34:42,890 --> 00:34:47,397 โมดูลเหล่านี้ดูถูกต้อง ใช่ ดูดี และมันจะสร้าง PRD 387 00:34:47,397 --> 00:34:52,179 ออกมา เพื่อความง่ายในการตั้งค่า ผมตั้งให้มันสร้างชุด 388 00:34:52,179 --> 00:34:57,513 issues (งาน) ในเครื่อง ดังนั้นมันจะสร้าง PRD ไว้ในโฟลเดอร์ 389 00:34:57,513 --> 00:35:02,019 issues นี้ แต่วิธีที่ผมทำปกติ และคุณลองไปดูเองได้ 390 00:35:02,019 --> 00:35:08,916 คือไปที่ repo งานของผม ซึ่งก็คือ github.com/MattPocock/course-video-manager 391 00:35:08,916 --> 00:35:15,997 ตามลิงก์ข้างบนนี้ ในนี้เป็นแอปที่ผมสร้างขึ้นมา ใช้ตลอดเวลาเพื่ออัดวิดีโอของผม 392 00:35:15,997 --> 00:35:22,619 ผมเคยดึงสถิติออกมาดู ผมอัดวิดีโอในนี้ไปประมาณพันกว่าเรื่องอะไรประมาณนั้น 393 00:35:22,619 --> 00:35:27,493 และคุณจะเห็นว่ามี issues ที่ปิดแล้ว 744 ตัว และนี่คือ 394 00:35:27,493 --> 00:35:33,470 PRD ทั้งหมดกับ issues ด้าน implementation ทั้งหมดที่ผมใส่ไว้ในนี้ 395 00:35:33,470 --> 00:35:39,264 นี่คือวิธีที่ผมชอบทำ >> [กระแอม] >> นั่นคือสิ่งที่ผมกำลังทำอยู่ 396 00:35:39,264 --> 00:35:43,770 เอาล่ะ ผมจะตอบว่า ใช่ แล้วก็สร้าง issue นั้นออกมา 397 00:35:43,770 --> 00:35:48,277 มาดูกัน มันอยู่ในนี้แล้ว เรามี problem statements 398 00:35:48,277 --> 00:35:52,967 คนที่สมัครเรียนคอร์ส วิธีแก้ user stories 18 เรื่อง 399 00:35:52,967 --> 00:35:57,841 ดูดี การตัดสินใจด้าน implementation เกณฑ์ระดับ (level 400 00:35:57,841 --> 00:36:05,198 thresholds) อะไรพวกนี้ ข้อมูลเพียงพอแล้ว เราเคลียร์แล้วว่าเราจะไปทางไหนและทำอะไร 401 00:36:05,198 --> 00:36:09,704 นั่นคือสิ่งที่เราทำ เรามีเซสชัน grilling และสร้าง 402 00:36:09,704 --> 00:36:15,038 asset ออกมาจากมัน ทีนี้ ยกมือหน่อย ผมควรทบทวนเอกสารนี้ไหม? 403 00:36:15,038 --> 00:36:20,372 ยกมือขึ้นถ้าคิดว่าผมควรทบทวนเอกสาร ใช่ ผมไม่ดูเอกสารพวกนี้ 404 00:36:20,372 --> 00:36:24,878 ผมไม่ดู เพราะสิ่งที่ผมกำลังทดสอบ ณ จุดนี้คืออะไร? 405 00:36:24,878 --> 00:36:30,856 เวลาผมอ่านมัน ผมกำลังทดสอบอะไร? failure modes (รูปแบบความล้มเหลว) 406 00:36:30,856 --> 00:36:36,282 ที่ผมกำลังพยายามเช็กคืออะไร? ผมรู้ว่า LLM เก่งเรื่องการสรุป 407 00:36:36,282 --> 00:36:40,880 เพราะมันเก่งจริงๆ ผมอยู่ในคลื่นความถี่เดียวกับ LLM 408 00:36:40,880 --> 00:36:45,662 แล้ว ใช่ไหม? การใช้ grill me skill ทำให้เรามี design 409 00:36:45,662 --> 00:36:50,352 concept ร่วมกัน ถ้าเรามี design concept ร่วมกันแล้ว 410 00:36:50,352 --> 00:36:55,410 สิ่งที่ผมทำก็แค่เช็กความสามารถในการสรุปของ LLM เท่านั้น 411 00:36:55,410 --> 00:37:02,400 ผมเลยไม่ค่อยอ่านพวกนี้ มาทำ Q&A กันดีกว่า เพราะผมรู้สึกว่าทุกคนอยากถามเต็มที 412 00:37:02,400 --> 00:37:06,906 และผมว่าเราน่าจะพักเบรกสัก 5 นาที เพื่อพักเสียงผม 413 00:37:06,906 --> 00:37:11,412 และให้ทุกคนได้ตามแบบฝึกหัดทันสักครู่ ถ้าไม่ว่ากัน 414 00:37:11,412 --> 00:37:17,022 มาทำ Q&A สั้นๆ กัน "ถ้าผมไม่ชอบ Claude Code แล้วผมชอบตัวไหน?" 415 00:37:17,022 --> 00:37:23,275 เคยได้ยินคำพูดที่ว่า "ประชาธิปไตยเป็นวิธีการปกครองประเทศที่แย่ที่สุด 416 00:37:23,275 --> 00:37:27,690 ยกเว้นวิธีอื่นๆ ทั้งหมด" ไหม? ผมรู้สึกแบบนั้นกับ 417 00:37:27,690 --> 00:37:33,483 Claude Code ตอบข้อนั้นแล้ว "คุณคิดยังไงกับนักพัฒนาที่ต้องเข้าใจ 418 00:37:33,483 --> 00:37:37,990 TypeScript อย่างลึกซึ้ง ในเมื่อตอนนี้มีเครื่องมือ 419 00:37:37,990 --> 00:37:44,059 fix the TS / make no mistakes อยู่แล้ว?" ผมไม่เข้าใจรูปแบบคำถามนี้ 420 00:37:44,059 --> 00:37:49,025 แต่คิดว่าเข้าใจความหมาย ซึ่งคือ ผมเชื่อว่าโค้ดสำคัญมาก 421 00:37:49,025 --> 00:37:55,279 และสิ่งนี้จะแทรกซึมไปทั้งเซสชัน และโค้ดเบสที่แย่จะสร้างเอเจนต์ที่แย่ 422 00:37:55,279 --> 00:38:01,716 ถ้าคุณมีโค้ดเบสที่ขยะๆ คุณจะได้ขยะออกมาจากเอเจนต์ที่ทำงานในโค้ดเบสนั้น 423 00:38:01,716 --> 00:38:09,441 เดี๋ยวเราจะพูดเรื่องนี้เพิ่มอีกที และผมคิดว่าการเข้าใจเครื่องมือเหล่านี้อย่างลึกซึ้ง 424 00:38:09,441 --> 00:38:14,683 เข้าใจโค้ดอย่างลึกซึ้ง จะทำให้คุณเป็นนักพัฒนาที่ดีขึ้นมาก 425 00:38:14,683 --> 00:38:19,649 และได้ประโยชน์จาก AI มากขึ้น และนั่นก็ตอบคำถามนั้นด้วย 426 00:38:19,649 --> 00:38:23,972 เยี่ยม ออกไปจากตรงนั้นหน่อย เอาล่ะ "ตอนนี้เรามี 427 00:38:23,972 --> 00:38:29,673 context window 1 ล้าน token แล้ว เราอยากใช้ประโยชน์จากมันจริงๆ 428 00:38:29,673 --> 00:38:34,915 ไหม? ผมสังเกตว่าโซนโง่ดูโง่น้อยลงช่วงนี้" โอเค คำถามดีมาก 429 00:38:34,915 --> 00:38:39,421 เรื่องนี้ย้อนกลับไปที่แนวคิดแรกของเราเรื่องโซนโง่ 430 00:38:39,421 --> 00:38:43,928 ผมอัดคอร์ส Claude Code โดยใช้ context window ขนาด 431 00:38:43,928 --> 00:38:48,802 200K และในวันที่ผมเปิดตัวคอร์ส พวกเขาก็ประกาศ context 432 00:38:48,802 --> 00:38:53,124 window 1 ล้าน ความเห็นผมคือ สิ่งที่ Claude Code 433 00:38:53,124 --> 00:38:58,274 ทำคือประมาณนี้ แหม! พวกเขาส่งโซนโง่เพิ่มให้คุณอีกเยอะมาก 434 00:38:58,274 --> 00:39:02,780 นี่เป็นเรื่องดีสำหรับงานที่คุณต้องการดึงข้อมูลจาก 435 00:39:02,780 --> 00:39:07,470 context window ขนาดใหญ่ ถ้าคุณอยากส่ง War and Peace 436 00:39:07,470 --> 00:39:13,172 (สงครามและสันติภาพ) ห้าเล่มเข้าไป แล้วให้มันหาว่ามีอะไรบ้าง... 437 00:39:13,172 --> 00:39:19,702 ผมนึกชื่อตัวละครใน War and Peace ไม่ได้เลย ทำไมผมถึงเริ่มด้วยอันนั้นนะ? 438 00:39:19,702 --> 00:39:25,495 มันดีสำหรับการค้นคืน (retrieval) แต่ไม่ค่อยดีสำหรับการเขียนโค้ด 439 00:39:25,495 --> 00:39:31,933 ผมเลยมองว่าตอนนี้โซนฉลาดอยู่ที่ประมาณ 100K และโซนฉลาดจะใหญ่ขึ้นเรื่อยๆ 440 00:39:31,933 --> 00:39:36,347 ซึ่งจะเป็นการพัฒนาที่ดีมาก ทุกคน เราจะพักเบรกสัก 441 00:39:36,347 --> 00:39:41,589 5 นาที ถ้าไม่ว่ากัน เพื่อพักเสียงผม และคุณอาจจะได้ขยับตัว 442 00:39:41,589 --> 00:39:49,130 หรือไปหาน้ำดื่ม ผมเห็นสายตาที่เริ่มง่วงๆ และอยากให้ทุกคนตื่นเต็มที่สำหรับช่วงต่อไป 443 00:39:49,130 --> 00:39:54,004 ถ้าไม่ว่ากัน เราจะพัก 5 นาที แล้วเจอกันที่นี่อีกครั้ง 444 00:39:54,004 --> 00:40:00,166 โอเคไหม? เรามี PRD ซึ่งผมจะไม่อ่าน มันคือเอกสารจุดหมายปลายทางของเรา 445 00:40:00,166 --> 00:40:08,535 ขอกวาดดูคำถามดีๆ ก่อนที่จะพุ่งไปต่อ "การค้นพบบทบาทของวิศวกรรมซอฟต์แวร์ในโลกปัจจุบันอีกครั้ง 446 00:40:08,535 --> 00:40:13,133 สามสาขาที่คุณแนะนำ" อืม เทควันโดก็ดีนะ เคยได้ยินมา 447 00:40:13,133 --> 00:40:18,834 ผมไม่รู้จะตอบคำถามนี้ยังไงเลย ขอบคุณที่ถามนะ สามสาขาที่ผมแนะนำ 448 00:40:18,834 --> 00:40:24,536 หมายถึง... อะไรนะ? ช่างประปา (plumbing) ช่างประปาก็ดีเหมือนกัน 449 00:40:24,536 --> 00:40:32,813 ใช่ ใช่ ใช่ ไม่รู้ว่ามันเป็นสาขาไหมนะ ช่างประปาที่ผมจ้างมามักไม่ค่อยมีระเบียบวินัยเท่าไหร่ 450 00:40:32,813 --> 00:40:37,411 เอาล่ะ โอเค ตอนนี้เรามีจุดหมายแล้ว โอเคไหม? เยี่ยม 451 00:40:37,411 --> 00:40:42,285 แล้วเราจะไปถึงจุดหมายได้ยังไง? เรามี PRD ที่คลุมเครือ 452 00:40:42,285 --> 00:40:47,251 จะแบ่งมันยังไงเพื่อไม่ให้ของตกไปในโซนโง่? พูดอีกแบบคือ 453 00:40:47,251 --> 00:40:52,401 เรามีงานใหญ่งานหนึ่ง จะแบ่งมันเป็นแผนหลายเฟสแบบนี้ยังไง? 454 00:40:52,401 --> 00:41:00,218 สิ่งที่คุณอาจทำตอนนี้คือบอกว่า "โอเค Claude ขอแผนหลายเฟสที่พาเราไปถึงจุดหมายนี้หน่อย" 455 00:41:00,218 --> 00:41:06,656 ฟังดูสมเหตุสมผล นี่คือสิ่งที่เราทำกันมาก่อน แต่ตอนนี้ผมมีวิธีที่ดีกว่า 456 00:41:06,656 --> 00:41:11,254 คือผมชอบสร้างคัมบังบอร์ด (Kanban board) จากสิ่งนี้ 457 00:41:11,254 --> 00:41:15,944 ยกมือขึ้นถ้าไม่รู้ว่า Kanban board คืออะไร อืม เจ๋ง 458 00:41:15,944 --> 00:41:21,830 โอเค Kanban board ก็คือชุดการ์ดงาน (tickets) ที่คุณแปะไว้บนกำแพง 459 00:41:21,830 --> 00:41:26,520 โดยมีการ์ดแต่ละใบมี ความสัมพันธ์แบบบล็อก (blocking) 460 00:41:26,520 --> 00:41:34,153 ระหว่างกัน มาดูกันว่ามันหน้าตาเป็นยังไง นี่คือวิธีที่เราทำงานกันในฐานะนักพัฒนามานาน 461 00:41:34,153 --> 00:41:39,395 ตั้งแต่ยุค Agile เกิดขึ้น และสิ่งที่มันทำ เราจะเห็นตรงนี้ 462 00:41:39,395 --> 00:41:43,993 มันเสนอให้แบ่งการตั้งค่านี้ออกเป็นห้างาน งานแรกคือ 463 00:41:43,993 --> 00:41:48,775 schema (โครงสร้างฐานข้อมูล) และ gamification service 464 00:41:48,775 --> 00:41:56,132 ใช่ ดูดีทีเดียว งานนี้ไม่ถูกบล็อกโดยอะไร และเราจะเห็นด้วยว่ามันระบุประเภทงานเป็น 465 00:41:56,132 --> 00:42:00,730 AFK ด้วย จำได้ไหมที่ผมพูดถึง human in the loop กับ 466 00:42:00,730 --> 00:42:06,984 AFK ก่อนหน้านี้? นี่คืองาน AFK คืองานที่เราส่งให้เอเจนต์จัดการได้เลย 467 00:42:06,984 --> 00:42:16,456 การติดตามสตรีค (streak tracking) โอเค ดูดี แล้วก็เชื่อมคะแนนและสตรีคเข้ากับการเรียนบทเรียน/ทำแบบทดสอบจบ 468 00:42:16,456 --> 00:42:21,330 งานนี้ถูกบล็อกโดยงานหนึ่งและสอง การ backfill ย้อนหลัง 469 00:42:21,330 --> 00:42:26,848 ถูกบล็อกโดยงานหนึ่งเท่านั้น และงานนี้อีกตัวถูกบล็อกโดยทุกงาน 470 00:42:26,848 --> 00:42:31,538 เจ๋ง อืม ตอนนี้ผมคิดว่า คุณอาจถามว่า "ทำไมเราไม่ให้ 471 00:42:31,538 --> 00:42:36,872 AI สร้าง issues พวกนี้เลยล่ะ? ทำไมผมต้องมายุ่งตรงนี้ด้วย?" 472 00:42:36,872 --> 00:42:44,413 เพราะมันให้เครื่องมือที่ดีๆ มาเยอะแยะ ทำไมผมต้องมาตรวจสอบและคิดว่างานต่อไปคืออะไร? 473 00:42:44,413 --> 00:42:49,012 ความเห็นผมคือ ขั้นนี้ทำได้ถูกมาก ทำได้เร็วมาก พอทำ 474 00:42:49,012 --> 00:42:53,978 PR เสร็จ ผมก็เห็นปัญหาได้ทันที มันมีเทคนิคที่สำคัญมากๆ 475 00:42:53,978 --> 00:42:59,311 ตอนที่คุณกำลังหาว่ารูปทรงของการเดินทางครั้งนี้ควรเป็นยังไง 476 00:42:59,311 --> 00:43:04,461 มันมาจากแนวคิดคลาสสิกจากหนังสือ The Pragmatic Programmer 477 00:43:04,461 --> 00:43:09,152 ที่เรียกว่า traceable bullets (กระสุนเรืองแสง) หรือ 478 00:43:09,152 --> 00:43:13,842 vertical slices (ชิ้นแนวตั้ง) และ traceable bullets 479 00:43:13,842 --> 00:43:20,003 เปลี่ยนวิธีคิดของผมเกี่ยวกับการให้ AI เลือกงานของตัวเองอย่างแท้จริง 480 00:43:20,003 --> 00:43:26,533 ระบบมีเลเยอร์ใช่ไหม? มีเลเยอร์อยู่ในระบบของคุณ สิ่งเหล่านี้อาจเป็นหน่วย 481 00:43:26,533 --> 00:43:33,522 deployable (หน่วยที่นำไปติดตั้งได้) ที่ต่างกัน คุณอาจมีฐานข้อมูลอยู่ที่หนึ่ง 482 00:43:33,522 --> 00:43:41,523 API อาจอยู่ใกล้ฐานข้อมูลแต่แยกส่วนกัน คุณอาจมีฟรอนต์เอนด์ที่อยู่คนละที่โดยสิ้นเชิงอย่าง 483 00:43:41,523 --> 00:43:46,673 CDN หรือภายในหน่วย deployable เหล่านี้ อาจมีเลเยอร์ย่อยๆ 484 00:43:46,673 --> 00:43:51,547 อยู่ข้างใน เช่นในโค้ดเบสที่เราทำงานด้วย เรามี service 485 00:43:51,547 --> 00:43:56,421 มากมาย ทั้ง quiz service, team service, user service, 486 00:43:56,421 --> 00:44:01,111 coupon service, core service และ service เหล่านี้มี 487 00:44:01,111 --> 00:44:05,434 dependency ต่อกัน มันก็เหมือนเป็นเลเยอร์เดี่ยวๆ 488 00:44:05,434 --> 00:44:10,492 สิ่งที่ผมสังเกตคือ AI ชอบเขียนโค้ดแนวนอน (horizontally) 489 00:44:10,492 --> 00:44:17,849 คือชอบเขียนทีละเลเยอร์ พูดอีกแบบ ในเฟสหนึ่ง มันจะทำทุกอย่างที่เกี่ยวกับฐานข้อมูล 490 00:44:17,849 --> 00:44:23,918 schema ทั้งหมด อะไรก็ตามที่เกี่ยวกับหน่วยนั้น จากนั้นเข้าสู่เฟสสอง 491 00:44:23,918 --> 00:44:29,252 ทำทุกอย่างที่เกี่ยวกับ API แล้วค่อยเพิ่มฟรอนต์เอนด์ทับลงไป 492 00:44:29,252 --> 00:44:33,942 มีใครบอกได้ไหมว่าภาพนั้นผิดตรงไหน? ทำไมมันถึงไม่ดี? 493 00:44:33,942 --> 00:44:39,460 ยกมือขึ้นถ้ามีคำตอบ ใช่ >> ได้ feedback loop ทั้งหมดนั่นแหละ 494 00:44:39,460 --> 00:44:45,990 ถูกต้อง คุณจะไม่ได้ feedback กับงานของคุณจนกว่าจะเริ่มหรือทำเฟสสามเสร็จ 495 00:44:45,990 --> 00:44:51,323 สิ่งที่คุณต้องทำคือ กว่าคุณจะถึงเฟสสาม คุณไม่ได้ทดสอบจริงๆ 496 00:44:51,323 --> 00:44:57,209 ว่าเลเยอร์ทั้งหมดทำงานร่วมกัน คุณยังไม่มีระบบแบบบูรณาการให้ทดสอบ 497 00:44:57,209 --> 00:45:02,083 ดังนั้นแทนที่จะคิดแบบนั้น คุณต้องคิดถึงเลเยอร์แนวตั้ง 498 00:45:02,083 --> 00:45:07,509 (vertical layers) คุณต้องคิดถึงชิ้นส่วนฟังก์ชันการทำงานบางๆ 499 00:45:07,509 --> 00:45:13,027 ที่ตัดผ่านทุกเลเยอร์ที่จำเป็น และนี่คือวิธีทำงานที่ดีกว่ามาก 500 00:45:13,027 --> 00:45:19,556 ดีกว่าสำหรับ AI ด้วย เพราะหมายความว่าในตอนจบเฟสหนึ่งหรือระหว่างเฟสหนึ่ง 501 00:45:19,556 --> 00:45:24,247 มันจะได้ feedback กับทั้งโฟลว์ของมัน สิ่งนี้หมายถึง 502 00:45:24,247 --> 00:45:29,580 ใน skill ชื่อ PRD to issues ที่อยู่ข้างบนนี้ ผมเขียนไว้ว่า 503 00:45:29,580 --> 00:45:33,903 "แบ่ง PRD เป็น issues ที่หยิบจับได้อิสระ โดยใช้ 504 00:45:33,903 --> 00:45:38,409 vertical slices / traceable bullets เขียนเป็นไฟล์ 505 00:45:38,409 --> 00:45:43,191 markdown ในเครื่อง" >> [หัวเราะเบาๆ] >> ขั้นแรกเราหา 506 00:45:43,191 --> 00:45:47,513 PRD เจอ ถ้าเป็นเซสชันใหม่ก็สำรวจโค้ดเบสอีกครั้ง 507 00:45:47,513 --> 00:45:52,204 เราร่าง vertical slices แล้วแบ่ง PRD ออกเป็น issues 508 00:45:52,204 --> 00:46:00,204 ที่ติดตามได้ อธิบาย traceable bullet หน่อย มันเหมือนตอนที่คุณเป็นพลยิงปืนต่อสู้อากาศยาน 509 00:46:00,204 --> 00:46:05,906 มันเป็นแนวคิดที่ค่อนข้างรุนแรงนะ และคุณมองขึ้นไปบนฟ้ายามค่ำคืน 510 00:46:05,906 --> 00:46:10,872 ถ้าคุณยิงกระสุนธรรมดา คุณไม่รู้เลยว่ากำลังยิงไปโดนอะไร 511 00:46:10,872 --> 00:46:15,930 คุณเห็นเครื่องบิน แต่ไม่เห็นว่ากระสุนไปทางไหน traceable 512 00:46:15,930 --> 00:46:20,253 bullet คือการติดสารเรืองแสงเล็กน้อยไว้กับกระสุน 513 00:46:20,253 --> 00:46:24,759 เพื่อให้มันเรืองแสงระหว่างทาง นั่นหมายความว่าทุกๆ 514 00:46:24,759 --> 00:46:29,265 กระสุนนัดที่หก คุณจะเห็นเส้นแสงบนท้องฟ้า คุณจะได้ 515 00:46:29,265 --> 00:46:34,231 feedback ว่ากำลังเล็งไปทางไหน แนวคิดคือเราจะเพิ่มระดับ 516 00:46:34,231 --> 00:46:39,749 feedback และได้ feedback เกือบจะทันทีกับสิ่งที่เรากำลังสร้าง 517 00:46:39,749 --> 00:46:44,807 เพราะถ้าไม่มีมัน AI จะเขียนโค้ดแบบมืดบอดไปจนถึงเฟสหลังๆ 518 00:46:44,807 --> 00:46:49,497 เรามีกฎ vertical slice เราถามผู้ใช้ แล้วก็สร้างไฟล์ 519 00:46:49,497 --> 00:46:54,187 issues สิ่งที่ผมเห็นตรงนี้คือ ถึงแม้ผมจะบอกให้มันทำ 520 00:46:54,187 --> 00:46:58,602 vertical slices มันกลับเสนอให้สร้าง gamification 521 00:46:58,602 --> 00:47:04,947 service ก่อนเป็นงานแรก นั่นคือชิ้นเดียวตรงนั้น และสำหรับผมมันดูเหมือน 522 00:47:04,947 --> 00:47:09,453 horizontal slice (ชิ้นแนวนอน) สิ่งที่ผมอยากเห็นใน 523 00:47:09,453 --> 00:47:14,235 vertical slice แรกเป็นพิเศษคือ การเปลี่ยนแปลง schema 524 00:47:14,235 --> 00:47:19,477 หรือบางส่วนของ schema ผมอยากเห็น service ใหม่ถูกสร้างขึ้น 525 00:47:19,477 --> 00:47:26,007 และอยากเห็นการแสดงผลขั้นต่ำของมันบนฟรอนต์เอนด์ ผมอยากให้มันทำตามแนวตั้ง 526 00:47:26,007 --> 00:47:30,421 ไม่ใช่แค่แนวนอน เข้าใจไหม? โอเค ผมจะด่า AI หน่อย 527 00:47:30,421 --> 00:47:35,479 "ไอ้เด็กไม่ดี" ไม่ล่ะ ผมจะไม่เสีย token ไปกับการด่าเฉยๆ 528 00:47:35,479 --> 00:47:41,825 "slice แรกมันแนวนอนเกินไป" ผมจะเริ่มแค่ตรงนั้นแล้วดูว่ามันจะรับได้ไหม 529 00:47:41,825 --> 00:47:48,538 เข้าใจแนวคิดไหม? และสิ่งที่ผมชอบมากเกี่ยวกับการย้อนกลับไปอ่านหนังสือเก่าๆ 530 00:47:48,538 --> 00:47:57,091 เหล่านั้นคือ ในยุคสมัยนี้เราพยายามหาคำพูดเป็นภาษาอังกฤษมาอธิบายแนวปฏิบัติซอฟต์แวร์ที่ดีที่สุด 531 00:47:57,091 --> 00:48:05,091 และหนังสืออายุ 20 ปีเหล่านี้ทำมันไว้แล้ว และมันคือเหมืองทองคำถ้าอยากเอามันไปใส่ในพรอมป์ 532 00:48:05,091 --> 00:48:09,966 แต่ถึงอย่างนั้น มันก็ไม่ได้ทำงานได้สมบูรณ์แบบทุกครั้ง 533 00:48:09,966 --> 00:48:14,288 "ให้คะแนนเมื่อเรียนบทเรียนจบ และแสดงบนแดชบอร์ด" 534 00:48:14,288 --> 00:48:19,990 ใช่ นี่คือ vertical slice ที่สวยงาม เพราะมันเป็นงานก้อนโตจริงๆ 535 00:48:19,990 --> 00:48:26,427 มันทำหลาย user stories ในนั้น แต่ตอนจบเราจะได้เห็นของที่มองเห็นได้จริง 536 00:48:26,427 --> 00:48:32,865 แล้ว AI ก็จะต่อยอดจากตรงนั้นได้ คุณเห็นไหมว่าทำไมอันนี้ถึงดีกว่าอันแรก 537 00:48:32,865 --> 00:48:39,210 เจ๋ง ดูดีมาก เรากำลังเข้าใกล้ขึ้นเรื่อยๆ แล้ว ใครที่ตามอยู่ที่บ้าน... 538 00:48:39,210 --> 00:48:45,004 เอาเถอะ ไม่ใช่ที่บ้าน แต่คุณคงพอเข้าใจ หวังว่าจะเห็นแบบเดียวกัน 539 00:48:45,004 --> 00:48:50,981 และเริ่มมีสัญชาตญาณเดียวกัน ขอเปิดรับคำถาม ระหว่างที่ผมกำลังสร้าง 540 00:48:50,981 --> 00:48:55,580 GitHub issues เหล่านี้ อ่า... ไม่ใช่ GitHub issues 541 00:48:55,580 --> 00:48:59,994 แต่อยู่ในเครื่อง "เมื่อไหร่ผมจะเลิกใช้ Windows?" 542 00:48:59,994 --> 00:49:05,328 ไม่มีวัน "เมื่อพูดกับฉัน จงยอมเสียไวยากรณ์เพื่อความกระชับ" 543 00:49:05,328 --> 00:49:12,133 พรอมป์นี้มีประโยชน์มากกับผมตอนอ่านแผน เพราะมันทำให้แผนที่ออกมามีความกระชับ 544 00:49:12,133 --> 00:49:17,191 อ่านง่าย ดีมาก แต่ผมเลิกใช้แนวคิดนี้แล้ว หันไปชอบเซสชัน 545 00:49:17,191 --> 00:49:22,801 grilling แทน เพราะสิ่งที่ผมสังเกตคือ ผมไม่อยากอ่านแผนอีกต่อไป 546 00:49:22,801 --> 00:49:29,146 ผมอยากอยู่ในคลื่นความถี่เดียวกับ LLM ผมอยากให้มันถามคำถามเชิงรุกกับผม 547 00:49:29,146 --> 00:49:34,021 และพอผมเลิกอ่านแผน ผมก็ไม่ต้องการให้มันกระชับอีกต่อไป 548 00:49:34,021 --> 00:49:38,527 ผมมองแผนในเอกสารจุดหมายปลายทางว่าเป็นสถานะสุดท้าย 549 00:49:38,527 --> 00:49:43,309 (end state) และผมไม่ต้องการให้สถานะสุดท้ายนั้นกระชับ 550 00:49:43,309 --> 00:49:49,562 หวังว่าคงตอบคำถามได้ "คุณคิดว่าผลลัพธ์ของสถานการณ์เม็กซิกันสแตนด์ออฟ 551 00:49:49,562 --> 00:49:53,885 (การเผชิญหน้าแบบไม่มีใครยอมถอย) ระหว่างบทบาทของ 552 00:49:53,885 --> 00:49:58,943 PM ในอนาคตกับบทบาทอื่นๆ ที่กำลังมาบรรจบกันจะเป็นยังไง?" 553 00:49:58,943 --> 00:50:05,380 ไม่รู้สิ ผมไม่ใช่นักวิเคราะห์ ไม่รู้ โอเค หลังจากการอนุมัติสองสามครั้ง 554 00:50:05,380 --> 00:50:12,002 เราก็จะได้ชุด issues ออกมา issues ที่เราสร้างถูกออกแบบให้หยิบจับได้อิสระ 555 00:50:12,002 --> 00:50:16,692 นั่นหมายความว่า Kanban board นี้จะมีหน้าตาประมาณนี้ 556 00:50:16,692 --> 00:50:21,842 คุณจะได้ชุดการ์ดงานที่มีความสัมพันธ์แบบอิสระต่อกันมากมาย 557 00:50:21,842 --> 00:50:27,452 งานนี้ต้องทำก่อนงานนี้ งานนี้ต้องทำก่อนงานนี้ และงานนี้อีกตัว 558 00:50:27,452 --> 00:50:34,625 สมมติว่ามีอีกตัวตรงนี้ งานนี้ต้องทำก่อนงานนี้ นั่นหมายความว่าคุณเริ่มทำแบบขนาน 559 00:50:34,625 --> 00:50:40,694 (parallelize) ได้ เริ่มให้เอเจนต์หลายตัวทำงานพร้อมกันในงานเหล่านี้ 560 00:50:40,694 --> 00:50:48,511 เพราะใช่ งานนี้ต้องทำก่อน แล้วสองงานนี้สามารถถูกหยิบไปทำพร้อมกันโดยเอเจนต์อิสระสองตัว 561 00:50:48,511 --> 00:50:52,834 ยกมือขึ้นถ้าเคยทำงานแบบขนานกับเอเจนต์ โอเค เจ๋ง 562 00:50:52,834 --> 00:50:57,432 สิ่งนี้ทำให้คุณเปลี่ยนแผนเหล่านั้นให้เป็น directed 563 00:50:57,432 --> 00:51:02,950 acyclic graphs (กราฟไร้รอบแบบมีทิศทาง) ได้อย่างเหมาะสมที่สุด 564 00:51:02,950 --> 00:51:07,640 โดยคุณจะมีสามเฟสตรงนี้ เฟสหนึ่ง... ขอเลื่อนนี่หน่อย 565 00:51:07,640 --> 00:51:12,606 เหนือเส้นนี้ คุณทำงานนี้ เฟสสอง คุณทำงานสองงานด้านล่าง 566 00:51:12,606 --> 00:51:17,848 และเฟสสาม คุณทำงานชิ้นที่สามแล้วต่อเข้ากับมัน และลองคิดดู 567 00:51:17,848 --> 00:51:23,366 มันอาจมี... นี่เป็นแผนที่ค่อนข้างง่าย แต่คุณสามารถมีแผนต่างๆ 568 00:51:23,366 --> 00:51:28,424 มากมายทำงานพร้อมกันได้ หมายความว่าคุณทำ parallelization 569 00:51:28,424 --> 00:51:33,758 (การทำงานขนาน) ได้ดีมาก และเดี๋ยวเราจะพูดถึงเรื่องนี้อีกที 570 00:51:33,758 --> 00:51:39,643 นั่นคือเหตุผลที่ผมชอบ Kanban board แบบนี้มากกว่าแผนแบบเรียงลำดับ 571 00:51:39,643 --> 00:51:46,265 (sequential plan) เพราะแผนแบบเรียงลำดับมีเอเจนต์เดียวเท่านั้นที่ทำงานได้ 572 00:51:46,265 --> 00:51:50,771 ตรงนี้... มันหายไปไหน? ตรงนี้ ใช่ แผนนี้เป็น loop 573 00:51:50,771 --> 00:51:56,105 เดียวจริงๆ ใช่ไหม? มีเอเจนต์เดียวเท่านั้นที่ทำงานกับมันได้ 574 00:51:56,105 --> 00:52:00,427 เพราะเรามีเฟสที่เป็นเลขลำดับ และมัน parallelize 575 00:52:00,427 --> 00:52:05,025 ไม่ได้ เข้าใจไหม? เจ๋ง เรามี issues ของเราแล้ว อ่า 576 00:52:05,025 --> 00:52:09,807 ไม่เอาน่า หยุดถามฉันได้แล้ว ฉันรู้ว่ามันกำลังสร้างบน 577 00:52:09,807 --> 00:52:14,406 GitHub ฉันไม่ต้องการแบบนั้น โอ้ ไม่ ไอ้โง่ สร้างใน 578 00:52:14,406 --> 00:52:19,647 issues แทนสิ ไม่ นั่นยังไม่แม่นยำพอ "ไอ้โง่ สร้างเป็นไฟล์ 579 00:52:19,647 --> 00:52:24,154 markdown ในเครื่องแทน โดยอ้างอิงเวอร์ชันท้องถิ่น" 580 00:52:24,154 --> 00:52:28,844 ขอโทษที พอมาถึงจุดนี้ เรามี issues ในเครื่องเป็นชุด 581 00:52:28,844 --> 00:52:35,557 ที่เราสามารถวน loop และ implement ได้ และ ณ จุดนี้แหละที่มนุษย์ออกจากวงวน 582 00:52:35,557 --> 00:52:40,523 ถึงตอนนี้ ขอเปิดภาพรวมของโฟลว์ที่เรากำลังสำรวจนี้ให้ดู 583 00:52:40,523 --> 00:52:48,064 เรามีไอเดียหนึ่ง ขอซูมให้คนแถวหลังดูหน่อย แล้วเราก็ซักถามตัวเองเกี่ยวกับไอเดียนั้น 584 00:52:48,064 --> 00:52:53,214 เราข้ามงานวิจัยและโปรโตไทป์ไปได้ แต่เราเปลี่ยนไอเดียเป็น 585 00:52:53,214 --> 00:52:57,537 PRD เป็นเอกสารจุดหมายปลายทาง จากนั้นเปลี่ยน PRD 586 00:52:57,537 --> 00:53:03,330 เป็น Kanban board และทุกขั้นตอนเหล่านั้นผ่านการตรวจสอบโดยมนุษย์ 587 00:53:03,330 --> 00:53:09,860 และตอนนี้ถึงขั้น implementation เราถอยออกมา และปล่อยให้เอเจนต์ทำงานผ่าน 588 00:53:09,860 --> 00:53:14,642 Kanban board นั้น หรือเอเจนต์หลายตัวทำงานผ่าน Kanban 589 00:53:14,642 --> 00:53:19,884 board นี่หมายความว่า ใช่ เราทุ่มเวลาไปกับการวางแผนเยอะมาก 590 00:53:19,884 --> 00:53:24,206 แต่หมายความว่าเราได้จัดคิวงานให้เอเจนต์ไว้เพียบ 591 00:53:24,206 --> 00:53:30,092 เรามองมันได้เหมือนกะกลางวันกับกะกลางคืน นี่คือกะกลางวันของมนุษย์ 592 00:53:30,092 --> 00:53:36,345 ใช่ไหม? วางแผนทุกอย่าง เตรียมของให้พร้อม แล้วพอเราส่งต่อให้กะกลางคืน 593 00:53:36,345 --> 00:53:40,668 AI ก็ทำงานแบบ AFK ได้เลย แต่หน้าตามันเป็นยังไง? 594 00:53:40,668 --> 00:53:46,186 ผมจะ... โอ้ ใช่ ปล่อยมันไปเถอะ สมบูรณ์แบบ นี่คือหน้าตาของมัน 595 00:53:46,186 --> 00:53:51,703 ถ้าเราไปที่แบบฝึกหัดถัดไป ซึ่งจริงๆ แล้วเป็นแบบฝึกหัดสุดท้าย 596 00:53:51,703 --> 00:53:56,210 คือการรัน AFK agent ของคุณ ผมตั้งชื่อมันว่า Ralph 597 00:53:56,210 --> 00:54:02,187 เพราะมันคือ Ralph loop จริงๆ และพรอมป์นี้ ผมอยากไล่ดูอย่างละเอียด 598 00:54:02,187 --> 00:54:08,165 สิ่งแรกที่มันทำคือ เราจะรัน Claude และพยายามกระตุ้นให้มันทำงานแบบ 599 00:54:08,165 --> 00:54:13,499 AFK เต็มรูปแบบ เดี๋ยวผมจะให้ดูสคริปต์ของมัน ถ้าคุณดูในไฟล์ 600 00:54:13,499 --> 00:54:18,097 once.sh ใน repo เราจะเห็นว่ามันเป็นแค่ bash script 601 00:54:18,097 --> 00:54:22,511 ที่เราดึง issues ทั้งหมด ซึ่งอยู่ในไฟล์ markdown 602 00:54:22,511 --> 00:54:27,109 มาวางรวมไว้ในตัวแปรท้องถิ่น ตัวแปร issues นั้นเก็บ 603 00:54:27,109 --> 00:54:32,443 issues ทั้งหมดใน backlog (คิวงานค้าง) ของเรา จากนั้นดึงห้า 604 00:54:32,443 --> 00:54:37,409 commits ล่าสุด เดี๋ยวจะอธิบายว่าทำไม แล้วก็ดึงพรอมป์มา 605 00:54:37,409 --> 00:54:41,732 แล้วรัน Claude Code ด้วยโหมดสิทธิ์ accept edits 606 00:54:41,732 --> 00:54:46,882 แล้วก็ส่งข้อมูลทั้งหมดให้มัน นี่คือหน้าตาของ implementer 607 00:54:46,882 --> 00:54:51,480 (ตัวลงมือทำ) นี่คือเวอร์ชันที่เรียบง่ายมากของ loop 608 00:54:51,480 --> 00:54:56,630 แบบนี้ และแน่นอนว่านี่ไม่ใช่ loop นี่คือการรันครั้งเดียว 609 00:54:56,630 --> 00:55:01,228 loop อยู่ในเวอร์ชัน AFK ด้านบน ซึ่งซับซ้อนกว่าเยอะ 610 00:55:01,228 --> 00:55:06,286 และส่วนสำคัญคือ เรารันมันใน Docker sandbox (แซนด์บ็อกซ์ 611 00:55:06,286 --> 00:55:11,160 Docker) ด้วย ผมไม่อยากให้คุณติดตั้ง Docker บนแล็ปท็อป 612 00:55:11,160 --> 00:55:15,574 เพราะเราจะต้องดาวน์โหลดอิมเมจพิเศษ และเราจะทำให้ 613 00:55:15,574 --> 00:55:19,989 Wi-Fi ของงานประชุมล่มถ้าทำแบบนั้น ผมจะสาธิตให้ดู 614 00:55:19,989 --> 00:55:24,403 แต่คุณไม่จำเป็นต้องรันเอง ผมจะอธิบายในอีกสักครู่ 615 00:55:24,403 --> 00:55:31,944 โดยพื้นฐานแล้ว once loop ตรงนี้ แบ้มๆๆๆ คือเราแค่รันเวอร์ชันหนึ่งของสิ่งที่เราจะวน 616 00:55:31,944 --> 00:55:36,266 loop ซ้ำแล้วซ้ำเล่า นี่คือเวอร์ชัน human in the 617 00:55:36,266 --> 00:55:41,324 loop และมันจำเป็นมาก การรันซ้ำแล้วซ้ำเล่าเป็นสิ่งจำเป็น 618 00:55:41,324 --> 00:55:45,831 เพราะคุณจะได้เห็นว่าเอเจนต์ทำอะไร และทำงานจบยังไง 619 00:55:45,831 --> 00:55:51,164 และถ้าต้องปรับแต่งพรอมป์เพิ่มเติม คุณก็ทำได้ มาดูพรอมป์กัน 620 00:55:51,164 --> 00:55:55,763 "ไฟล์ issues ในเครื่องถูกส่งเข้ามา คุณจะทำงานเฉพาะ 621 00:55:55,763 --> 00:56:00,085 issues แบบ AFK เท่านั้น" สมเหตุสมผล "ถ้างาน AFK 622 00:56:00,085 --> 00:56:04,867 ทั้งหมดเสร็จสิ้น ให้ output ข้อความว่าไม่มีงานเหลือ" 623 00:56:04,867 --> 00:56:10,109 และสิ่งถัดไปคือ เลือกงานถัดไป สิ่งที่เราทำตรงนี้คือการรัน 624 00:56:10,109 --> 00:56:15,627 backlog หรือคัดสรร backlog ที่ AFK agent ของเราจะมาหยิบงานไป 625 00:56:15,627 --> 00:56:19,949 นั่นคือจุดประสงค์ของการตั้งค่าทั้งหมดตั้งแต่แรก 626 00:56:19,949 --> 00:56:24,271 ตั้งแต่ต้นจนถึง Kanban board ตรงนี้ เราแค่สร้าง 627 00:56:24,271 --> 00:56:28,686 backlog ของงานสำหรับกะกลางคืนมาหยิบ และกะกลางคืน 628 00:56:28,686 --> 00:56:34,847 หรือพรอมป์ Ralph นี้ มีแนวคิดของตัวเองว่างานแบบไหนที่ดีควรหยิบต่อไป 629 00:56:34,847 --> 00:56:40,733 ผมพูดถึงเรื่อง parallelization ไปแล้ว และเดี๋ยวจะโชว์ให้ดูทีหลัง 630 00:56:40,733 --> 00:56:45,607 แต่นี่คือ loop แบบเรียงลำดับ เราจะรันทีละหนึ่ง coding 631 00:56:45,607 --> 00:56:52,137 agent นี่เป็นวิธีที่ดีในการเริ่มหัดลงน้ำ เอเจนต์จะจัดลำดับความสำคัญเป็น 632 00:56:52,137 --> 00:56:56,827 การแก้บั๊กวิกฤต โครงสร้างพื้นฐานสำหรับพัฒนา จากนั้น 633 00:56:56,827 --> 00:57:01,609 trace bullets ตามด้วยการขัดเกลา งานที่ได้เร็ว (quick 634 00:57:01,609 --> 00:57:07,494 wins) และ refactor (การปรับโครงสร้างโค้ด) จากนั้นก็มีคำสั่งง่ายๆ 635 00:57:07,494 --> 00:57:13,564 เกี่ยวกับวิธีทำงานให้เสร็จ "สำรวจ repo ใช้ TDD เพื่อทำงานให้เสร็จ" 636 00:57:13,564 --> 00:57:18,346 เดี๋ยวจะพูดถึงเรื่องนั้นทีหลัง แล้วเราก็รัน feedback 637 00:57:18,346 --> 00:57:23,680 loop บางอย่าง มาลองกัน ดูว่าจะเกิดอะไรขึ้น ดี มันสร้างไฟล์ 638 00:57:23,680 --> 00:57:29,198 issues แล้ว พร้อมไปต่อได้เลย ผมจะยกเลิกอันนี้ ล้างแล้วรัน... 639 00:57:29,198 --> 00:57:33,612 อยู่ไหนนะ? Ralph once.sh และถ้าคุณกำลังทำตามอยู่ 640 00:57:33,612 --> 00:57:37,935 ก็ทำแบบเดียวกันได้เลย เราจะเห็นว่ามันรัน Claude 641 00:57:37,935 --> 00:57:43,912 ในนี้พร้อมพรอมป์และ issues ทั้งหมดที่ส่งเข้าไป ระหว่างที่มันทำงาน 642 00:57:43,912 --> 00:57:52,097 คุณอาจมีคำถามเกี่ยวกับการตั้งค่านี้ และการตัดสินใจของผมที่จะมอบหมายงานเขียนโค้ดทั้งหมดให้ 643 00:57:52,097 --> 00:57:56,879 AI ใช่ไหม? มาทำ Q&A เร็วๆ ระหว่างที่มันเริ่มทำงานกัน 644 00:57:56,879 --> 00:58:01,845 โอเค อ่าๆๆ ผมจะลบพวกนั้นทิ้ง "คุณเก็บการตัดสินใจเชิงลบ 645 00:58:01,845 --> 00:58:08,007 สิ่งที่คุณตัดสินใจไม่เอา และเหตุผล ไว้ยังไง ตอนที่บันทึกผลจากเซสชัน 646 00:58:08,007 --> 00:58:12,605 grill me?" คำถามดีมาก คำตอบง่ายมาก คือในส่วน write 647 00:58:12,605 --> 00:58:18,858 a PRD ของ PRD จะมีหัวข้ออยู่ด้านล่าง เป็นส่วนของสิ่งที่อยู่นอกขอบเขต 648 00:58:18,858 --> 00:58:23,365 (out of scope) คือสิ่งที่เราจะไม่จัดการใน PRD นี้ 649 00:58:23,365 --> 00:58:29,434 ซึ่งสำคัญมากสำหรับการให้นิยามความสำเร็จ ถ้ามีคำถามเพิ่มเติมก็ถามใน 650 00:58:29,434 --> 00:58:34,033 Slido ได้เลย "เวิร์กโฟลว์ฟรอนต์เอนด์ของผมคืออะไร?" 651 00:58:34,033 --> 00:58:43,229 โอเค คำถามดีมาก ผมจะตอบคำถามนั้นในอีกสักครู่ "จะจัดการยังไงกับเอเจนต์ที่สร้างโค้ดมากเกินกว่าที่เราจะ 652 00:58:43,229 --> 00:58:49,850 review ไหว? จะ parallelize และใช้เอเจนต์หลายตัวอย่างถูกวิธีแยกกันยังไง?" 653 00:58:49,850 --> 00:58:54,816 โอเค นั่นเป็นสองคำถาม ยกมือขึ้นถ้ารู้สึกว่าตอนนี้คุณทำ 654 00:58:54,816 --> 00:59:01,162 code review (ทบทวนโค้ด) มากกว่าเดิม ใช่ แน่นอน ผมไม่คิดว่ามีทางเลี่ยง 655 00:59:01,162 --> 00:59:06,404 ถ้าเรามอบหมายงานเขียนโค้ดทั้งหมดให้เอเจนต์ คุณจะสังเกตว่า 656 00:59:06,404 --> 00:59:11,646 implementation คือส่วน AFK เพียงส่วนเดียวจริงๆ เรายังต้อง 657 00:59:11,646 --> 00:59:16,244 QA งานและ code review งานด้วย ใช่ไหม? และถ้าเรารัน 658 00:59:16,244 --> 00:59:21,026 loop แบบนี้ ที่มันจะ implement สี่ issues ในรอบเดียว 659 00:59:21,026 --> 00:59:26,636 มันก็ขัดกับหลักที่ว่า pull requests ควรเล็กและเป็นอิสระต่อกัน 660 00:59:26,636 --> 00:59:32,797 ใช่ไหม? pull requests เล็กๆ ที่เป็นอิสระต่อกัน หมายความว่าคุณต้องวน 661 00:59:32,797 --> 00:59:38,223 loop น้อยลง หรือ loop สั้นลง หรือบางทีอาจทำ PR เป็นกองใหญ่ๆ 662 00:59:38,223 --> 00:59:42,730 แต่ก็ดูแย่เหมือนกัน นั่นก็ยังเป็นโค้ดที่แยกกันให้ 663 00:59:42,730 --> 00:59:47,328 review เพิ่มขึ้น ผมยังไม่รู้คำตอบของเรื่องนี้จริงๆ 664 00:59:47,328 --> 00:59:51,926 ผมคิดว่าเราต้องเตรียมใจที่จะทำ code review มากขึ้น 665 00:59:51,926 --> 00:59:56,432 ซึ่งไม่สนุกเลย การพูดแบบนั้นไม่สนุกเลย ผมไม่รู้สิ 666 00:59:56,432 --> 01:00:02,410 ผมไม่ค่อยสบายใจที่พูดแบบนั้น แต่ผมคิดว่าน่าจะเป็นทิศทางที่กำลังไป 667 01:00:02,410 --> 01:00:07,008 คำถามดีมาก ขอถามจากในห้องบ้างได้ไหม? เราไม่ใช้ไมค์ 668 01:00:07,008 --> 01:00:12,342 แต่ยกมือถ้ามีคำถามถามผมตอนนี้ ใช่ "แนวทางนี้เป็นเส้นตรงมาก 669 01:00:12,342 --> 01:00:19,975 ตั้งแต่ไอเดียไปจนถึง QA และ code review แน่นอนว่าโลกความจริงมันยุ่งเหยิงกว่านั้นมาก 670 01:00:19,975 --> 01:00:26,045 คุณมีไอเดียหลายอย่างที่ดำเนินคู่ขนานกัน และไม่มีใครเห็นภาพทั้งหมด" 671 01:00:26,045 --> 01:00:31,654 และระหว่างที่คุณทำงานบางอย่างอยู่ ก็มีอย่างอื่นเข้ามาเป็นบั๊ก 672 01:00:31,654 --> 01:00:36,345 คุณจัดการกับความยุ่งเหยิงยังไง? ทำยังไงให้ feedback 673 01:00:36,345 --> 01:00:42,966 loop แน่นขึ้น? คำถามดีมาก คำถามคือ ถ้าเรื่องนี้ดูดีสำหรับนักพัฒนาคนเดียว 674 01:00:42,966 --> 01:00:48,300 แต่จะ implement ในทีมยังไง? จะรวบรวม feedback จากทีมยังไง? 675 01:00:48,300 --> 01:00:57,312 คำตอบของผมคือ ถ้าคุณมีไอเดียอยู่บนนั้น เส้นทางจากไอเดียไปสู่จุดหมายเป็นสิ่งที่คุณต้องคิดร่วมกับทีม 676 01:00:57,312 --> 01:01:01,727 ใช่ไหม? ทุกอย่างที่อยู่บนนี้ มันเป็นเรื่องของทีม 677 01:01:01,727 --> 01:01:06,325 เข้าใจที่ผมหมายถึงไหม? ถ้าคุณมีไอเดีย แล้วทำเซสชัน 678 01:01:06,325 --> 01:01:14,785 grilling กับมัน แล้วมีคำถามที่ตอบไม่ได้ คุณต้องดึงทีมเข้ามาในวงวนอย่างที่เราอธิบายไปก่อนหน้า 679 01:01:14,785 --> 01:01:20,211 บางทีคุณอาจต้องบอกว่า "โอเค เราต้องสร้างโปรโตไทป์ของสิ่งนี้ 680 01:01:20,211 --> 01:01:26,005 เราต้องลองทำจริง เราต้องการของที่ผู้เชี่ยวชาญโดเมนจะได้ลองเล่น" 681 01:01:26,005 --> 01:01:31,339 หรือ "โอเค เราอาจต้อง integrate ไลบรารีของบริษัทอื่นเข้ามา 682 01:01:31,339 --> 01:01:36,121 เราอาจต้องทำงานวิจัย" เราอาจต้องโยนความคิดไปมา และหา 683 01:01:36,121 --> 01:01:40,903 service ของบริษัทที่สามที่เราใช้ประโยชน์ได้มากที่สุด 684 01:01:40,903 --> 01:01:45,869 เราอาจต้องนำข้อมูลที่เก็บได้กลับไปที่เฟสไอเดีย ดังนั้น 685 01:01:45,869 --> 01:01:51,203 ตลอดเส้นทางจนถึง PRD นั่นคือสิ่งที่คุณต้องให้ทีมมีส่วนร่วม 686 01:01:51,203 --> 01:01:56,997 นั่นคือจุดที่ asset เหล่านี้จะถูกแชร์ต่อ และจะมีคำขอความคิดเห็น 687 01:01:56,997 --> 01:02:02,423 (requests for comments) กับมัน และ loop นั้นก็จะบดไปเรื่อยๆ 688 01:02:02,423 --> 01:02:07,297 จนกว่าคุณจะรู้ว่าจะไปทางไหน พอคุณรู้ว่าจะไปทางไหนแล้ว 689 01:02:07,297 --> 01:02:11,803 คุณถึงเริ่มทำ Kanban board และ implementation ได้ 690 01:02:11,803 --> 01:02:17,965 แต่นี่เป็นเรื่องที่ถกเถียงกันได้มาก และคุณจะเด้งไปมาระหว่างเฟสต่างๆ 691 01:02:17,965 --> 01:02:23,023 เข้าใจไหม? ใช่ "คุณไม่ต้องการ PRD สำหรับโปรโตไทป์เหรอ?" 692 01:02:23,023 --> 01:02:29,092 พูดอีกทีได้ไหม ขอโทษ "คุณไม่อยากมี PRD สำหรับโปรโตไทป์ของคุณเหรอ?" 693 01:02:29,092 --> 01:02:34,794 คำถามคือ คุณอยากผ่านกระบวนการทั้งหมดนี้เพื่อสร้างโปรโตไทป์เฉยๆ 694 01:02:34,794 --> 01:02:41,140 เหรอ? คุณไม่จำเป็นต้องมี PRD สำหรับโปรโตไทป์ ขอพูดถึงโปรโตไทป์สักครู่ 695 01:02:41,140 --> 01:02:45,646 มีคำถามว่า ทำยังไงให้วิธีนี้ใช้กับฟรอนต์เอนด์ได้? 696 01:02:45,646 --> 01:02:54,934 เพราะฟรอนต์เอนด์ไวต่อสายตามนุษย์มาก คุณต้องมีสายตามนุษย์มองฟรอนต์เอนด์ตลอดเวลาเพื่อให้แน่ใจว่ามันดูดี 697 01:02:54,934 --> 01:03:00,820 AI ไม่มีตา มันดูโค้ดได้ แต่ฟรอนต์เอนด์เป็นสิ่งที่ต้องมองหลายมิติ 698 01:03:00,820 --> 01:03:05,694 (multimodal) จากประสบการณ์ของผมในการลองต่อ AI เข้ากับ 699 01:03:05,694 --> 01:03:12,407 agent browser หรือ Playwright MCP (โปรโตคอลที่ให้โมเดลเรียกใช้เครื่องมือ) 700 01:03:12,407 --> 01:03:16,913 เพื่อให้มันมีเครื่องมือมองผ่านฟรอนต์เอนด์และดูภาพ 701 01:03:16,913 --> 01:03:21,328 แต่จากประสบการณ์ มันยังไม่เก่งเรื่องนั้นเท่าไหร่ 702 01:03:21,328 --> 01:03:26,662 และมันสร้างฟรอนต์เอนด์ที่สวยงามในโค้ดเบสที่โตเต็มที่ไม่ได้ 703 01:03:26,662 --> 01:03:31,536 มันทำได้แค่พ่นๆ ออกมา แต่สิ่งที่มันทำได้คือ คุณบอกว่า 704 01:03:31,536 --> 01:03:36,686 "โอเค ผมอยากได้ไอเดียว่าฟรอนต์เอนด์นี้ควรหน้าตาเป็นยังไง 705 01:03:36,686 --> 01:03:41,928 สร้างโปรโตไทป์สามแบบให้ฉัน สลับดูได้ใน route แบบทิ้งขว้าง 706 01:03:41,928 --> 01:03:46,894 (throwaway route) แล้วฉันจะตัดสินใจว่าอันไหนสวยที่สุด" 707 01:03:46,894 --> 01:03:51,676 แล้วคุณก็นำ asset ของโปรโตไทป์นั้นกลับเข้าไปในเซสชัน 708 01:03:51,676 --> 01:03:57,378 grilling หรือขอ feedback กับมัน อะไรแบบนั้น ตอบคำถามคุณได้ไหม? 709 01:03:57,378 --> 01:04:01,976 โปรโตไทป์มันก็แค่ของที่เละๆ มันมีไว้เพื่อให้คุณได้ 710 01:04:01,976 --> 01:04:08,689 feedback เร็วขึ้นในกระบวนการ นั่นคือวิธีที่ดีในการทำงานกับโค้ดฟรอนต์เอนด์ 711 01:04:08,689 --> 01:04:13,287 และเป็นวิธีที่ดีในการมองสถาปัตยกรรมซอฟต์แวร์โดยรวม 712 01:04:13,287 --> 01:04:17,702 ขออีกหนึ่งคำถาม ใช่ >> [กระแอม] >> "ในระบบของคุณ 713 01:04:17,702 --> 01:04:22,116 คุณ integrate การเคารพสถาปัตยกรรมและการออกแบบกับ 714 01:04:22,116 --> 01:04:27,910 API contracts (สัญญา API) และการเข้ากับระบบที่ใหญ่กว่าได้ยังไง? 715 01:04:27,910 --> 01:04:32,416 ข้อจำกัดด้านความปลอดภัย ข้อจำกัดทุกประเภทแบบนั้น" 716 01:04:32,416 --> 01:04:39,589 ใช่ คำถามนี้มีอะไรเยอะแยะ คำถามคือ คุณทำให้มันสอดคล้องกับสถาปัตยกรรมเดิมยังไง? 717 01:04:39,589 --> 01:04:45,291 ทำยังไงให้มันเป็นไปตามมาตรฐานโค้ดของโค้ดเบสคุณ หรือสถาปัตยกรรม 718 01:04:45,291 --> 01:04:49,889 การออกแบบ API กฎความปลอดภัยที่จำกัดการออกแบบของคุณ 719 01:04:49,889 --> 01:04:56,234 ใช่ ผมจะตอบเรื่องนั้นอีกสักครู่ โอเค หวังว่าเราจะเริ่มมีอะไรเดือดปุดๆ 720 01:04:56,234 --> 01:05:00,557 แล้ว มันกำลังอยู่ในเฟสสำรวจ อืม อยากเริ่มรันแบบ 721 01:05:00,557 --> 01:05:05,707 AFK เลยจัง บางทีอาจทำ บางทีอาจไม่ทำ สิ่งที่มันทำคือสำรวจ 722 01:05:05,707 --> 01:05:13,248 repo จากนั้นจะเริ่ม implement ตามที่เราต้องการ ขออีกหนึ่งคำถามระหว่างที่มันรันอยู่ 723 01:05:13,248 --> 01:05:17,570 ใช่ "ทำไมไม่ให้ AI QA ทุกอย่างเลยล่ะ?" คำถามคือ 724 01:05:17,570 --> 01:05:24,835 ทำไมคุณไม่ให้ AI ทำ QA? AI มาทำ QA ผมเพิ่งเจอศัพท์เทคนิคทะลักเข้าหัวไปแป๊บหนึ่ง 725 01:05:24,835 --> 01:05:29,801 ทำไมคุณไม่ให้ AI ทดสอบโค้ดของตัวเอง? แน่นอนว่าคุณทำได้ 726 01:05:29,801 --> 01:05:35,043 และระหว่างที่มันกำลังทำ ระหว่างที่มันเดือดปุดๆ อยู่ตรงนี้ 727 01:05:35,043 --> 01:05:39,458 โอเค มันเห็นภาพโค้ดเบสชัดเจนแล้ว มันกำลังประเมิน 728 01:05:39,458 --> 01:05:45,343 issues มันเลือกทำ issue 02 เป็นงานถัดไป เดี๋ยวผมจะโชว์ให้ดูอีกที 729 01:05:45,343 --> 01:05:50,493 เพราะคุณควรทำขั้นตอน review แบบอัตโนมัติเป็นส่วนหนึ่งของ 730 01:05:50,493 --> 01:05:55,183 implementation อย่างแน่นอน พอมี implementation แล้ว 731 01:05:55,183 --> 01:05:59,782 เพราะ token ราคาถูกและ AI เก่งเรื่องการ review มาก 732 01:05:59,782 --> 01:06:04,288 คุณควรให้มัน review โค้ดของตัวเองก่อน แล้วค่อย QA 733 01:06:04,288 --> 01:06:08,794 ผมพบว่ามันจับบั๊กได้เยอะมาก และวิธีที่มันทำงานคือ 734 01:06:08,794 --> 01:06:13,116 ขอวาดไดอะแกรมเล็กๆ ถ้าคุณมีการ implement ที่ใช้ 735 01:06:13,116 --> 01:06:17,898 token ไปเยอะในโซนฉลาด แล้วให้มันลอง review ต่อเนื่อง 736 01:06:17,898 --> 01:06:22,956 มันจะ review ในโซนโง่ ดังนั้นผู้ review จะโง่กว่าตัวที่ 737 01:06:22,956 --> 01:06:28,934 implement จริงๆ ถ้าเราจินตนาการว่านี่คือ... ขอให้สอดคล้องกันหน่อย 738 01:06:28,934 --> 01:06:34,084 นั่นคือ review นั่นคือ implementation ในขณะที่ถ้าคุณล้าง 739 01:06:34,084 --> 01:06:40,062 context คุณจะสามารถ review ในโซนฉลาดได้ ซึ่งเป็นที่ที่คุณอยากอยู่ 740 01:06:40,062 --> 01:06:44,568 มาดูกันว่า implementation ของเราเป็นยังไง โอเค ดี 741 01:06:44,568 --> 01:06:49,626 มันกำลังสร้าง migration (ไฟล์ย้ายฐานข้อมูล) ดูดีทีเดียว 742 01:06:49,626 --> 01:06:54,408 เราได้โค้ดพ่นออกมาแล้ว และระหว่างที่ผม... อ่า เอาล่ะ 743 01:06:54,408 --> 01:06:59,374 TDD มาพูดถึง TDD กัน แล้วคิดว่าเราจะพักเบรกอีกสักหน่อย 744 01:06:59,374 --> 01:07:03,696 TDD ผมพบว่าจำเป็นสุดๆ ในการดึงศักยภาพจากเอเจนต์ 745 01:07:03,696 --> 01:07:08,111 ยกมือขึ้นถ้ารู้ว่า TDD คืออะไร เจ๋ง โอเค TDD คือ 746 01:07:08,111 --> 01:07:12,801 test-driven development (การพัฒนาแบบเขียนเทสต์ก่อน) 747 01:07:12,801 --> 01:07:17,307 สิ่งที่มันทำคือสิ่งที่เรียกว่า red-green-refactor 748 01:07:17,307 --> 01:07:21,997 (แดง-เขียว-รีแฟกเตอร์) และถ้าคุณดูในโค้ดเบส คุณจะพบ 749 01:07:21,997 --> 01:07:26,320 skill ที่อธิบายวิธีทำ red green refactor และสอน 750 01:07:26,320 --> 01:07:31,929 AI ว่าต้องทำยังไง สิ่งที่มันทำคือเขียนเทสต์ที่ต้องล้มเหลวก่อน 751 01:07:31,929 --> 01:07:37,907 มันบอกว่า "โอเค ผมแยกย่อยแนวคิดที่กำลังทำ แล้วจะเขียนเทสต์เดี่ยวๆ 752 01:07:37,907 --> 01:07:42,781 ที่ล้มเหลว จากนั้นต้องทำให้ implementation ผ่านเทสต์" 753 01:07:42,781 --> 01:07:48,851 ผมพบว่า อย่างแรก มันเพิ่มเทสต์เข้าไปในโค้ดเบส และมักเป็นเทสต์ที่ดี 754 01:07:48,851 --> 01:07:56,944 เรามี gamification service แบบนี้ มันดูเหมือนใช้ของเดิมที่มีอยู่เพื่อสร้างเทสต์ฐานข้อมูล 755 01:07:56,944 --> 01:08:02,185 เทสต์ล้มเหลวเพราะโมดูลยังไม่มี โอเค เรายืนยันสถานะแดงแล้ว 756 01:08:02,185 --> 01:08:07,244 จากนั้นมันก็ไปรันและหวังว่ามันจะผ่าน ยกมือขึ้นถ้าเคยเจอ 757 01:08:07,244 --> 01:08:13,497 AI เขียนเทสต์ห่วยๆ ใช่ มันมักจะพยายามโกงเทสต์ เพราะมันทำแบบเป็นชั้นๆ 758 01:08:13,497 --> 01:08:20,026 มันจะทำ implementation ทั้งหมดก่อน แล้วค่อยทำเลเยอร์เทสต์ทั้งหมดตามลงมา 759 01:08:20,026 --> 01:08:24,901 ผมจะตอบว่า ใช่ คุณใช้ NPX vitest ได้ และด้วยเทคนิคนี้ 760 01:08:24,901 --> 01:08:29,683 การโกงทำได้ยากขึ้นมาก เพราะมันต้องสร้างเครื่องมือวัด 761 01:08:29,683 --> 01:08:34,281 (instrument) โค้ดก่อน แล้วค่อยเขียนโค้ด ผมเลยพบว่า 762 01:08:34,281 --> 01:08:41,914 TDD ดีมากๆ สำหรับที่ที่ทำได้จริง ที่จริงมันดีขนาดที่ผมบิดเทคนิคทั้งหมดของผมเพื่อให้ 763 01:08:41,914 --> 01:08:47,432 TDD ทำงานได้ดีขึ้น ผมเห็นสายตาที่เริ่มเคลิ้ม มันร้อนมากในนี้ 764 01:08:47,432 --> 01:08:51,754 คุณนึกภาพไม่ออกว่าบนเวทีร้อนแค่ไหน พักเบรกอีก 5 765 01:08:51,754 --> 01:08:57,272 นาทีดีกว่า กลับมาเวลาสี่สิบห้านาที น่าจะได้ พักให้เต็มที่เลย 766 01:08:57,272 --> 01:09:03,433 แล้วเราจะกลับมาอีกทีในราว 6-7 นาที แล้วผมจะพูดถึงวิธีคิดเรื่องโมดูล 767 01:09:03,433 --> 01:09:07,940 การสร้างโค้ดเบสให้สิ่งนี้เป็นไปได้ ผมเพิ่งเล่นกับ 768 01:09:07,940 --> 01:09:12,998 AI ตรงนี้ และเราได้ commit มาหนึ่งอัน มีของให้ทดสอบแล้ว 769 01:09:12,998 --> 01:09:18,424 issue หมายเลขสองเสร็จแล้ว นี่คือสิ่งที่ทำไป นี่คือหน้าตาตอน 770 01:09:18,424 --> 01:09:25,137 Ralph loop เสร็จสมบูรณ์ คือคุณจะได้บทสรุปเล็กๆ และตอนนี้เรามีของที่สามารถ 771 01:09:25,137 --> 01:09:29,643 QA ได้ เพราะเราทำ feedback loops เพราะเราทำ trace 772 01:09:29,643 --> 01:09:35,161 bullets เพราะเราบอกว่า "โอเค ให้ของที่ review ได้ตอนจบหน่อย" 773 01:09:35,161 --> 01:09:40,311 เราก็เข้าไป QA ได้ทันที ไม่มีอะไรน่าเบื่อเท่าการดูคนอื่น 774 01:09:40,311 --> 01:09:45,921 QA แล้ว หวังว่าเราจะได้ลองเล่นกันบ้าง ขอเช็กว่ามันทำงานได้ไหม 775 01:09:45,921 --> 01:09:50,703 ที่จริง ก่อนไปตรงนั้น ผมอยากไล่ดูว่าเกิดอะไรขึ้นบ้าง 776 01:09:50,703 --> 01:09:55,761 คือเราเห็นว่ามันสร้างของบางอย่างบนแดชบอร์ด แล้วมันก็รัน 777 01:09:55,761 --> 01:10:01,095 feedback loops คือรันเทสต์และเช็ก types TDD สำคัญมากแน่นอน 778 01:10:01,095 --> 01:10:05,601 และมันสำคัญเพราะ feedback loops เหล่านี้จำเป็นต่อ 779 01:10:05,601 --> 01:10:11,119 AI จำเป็นต่อการให้ AI ผลิตอะไรที่สมเหตุสมผล เพราะถ้าไม่มีมัน 780 01:10:11,119 --> 01:10:15,625 AI จะเขียนโค้ดแบบมืดบอดสนิท ถ้าโค้ดเบสของคุณไม่มี 781 01:10:15,625 --> 01:10:19,947 feedback loops คุณจะไม่มีวันได้ output ที่ดีจาก 782 01:10:19,947 --> 01:10:24,546 AI และบ่อยครั้งคุณจะพบว่า คุณภาพของ feedback loops 783 01:10:24,546 --> 01:10:29,236 คือตัวกำหนดว่า AI เขียนโค้ดได้ดีแค่ไหน นั่นคือเพดาน 784 01:10:29,236 --> 01:10:34,110 ถ้าคุณได้ output แย่ๆ จาก AI คุณมักต้องเพิ่มคุณภาพของ 785 01:10:34,110 --> 01:10:38,708 feedback loops เดี๋ยวเราจะพูดถึงวิธีทำในอีกสักครู่ 786 01:10:38,708 --> 01:10:43,122 ตอนนี้มันรัน npm run test และ npm run type check 787 01:10:43,122 --> 01:10:47,904 มันเจอ type error หนึ่งตัว และต้องแก้ด้วย TypeScript 788 01:10:47,904 --> 01:10:52,411 magic สักหน่อย ดีมาก ใช่ type ของ level threshold 789 01:10:52,411 --> 01:10:57,653 เป็น number โอเค คุณเห็นไหมว่าทำไมผมถึงเลิกสอน TypeScript 790 01:10:57,653 --> 01:11:02,251 เพราะตอนนี้ AI รู้ทุกอย่างแล้ว มันรันเทสต์แล้วผ่าน 791 01:11:02,251 --> 01:11:07,125 ดูดีมาก ตอนนี้เรามีเทสต์ 284 ตัวใน repo นี้ ดีทีเดียว 792 01:11:07,125 --> 01:11:12,275 ผมพบว่าฟรอนต์เอนด์ทดสอบยากจริงๆ ในโครงการนี้ เราทดสอบแค่ 793 01:11:12,275 --> 01:11:17,149 service เป็นหลัก เราสร้าง gamification service ขึ้นมา 794 01:11:17,149 --> 01:11:22,115 ถ้าดูตรงนี้ แล้วก็มีเทสต์สำหรับ service นั้น คุณจะเห็น 795 01:11:22,115 --> 01:11:26,437 service กับเทสต์ของมัน ถ้าผมกำลังทำ code review 796 01:11:26,437 --> 01:11:32,875 ผมจะเริ่มจาก review เทสต์ก่อน ให้แน่ใจว่าเทสต์ตรวจสอบสิ่งที่สมเหตุสมผล 797 01:11:32,875 --> 01:11:38,944 แล้วค่อย review ตัวโค้ดเพื่อให้แน่ใจว่ามันไม่ได้ทำอะไรเพี้ยนเกินไป 798 01:11:38,944 --> 01:11:44,186 สิ่งสำคัญคือผมต้องดูแดชบอร์ดจริงๆ ผมจะล็อกอินเป็นนักเรียน 799 01:11:44,186 --> 01:11:49,428 โอ้ ถ้ามันยอมให้ล็อกอิน บางทีมันอาจไม่ยอม ไม่เอาน่าเพื่อน 800 01:11:49,428 --> 01:11:53,843 เอาล่ะ ล็อกอินเป็น Emma Wilson เข้าไปที่ courses 801 01:11:53,843 --> 01:11:58,901 สมมติว่าผมมีคอร์ส Introduction to TypeScript กดเรียนต่อ 802 01:11:58,901 --> 01:12:03,775 ใช่ ผมเรียนบทเรียนนี้จบแล้ว แล้วมีอะไรบางอย่างผิดพลาด 803 01:12:03,775 --> 01:12:09,384 ผมเดาว่าเพราะผมไม่มี... เออเร่อ SQLite ผมไม่มีตารางที่ถูกต้อง 804 01:12:09,384 --> 01:12:15,178 ผมต้องมีตาราง point events point events เป็นชื่อตารางที่แปลกมาก 805 01:12:15,178 --> 01:12:19,960 ไม่รู้ว่ามันคิดอะไรอยู่ ขอพักก่อน รัน npm db:migrate 806 01:12:19,960 --> 01:12:24,834 หรือ push ผมจำไม่ได้ว่าอันไหน แต่คุณคงพอเข้าใจใช่ไหม? 807 01:12:24,834 --> 01:12:29,525 ผมจะไม่ทรมานคุณด้วยการดูผมทำ QA เพราะมันน่าเบื่อมาก 808 01:12:29,525 --> 01:12:33,939 แต่ ณ จุดนี้ ผมจะกลับเข้าไป ขอเปิดโปรเจกต์กลับมา 809 01:12:33,939 --> 01:12:38,629 และผมจะ... นี่คือช่วงเวลาสำคัญ และสำคัญมากที่จะต้อง 810 01:12:38,629 --> 01:12:43,043 QA ด้วยมือตรงนี้ เพราะ QA โอ้ ไม่ๆ เกิดอะไรขึ้น? 811 01:12:43,043 --> 01:12:49,021 เอาล่ะ QA คือวิธีที่ผมยัดเยียดความคิดเห็นของผมกลับเข้าไปในโค้ดเบส 812 01:12:49,021 --> 01:12:53,343 วิธีที่ผมยัดเยียดรสนิยมของผม สิ่งที่คุณมักพบคือ 813 01:12:53,343 --> 01:12:58,769 มีทีมที่พยายามทำให้ทุกอย่างอัตโนมัติ ทุกส่วนของกระบวนการนี้ 814 01:12:58,769 --> 01:13:03,275 และถ้าคุณลองทำให้การสร้างไอเดียอัตโนมัติ ทำให้ QA 815 01:13:03,275 --> 01:13:08,425 อัตโนมัติ ทำให้งานวิจัยอัตโนมัติ ทำให้โปรโตไทป์อัตโนมัติ 816 01:13:08,425 --> 01:13:13,667 คุณจะได้แอปที่ผมรู้สึกว่าขาดรสนิยมและแย่ บางทีมันไม่ทำงาน 817 01:13:13,667 --> 01:13:21,944 หรือทำงานไม่ตรงตามที่ตั้งใจ หรือมันไม่มี... คุณต้องมีสัมผัสของมนุษย์ในการสร้างสิ่งเหล่านี้ 818 01:13:21,944 --> 01:13:28,289 เพราะถ้าไม่มี คุณจะได้แค่ของเละๆ (slop) และเราที่นี่ไม่ได้ผลิตของเละๆ 819 01:13:28,289 --> 01:13:32,980 เราพยายามผลิตของที่มีคุณภาพสูง นั่นคือจุดประสงค์ของ 820 01:13:32,980 --> 01:13:38,497 QA ในส่วนสุดท้ายนี้ผมจะทำสองอย่าง อย่างแรกคือ ผมจะบอกวิธี... 821 01:13:38,497 --> 01:13:43,464 ในใจคุณอาจมีคำถามว่า สมมติผมมีโค้ดเบสที่กำลังทำงานด้วย 822 01:13:43,464 --> 01:13:48,981 และมันเป็นโค้ดเบสที่แย่ ซับซ้อนมาก AI ไม่เคยทำงานในนั้นได้ดี 823 01:13:48,981 --> 01:13:55,419 และจริงๆ แล้วมนุษย์ส่วนใหญ่ที่เข้าไปในโค้ดเบสนั้นก็ทำงานไม่ดีเหมือนกัน 824 01:13:55,419 --> 01:14:01,856 จะปรับปรุงโค้ดเบสนั้นยังไง? และอย่างที่สองคือ ผมจะโชว์การตั้งค่าสำหรับ 825 01:14:01,856 --> 01:14:06,914 parallelization ของผม เริ่มจากโค้ดที่แย่ก่อน อยู่ไหนนะ? 826 01:14:06,914 --> 01:14:11,237 ไดอะแกรมอยู่ไหน? นี่ไง ในหนังสือ The Philosophy 827 01:14:11,237 --> 01:14:16,938 of Software Design ของ John Ousterhout เขาพูดถึงโมดูลในอุดมคติ 828 01:14:16,938 --> 01:14:22,824 ลองจินตนาการว่าคุณมีโค้ดเบสหน้าตาแบบนี้ แต่ละบล็อกคือไฟล์เดี่ยวๆ 829 01:14:22,824 --> 01:14:29,813 และไฟล์เหล่านี้ export สิ่งต่างๆ ออกมา มีสิ่งที่คุณดึงจากไฟล์ไปใช้ในสิ่งอื่น 830 01:14:29,813 --> 01:14:34,320 คุณอาจมี dependency แปลกๆ ที่ไฟล์นี้พึ่งพาไฟล์นี้ 831 01:14:34,320 --> 01:14:38,734 หรือพึ่งพาไฟล์นั้น ถ้าไฟล์เหล่านี้เล็กและไม่ค่อย 832 01:14:38,734 --> 01:14:43,056 export อะไรมากมาย John Ousterhout จะเรียกมันว่า 833 01:14:43,056 --> 01:14:47,654 shallow modules (โมดูลตื้น) พวกมันจะดูประมาณนี้... 834 01:14:47,654 --> 01:14:52,712 ไม่ ไม่ใช่ ฉันวาดไดอะแกรมสวยๆ ไม่ได้ พวกมันคือก้อนเล็กๆ 835 01:14:52,712 --> 01:15:00,345 มากมายมหาศาล ซึ่งยากที่ AI จะสำรวจ เพราะมันไม่เข้าใจความสัมพันธ์ระหว่างทุกสิ่งจริงๆ 836 01:15:00,345 --> 01:15:05,863 มันหาว่าอะไรอยู่ตรงไหนไม่เจอ มันต้องไล่ตามกราฟทั้งหมดด้วยมือ 837 01:15:05,863 --> 01:15:10,829 แล้วบอกว่า "โอเค อันนี้พึ่งพาอันนี้ อันนี้พึ่งพาอันนี้ 838 01:15:10,829 --> 01:15:18,002 อันนี้พึ่งพาอันนี้" แล้วมันก็ยากที่จะทดสอบด้วย เพราะคุณจะขีดเส้นขอบเขตการทดสอบ 839 01:15:18,002 --> 01:15:23,152 (test boundaries) ตรงไหน? คุณจะทดสอบแต่ละโมดูลแยกกันไหม? 840 01:15:23,152 --> 01:15:28,026 ขีดเส้นขอบเขตการทดสอบ... ไม่ อย่าทำแบบนั้น รอบอันนี้? 841 01:15:28,026 --> 01:15:34,280 แล้วก็เส้นอีกอันรอบอันถัดไป แล้วก็อันถัดไป? หรือคุณควรรวมกลุ่มใหญ่ๆ? 842 01:15:34,280 --> 01:15:40,350 คุณจะบอกว่า "โอเค เราจะทดสอบโมดูลที่เกี่ยวข้องกันทั้งหมดนี้ด้วยกัน 843 01:15:40,350 --> 01:15:44,764 แล้วก็หวังและอธิษฐานว่ามันจะทำงาน" >> [ถอนหายใจ] 844 01:15:44,764 --> 01:15:50,558 >> นี่หมายความว่า ถ้าผมคิดว่าเทสต์ที่แย่ๆ ส่วนใหญ่หน้าตาแบบนั้น 845 01:15:50,558 --> 01:15:56,075 คือ AI พยายามห่อทุกฟังก์ชันเล็กๆ ด้วยขอบเขตการทดสอบของมันเอง 846 01:15:56,075 --> 01:16:00,582 แล้วก็แค่ทดสอบว่ามันทำงานเดี่ยวๆ แต่ผลที่ตามมาคือ 847 01:16:00,582 --> 01:16:05,732 สมมติว่าโมดูลตรงนี้เรียกสองโมดูลนั้น มันพึ่งพาทั้งสองตัว 848 01:16:05,732 --> 01:16:14,192 โมดูลนี้อาจเรียกใช้ฟังก์ชันผิดลำดับ หรืออาจมีอะไรในโมดูลที่น่าสงสารนั้นที่ควรทดสอบแยกต่างหาก 849 01:16:14,192 --> 01:16:18,607 แล้วถ้าคุณห่อมันด้วยขอบเขตการทดสอบ คุณจะทำยังไง? 850 01:16:18,607 --> 01:16:23,113 คุณจะ mock (จำลอง) อีกสองโมดูลไหม? มันทำงานยังไง? 851 01:16:23,113 --> 01:16:28,447 ดังนั้น การหาวิธีสร้างโค้ดเบสที่ทดสอบง่ายจึงเป็นสิ่งจำเป็น 852 01:16:28,447 --> 01:16:33,413 เพราะถ้าโค้ดเบสทดสอบง่าย feedback loops ของเราจะดีขึ้น 853 01:16:33,413 --> 01:16:37,919 และ AI จะทำงานได้ดีขึ้นในโค้ดเบสของเรา เข้าใจไหม? 854 01:16:37,919 --> 01:16:43,437 แล้วโค้ดเบสที่ดีหน้าตาเป็นยังไง? ไม่ใช่แบบนั้น มันเป็นแบบนี้ 855 01:16:43,437 --> 01:16:48,035 คือมีสิ่งที่ John Ousterhout เรียกว่า deep modules 856 01:16:48,035 --> 01:16:55,668 (โมดูลลึก) โมดูลที่มีอินเทอร์เฟซเล็กๆ ข้างนอก เปิดเผยอินเทอร์เฟซที่เล็กและเรียบง่าย 857 01:16:55,668 --> 01:17:01,462 แต่ข้างในมีฟังก์ชันการทำงานมากมาย นี่หมายความว่าพวกมันทดสอบง่าย 858 01:17:01,462 --> 01:17:06,888 เพราะคุณแค่... สมมติว่ามี dependency ระหว่างอันนี้กับอันนี้ 859 01:17:06,888 --> 01:17:11,302 ลูกศรผมใช้ได้ไหม? ใช่ เอาล่ะ แล้วสิ่งที่คุณทำคือ 860 01:17:11,302 --> 01:17:16,544 ขีดเส้นขอบเขตการทดสอบขนาดใหญ่รอบโมดูลนั้น รอบอันนี้ข้างบน 861 01:17:16,544 --> 01:17:22,705 แล้วคุณจะจับของดีๆ ได้เยอะ เพราะมีฟังก์ชันการทำงานมากมายที่คุณทดสอบ 862 01:17:22,705 --> 01:17:28,223 และผู้เรียกใช้ (caller) คนที่เรียกโมดูล จะมีอินเทอร์เฟซง่ายๆ 863 01:17:28,223 --> 01:17:33,281 ให้ใช้งาน ไม่ยากเกินไป เข้าใจไหม? deep modules เทียบกับ 864 01:17:33,281 --> 01:17:37,696 shallow modules อันนี้ดี เวอร์ชันตื้นๆ แบบนี้แย่ 865 01:17:37,696 --> 01:17:43,121 และสิ่งที่ผมพบคือ ถ้าไม่มีการช่วยเหลือ หรือถ้าคุณไม่จับตาดู 866 01:17:43,121 --> 01:17:49,007 AI อย่างใกล้ชิด มันจะผลิตโค้ดเบสหน้าตาแบบนี้ คุณต้องระวังให้มากๆ 867 01:17:49,007 --> 01:17:53,605 ตอนที่คุมมัน และนั่นคือเหตุผลที่ ถ้าเรามองเข้าไปใน 868 01:17:53,605 --> 01:17:58,204 PRD PRD หายไปไหน? มันอยู่ใน issues ใน gamification 869 01:17:58,204 --> 01:18:03,262 system หาไม่เจอ แน่นอนสิว่าหาไม่เจอ นี่ไง แล้วในนี้ผมมี 870 01:18:03,262 --> 01:18:08,503 data model โมดูลต่างๆ มันระบุชัดเจนว่า "โอเค gamification 871 01:18:08,503 --> 01:18:13,378 service นี้เป็น deep module ใหม่ ซึ่งเราจะทดสอบรอบมัน 872 01:18:13,378 --> 01:18:18,068 มันจะมีอินเทอร์เฟซแบบนี้โดยเฉพาะ และมันจะมี... โอเค 873 01:18:18,068 --> 01:18:22,574 เรากำลังแก้ progress service ด้วย กำลังแก้ lesson 874 01:18:22,574 --> 01:18:30,207 route กำลังแก้ dashboard route อะไรพวกนี้ ผมระบุโมดูลที่กำลังแก้อย่างเฉพาะเจาะจงมาก 875 01:18:30,207 --> 01:18:36,001 และทำให้แน่ใจว่าผมเก็บแผนที่โมดูล (module map) ไว้ในหัวตลอดเวลา 876 01:18:36,001 --> 01:18:40,875 ทั้งระหว่างวางแผนและระหว่าง implementation เข้าใจไหม? 877 01:18:40,875 --> 01:18:45,381 มีประโยชน์มากๆ และยังมีประโยชน์อีกเหตุผลหนึ่งด้วย 878 01:18:45,381 --> 01:18:52,002 ไม่เพียงแต่ทำให้แอปของคุณทดสอบง่ายขึ้น แต่คุณยังได้เล่นกลทางความคิดเล็กๆ 879 01:18:52,002 --> 01:18:56,325 ขอเติมน้ำก่อน ในระหว่างที่คุณรอฟังว่ามันคืออะไร 880 01:18:56,325 --> 01:19:02,210 ขอถามจากพวกคุณหน่อย ยกมือขึ้นถ้ารู้สึกว่าทำงานหนักกว่าเดิมมากกับ 881 01:19:02,210 --> 01:19:08,372 AI ใช่ ยกมือขึ้นถ้ารู้สึกว่ารู้จักโค้ดเบสของตัวเองน้อยกว่าเมื่อก่อน 882 01:19:08,372 --> 01:19:14,717 ใช่ นี่คือเรื่องจริง เพราะเราเคลื่อนที่เร็ว เพราะเรามอบหมายงานมากขึ้น 883 01:19:14,717 --> 01:19:21,155 เราจึงสูญเสียความรู้สึกต่อโค้ดเบส และถ้าเราสูญเสียความรู้สึกต่อโค้ดเบส 884 01:19:21,155 --> 01:19:26,581 เราจะไม่สามารถปรับปรุงมันได้ และเรากำลังมอบรูปร่างของมันให้ 885 01:19:26,581 --> 01:19:35,961 AI จริงๆ ผมไม่คิดว่านั่นเป็นสิ่งที่ดี แล้วเราจะทำยังไงให้เคลื่อนที่เร็วพร้อมกับเก็บพื้นที่ในสมองไว้พอ? 886 01:19:35,961 --> 01:19:43,318 ผมว่านี่คือหนทาง เพราะสิ่งที่คุณทำตรงนี้ ไม่เพียงแต่คุณคิดถึงการสร้างรูปทรงใหญ่ๆ 887 01:19:43,318 --> 01:19:47,916 ในโค้ดเบส service ใหญ่ๆ สิ่งที่ผมคิดว่าคุณควรทำคือ 888 01:19:47,916 --> 01:19:52,331 ออกแบบอินเทอร์เฟซของโมดูลเหล่านี้ แล้วมอบหมายการ 889 01:19:52,331 --> 01:19:58,032 implement ให้คนอื่น พูดอีกแบบคือ โมดูลเหล่านี้กลายเป็นกล่องเทา 890 01:19:58,032 --> 01:20:03,458 (gray box) ที่คุณแค่ต้องรู้รูปทรงของมัน ต้องรู้ว่ามันทำอะไร 891 01:20:03,458 --> 01:20:08,608 รู้พฤติกรรมของมัน แต่คุณมอบหมายการ implement ภายในมันได้ 892 01:20:08,608 --> 01:20:14,402 ผมพบว่านี่ดีมาก ผมไม่จำเป็นต้อง code review ทุกอย่างในโมดูลนั้น 893 01:20:14,402 --> 01:20:23,323 ผมไม่จำเป็นต้องรู้ทุกอย่างว่ามันทำอะไร ผมแค่ต้องรู้ว่ามันมีพฤติกรรมแบบหนึ่งภายใต้เงื่อนไขบางอย่าง 894 01:20:23,323 --> 01:20:29,484 และมันทำหน้าที่ของมัน มันเหมือนกับว่า โอเค ผมมีภาพรวมใหญ่ของโค้ดเบส 895 01:20:29,484 --> 01:20:34,818 เข้าใจรูปทรงต่างๆ ข้างใน เข้าใจว่าอินเทอร์เฟซทั้งหมดทำอะไร 896 01:20:34,818 --> 01:20:46,130 แต่ผมสามารถมอบหมายสิ่งที่อยู่ข้างในได้ ผมพบว่านี่เป็นวิธีที่ดีมากในการรักษาความรู้สึกต่อโค้ดเบสไว้พร้อมกับรักษาสติของตัวเอง 897 01:20:46,130 --> 01:20:52,751 เข้าใจไหม? คุณอาจถามว่า จะเปลี่ยนโค้ดเบสแบบนี้ให้เป็นโค้ดเบสแบบนี้ยังไง? 898 01:20:52,751 --> 01:20:57,901 จะทำให้โมดูลลึกขึ้นยังไง? เรามี... หวังว่ามันจะอยู่ในนี้ 899 01:20:57,901 --> 01:21:02,591 ค่อนข้างแน่ใจว่าอยู่ เรามี skill ที่ชื่อว่า improve 900 01:21:02,591 --> 01:21:06,913 code base architecture ตรงไปตรงมาดี มาลองรันกัน 901 01:21:06,913 --> 01:21:11,788 skill นี้จะสแกนโค้ดเบสของเราและมองหาว่ามีอะไรอยู่บ้าง 902 01:21:11,788 --> 01:21:17,305 ถ้าคุณกำลังทำแบบฝึกหัดอยู่ก็ลองรันได้เลย มันสำรวจสถาปัตยกรรม 903 01:21:17,305 --> 01:21:23,375 สำรวจวิธีทำงานในโค้ดเบสนี้ และจะพยายามหาจุดที่ทำให้โมดูลลึกขึ้นได้ 904 01:21:23,375 --> 01:21:28,341 ง่ายๆ สิ่งที่เจ๋งมากที่มันเจอตรงนี้คือ ส่วนหนึ่งของแอป 905 01:21:28,341 --> 01:21:35,606 course video manager ของผมคือ video editor ตัวตัดต่อวิดีโอที่ทำงานในเบราว์เซอร์ 906 01:21:35,606 --> 01:21:46,182 ซึ่งโหดมาก มันเป็นงานวิศวกรรมที่หนักหน่อย และผมต้องการวิธีห่อฟรอนต์เอนด์ทั้งหมดจนถึงแบ็กเอนด์เป็นโมดูลใหญ่ก้อนเดียว 907 01:21:46,182 --> 01:21:53,631 เพื่อที่ผมจะได้ทดสอบว่าการกดอะไรบางอย่างบนฟรอนต์เอนด์แล้วมันส่งผลไปจนถึงแบ็กเอนด์ 908 01:21:53,631 --> 01:21:58,781 ผมหาวิธีได้โดยใช้ discriminated union (ยูเนียนแบบแยกแยะ) 909 01:21:58,781 --> 01:22:06,322 ระหว่างสอง type ตรงนี้ ผมใช้ skill นี้เพื่อสร้างโมดูลยักษ์ใหญ่ที่ทดสอบจากภายนอกได้ 910 01:22:06,322 --> 01:22:11,288 โครงสร้างพื้นฐานของ video editor นี้ และมันหมายความว่า 911 01:22:11,288 --> 01:22:17,450 AI เห็นโฟลว์ทั้งหมด ลงมือกับโฟลว์ทั้งหมด และทดสอบกับโฟลว์ทั้งหมดได้ 912 01:22:17,450 --> 01:22:23,427 และจริงๆ แล้ว มันต่างกันเหมือนกลางวันกับกลางคืนในแง่ความสามารถของ 913 01:22:23,427 --> 01:22:27,934 AI ในการแก้ไขอะไรจริงๆ เพราะ AI ที่ทำงานกับ video 914 01:22:27,934 --> 01:22:32,440 editor ค่อนข้างโหดร้ายถ้าคุณไม่ให้เทสต์ดีๆ กับมัน 915 01:22:32,440 --> 01:22:37,038 เอาจริงๆ ถ้าจะให้จำอะไรติดตัวไปจากวันนี้หนึ่งอย่าง 916 01:22:37,038 --> 01:22:42,188 ก็ลองรัน skill นี้บน repo ของคุณดู แล้วดูว่าเกิดอะไรขึ้น 917 01:22:42,188 --> 01:22:47,246 ไปดู Slido กัน ขอเช็กคำถามสองสามข้อระหว่างที่มันรันอยู่ 918 01:22:47,246 --> 01:22:51,752 มาดูกัน "คุณลองใช้ auto mode ของ Claude กับคำสั่ง 919 01:22:51,752 --> 01:22:57,638 'enable auto mode' ไหม?" วิธีนั้นจะช่วยให้คุณเลี่ยงการเช็กสิทธิ์ 920 01:22:57,638 --> 01:23:02,788 (permission checks) ที่ชัดเจนหลายอย่างได้ เดี๋ยวจะพูดถึง 921 01:23:02,788 --> 01:23:07,294 permission checks อีกสักครู่ "ผมเก็บแผนและ issues 922 01:23:07,294 --> 01:23:12,168 แบบ markdown ไว้ใช้อ้างอิงทีหลังไหม?" โอเค คำถามดีมาก 923 01:23:12,168 --> 01:23:16,583 สมมติว่าคุณมีไอเดียดีๆ เปลี่ยนมันเป็น PRD ขึ้นมา 924 01:23:16,583 --> 01:23:20,997 แล้ว implement PRD นั้น และ PRD เสร็จสมบูรณ์แล้ว 925 01:23:20,997 --> 01:23:26,055 ยกมือขึ้นถ้าคุณเก็บข้อมูลนั้นไว้ใน repo โดยแปลงเป็นไฟล์ 926 01:23:26,055 --> 01:23:33,228 markdown ยกมือขึ้นถ้าอยากเก็บมันไว้ เจ๋ง โอเค และยกมือขึ้นถ้าไม่อยากเก็บมันไว้ 927 01:23:33,228 --> 01:23:38,930 ถ้าอยากกำจัดมันให้เร็วที่สุด ใช่ ผมว่าคำถามนี้ไม่มีคำตอบชัดเจน 928 01:23:38,930 --> 01:23:43,620 สิ่งที่ผมกลัวมากเกี่ยวกับการตัดสินใจเรื่องเอกสารคือ 929 01:23:43,620 --> 01:23:48,034 สมมติว่าเรามี PRD สำหรับ gamification system นี้ 930 01:23:48,034 --> 01:23:53,736 เราเก็บมันไว้ใน repo เราทำงานต่อไปเรื่อยๆ สมมติหนึ่งเดือนต่อมา 931 01:23:53,736 --> 01:23:58,242 เราอยากแก้ไข gamification system แล้วเราเข้าไปกับ 932 01:23:58,242 --> 01:24:04,680 Claude และมันเจอ PRD เก่านี้แล้วบอกว่า "ใช่ ฉันเจอเอกสารต้นฉบับของระบบ 933 01:24:04,680 --> 01:24:10,841 PRD แล้ว" แล้วปรากฏว่าโค้ดจริงเปลี่ยนไปจาก PRD เดิมมากจนแทบจำไม่ได้ 934 01:24:10,841 --> 01:24:15,347 ชื่อของสิ่งต่างๆ เปลี่ยนไป โครงสร้างไฟล์เปลี่ยนไป 935 01:24:15,347 --> 01:24:19,670 แม้แต่ความต้องการ (requirements) ก็อาจเปลี่ยนไป 936 01:24:19,670 --> 01:24:24,084 เราอาจเอาไปทดสอบกับผู้ใช้จริงแล้ว นี่คือ doc rot 937 01:24:24,084 --> 01:24:29,050 (เอกสารเน่า) คือเอกสารของบางอย่างกำลังเน่าเปื่อยอยู่ใน 938 01:24:29,050 --> 01:24:35,671 repo ของคุณ และมีอิทธิพลกับ Claude ในทางที่แย่ หรือกับเอเจนต์ในทางที่แย่ 939 01:24:35,671 --> 01:24:40,362 ผมเลยมักไม่เก็บมันไว้ ผมมักกำจัดมันทิ้ง และสำหรับผม 940 01:24:40,362 --> 01:24:44,960 เพราะการตั้งค่าของผมใช้ GitHub issues ผมก็แค่ mark 941 01:24:44,960 --> 01:24:49,834 เป็น closed (ปิดแล้ว) มันดึงข้อมูลกลับมาได้ถ้าต้องการ 942 01:24:49,834 --> 01:24:56,915 แต่มันมีตัวบ่งชี้ว่าจบแล้ว ผมเลยชอบทิ้งพวกมัน "ความคิดเห็นเกี่ยวกับเฟรมเวิร์ก 943 01:24:56,915 --> 01:25:02,985 BEADS ของ Steve?" ผมยังไม่ได้ทดสอบมัน แต่ดูเหมือนเป็นอีกวิธีจัดการ 944 01:25:02,985 --> 01:25:07,399 Kanban boards และ issues ดูดีมาก แต่ยังไม่ได้ลอง 945 01:25:07,399 --> 01:25:13,653 >> [กระแอม] >> ขอเช็กการตั้งค่าตรงนี้หน่อย ขอถามจากในห้องสองสามคำถาม 946 01:25:13,653 --> 01:25:18,343 มีใครมีคำถามเกี่ยวกับสิ่งที่เราครอบคลุมมา ถึงตอนนี้ 947 01:25:18,343 --> 01:25:23,677 โดยเฉพาะส่วนสุดท้ายนี้ไหม? ใช่ "ผมว่าคำตอบของคุณเรื่องไฟล์ 948 01:25:23,677 --> 01:25:28,367 markdown ที่คุณลบเพราะมันสร้าง doc rot น่าสนใจ แล้ว 949 01:25:28,367 --> 01:25:32,781 migration ล่ะ? ไฟล์ migration คุณจะ squash (รวม) 950 01:25:32,781 --> 01:25:38,115 มันทีหลังไหม? แบบ database migrations (การย้ายฐานข้อมูล)?" 951 01:25:38,115 --> 01:25:42,621 ใช่ ไม่รู้สิ หวังว่าคงตอบคำถามคุณได้ ขอโทษที ไม่ๆ 952 01:25:42,621 --> 01:25:51,082 ผมคิดว่า database migrations เป็นคนละเรื่องกัน เพราะคุณมีบันทึกต่อเนื่องว่าอะไรเปลี่ยนไปบ้าง 953 01:25:51,082 --> 01:25:55,404 และมันกำหนดผลลัพธ์ได้แน่นอนกว่า และผมว่า... ใช่ 954 01:25:55,404 --> 01:25:59,910 มันเป็นการเปรียบเทียบที่น่าสนใจ ไม่แน่ใจเหมือนกัน 955 01:25:59,910 --> 01:26:04,785 คุยกันทีหลังนะ นั่นคือวิธีพูดอย่างสุภาพว่า "ผมไม่รู้" 956 01:26:04,785 --> 01:26:09,475 ใช่ ใช่ "คุณพูดว่าคุณไม่ลบ PRD คุณพูดว่าคุณไม่ทบทวน 957 01:26:09,475 --> 01:26:16,096 PRD เมื่อมันเสร็จแล้ว" ขอโทษนะทุกคน ผมกำลังฟังคำถามของคุณผู้ชายคนนี้อยู่ 958 01:26:16,096 --> 01:26:20,602 "คุณเคยลองใช้ deep think อย่าง ChatGPT อะไรแบบนี้ 959 01:26:20,602 --> 01:26:26,028 ให้มันดู PRD แล้วบอกว่ามัน..." มันใช้เวลาประมาณหนึ่งชั่วโมง 960 01:26:26,028 --> 01:26:31,546 ใช่ คำถามคือ ผมควรพยายาม optimize แผนในช่วงวางแผนช่วงแรกไหม? 961 01:26:31,546 --> 01:26:36,328 นี่คือสิ่งที่ผมเห็นคนทำกันเยอะ และเป็นไอเดียที่ดีมาก 962 01:26:36,328 --> 01:26:41,938 ตอนที่คุณ... กลับไปที่เฟสต่างๆ กัน สมมติว่าคุณมีเฟสทั้งหมดนี้ 963 01:26:41,938 --> 01:26:47,916 แล้วคุณมาถึงจุดที่คิดทุกอย่างกับ LLM แล้ว เข้าใจแล้วว่าจะไปทางไหน 964 01:26:47,916 --> 01:26:53,525 สร้างเอกสารจุดหมายปลายทางของการเดินทางแล้ว แล้วคุณควรจะพยายาม 965 01:26:53,525 --> 01:27:01,618 optimize PRD ซ้ำแล้วซ้ำเล่าจนกว่าจะเป็น PRD ที่สมบูรณ์แบบที่สุดเท่าที่จะจินตนาการได้ไหม? 966 01:27:01,618 --> 01:27:08,424 ผมว่าไม่มีคุณค่ามากนักในนั้น เพราะผมว่าการเดินทางเป็นแค่การบอกทิศทางคร่าวๆ 967 01:27:08,424 --> 01:27:12,838 ว่าคุณอยากไปทางไหน และจุดที่คุณควรทุ่มเททำงานคือ 968 01:27:12,838 --> 01:27:17,344 QA และคุณทำแบบ AFK ได้ด้วย ผมว่า แต่จากประสบการณ์ 969 01:27:17,344 --> 01:27:21,850 คุณจะไม่ได้ประโยชน์จากมันมากนัก สิ่งที่สำคัญจริงๆ 970 01:27:21,850 --> 01:27:26,540 คือการสร้างความเข้าใจตรงกันกับ AI ซึ่งคุณทำในเซสชัน 971 01:27:26,540 --> 01:27:30,955 grilling ตั้งแต่แรก ขออีกหนึ่งคำถาม มีใครอีกไหม? 972 01:27:30,955 --> 01:27:37,208 ใช่ "ในเวิร์กโฟลว์ของคุณ ทำยังไงให้มันเขียนโค้ดแบบที่คุณอยากให้เขียน 973 01:27:37,208 --> 01:27:43,278 เพื่อที่พอถึงขั้น code review มันจะคุ้นเคย ใช้ไลบรารีที่คุณอยากใช้ 974 01:27:43,278 --> 01:27:51,279 ใช่" จริงๆ เรามีคำถามนี้มาก่อนแล้ว คือจะบังคับมาตรฐานการเขียนโค้ดของคุณกับเอเจนต์ยังไง? 975 01:27:51,279 --> 01:27:56,705 จะให้มันเขียนโค้ดแบบที่คุณอยากให้เขียนยังไง? มีสองวิธีหลักๆ 976 01:27:56,705 --> 01:28:01,763 คือ... ไม่รู้สิ เอาน่า "push" กับ "pull" ผมหมายถึงอะไร? 977 01:28:01,763 --> 01:28:06,821 Push คือการผลักคำสั่งไปให้ LLM เช่น ถ้าคุณใส่บางอย่างใน 978 01:28:06,821 --> 01:28:13,534 Claude.md อย่าง "พูดเหมือนโจรสลัด" คำสั่งนั้นจะถูกส่งไปให้เอเจนต์ตลอดเวลา 979 01:28:13,534 --> 01:28:18,224 นั่นคือ push จริงๆ คุณกำลังผลัก token ไปให้มัน ส่วน 980 01:28:18,224 --> 01:28:22,546 Pull คือการให้โอกาสเอเจนต์ดึงข้อมูลเพิ่มเติมเอง 981 01:28:22,546 --> 01:28:28,432 เช่น skill skill คือสิ่งที่อยู่ใน repo และมีส่วนหัวคำอธิบายเล็กๆ 982 01:28:28,432 --> 01:28:33,950 บอกว่า "โอเค เอเจนต์ เธอสามารถดึงอันนี้มาใช้ได้เมื่อต้องการ" 983 01:28:33,950 --> 01:28:40,571 ความคิดของผมตอนนี้เกี่ยวกับ code review และมาตรฐานการเขียนโค้ดเป็นแบบนี้ 984 01:28:40,571 --> 01:28:45,629 เมื่อคุณมี implementer เกิดอะไรขึ้น? เอาล่ะ Implementer 985 01:28:45,629 --> 01:28:52,803 เดี๋ยวจะทำให้มันแดงน้อยลงหน่อย คุณต้องการให้มาตรฐานการเขียนโค้ดพร้อมใช้งานผ่าน 986 01:28:52,803 --> 01:28:58,044 pull ถ้ามันมีคำถาม คุณอยากให้มันหาคำตอบได้เอง แต่ถ้าคุณมี 987 01:28:58,044 --> 01:29:02,459 automated reviewer (ผู้ตรวจสอบอัตโนมัติ) ตามหลัง 988 01:29:02,459 --> 01:29:07,149 คุณอยากให้มัน push คือผลักข้อมูลนั้นไปให้ผู้ review 989 01:29:07,149 --> 01:29:14,966 คุณอยากบอกว่า "นี่คือมาตรฐานการเขียนโค้ดของเรา ตรวจสอบให้แน่ใจว่าโค้ดนี้ทำตามมาตรฐาน" 990 01:29:14,966 --> 01:29:20,116 ดังนั้นถ้าคุณมี skill เช่น คุณอยาก push สิ่งนั้นไปให้ผู้ 991 01:29:20,116 --> 01:29:27,657 review เพื่อให้ผู้ review มีทั้งโค้ดที่เขียนเสร็จและมาตรฐานการเขียนโค้ดไว้เทียบกัน 992 01:29:27,657 --> 01:29:34,830 หวังว่าคงตอบคำถามคุณได้ ที่จริงผมโชว์เวอร์ชันอัตโนมัติของเรื่องนี้ให้ดูได้ด้วย 993 01:29:34,830 --> 01:29:39,980 ใช่ มาทำตอนนี้เลย ระหว่างที่ยังจำได้สดๆ เมื่อไม่นานมานี้ 994 01:29:39,980 --> 01:29:44,302 ผมใช้เวลาประมาณหนึ่งอาทิตย์สร้างสิ่งที่เรียกว่า 995 01:29:44,302 --> 01:29:52,027 Sandcastle Sandcastle คือ... ผมไม่ค่อยพอใจกับตัวเลือกที่มีอยู่สำหรับการรันเอเจนต์แบบ 996 01:29:52,027 --> 01:29:56,993 AFK สิ่งที่มันทำคือ มันคือไลบรารี TypeScript สำหรับรัน 997 01:29:56,993 --> 01:30:01,408 loop พวกนี้ คุณมีฟังก์ชัน run ที่สร้าง work tree 998 01:30:01,408 --> 01:30:08,305 (ต้นไม้งาน) แซนด์บ็อกซ์มันใน Docker container แล้วให้คุณรันพรอมป์ข้างในนั้น 999 01:30:08,305 --> 01:30:13,639 และใน work tree นั้น มันก็เป็นแค่ Git branch คุณมีโค้ดนั้น 1000 01:30:13,639 --> 01:30:19,525 แล้วค่อย merge ทีหลังได้ ถ้าผมเปิด... มันมีวิธีดูผลลัพธ์ที่ดีมาก 1001 01:30:19,525 --> 01:30:24,307 และมันให้คุณรัน loop อัตโนมัติแบบนี้ และ parallelize 1002 01:30:24,307 --> 01:30:28,721 ระหว่างเอเจนต์หลายตัวได้ง่ายมาก ผมจะเข้าไปในไฟล์ 1003 01:30:28,721 --> 01:30:35,066 Sandcastle ไปที่ main.ts ตรงนี้ มาดูกัน นี่คือแบบที่ผมโชว์ให้ดูตอนแรก 1004 01:30:35,066 --> 01:30:42,424 ซึ่งเป็นเวอร์ชันของ Ralph loop นี่คือจุดที่เราเปลี่ยนจากแบบเรียงลำดับเป็นแบบขนาน 1005 01:30:42,424 --> 01:30:47,022 ตรงนี้เรามี planner (ตัววางแผน) ซึ่งมี plan prompt 1006 01:30:47,022 --> 01:30:52,723 ที่ดู backlog และเลือกจำนวน issues จำนวนหนึ่งเพื่อทำงานแบบขนาน 1007 01:30:52,723 --> 01:30:58,609 จำได้ไหมที่ผมโชว์ Kanban board ที่มีความสัมพันธ์แบบบล็อกทั้งหมด? 1008 01:30:58,609 --> 01:31:04,127 มันคำนวณเฟสทั้งหมดออกมา ตัวนี้จะบอกว่า โอเค สมมติว่าเรามี... 1009 01:31:04,127 --> 01:31:08,633 คุณข้าม glue code (โค้ดเชื่อมต่อ) ทั้งหมดนี้ไปได้ 1010 01:31:08,633 --> 01:31:14,335 นี่ก็แค่ชุด issues ซึ่งเป็น GitHub issues ที่มีชื่อเรื่องและมี 1011 01:31:14,335 --> 01:31:19,117 branch ให้คุณทำงาน จากนั้นสำหรับแต่ละ issue เราสร้าง 1012 01:31:19,117 --> 01:31:24,359 sandbox แล้วรัน implementer ใน sandbox นั้น โดยส่งหมายเลข 1013 01:31:24,359 --> 01:31:30,521 issue ชื่อ issue และ branch เข้าไป นี่คือ loop ที่เรารันก่อนหน้านี้ 1014 01:31:30,521 --> 01:31:35,487 จากนั้นถ้ามันสร้าง commits ขึ้นมา เราก็ review commits 1015 01:31:35,487 --> 01:31:40,085 เหล่านั้น นี่คือ loop จริงๆ เราจะทำอะไรกับ commits 1016 01:31:40,085 --> 01:31:44,407 เหล่านั้น? ส่งให้ merger agent (เอเจนต์รวมโค้ด) 1017 01:31:44,407 --> 01:31:48,729 ซึ่งรับ merge prompt รับ branch ที่ถูกสร้าง รับ 1018 01:31:48,729 --> 01:31:53,144 issues แล้วก็ merge เข้าด้วยกัน ถ้ามีปัญหากับการ 1019 01:31:53,144 --> 01:31:58,386 merge อย่างปัญหา types หรือ tests อะไรแบบนั้น มันก็แก้ให้ 1020 01:31:58,386 --> 01:32:04,547 และนี่คือโฟลว์ของผมมาสักพักใหญ่แล้วสำหรับการทำงานในโปรเจกต์ส่วนใหญ่ 1021 01:32:04,547 --> 01:32:08,962 มันเวิร์คดีมาก และใช่ ผมแนะนำให้ลองดู Sandcastle 1022 01:32:08,962 --> 01:32:13,560 ถ้าอยากเรียนรู้เพิ่มเติม และเพื่อตอบคำถามคุณให้ตรง 1023 01:32:13,560 --> 01:32:18,434 คือ ในผู้ review ผมจะ push มาตรฐานการเขียนโค้ด ส่วนใน 1024 01:32:18,434 --> 01:32:22,940 implementer ผมจะให้มัน pull ได้เอง และจริงๆ ผมใช้ 1025 01:32:22,940 --> 01:32:27,722 Sonnet สำหรับการ implement และ Opus สำหรับการ review 1026 01:32:27,722 --> 01:32:32,780 เพราะผมว่าการ review ต้องใช้ความฉลาดตรงนั้น มีคำถามไหม? 1027 01:32:32,780 --> 01:32:37,470 เอาแบบนี้ ก่อนที่จะถามคำถามเพิ่ม ขอกลับมาตรงนี้ก่อน 1028 01:32:37,470 --> 01:32:45,103 โอเค เราอยู่ตรงไหนแล้ว? โอเค เราซูมไปมาในทอล์กนี้เพราะผมต้องรันอะไรหลายอย่างแบบขนาน 1029 01:32:45,103 --> 01:32:50,621 กลับไปที่ improve code base architecture กัน มันรันเสร็จแล้ว 1030 01:32:50,621 --> 01:32:57,151 และเจอตัวเลือกการปรับปรุงสถาปัตยกรรมหลายจุด มันมีคลัสเตอร์ของโมดูลต่างๆ 1031 01:32:57,151 --> 01:33:01,841 ที่เกี่ยวข้องกัน ซึ่งน่าจะทดสอบเป็นหน่วยเดียวกันได้ 1032 01:33:01,841 --> 01:33:08,554 อันดับหนึ่งคือ quiz scoring service มีการแยกตรรกะการจัดเรียงลำดับใหม่ด้วย 1033 01:33:08,554 --> 01:33:13,704 มันให้เหตุผลว่าทำไมมันถึง coupled (ผูกกัน) และมีหมวดหมู่ 1034 01:33:13,704 --> 01:33:20,417 dependency ด้วย "ทดแทนได้ในเครื่อง ใน SQLite ฐานข้อมูลทดสอบในหน่วยความจำ" 1035 01:33:20,417 --> 01:33:26,947 quiz scoring service ตอนนี้มีเทสต์เป็นศูนย์ นี่คือช่องว่างที่ใหญ่ที่สุด 1036 01:33:26,947 --> 01:33:32,281 นี่คือหน้าตาตอนเรากลับมาของ improve code base architecture 1037 01:33:32,281 --> 01:33:37,339 โอเค เรามีเวลาเหลือประมาณ 17 นาที ไม่รู้ว่าคุณเป็นยังไง 1038 01:33:37,339 --> 01:33:42,397 แต่ผมเหนื่อยมาก >> [เสียงหัวเราะ] >> ผมอยาก >> [กระแอม] 1039 01:33:42,397 --> 01:33:48,558 >> ขอสรุปให้ฟังหน่อย เพราะผมว่าเรากำลังถึงขีดจำกัดความอึดของเราแล้ว 1040 01:33:48,558 --> 01:33:54,444 ผมจะอยู่ให้ครบเวลา ถ้าใครอยากมาถามคำถาม ผมอาจจะเช็กสไลด์อีกครั้ง 1041 01:33:54,444 --> 01:34:00,514 แต่ขอสรุปว่ามาถึงจุดไหนแล้ว นี่คือโฟลว์โดยรวม ตลอดกระบวนการทั้งหมด 1042 01:34:00,514 --> 01:34:07,043 เราคำนึงถึงรูปทรงของโค้ดเบสอยู่เสมอ นี่ไม่ใช่คอมไพเลอร์แปลงสเปกเป็นโค้ด 1043 01:34:07,043 --> 01:34:16,240 นี่ไม่ใช่ AI ที่พ่นโค้ดออกมาอย่างเดียว เราตั้งใจมากกับประเภทของโมดูลและรูปทรงของโค้ดเบสที่เราต้องการ 1044 01:34:16,240 --> 01:34:21,022 เราทำให้แน่ใจว่าเราเข้าใจตรงกันมากที่สุดโดยใช้เซสชัน 1045 01:34:21,022 --> 01:34:26,907 grilling โดยการตีแผ่ไอเดียของเราอย่างจริงจัง เราไม่ได้หมกมุ่นกับ 1046 01:34:26,907 --> 01:34:34,356 PRD มากเกินไป เราไม่ได้พยายามอ่านทุกส่วนของมัน เราไม่ได้คิดถึงมันมากเกินไปด้วยซ้ำ 1047 01:34:34,356 --> 01:34:39,414 จากนั้นเราก็เปลี่ยนมันเป็นชุด issues ที่ parallelizable 1048 01:34:39,414 --> 01:34:43,829 ซึ่งเอเจนต์ทำงานคู่ขนานกันได้ เราทำการ implement 1049 01:34:43,829 --> 01:34:49,255 และ QA และ code review อย่างเอาเป็นเอาตาย แล้วก็วนกลับไปที่ 1050 01:34:49,255 --> 01:34:54,864 implementation นั้นเรื่อยๆ มีสิ่งหนึ่งที่ผมไม่ได้พูดถึงมากนัก 1051 01:34:54,864 --> 01:34:59,187 คือในเฟส QA จุดประสงค์ของ QA คือการสร้าง issues 1052 01:34:59,187 --> 01:35:04,613 เพิ่มเติมให้ Kanban board นั้น ดังนั้นแม้ระหว่างที่มันกำลัง 1053 01:35:04,613 --> 01:35:09,303 implement คุณก็สามารถ QA ไปพร้อมกัน แล้วกลับไปเพิ่ม 1054 01:35:09,303 --> 01:35:16,476 issues ได้ และ Kanban board ให้คุณเพิ่ม issues แบบบล็อกได้แทบจะไม่มีที่สิ้นสุด 1055 01:35:16,476 --> 01:35:22,454 แล้วเมื่อทุกอย่างเสร็จ เมื่อคุณพอใจกับโค้ด เมื่อคุณพอใจกับงานแล้ว 1056 01:35:22,454 --> 01:35:26,776 คุณก็แชร์ให้ทีมและรับการ review อย่างเต็มรูปแบบ 1057 01:35:26,776 --> 01:35:33,581 นี่คือตอนที่คุณมาถึงตรงนี้ จะมีนักพัฒนาหนึ่งคนหรือสองสามคนคอยจัดการสิ่งนี้ 1058 01:35:33,581 --> 01:35:38,179 แล้วก็ขึ้นอยู่กับคุณว่าจะ merge มันกลับเข้าไปยังไง 1059 01:35:38,179 --> 01:35:43,053 >> [ถอนหายใจ] >> แน่นอนว่าทั้งหมดนี้คุณปรับแต่งได้หมด 1060 01:35:43,053 --> 01:35:49,583 นี่เป็นเพียงสิ่งที่ผมพบว่ามันเวิร์ค ผมไม่ได้พยายามขายแนวทางอะไรให้คุณนะ 1061 01:35:49,583 --> 01:35:55,009 สิ่งที่ผมแนะนำ ถ้าจะให้จำอะไรติดตัวไปจากเซสชันนี้หนึ่งอย่าง 1062 01:35:55,009 --> 01:35:59,331 คือกลับบ้านไป แล้วไปที่ Amazon ซื้อหนังสือเก่าๆ 1063 01:35:59,331 --> 01:36:04,389 พวกนั้นมากองหนึ่ง เพราะผมพบว่าการอ่านมันให้ข้อคิดมากมาย 1064 01:36:04,389 --> 01:36:08,987 งานเขียนยุคก่อน AI อ่านสนุกอยู่แล้ว และในทุกๆ หน้า 1065 01:36:08,987 --> 01:36:13,310 ผมพบว่ามีอะไรที่มีประโยชน์และน่าสนใจให้อ่านเสมอ 1066 01:36:13,310 --> 01:36:21,127 ขอบคุณมากๆ ขอบคุณที่ทนกับความร้อนนะ หวังว่าอุณหภูมิร่างกายของคุณจะกลับสู่ปกติในไม่ช้า 1067 01:36:21,127 --> 01:36:25,081 ขอบคุณมากครับ >> [เสียงปรบมือ] [เสียงดนตรี]