TERRA RPC

กำลังเตรียมกระดาน…

Agent Dev Thai Academyprinciples · patterns · architecture
หลักสูตร · Engineering practice ในงานจริง
0/6
Engineering practice ในงานจริง · ร้านเดียว ห้ากระดาน

ความพังไปได้ไกลแค่ไหน

SOLID กับ Clean Architecture สอนว่าความพังในโค้ดควรอยู่ในไฟล์เดียว บทนี้คือบทเรียนเดียวกันในระดับวิธีทำงาน AI ทำงานบน branch ไหน PR ใหญ่แค่ไหน อะไรตัดสินว่า merge ได้ commit ทิ้งอะไรไว้ให้ session ถัดไป และถ้าพังคืนนี้ ถอยด้วยคำสั่งอะไร

ร้านขายคอร์สออนไลน์ร้านเดิม ขายบนเว็บและ LINE คราวนี้แถวบนกระดานคือ main, branch, PR, CI และทางถอย กล่องยังเป็นไฟล์ ชิ้นคือสิ่งที่ AI เปลี่ยน ซ้ายคือวิธีทำงานที่คุณตั้งกติกาไว้ก่อน ขวาคือสิ่งที่ AI ทำเมื่อไม่มีใครกำหนด กดถัดไปแล้วนับว่าความพังไปถึงใครบ้าง บทจะถูกนับว่าเรียนจบเมื่อคุณไปถึงขั้นสุดท้ายของรูป

1
ตอนที่ 1 · ทำบน branch ส่งเป็น PRAI เพิ่มสั่งซื้อผ่าน LINE ลง main ตรง ๆ แล้วการแก้ฐานข้อมูลครั้งเดียวทำร้านล่มทั้งร้าน
เรื่องย่อ

ร้านอยากให้ลูกค้าสั่งคอร์สผ่าน LINE ได้ คุณสั่ง AI ให้ทำบอท LINE และเก็บ LINE id ของสมาชิก repo นี้ขึ้นร้านจริงทุกครั้งที่มีของเข้า main

บนฝั่งขวา AI push ลง main เอง งานของมันปนกับงานที่คุณแก้เองตั้งแต่ commit แรก วันที่การแก้ฐานข้อมูลของมันล้ม ร้านทั้งร้านล้มตาม และวันที่ต้องถอย ไม่มีเส้นไหนบอกว่าตรงไหนคืองานของ AI

ซ้าย AI เปิด branch ของตัวเองแล้วส่งงานเป็น PR #142 ส่วน main ที่ขึ้นร้านจริงทุกครั้งที่มีของเข้าไม่ถูกแตะ ขวา AI push ลง main เอง ไฟล์ของมันอยู่ข้างหน้าจ่ายเงินกับกฎคูปองที่ขายอยู่จริง คุณจะสั่งเพิ่มสั่งซื้อผ่าน LINE เพิ่มการแก้ฐานข้อมูล แล้วสั่งถอย ดูว่าความพังไปถึงไหนบ้าง

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
บอท LINEรับคำสั่งซื้อและตอบลูกค้าใน LINE ไฟล์ใหม่ของ AIซ้ายอยู่ใน branch ขวาอยู่บน main ตั้งแต่ push แรก
ตารางสมาชิก: เพิ่มช่อง LINEแก้ฐานข้อมูลให้สมาชิกทุกคนต้องมี LINE idสมาชิกเก่าไม่มีค่านี้ การแก้เลยล้ม
หน้าจ่ายเงินบนเว็บที่ลูกค้าจ่ายเงินไม่เกี่ยวกับ LINE แต่ล่มไปด้วยเมื่อแอปขึ้นไม่ได้
กฎคูปองงานอีกเรื่องที่คุณแก้เองเมื่อเช้าขวาอยู่บน main เดียวกับงานของ AI เลยโดนถอยไปด้วย
1
Branch and Pull Request · ทำบน branch ส่งเป็น PRคุณจะสั่ง AI ว่าอะไร
1
Branch and Pull Request · ทำบน branch ส่งเป็น PR
ตอนที่ 1 · สถานการณ์

ร้านอยากให้ลูกค้าสั่งคอร์สผ่าน LINE ได้ คุณสั่ง AI ให้ทำบอท LINE และเก็บ LINE id ของสมาชิก repo นี้ขึ้นร้านจริงทุกครั้งที่มีของเข้า main

AI เพิ่มสั่งซื้อผ่าน LINE ลง main ตรง ๆ แล้วการแก้ฐานข้อมูลครั้งเดียวทำร้านล่มทั้งร้าน

branch ของ AI · PR #142
AI push ลง main ตรง ๆ

แตะกล่องเพื่อหาไฟล์บนกระดาน

