ก่อนปิดบท
ทายก่อนรันโค้ด
ทุกข้อคือคำขอที่กำลังจะส่งให้ agent คุณต้องบอกว่าควรใช้แพทเทิร์นไหน หรือฝั่งไหนจะเจ็บ
ข้อ 1 / 16ส่วนลด Gold คูปอง ซื้อ 3 คอร์ส และ early-bird เขียนเป็น
ส่วนลด Gold คูปอง ซื้อ 3 คอร์ส และ early-bird เขียนเป็น if / else if ในหน้า checkout แล้ว bot/line.ts ก๊อปชุดเดียวกันไป ฝ่ายการตลาดขอ “กรอกโค้ดเมื่อไร ให้คูปองชนะ” อะไรน่ากลัวที่สุด?
1 · Strategy
else if หยุดที่ตัวแรกที่เข้าเงื่อนไข ลำดับบรรทัดเลยกลายเป็นกติกาที่ไม่มีใครเขียนไว้ ถ้าแต่ละแคมเปญเป็นไฟล์ที่ทำตาม Discount และ bestDiscount เป็นที่เดียวที่เลือก งานนี้คือแก้ฟังก์ชันเดียว ดูบนกระดาน 1 · Strategy →ข้อ 2 / 16diff ใน
diff ใน bot/line.ts: + else if (isEarlyBird(cart)) discount = total * 0.15; ต่อท้ายหลัง if (member.tier === "gold") สมาชิก Gold ซื้อคอร์สเปิดใหม่ 15,000 บาทผ่าน LINE จะได้ลดเท่าไร?
1 · Strategy ในเว็บ agent ใส่ early-bird ไว้บนสุด แต่ใน LINE ต่อท้าย ตะกร้าเดียวกันเลยลดไม่เท่ากัน diff แต่ละไฟล์ดูถูก เพราะไม่มีที่ไหนเขียนว่า “เลือกอันที่ลดมากสุด” ไว้เป็นโค้ด ดูบนกระดาน 1 · Strategy →
ข้อ 3 / 16
pay() ตัดเงิน แล้ว await ส่งใบเสร็จ ส่ง LINE และเปิดสิทธิ์เข้าเรียนต่อกันทีละบรรทัด วันหนึ่ง LINE ตอบ 400 เพราะ Flex message ผิดรูป ลูกค้าเจออะไร?
2 · Observer ปฏิกิริยาทุกตัวอยู่ในฟังก์ชันเดียวกับการจ่ายเงิน ตัวไหน throw บรรทัดที่อยู่ถัดไปก็ไม่ถูกเรียก ถ้า
pay แค่ emit("order.paid") แล้วแต่ละตัวลงชื่อรอเอง LINE พังก็พังแค่ข้อความ LINE และ log บอกชื่อ ดูบนกระดาน 2 · Observer →ข้อ 4 / 16agent ส่ง diff มาเพิ่ม
agent ส่ง diff มาเพิ่ม posthog.capture(…); await posthog.flush(); ไว้ท้าย pay() ควรถามอะไรก่อนรับ?
2 · Observer บนกระดาน flush ใช้ 2-4 วินาที
pay เลยใช้ 9 วินาที หน้า checkout หมดเวลาที่ 8 วินาที ลูกค้ากดจ่ายซ้ำ แล้วถูกตัดเงินสองครั้ง analytics ไม่ใช่ส่วนหนึ่งของการจ่ายเงิน มันคือคนที่รอฟังว่าจ่ายแล้ว ดูบนกระดาน 2 · Observer →ข้อ 5 / 16ย้ายวิดีโอจาก Vimeo ไป Bunny agent แก้หน้าเรียนกับหน้าอัปโหลดครบ แต่
ย้ายวิดีโอจาก Vimeo ไป Bunny agent แก้หน้าเรียนกับหน้าอัปโหลดครบ แต่ app/api/progress/route.ts เริ่มบันทึก NaN ทั้งที่ไม่มีใครแตะไฟล์นั้น เพราะอะไร?
3 · Adapter หน้าเรียนส่ง event ดิบของ vendor ไปตรง ๆ ไฟล์ที่อ่าน
percent ไม่มีคำว่า Vimeo สักคำ เลยไม่ถูกเปิดตอนย้าย ถ้าตัวแปลงคืน watched 0 ถึง 1 เสมอ ความต่างของ vendor อยู่ในไฟล์เดียว ดูบนกระดาน 3 · Adapter →ข้อ 6 / 16diff ไฟล์ใหม่
diff ไฟล์ใหม่ app/courses/[slug]/preview.tsx: const v = await vimeo.request({ path: `/videos/${id}` }); <VideoFrame src={v.player_embed_url} /> ในโปรเจกต์ที่มี VideoHost อยู่แล้ว ควรขอให้แก้อะไร?
3 · Adapter ทุกไฟล์ที่ถือ field ของ vendor เองคือไฟล์ที่ต้องตามหาตอนย้าย บนกระดาน หน้าคลิปตัวอย่างที่ก๊อปมาแบบนี้ไม่มีใครเจอ จนยกเลิกบัญชี Vimeo แล้วคลิปขึ้นจอดำ ดูบนกระดาน 3 · Adapter →
ข้อ 7 / 16
ทีมขอ “ให้ลองใหม่ 3 ครั้งตอนอ่านคอร์สจาก DB พลาด” agent ก๊อป for-loop กับ try/catch ไปใส่ในหน้าคอร์ส LINE bot และหน้า checkout เกิดอะไรกับหน้า checkout ได้?
4 · Decorator retry ที่เขียนใหม่ในทุกไฟล์ที่เรียก ห่อไม่เหมือนกันสักชุด ตัวห่อ
retry(repo) ที่มีรูปเดียวกับ CourseRepo ห่อได้แค่การอ่าน และถูกต่อที่ main.ts ที่เดียว ดูบนกระดาน 4 · Decorator →ข้อ 8 / 16ใน
ใน main.ts มีบรรทัด const courses = retry(logged(prismaCourses(db))); ข้อไหนอธิบายถูก?
4 · Decorator ตัวห่อมีรูปเดียวกับของที่มันห่อ คนเรียกเลยไม่รู้ว่ามีกี่ชั้น เพิ่ม cache ก็คือเขียน
cached อีกไฟล์ แล้วต่ออีกชั้นใน main.ts และเลือกได้ว่า checkout ไม่ต้องอ่านผ่าน cache ดูบนกระดาน 4 · Decorator →ข้อ 9 / 16
ใบเสร็จออกได้สามทาง หน้าดาวน์โหลด อีเมล และ LINE bot ทุกไฟล์มี taxId ? new TaxInvoicePdf : new ReceiptPdf ของตัวเอง ฝ่ายบัญชีขอให้บริษัทได้ e-Tax Invoice แทน agent ค้นคำว่า taxId แล้วแก้สองไฟล์ คุณควรสงสัยอะไร?
5 · Factory Method บนกระดาน
bot/line.ts เช็ก order.company แทน taxId เลยหลุดจากผลค้น บริษัทที่ซื้อผ่าน LINE ยังได้ PDF เดิม ถ้าการเลือก class อยู่ใน makeReceipt(order) ที่เดียว ก็ไม่มีที่สามให้หลุด ดูบนกระดาน 5 · Factory Method →ข้อ 10 / 16
agent ส่ง diff เพิ่มปุ่มส่งใบเสร็จซ้ำในหน้า admin ในไฟล์ใหม่มีบรรทัด const doc = order.buyer.taxId ? new TaxInvoicePdf(order) : new ReceiptPdf(order); ทั้งที่ repo มี makeReceipt(order) อยู่แล้ว ควรขอให้แก้อะไร?
5 · Factory Method
new ของ class ที่มีหลายแบบ ไม่ควรอยู่นอกไฟล์ที่เลือก class เงื่อนไขที่ agent เขียนจากความจำคือกฎเวอร์ชันเก่า คนเรียกคนใหม่ควรได้กฎครบจาก makeReceipt ดูบนกระดาน 5 · Factory Method →ข้อ 11 / 16
เว็บและ LINE bot เรียกห้า service เอง (คิดราคา ตัดเงิน เปิดคอร์ส อีเมล แจ้ง LINE) bug report จากเว็บบอกว่าคอร์สเต็มแต่ลูกค้าโดนตัดเงิน agent เพิ่มการคืนเงินใน app/api/checkout/route.ts อะไรน่าจะยังพังอยู่?
6 · Facade service คืนเงินมีอยู่ แต่การ เรียก มันอยู่ในลำดับของแต่ละช่องทาง ถ้าทุกช่องทางเรียก
purchase(cmd) ที่เดียว การแก้ลำดับครั้งเดียวไปถึงทุกช่องทาง ดูบนกระดาน 6 · Facade →ข้อ 12 / 16
diff เพิ่มช่องทาง Messenger มาเป็นไฟล์ใหม่ bot/messenger.ts ยาว 40 บรรทัด เรียก priceFor, charge, enroll, sendAccess เอง ลำดับก๊อปมาจาก bot/line.ts คำถามไหนควรถามก่อนรับ?
6 · Facade ช่องทางที่สามที่ก๊อปลำดับจากบอท ก๊อปจุดที่ไม่มีคืนเงินมาด้วย ไฟล์ช่องทางควรแปลงของตัวเองเป็น cmd แล้วเรียกทางเข้าเดียว ไม่ใช่เรียก service เองหลายตัว ดูบนกระดาน 6 · Facade →
ข้อ 13 / 16
admin กดย้ายนักเรียน 30 คนไปผิดรุ่น ปุ่มเรียก db.enrollment.updateMany ตรง ๆ และ log ที่เติมทีหลังเขียนแค่ move 30 → 2026-11 จะย้อนกลับได้แค่ไหน?
7 · Command ถ้าการย้ายรุ่นเป็นคำสั่ง
MoveCohort ที่จำทั้ง from และ to undo() ก็ย้อนจากข้อมูลในคำสั่งเอง บนกระดาน ฝั่งที่ต้องเดาย้อนผิด 12 จาก 30 คน ดูบนกระดาน 7 · Command →ข้อ 14 / 16
agent แก้ bug คืนเงิน timeout ด้วย diff นี้ในปุ่ม admin: for (let i = 0; i < 3; i++) { try { await payments.refund(o.chargeId, o.amount); break; } catch { await sleep(2000); } } เสี่ยงตรงไหน?
7 · Command การลองใหม่ต้องรู้ว่าเป็นคำสั่งเดิม ฝั่งซ้ายให้
run(cmd) เข้าคิวแล้วลองใหม่ด้วย cmd.id เดิม ระบบจ่ายเงินเห็น key ซ้ำเลยไม่คืนซ้ำ และปุ่มอื่นได้การลองใหม่แบบเดียวกันโดยไม่ต้องเขียนเพิ่ม ดูบนกระดาน 7 · Command →ข้อ 15 / 16
ยอดจ่ายผู้สอนส่งออกสามที่ CSV, Google Sheets และระบบบัญชี แต่ละที่เป็น script ที่ก๊อปกันมา ฝ่ายบัญชีแจ้งว่าไฟล์ CSV นับคืนเงินบางส่วนเป็นยอดขาย agent แก้ scripts/payout-csv.ts แล้วยอด CSV ถูก อะไรยังผิด?
8 · Template Method ขั้นที่เหมือนกันควรมีที่เดียว ใน
PayoutExport แก้ filterRefunds ครั้งเดียว ทุกปลายทางได้ตาม ปลายทางเขียนแค่ format กับ deliver ดูบนกระดาน 8 · Template Method →ข้อ 16 / 16
diff เพิ่มหักภาษี ณ ที่จ่าย 3% โดยแก้ net: … * 0.97 ในสาม script ทีละไฟล์ diff ผ่าน test ของแต่ละไฟล์ อะไรบอกว่าควรขอให้ทำใหม่?
8 · Template Method ลำดับกับขั้นที่เหมือนกันควรถูกล็อกไว้ใน
run() ที่เดียว บนกระดาน ฝั่งขวาแตะ 3 ไฟล์ ทดสอบซ้ำ 9 ตัว และสองไฟล์ที่พังจากรอบก่อนก็ยังพังอยู่ ดูบนกระดาน 8 · Template Method →คะแนนเก็บในเบราว์เซอร์ของคุณเท่านั้น