branch ของ AI · PR #142
AI push ลง main ตรง ๆ
branch ของ AI · PR #142
main · deploy ทุกครั้งที่ push
หน้าจ่ายเงินบนเว็บของเดิมลูกค้าจ่ายเงินที่นี่
ลูกค้ากดจ่ายเงิน
กฎคูปองงานอีกเรื่องคุณแก้เองเมื่อเช้า
คิดส่วนลดจากคูปอง
branch ของ AI · PR #142
AI push ลง main ตรง ๆ
main · deploy ทุกครั้งที่ push
หน้าจ่ายเงินบนเว็บของเดิมลูกค้าจ่ายเงินที่นี่
ลูกค้ากดจ่ายเงิน
กฎคูปองงานอีกเรื่องคุณแก้เองเมื่อเช้า
คิดส่วนลดจากคูปอง
branch ของ AI · PR #142
ไม่มี branch · AI push ลง main เอง
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากงานสามชิ้นของ AI ออกจาก main ไปไว้ใน branch ของมัน

กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย

เขียว: ที่ AI เพิ่มหรือแก้ประแดง: preview ไม่ผ่าน · ไม่ mergeแดง: พังบนร้านจริง

บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่

0 / 3
ก่อนเริ่มก่อนสั่งอะไร

ทั้งสองฝั่งคือร้านเดียวกัน หน้าจ่ายเงินบนเว็บกับกฎคูปองอยู่บน main และ main ขึ้นร้านจริงทุกครั้งที่มีของเข้า ซ้าย AI จะทำงานใน branch ของตัวเองแล้วส่งเป็น PR ขวา AI push ลง main ตรง ๆ

ขั้นที่ 1ให้ลูกค้าสั่งคอร์สผ่าน LINE

ซ้าย AI สร้างบอท LINE ใน branch แล้วเปิด PR #142 ได้ preview ของตัวเอง ทดสอบซ้ำ 2 ขวา AI สร้างไฟล์เดียวกันแล้ว push ลง main ร้านจริงได้ของใหม่ทันทีและใช้ได้ สองฝั่งยังดูเท่ากัน

ขั้นที่ 2เก็บ LINE id ของสมาชิก

ซ้าย AI เพิ่มการแก้ตารางสมาชิกใน branch สมาชิกเก่าไม่มี LINE id ทำให้ preview ของ PR ขึ้นไม่ได้ PR เลยไม่ถูก merge ส่วนกฎคูปองที่คุณแก้เมื่อเช้าเข้า main ผ่าน PR ของมันเอง ขวา การแก้ตารางเดียวกันรันกับฐานข้อมูลของร้านจริงตอน deploy แอปขึ้นไม่ได้ หน้าจ่ายเงินล่มทั้งร้าน และคูปองที่คุณแก้ก็ push ลง main เดียวกันนั้น

ขั้นสุดท้ายถอย LINE ออกก่อน ให้ร้านขายได้

ซ้าย ปิด PR #142 คำสั่งเดียว main ไม่ต้องแตะสักไฟล์ ขวา AI ย้อน main กลับไปก่อนมีบอทแล้ว push ทับ ต้องแตะ 3 ไฟล์ ทดสอบซ้ำ 4 และกฎคูปองที่คุณแก้ตอน 10:40 หายไปด้วย

หลักการ ในภาษาของโค้ด

ให้ AI ทำงานใน branch ของตัวเองเสมอ แล้วส่งเข้า main ผ่าน PR ถ้ามันพัง ความพังอยู่ใน branch เดียว diff เดียว และถอยได้ด้วยการปิด PR

ถามก่อนรับ diffdiff นี้มาเป็น PR จาก branch หรือ AI push ลง main ไปแล้ว

GitHub flow (GitHub Docs): anything in the default branch is deployable; create a branch, open a pull request, review, then merge; a branch keeps a change isolated until it is ready
2
ตอนที่ 2 · PR เล็ก รีวิวได้จริงขอแค่คูปอง LINE ได้ PR 40 ไฟล์ และเพดานลด 500 หายอยู่ในไฟล์ที่ 27
เรื่องย่อ

คุณสั่ง AI ทำคูปอง LINE10 ให้ลูกค้า LINE ระหว่างทางมันเปลี่ยนคำว่า member เป็น customer ทั้ง repo และแก้กฎส่วนลดให้สั้นลงด้วย ทั้งหมดรอคุณรีวิว

บนฝั่งขวา ทุกอย่างอยู่ใน PR เดียว 40 ไฟล์ บรรทัดที่ลบเพดานลด 500 อยู่ในไฟล์ที่ 27 ระหว่างไฟล์ที่แค่เปลี่ยนชื่อ คนรีวิวที่อ่านมาแล้ว 26 ไฟล์จะเห็นมันเป็นอีก diff หนึ่งที่หน้าตาเหมือนกัน

ทั้งสองฝั่ง AI ทำงานชุดเดียวกัน คูปอง LINE10 เปลี่ยนคำว่า member เป็น customer 36 ไฟล์ และทำกฎส่วนลดให้สั้นลง ซ้ายแยกเป็นสาม PR ตามเรื่อง ขวารวมเป็น PR #149 ก้อนเดียว 40 ไฟล์ คุณจะส่งรีวิว ขอแก้หนึ่งจุด แล้ว merge ดูว่าคนรีวิวเห็นอะไรทัน

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
กฎคูปองกฎของคูปอง LINE10ซ้ายอยู่ใน PR #150 กับ test ของมัน
test ของกฎคูปองเคสทดสอบของ LINE10ต้องแก้ตามเมื่อรีวิวขอแก้กฎ
…อีก 36 ไฟล์เปลี่ยนคำว่า member เป็น customerไม่มีตรรกะ รีวิวด้วยการค้นคำได้ ถ้าแยกออกมา
กฎส่วนลดAI ทำให้สั้นลงdiff บรรทัดเดียวที่เพดานลด 500 หาย
2
Small Pull Requests · PR เล็ก รีวิวได้จริงคุณจะสั่ง AI ว่าอะไร
2
Small Pull Requests · PR เล็ก รีวิวได้จริง
ตอนที่ 2 · สถานการณ์

คุณสั่ง AI ทำคูปอง LINE10 ให้ลูกค้า LINE ระหว่างทางมันเปลี่ยนคำว่า member เป็น customer ทั้ง repo และแก้กฎส่วนลดให้สั้นลงด้วย ทั้งหมดรอคุณรีวิว

ขอแค่คูปอง LINE ได้ PR 40 ไฟล์ และเพดานลด 500 หายอยู่ในไฟล์ที่ 27

สาม PR · PR ละเรื่อง
PR เดียว 40 ไฟล์ ทุกเรื่อง

แตะกล่องเพื่อหาไฟล์บนกระดาน

สาม PR · PR ละเรื่อง
PR เดียว 40 ไฟล์ ทุกเรื่อง
สาม PR · PR ละเรื่อง
PR #150 · คูปอง LINE
บอท LINELINE ตอบยอดหลังคูปอง
ตอบยอดหลังหักคูปองใน LINE
กฎคูปองกฎคูปอง LINE10
กฎคูปอง LINE10
test ของกฎคูปองtest ของคูปอง
เคสทดสอบของ LINE10
PR #151 · เปลี่ยนชื่ออย่างเดียว
…36 ไฟล์เปลี่ยนชื่ออย่างเดียวไม่มี logic
เปลี่ยนคำว่า member เป็น customer ทั้ง repo
PR #152 · กฎส่วนลด
กฎส่วนลดAI ทำให้สั้นลง
คิดราคาหลังส่วนลด
PR เดียว 40 ไฟล์ ทุกเรื่อง
PR #149 · 40 ไฟล์ ทุกเรื่อง
บอท LINELINE ตอบยอดหลังคูปอง
ตอบยอดหลังหักคูปองใน LINE
กฎคูปองกฎคูปอง LINE10
กฎคูปอง LINE10
test ของกฎคูปองtest ของคูปอง
เคสทดสอบของ LINE10
…อีก 36 ไฟล์เปลี่ยนชื่อ ปนมากับคูปอง
เปลี่ยนคำว่า member เป็น customer ทั้ง repo
กฎส่วนลดไฟล์ที่ 27 จาก 40
คิดราคาหลังส่วนลด
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากการเปลี่ยนชื่อกับกฎส่วนลด ออกจาก PR #149 ไปเป็น PR ของตัวเอง

กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย

เขียว: ที่ AI แก้ประ: คนรีวิวต้องอ่านซ้ำ · ประแดง: ไม่ mergeแดง: หลุดไป production

บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่

0 / 3
ก่อนเริ่มก่อนสั่งอะไร

ซ้าย งานแยกเป็น PR #150 คูปอง 3 ไฟล์ PR #151 เปลี่ยนชื่อ 36 ไฟล์ และ PR #152 กฎส่วนลด 1 ไฟล์ ขวา งานชุดเดียวกันอยู่ใน PR #149 ก้อนเดียว 40 ไฟล์

ขั้นที่ 1AI ส่งคูปอง LINE10 ให้รีวิว

ซ้าย AI แก้บอท LINE กฎคูปอง test ของคูปอง เปลี่ยนชื่อ 36 ไฟล์ และแก้กฎส่วนลด แยกเป็นสาม PR ขวา แก้ชุดเดียวกันใน PR #149 ทั้งสองฝั่งทดสอบซ้ำ 5เท่ากัน ยังไม่มีอะไรพัง

ขั้นที่ 2รีวิวขอแก้: LINE10 ห้ามซ้อนกับส่วนลด Gold

ซ้าย AI แก้กฎคูปองกับ test ของมันใน PR #150 คนรีวิวอ่านซ้ำแค่ 2 ไฟล์ ขวา AI แก้สองที่เดียวกัน แล้ว rebase กับ push ทับ PR #149 คนรีวิวต้องอ่าน 40 ไฟล์ใหม่ทั้งก้อน ทดสอบซ้ำ 5

ขั้นสุดท้ายmerge แล้วปล่อยขึ้นระบบ

ซ้าย PR #152 มี diff บรรทัดเดียว คนรีวิวเห็นว่าเพดานลด 500 หาย เลยไม่ merge ขวา คนรีวิว approve PR #149 รอบสอง บรรทัดที่ลบเพดานอยู่ในไฟล์ที่ 27 กฎส่วนลดขึ้นระบบไปแบบนั้น Gold ซื้อ 15,000 ได้ลด 1,500

หลักการ ในภาษาของโค้ด

PR หนึ่งใบ เรื่องเดียว และเล็กพอที่คนรีวิวอ่านจบในรอบเดียว diff ที่ใหญ่เกินอ่าน คือ diff ที่ไม่มีใครรีวิวจริง

ถามก่อนรับ diffPR นี้ทำกี่เรื่อง และมีไฟล์ไหนที่ไม่เกี่ยวกับคำสั่งที่ให้ AI ไป

Small CLs (Google Engineering Practices): small changes are reviewed more quickly and more thoroughly, are less likely to introduce bugs, and are easier to roll back
3
ตอนที่ 3 · CI คือด่านที่ AI เถียงไม่ได้AI บอกว่า test ผ่านหมด แต่ร้านส่งยอดไป 2C2P เกิน 100 เท่า
เรื่องย่อ

ร้านจะเพิ่ม 2C2P เป็นช่องทางจ่ายเงินข้าง Omise แล้วเพิ่มการคืนเงิน จากนั้นแก้กฎไม่ให้ส่วนลด Gold ซ้อนกับคอร์สที่ลดราคาอยู่แล้ว ทุกงานจบด้วย AI บอกว่า test ผ่าน

AI ไม่ได้โกหก มันรัน test ที่มันเลือกรัน บางตัวมันเขียนเองตามโค้ดของตัวเอง บางตัวมันสั่งข้ามไปเฉย ๆ บนฝั่งขวา คำว่าผ่านในแชทคือด่านเดียวก่อนถึงเงินของลูกค้า

ซ้าย ทุก PR ต้องผ่านด่านอัตโนมัติสี่ด่านก่อน merge คือ lint ตรวจชนิดข้อมูล ตรวจทิศทางการพึ่งพา และตรวจสัญญากับระบบจ่ายเงิน ขวา ไม่มี CI สิ่งเดียวที่บอกว่าผ่านคือข้อความของ AI ในแชท คุณจะสั่งเพิ่ม 2C2P เพิ่มการคืนเงิน แล้วแก้กฎส่วนลด ดูว่าอะไรจับความผิดได้

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
CI · ด่านที่รันเองทุก PRสี่ด่านที่เครื่องรันเองทุก PRแดงแล้ว merge ไม่ได้ AI เถียงไม่ได้
ช่องทางจ่ายเงิน 2C2Pส่งยอดไป 2C2P2C2P รับเป็นบาท ส่วน Omise รับเป็นสตางค์
เคสทดสอบของกฎส่วนลดเคสของกฎส่วนลด รวมเพดานลด 500AI สั่งข้ามเคสที่แดงได้ ถ้าไม่มีอะไรห้าม
แชทกับ AIที่ที่ AI บอกว่าผ่านเป็นคำพูด ไม่ใช่ผลรัน
3
CI as the Fence · CI คือด่านที่ AI เถียงไม่ได้คุณจะสั่ง AI ว่าอะไร
3
CI as the Fence · CI คือด่านที่ AI เถียงไม่ได้
ตอนที่ 3 · สถานการณ์

ร้านจะเพิ่ม 2C2P เป็นช่องทางจ่ายเงินข้าง Omise แล้วเพิ่มการคืนเงิน จากนั้นแก้กฎไม่ให้ส่วนลด Gold ซ้อนกับคอร์สที่ลดราคาอยู่แล้ว ทุกงานจบด้วย AI บอกว่า test ผ่าน

AI บอกว่า test ผ่านหมด แต่ร้านส่งยอดไป 2C2P เกิน 100 เท่า

CI ต้องเขียวก่อน merge
เชื่อคำว่าผ่านในแชท

แตะกล่องเพื่อหาไฟล์บนกระดาน

CI ต้องเขียวก่อน merge
เชื่อคำว่าผ่านในแชท
CI ต้องเขียวก่อน merge
โค้ดที่ AI แก้
กฎส่วนลดที่ตัดสินว่าลดเท่าไร
คิดราคาหลังส่วนลด
เคสทดสอบของกฎส่วนลดที่จับได้ถ้ากฎเปลี่ยน
เคส: ลดไม่เกิน 500เคส: Gold ลด 10%
CI · ต้องเขียวก่อน merge
CI · ด่านที่รันเองทุก PRรันทุก PRแดงแล้ว merge ไม่ได้
ตรวจรูปแบบโค้ด (lint)ตรวจชนิดข้อมูลตรวจทิศทางการพึ่งพาตรวจสัญญากับระบบจ่ายเงิน
แชทกับ AI
คำว่าผ่านในแชท ไม่ใช่เงื่อนไขของ merge
เชื่อคำว่าผ่านในแชท
โค้ดที่ AI แก้
กฎส่วนลดที่ตัดสินว่าลดเท่าไร
คิดราคาหลังส่วนลด
เคสทดสอบของกฎส่วนลดที่จับได้ถ้ากฎเปลี่ยน
เคส: ลดไม่เกิน 500เคส: Gold ลด 10%
CI · ต้องเขียวก่อน merge
ไม่มี CI · merge ได้ทุกอย่าง
แชทกับ AI
แชทกับ AIด่านเดียวก่อน merge
test ทั้งชุดผ่านสัญญากับระบบจ่ายเงินตรงlint ผ่าน
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากคำว่าผ่านสามข้อของ AI ไปไว้ใน CI ให้เครื่องเช็กแทน

กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย

เขียว: ที่ AI แก้ประ: CI รันซ้ำให้ · ประแดง: CI แดง ไม่ mergeแดง: หลุดไป production

บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่

0 / 3
ก่อนเริ่มก่อนสั่งอะไร

ซ้าย มีกฎส่วนลดกับเคสทดสอบของมัน และ CI ที่รัน lint ตรวจชนิดข้อมูล ตรวจทิศทางการพึ่งพา และตรวจสัญญากับระบบจ่ายเงิน ทุก PR ขวา โค้ดชุดเดียวกัน แต่ไม่มี CI สิ่งที่ใช้ตัดสินว่า merge ได้คือแชทกับ AI

ขั้นที่ 1เพิ่ม 2C2P เป็นช่องทางจ่ายเงิน

ซ้าย AI เพิ่มช่องทาง 2C2P CI รันสี่ด่านให้ ทดสอบซ้ำ 5 ผ่านใน 3 นาที ขวา AI เพิ่มไฟล์เดียวกันแล้วบอกว่า test ผ่าน ทดสอบซ้ำแค่ 1 และใช้ได้จริง ตอนนี้ขวาดูเร็วกว่า

ขั้นที่ 2เพิ่มการคืนเงินผ่าน 2C2P

ซ้าย AI เพิ่มการคืนเงิน แล้วยกวิธีคิดยอดจาก Omise มาใส่การส่งยอด ด่านตรวจสัญญาไม่ผ่าน เพราะ 1,990 บาทถูกส่งเป็น 199000.00 PR เลย merge ไม่ได้ ขวา AI บอกว่า test ของ 2C2P ผ่าน 4/4 ซึ่งเป็น test ที่มันเขียนตามโค้ดตัวเอง การส่งยอดขึ้นระบบไปแบบนั้น ร้านส่งยอด 199,000 บาทไป 2C2P แทน 1,990

ขั้นสุดท้ายไม่ให้ส่วนลด Gold ซ้อนกับคอร์สลดราคา

ซ้าย AI แก้กฎส่วนลด แล้วเคส ลดไม่เกิน 500 แดง มันเลยสั่งข้ามเคสนั้น แต่ lint ไม่ยอม PR merge ไม่ได้ ขวา AI ทำแบบเดียวกันแล้วบอกว่าผ่านหมด 11 passed 1 skipped กฎส่วนลดขึ้นระบบโดยไม่มีเพดาน 500 Gold ซื้อ 15,000 ได้ลด 1,500

หลักการ ในภาษาของโค้ด

คำว่า test ผ่านจาก AI เป็นแค่คำพูด ให้ CI รัน lint, test และกฎทิศทางการพึ่งพาทุก PR แล้วตั้งให้ merge ไม่ได้จนกว่าจะเขียว AI เถียงกับคนได้ แต่เถียงกับ CI ไม่ได้

ถามก่อนรับ diffdiff นี้ผ่าน CI แล้ว หรือมีแค่คำว่าผ่านในแชท และมี test ไหนถูกข้าม หรือถูกเขียนให้ตรงกับโค้ดใหม่

Continuous Integration (Fowler 2006; Humble & Farley, Continuous Delivery 2010): every change is verified by an automated build and test run before it joins the mainline; a red build stops the line
4
ตอนที่ 4 · commit message คือ contextAI session ใหม่เปิดประวัติไฟล์ เจอแค่คำว่า update เลยลบเงื่อนไขที่กันขาดทุนทิ้ง
เรื่องย่อ

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

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

ทั้งสองฝั่งมีโค้ดชุดเดียวกัน ต่างกันแค่ข้อความที่ commit และ PR ทิ้งไว้ ซ้าย ประวัติของกฎส่วนลดชี้ไป #147 และ PR #152 มี checklist ขวา ประวัติบอกแค่ update, fix, wip เหตุผลอยู่ในแชทที่ปิดไปแล้ว คุณจะเปิด session ใหม่สามรอบ

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
กฎส่วนลดมีเงื่อนไขไม่ลดซ้อนคอร์สที่ลดอยู่แล้วซ้าย ประวัติบอกว่าเงื่อนไขนี้กันขาดทุน
คำอธิบายใน PR #152checklist ของงานที่ค้างsession ใหม่รู้ว่าต้องเริ่มตรงไหน
กฎคูปองกฎของคูปอง LINE10ไม่ซ้อนคอร์สลดราคาโดยตั้งใจ
แชท session เมื่อวานที่ที่เหตุผลอยู่บนฝั่งขวาปิดไปแล้ว AI ตัวใหม่อ่านไม่ได้
4
Commits as Context · commit message คือ contextคุณจะสั่ง AI ว่าอะไร
4
Commits as Context · commit message คือ context
ตอนที่ 4 · สถานการณ์

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

AI session ใหม่เปิดประวัติไฟล์ เจอแค่คำว่า update เลยลบเงื่อนไขที่กันขาดทุนทิ้ง

commit กับ PR บอกเหตุผล
commit ว่า update, fix, wip

แตะกล่องเพื่อหาไฟล์บนกระดาน

commit กับ PR บอกเหตุผล
commit ว่า update, fix, wip
commit กับ PR บอกเหตุผล
โค้ด · ประวัติการแก้บอกอะไร
กฎส่วนลดfix(pricing): Gold ไม่ซ้อนคอร์สลดราคา #147
คิดราคาหลังส่วนลดเงื่อนไข: ไม่ลดซ้อนคอร์สที่ลดอยู่แล้ว
กฎคูปองfeat(coupon): LINE10 ไม่ซ้อนคอร์สลดราคา #152
คิดส่วนลดจากคูปอง
บอท LINEfeat(line): สั่งซื้อผ่าน LINE #142
ตอบยอดกลับใน LINE
PR ที่ค้างจากเมื่อวาน
คำอธิบายใน PR #152เขียนไว้ให้ session ถัดไป
✓ ทำแล้ว: LINE10 ไม่ซ้อนคอร์สลดราคา☐ ยังค้าง: บอท LINE ตอบยอดหลังหักคูปอง
แชทที่ปิดไปแล้ว
ไม่มีอะไรค้างในแชท · เหตุผลอยู่ใน commit กับ PR
commit ว่า update, fix, wip
โค้ด · ประวัติการแก้บอกอะไร
กฎส่วนลดupdate
คิดราคาหลังส่วนลดเงื่อนไข: ไม่ลดซ้อนคอร์สที่ลดอยู่แล้ว
กฎคูปองwip
คิดส่วนลดจากคูปอง
บอท LINEfix
ตอบยอดกลับใน LINE
PR ที่ค้างจากเมื่อวาน
คำอธิบายใน PR #152ว่าง
เขียนไว้แค่ wip
แชทที่ปิดไปแล้ว
แชท session เมื่อวานปิดไปแล้วAI ตัวใหม่อ่านไม่ได้
ทำไมต้องมีเงื่อนไขไม่ลดซ้อนLINE10 ทำถึงไหนแล้ว
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากเหตุผลสองข้อจากแชทที่ปิดแล้ว ไปไว้ในไฟล์กับ PR ที่มันอธิบาย

กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย

เขียว: ที่ session ใหม่แก้ประ: เปิดอ่านเพื่อเดาเหตุผลแดง: ลบหรือแก้สิ่งที่ร้านตั้งใจไว้

บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่

0 / 3
ก่อนเริ่มก่อนสั่งอะไร

ซ้าย ทุกไฟล์มี commit ที่บอกว่าทำอะไรและทำไม เช่น กฎส่วนลดมาจาก #147 และ PR #152 มี checklist ขวา ไฟล์ชุดเดียวกัน แต่ commit เขียนว่า update, fix, wip เหตุผลอยู่ในแชท session เมื่อวานที่ปิดไปแล้ว

ขั้นที่ 1session ใหม่: ทำ LINE10 ต่อจากเมื่อวาน

ซ้าย AI อ่าน checklist ใน PR #152 แล้วแก้แค่การตอบยอดในบอท LINE กับติ๊กข้อที่ค้าง ทดสอบซ้ำ 3 ขวา PR ไม่มีคำอธิบาย AI เปิดกฎส่วนลดเพื่อเดาว่าทำถึงไหน แล้วเขียนกฎคูปองใหม่ทั้งที่เสร็จแล้ว ทดสอบซ้ำ 4 ยังไม่พัง

ขั้นที่ 2session ใหม่: ทำกฎส่วนลดให้อ่านง่ายขึ้น

ซ้าย AI อ่าน #147 จากประวัติ รู้ว่าเงื่อนไขไม่ลดซ้อนกันขาดทุนอยู่ เลยแก้โดยเก็บเงื่อนไขไว้ ขวา ประวัติบอกแค่ update AI เห็นว่าเงื่อนไขนี้ดูเกิน เลยลบทิ้ง Gold ได้ลดซ้อนกับคอร์สลดราคาอีกครั้ง

ขั้นสุดท้ายsession ใหม่: ทำไมลูกค้าบางคนใช้ LINE10 ไม่ได้

ซ้าย AI ค้นประวัติด้วยคำว่า LINE10 เจอว่า LINE10 ไม่ซ้อนคอร์สลดราคาโดยตั้งใจ ตอบได้โดยไม่แก้สักไฟล์ ขวา commit เขียนแค่ wip AI ตัดสินว่าเป็นบั๊ก แล้วแก้กฎคูปองให้ซ้อนได้ ทดสอบซ้ำ 2 กฎคูปองขึ้นระบบแบบที่ร้านไม่ได้ตั้งใจ

หลักการ ในภาษาของโค้ด

เขียน commit กับ PR ให้ AI ตัวถัดไปอ่าน บอกว่าทำอะไร ทำไม และอะไรยังค้าง AI ตัวใหม่จำแชทเมื่อวานไม่ได้ มันอ่านได้แค่ repo

ถามก่อนรับ diffcommit message ของ diff นี้บอกไหมว่าทำไม ถ้าพรุ่งนี้ AI ตัวใหม่เปิดประวัติไฟล์ มันจะรู้ไหมว่าห้ามลบอะไร

How to Write a Git Commit Message (Beams 2014): use the body to explain what and why, not how; Conventional Commits 1.0.0: a structured subject (type(scope): description) that tools and people can read
5
ตอนที่ 5 · ถอยได้ในคำสั่งเดียวออเดอร์ LINE ค้างตอนห้าทุ่ม ไม่มีทางถอย AI เลยแก้สดถึงตีสอง
เรื่องย่อ

คืนวันศุกร์ ร้านปล่อยการจ่ายเงินผ่าน LINE แบบใหม่ขึ้นระบบ 23:40 ออเดอร์จาก LINE เริ่มค้าง คุณต้องหยุดของใหม่ก่อน แล้วค่อยถอยโค้ดกับฐานข้อมูลออก

บนฝั่งขวา ไม่มีคำสั่งไหนถอยได้ในครั้งเดียว AI แก้สดบน main ตอนตีหนึ่ง revert 14 commit ที่ปนกับงานแก้ด่วน และเขียนทางถอยของฐานข้อมูลเองตอนตีสอง ทุกขั้นคือโค้ดใหม่ที่ไม่มีใครรีวิว ในตอนที่คุณง่วงที่สุด

ทั้งสองฝั่งปล่อยการจ่ายเงินผ่าน LINE แบบใหม่จาก PR #160 ขึ้นระบบคืนวันศุกร์ ซ้ายเตรียมทางถอยไว้ก่อนปล่อย มีสวิตช์ปิดของใหม่ได้ PR ถูกรวมเป็น commit เดียว และการแก้ฐานข้อมูลมีทางถอย ขวาไม่มีทางถอย และการแก้ฐานข้อมูลลบช่องเก่าทิ้งไปด้วย คุณจะถอยสามชั้น สวิตช์ โค้ด และฐานข้อมูล

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
สวิตช์เปิดปิดของใหม่ปิดการจ่ายเงินผ่าน LINE แบบใหม่ได้ทันทีไม่ต้อง deploy
สร้างออเดอร์ตัวสร้างออเดอร์ที่เว็บกับ LINE ใช้ร่วมกันซ้ายถอยด้วย revert commit เดียว
ตารางออเดอร์: เพิ่มช่องทางขายเพิ่มช่องใหม่ในตารางออเดอร์ซ้ายมีทางถอย และไม่ลบช่องเก่าในรอบเดียวกัน
หน้าจ่ายเงินบนเว็บที่ลูกค้าเว็บจ่ายเงินใช้ตัวสร้างออเดอร์ตัวเดียวกัน พังตามเมื่อถอยผิด
5
One-Command Rollback · ถอยได้ในคำสั่งเดียวคุณจะสั่ง AI ว่าอะไร
5
One-Command Rollback · ถอยได้ในคำสั่งเดียว
ตอนที่ 5 · สถานการณ์

คืนวันศุกร์ ร้านปล่อยการจ่ายเงินผ่าน LINE แบบใหม่ขึ้นระบบ 23:40 ออเดอร์จาก LINE เริ่มค้าง คุณต้องหยุดของใหม่ก่อน แล้วค่อยถอยโค้ดกับฐานข้อมูลออก

ออเดอร์ LINE ค้างตอนห้าทุ่ม ไม่มีทางถอย AI เลยแก้สดถึงตีสอง

สวิตช์ · revert · ทางถอยของฐานข้อมูล เตรียมไว้
ไม่มีทางถอย · แก้สดตอนตีหนึ่ง

แตะกล่องเพื่อหาไฟล์บนกระดาน

สวิตช์ · revert · ทางถอยของฐานข้อมูล เตรียมไว้
ไม่มีทางถอย · แก้สดตอนตีหนึ่ง
สวิตช์ · revert · ทางถอยของฐานข้อมูล เตรียมไว้
PR #160 · จ่ายเงินผ่าน LINE แบบใหม่
จ่ายเงินผ่าน LINE แบบใหม่อยู่หลังสวิตช์
จ่ายเงินผ่าน LINE แบบใหม่
สร้างออเดอร์รวมเป็น commit เดียว
สร้างออเดอร์ (เว็บกับ LINE ใช้ร่วมกัน)
ตารางออเดอร์: เพิ่มช่องทางขายมีทางถอยไม่ลบช่องเก่า
ทางไป: เพิ่มช่องทางขายทางถอย: เอาช่องทางขายออก
ของเดิมที่ใช้ร่วมกัน
หน้าจ่ายเงินบนเว็บของเว็บใช้ตัวสร้างออเดอร์ตัวเดียวกัน
ลูกค้ากดจ่ายเงินบนเว็บ
ทางถอย · เตรียมก่อนปล่อย
สวิตช์เปิดปิดของใหม่สวิตช์ของใหม่ไม่ต้อง deploy
สวิตช์ของ LINE แบบใหม่
ไม่มีทางถอย · แก้สดตอนตีหนึ่ง
PR #160 · จ่ายเงินผ่าน LINE แบบใหม่
จ่ายเงินผ่าน LINE แบบใหม่เปิดให้ทุกคนทันที
จ่ายเงินผ่าน LINE แบบใหม่
สร้างออเดอร์14 commit ปนกับงานอื่น
สร้างออเดอร์ (เว็บกับ LINE ใช้ร่วมกัน)
ตารางออเดอร์: เพิ่มช่องทางขายลบช่องเก่าทิ้งไม่มีทางถอย
ทางไป: เพิ่มช่องทางขายทางไป: ลบช่องเก่าทิ้งเลย
ของเดิมที่ใช้ร่วมกัน
หน้าจ่ายเงินบนเว็บของเว็บใช้ตัวสร้างออเดอร์ตัวเดียวกัน
ลูกค้ากดจ่ายเงินบนเว็บ
ทางถอย · เตรียมก่อนปล่อย
ไม่มีสวิตช์ · การแก้ฐานข้อมูลไม่มีทางถอย
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากการลบช่องเก่าออกจากการแก้ฐานข้อมูลรอบนี้ ไปเป็นรอบแยก ที่ปล่อยทีหลัง

กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย

เขียว: ที่แก้ตอนถอยประ: ไฟล์ที่ต้องแก้ตามแดง: พังหรือข้อมูลหาย

บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่

0 / 3
ก่อนเริ่มก่อนสั่งอะไร

ซ้าย PR #160 ถูกรวมเป็น commit เดียว ของใหม่อยู่หลังสวิตช์ และการแก้ฐานข้อมูลมีทั้งทางไปและทางถอย ขวา PR เดียวกัน merge เป็น 14 commit ไม่มีสวิตช์ และการแก้ฐานข้อมูลมีแต่ทางไป ที่ลบช่องเก่าทิ้งด้วย

ขั้นที่ 123:40 ออเดอร์ LINE ค้าง หยุดของใหม่ก่อน

ซ้าย ปิดสวิตช์คำสั่งเดียว ลูกค้ากลับไปใช้แบบเดิม ทดสอบซ้ำ 1 ขวา ไม่มีสวิตช์ AI แก้การจ่ายเงินแบบใหม่กับตัวสร้างออเดอร์สดบน main ตอนตีหนึ่ง ทดสอบซ้ำ 2 ออเดอร์เดินได้อีกครั้ง

ขั้นที่ 2ถอยโค้ดของ PR #160 ออกทั้งก้อน

ซ้าย revert commit เดียวของ PR #160 แตะ 2 ไฟล์ CI ผ่าน ขวา AI revert 14 commit ทีละตัว ชนกับงานแก้ด่วนเมื่อตีหนึ่ง แล้วแก้ที่ชนเอง ตัวสร้างออเดอร์ถูกเรียกสองรอบ ออเดอร์เว็บถูกสร้างซ้ำ

ขั้นสุดท้ายถอยการแก้ฐานข้อมูลกลับ

ซ้าย รันทางถอยที่เตรียมไว้คำสั่งเดียว ช่องเก่าไม่เคยหาย ทดสอบซ้ำ 2 ขวา ไม่มีทางถอย AI เขียนเองตอนตีสอง ช่องเก่ากลับมา แต่ว่างทั้ง 3,214 แถว เพราะข้อมูลหายไปตั้งแต่ตอนลบ

หลักการ ในภาษาของโค้ด

ก่อนปล่อยของใหม่ ให้มีทางถอยที่เป็นคำสั่งเดียว ปิดสวิตช์ revert commit เดียว รันทางถอยของฐานข้อมูล ถ้าการถอยต้องเขียนโค้ดใหม่ตอนตีสอง นั่นไม่ใช่การถอย มันคือการปล่อยของใหม่อีกรอบโดยไม่มีใครรีวิว

ถามก่อนรับ diffถ้า diff นี้พังคืนนี้ ถอยด้วยคำสั่งอะไร และมีอะไรใน diff ที่ถอยแล้วข้อมูลไม่กลับมา

Continuous Delivery (Humble & Farley 2010): rolling back must be a one-step, rehearsed operation; Feature Toggles (Hodgson, martinfowler.com 2017); Parallel Change / expand–contract (Sato, martinfowler.com 2014)
ครบห้ากระดานแล้ว? ทายก่อนกด mergeแบบทดสอบสิบข้อ ทุกข้อคือสถานการณ์ใน repo ที่ AI กำลังทำงาน
ทำแบบทดสอบ →

ห้าข้อคือรั้วเดียวกัน วางคนละจุด

branch กั้นความพังไว้ใน diff เดียว (1) PR เล็กทำให้คนรีวิวอ่าน diff นั้นได้จริง (2) CI ตัดสินว่า merge ได้ไหม แทนคำพูดของ AI (3) commit กับ PR เก็บเหตุผลไว้ให้ AI ตัวถัดไป (4) และทางถอยที่เป็นคำสั่งเดียว ทำให้ความพังที่หลุดไปแล้วอยู่ได้ไม่นาน (5) AI เขียนโค้ดเร็วขึ้นทุกเดือน ความพังจากโค้ดที่เร็วขึ้นก็ไปได้ไกลขึ้นด้วย ห้าข้อนี้กำหนดว่ามันไปได้ไกลแค่ไหน

ห้ากระดานบนร้านคอร์สออนไลน์ร้านเดียว: สั่งซื้อผ่าน LINE · คูปอง LINE10 · 2C2P · กฎส่วนลด Gold · จ่ายเงินผ่าน LINE แบบใหม่ · โค้ดเป็น TypeScriptคีย์บนกระดาน: Enter / คลิก = ขั้นถัดไป · ⌫ = รีเซ็ต