TERRA RPC

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

Agent Dev Thai Academyprinciples · patterns · architecture
หลักสูตร · DDD ในงานจริง
0/5
Domain-Driven Design ในงานจริง · ร้านเดียว สี่กระดาน

คำกับเส้นแบ่งที่ AI ต้องเห็น

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

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

1
ตอนที่ 1 · แต่ละส่วนมีข้อมูลของตัวเองฝ่ายการตลาดขอติดป้ายคนที่คลิกแคมเปญ แล้วระบบเก็บเงินตัดบัตรคนที่ยกเลิกไปแล้ว
เรื่องย่อ

ร้านเดิมโตขึ้น ตอนนี้มีส่วนเก็บเงินรายเดือน ส่วนบทเรียน และส่วนแคมเปญทาง LINE สัปดาห์นี้ฝ่ายการตลาดขอสองงาน ฝ่ายบัญชีขอหนึ่งงาน คุณส่งให้ AI ทีละงาน

บนฝั่งขวา ทุกส่วนใช้ข้อมูลลูกค้าก้อนเดียวกัน ช่องสถานะของส่วนเก็บเงินกับของส่วนแคมเปญจึงเป็นช่องเดียวกัน diff ของงานการตลาดไม่มีไฟล์ของส่วนเก็บเงินอยู่เลย คุณจึงไม่มีทางเห็นว่าระบบจะตัดบัตรใคร

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

กล่องบนกระดานนี้ · 5
ส่วนทำอะไรทำไม
ลูกค้า ฝั่งเก็บเงินข้อมูลลูกค้าเท่าที่เก็บเงินต้องใช้สถานะในนี้แปลว่ายังจ่ายเงินอยู่ อย่างเดียว
ผู้ติดต่อ ฝั่งแคมเปญข้อมูลลูกค้าเท่าที่แคมเปญต้องใช้คนที่คลิกแคมเปญ เก็บเป็นความสนใจของตัวเอง
ผู้เรียน ฝั่งบทเรียนข้อมูลลูกค้าเท่าที่บทเรียนต้องใช้รู้แค่คอร์สกับการดูบทเรียน
ข้อมูลลูกค้าก้อนกลางก้อนเดียว 40 ช่อง ที่ฝั่งขวาใช้ร่วมกันสามส่วนแก้ไฟล์เดียว ทุกการแก้กระทบทุกส่วน
ตัดบัตรรายเดือนตัดบัตรรอบถัดไปขวา อ่านช่องสถานะที่ส่วนแคมเปญก็เขียนได้
1
Bounded Context · แต่ละส่วนมีข้อมูลของตัวเองคุณจะสั่ง AI ว่าอะไร
1
Bounded Context · แต่ละส่วนมีข้อมูลของตัวเอง
ตอนที่ 1 · สถานการณ์

ร้านเดิมโตขึ้น ตอนนี้มีส่วนเก็บเงินรายเดือน ส่วนบทเรียน และส่วนแคมเปญทาง LINE สัปดาห์นี้ฝ่ายการตลาดขอสองงาน ฝ่ายบัญชีขอหนึ่งงาน คุณส่งให้ AI ทีละงาน

ฝ่ายการตลาดขอติดป้ายคนที่คลิกแคมเปญ แล้วระบบเก็บเงินตัดบัตรคนที่ยกเลิกไปแล้ว

แต่ละส่วนเก็บข้อมูลลูกค้าของตัวเอง
ข้อมูลลูกค้าก้อนเดียว 40 ช่อง ทุกส่วนแก้

ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน

แต่ละส่วนเก็บข้อมูลลูกค้าของตัวเอง
ข้อมูลลูกค้าก้อนเดียว 40 ช่อง ทุกส่วนแก้
แต่ละส่วนเก็บข้อมูลลูกค้าของตัวเอง
ส่วนเก็บเงิน
ลูกค้า ฝั่งเก็บเงินเรื่องเก็บเงินอย่างเดียว
ข้อมูลลูกค้า เท่าที่เก็บเงินต้องใช้ยังเก็บเงินได้ไหม
ตัดบัตรรายเดือนเรื่องเก็บเงินอย่างเดียว
ใช้ ← ลูกค้า ฝั่งเก็บเงิน
ตัดบัตรรอบถัดไป
ส่วนบทเรียน
ผู้เรียน ฝั่งบทเรียนเรื่องบทเรียนอย่างเดียว
ข้อมูลผู้เรียน เท่าที่บทเรียนต้องใช้ดูบทเรียนได้ไหม
ส่วนแคมเปญ LINE
ผู้ติดต่อ ฝั่งแคมเปญเรื่องแคมเปญอย่างเดียว
ข้อมูลผู้ติดต่อ เท่าที่แคมเปญต้องใช้กลุ่มเป้าหมาย
ข้อมูลกลาง ทุกส่วนใช้ร่วมกัน
ไม่มีข้อมูลลูกค้าก้อนกลาง · แต่ละส่วนเก็บของตัวเอง
ข้อมูลลูกค้าก้อนเดียว 40 ช่อง ทุกส่วนแก้
ส่วนเก็บเงิน
ตัดบัตรรายเดือนเรื่องเก็บเงิน
ใช้ ← ข้อมูลลูกค้าก้อนกลาง
ตัดบัตรรอบถัดไป
ส่วนบทเรียน
สิทธิ์เข้าเรียนเรื่องบทเรียน
ใช้ ← ข้อมูลลูกค้าก้อนกลาง
ดูบทเรียนได้ไหม
ส่วนแคมเปญ LINE
ยิงแคมเปญเรื่องแคมเปญ
ใช้ ← ข้อมูลลูกค้าก้อนกลาง
ยิงแคมเปญ LINE
ข้อมูลกลาง ทุกส่วนใช้ร่วมกัน
ข้อมูลลูกค้าก้อนกลางเก็บเงินบทเรียนแคมเปญ ใช้ร่วมกัน
ข้อมูลลูกค้าก้อนเดียว 40 ช่องสถานะ (ใช้งานอยู่ หรือยกเลิก)
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลาก สถานะ กับ เลขผู้เสียภาษี ไปไว้ที่ลูกค้าฝั่งเก็บเงิน ส่วน ยอมรับข้อความ LINE ไปไว้ที่ผู้ติดต่อฝั่งแคมเปญ

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

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

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

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

ซ้าย ส่วนเก็บเงิน ส่วนบทเรียน และส่วนแคมเปญ ต่างมีข้อมูลลูกค้าของตัวเอง ใช้ร่วมกันแค่รหัสลูกค้า ขวา การตัดบัตร สิทธิ์เข้าเรียน และการยิงแคมเปญ อ่านข้อมูลลูกค้าก้อนกลางก้อนเดียวกัน

ขั้นที่ 1เก็บว่าใครยอมรับข้อความ LINE

ซ้าย AI เพิ่มช่องในข้อมูลผู้ติดต่อของส่วนแคมเปญ ไฟล์เดียว ขวา AI เพิ่มช่องที่ 41 ลงข้อมูลก้อนกลาง แล้ว CI ต้องรัน test ของทั้งสามส่วนที่ใช้ก้อนนี้ ยังไม่มีอะไรพัง

ขั้นที่ 2ติดป้าย ใช้งานอยู่ ให้คนที่คลิกแคมเปญ

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

ขั้นสุดท้ายเก็บเลขผู้เสียภาษี สำหรับ e-Tax Invoice

ซ้าย AI เพิ่มช่องในข้อมูลลูกค้าของส่วนเก็บเงิน ไฟล์เดียว ขวา AI เพิ่มช่องที่ 42 ลงก้อนกลาง test ของส่วนบทเรียนกับส่วนแคมเปญต้องรันซ้ำอีกรอบ ทั้งที่สองส่วนนั้นไม่ได้ขออะไร

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

แต่ละส่วนของแอปเก็บข้อมูลของตัวเอง แม้จะพูดถึงคนคนเดียวกัน คำเดียวกันในสองส่วนอาจแปลคนละอย่าง ให้ใช้ร่วมกันแค่รหัส ชื่อเรียกของเรื่องนี้คือ bounded context

ถามก่อนรับ diffdiff นี้แก้ช่องที่ส่วนอื่นอ่านอยู่หรือเปล่า และส่วนนั้นใช้ช่องนี้ในความหมายเดียวกันไหม

Bounded Context (Evans, Domain-Driven Design 2003, ch. 14): a model applies inside an explicit boundary; the same word can mean different things in different contexts
2
ตอนที่ 2 · หนึ่งเรื่อง หนึ่งคำ ทุกไฟล์ฝ่ายซัพพอร์ตขอยกเลิก enrollment แต่ใน repo ไม่มีคำนี้ AI เลยสร้างตารางใหม่
เรื่องย่อ

ร้านเดิม ฝ่ายซัพพอร์ตกับฝ่ายการตลาดส่งงานมาในแชต ทุกคนพูดว่า enrollment หรือ learner คุณส่งต่อให้ AI และ AI ค้นคำนั้นใน repo ก่อนลงมือทุกครั้ง

บนฝั่งขวา เรื่องเดียวกันมีห้าชื่อ คำที่คุณพิมพ์ไม่ตรงกับคำในโค้ด AI ค้นไม่เจอก็สร้างของใหม่ หรือหยิบของที่ชื่อตรงแต่ความหมายไม่ตรง diff ดูถูกทุกบรรทัด

ซ้าย การที่คนลงคอร์สเรียกว่า enrollment ทุกที่ ทั้งไฟล์ ตาราง ปุ่มบนหน้าเว็บ และแชตที่คุณคุยกับ AI ขวา โค้ดเรียก student ตารางชื่ออีกอย่าง บอทเรียก learner ส่วนคุณพิมพ์ว่า enrollment คุณจะส่งสามงานด้วยคำของคุณเอง แล้วดูว่า AI ค้นเจออะไร

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
ลงทะเบียนเรียน (enrollment)ที่เดียวที่เก็บว่าใครลงคอร์สไหน ฝั่งซ้ายตาราง ปุ่ม และแชตใช้คำเดียวกัน
ผู้เรียน (student)เพิ่มผู้เรียนลงตารางที่ชื่ออีกอย่าง ฝั่งขวาโค้ดเรียก student แต่คุณเรียก enrollment
บอท LINEสมัครผ่าน LINE และรายชื่อคนที่สมัครทางนั้นlearner ในไฟล์นี้แปลว่าสมัครผ่าน LINE เท่านั้น
เตือนให้เริ่มเรียนส่งข้อความหาคนที่ยังไม่เริ่มเรียนขวา ดึงรายชื่อจากบอท
2
Ubiquitous Language · หนึ่งเรื่อง หนึ่งคำ ทุกไฟล์คุณจะสั่ง AI ว่าอะไร
2
Ubiquitous Language · หนึ่งเรื่อง หนึ่งคำ ทุกไฟล์
ตอนที่ 2 · สถานการณ์

ร้านเดิม ฝ่ายซัพพอร์ตกับฝ่ายการตลาดส่งงานมาในแชต ทุกคนพูดว่า enrollment หรือ learner คุณส่งต่อให้ AI และ AI ค้นคำนั้นใน repo ก่อนลงมือทุกครั้ง

ฝ่ายซัพพอร์ตขอยกเลิก enrollment แต่ใน repo ไม่มีคำนี้ AI เลยสร้างตารางใหม่

enrollment คำเดียว ทุกไฟล์
student · member · learner · customer คือเรื่องเดียวกัน

ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน

enrollment คำเดียว ทุกไฟล์
student · member · learner · customer คือเรื่องเดียวกัน
enrollment คำเดียว ทุกไฟล์
ลงทะเบียนเรียน (enrollment)ใช้คำว่า enrollment ทุกที่
การลงทะเบียน หนึ่งแถวต่อหนึ่งคนลงทะเบียนเรียน
หน้าคอร์สปุ่ม: ลงทะเบียน
ใช้ ← ลงทะเบียนเรียน (enrollment)
ปุ่ม ลงทะเบียน
บอท LINEบอท LINE
ใช้ ← ลงทะเบียนเรียน (enrollment)
ลงทะเบียนผ่าน LINE
หลังจ่ายเงินหลังจ่ายเงิน
ใช้ ← ลงทะเบียนเรียน (enrollment)
ลงทะเบียนให้หลังจ่ายเงิน
student · member · learner · customer คือเรื่องเดียวกัน
ผู้เรียน (student)ตารางชื่อหนึ่งโค้ดเรียกอีกชื่อ
ผู้เรียน (โค้ดเรียก student)เพิ่มผู้เรียน (student)
หน้าคอร์สปุ่ม: สมัครสมาชิก
ใช้ ← ผู้เรียน (student)
ปุ่ม สมัครสมาชิก
บอท LINEบอทเรียกว่า learner
สมัครผ่าน LINE (เรียก learner)รายชื่อคนที่สมัครผ่าน LINE
หลังจ่ายเงินหลังจ่ายเงิน เรียกว่า customer
ใช้ ← ผู้เรียน (student)
ให้สิทธิ์คอร์สหลังจ่าย (เรียก customer)
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลาก เพิ่มผู้เรียน นับผู้เรียน และรายชื่อจากบอท ไปรวมในไฟล์ลงทะเบียนเรียน

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

เขียว: ที่แก้หรือเพิ่มประ: AI ต้องเปิดดูว่าเป็นคนเดียวกันไหมแดง: ทำงานผิดเงียบ ๆ เพราะคำไม่ตรงกัน

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

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

ซ้าย ไฟล์ลงทะเบียนเรียนมีการลงทะเบียนอยู่ที่เดียว หน้าคอร์ส บอท และขั้นหลังจ่ายเงินเรียกตัวเดียวกัน ขวา โค้ดเรียก student หน้าเว็บเขียนว่าสมัครสมาชิก บอทเรียก learner และขั้นหลังจ่ายเงินเรียก customer ทุกตัวเขียนลงตารางเดียวกันที่ชื่ออีกอย่าง

ขั้นที่ 1แอดมินขอนับจำนวนผู้เรียนต่อคอร์ส

ซ้าย AI เพิ่มการนับในไฟล์ลงทะเบียนเรียน ขวา AI เพิ่มการนับในไฟล์ผู้เรียน ได้ตัวเลขถูก แต่ต้องเปิดบอทกับขั้นหลังจ่ายเงินก่อน เพื่อเช็กว่า learner กับ customer คือ student คนเดียวกันไหม

ขั้นที่ 2ฝ่ายซัพพอร์ตขอยกเลิก enrollment แล้วคืนเงินภายใน 7 วัน

ซ้าย AI ค้นคำว่า enrollment เจอไฟล์เดียว แล้วเพิ่มการยกเลิกในนั้น ขวา AI ค้นเจอ 0 ไฟล์ เลยสร้างไฟล์กับตารางใหม่ชื่อ enrollment คืนเงินแล้ว แต่แถวในตารางผู้เรียนเดิมยังอยู่ ลูกค้าเลยยังเข้าเรียนได้

ขั้นสุดท้ายฝ่ายการตลาดขอส่ง LINE หา learner ที่ยังไม่เริ่มเรียน

ซ้าย AI เพิ่มไฟล์เตือนให้เริ่มเรียน ที่ดึงรายชื่อจากการลงทะเบียน ครบทั้งเว็บและ LINE ขวา AI เจอรายชื่อในบอทที่ชื่อว่า learners แล้วใช้ต่อ ข้อความเลยส่งถึงแค่คนที่สมัครผ่าน LINE คนที่สมัครผ่านเว็บไม่ได้ข้อความ

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

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

ถามก่อนรับ diffชื่อใหม่ใน diff นี้ตรงกับคำที่เราใช้คุยกันไหม หรือ AI เพิ่งตั้งชื่อใหม่ให้ของที่มีอยู่แล้ว

Ubiquitous Language (Evans, Domain-Driven Design 2003, ch. 2): one language shared by the team and the code, used in conversation, documents and the code itself
3
ตอนที่ 3 · กฎที่นั่งอยู่ในทางเข้าเดียวเปิด flash sale รุ่นสด 30 ที่ แล้วมีคนจ่ายเงิน 34 คน
เรื่องย่อ

ร้านเดิมเปิดคอร์สสดเป็นรุ่น รุ่นละ 30 ที่ สัปดาห์นี้แอดมินขอย้ายผู้เรียนข้ามรุ่น คุณอยากเปิดจองผ่าน LINE และฝ่ายการตลาดจะเปิด flash sale รุ่น 3 ตอนสองทุ่ม

บนฝั่งขวา กฎห้ามขายเกิน 30 ที่ถูกเขียนซ้ำในทุกทางเข้า แต่ละชุดผ่าน test ที่จองทีละคน พอคนกดพร้อมกัน ตัวเลขเขียนทับกัน ระบบขายเกินโดยไม่มีข้อผิดพลาดสักบรรทัด

ซ้าย ที่นั่งของรุ่นเปลี่ยนได้ผ่านการจองกับการคืนที่นั่งในไฟล์กฎของรุ่นเท่านั้น และการบันทึกเช็กว่าไม่มีใครแก้ตัดหน้า ขวา หน้าจ่ายเงิน หลังบ้าน และบอท ต่างคนต่างอ่านยอดจองแล้วเขียนกลับเอง คุณจะย้ายผู้เรียนจากหลังบ้าน เปิดจองผ่าน LINE แล้วเปิด flash sale

กล่องบนกระดานนี้ · 5
ส่วนทำอะไรทำไม
รุ่นเรียน (กฎที่นั่ง)จองและคืนที่นั่ง พร้อมเช็กว่าไม่เกินกฎไม่ขายเกินอยู่ที่นี่ที่เดียว
บันทึกรุ่นบันทึกพร้อมเช็กว่าไม่มีใครแก้ตัดหน้าจองตัดหน้ากัน คนหลังต้องโหลดใหม่
จ่ายเงินบนเว็บลูกค้ากดจ่ายบนเว็บขวา เช็กแล้วบวกยอดจองเอง
บอท LINEจองผ่าน LINEขวา AI เขียนเช็กชุดที่สอง
ตารางรุ่นตารางในฐานข้อมูล ฝั่งขวายอดจองที่ทุกไฟล์แก้ได้ตรง ๆ
3
Aggregate · กฎที่นั่งอยู่ในทางเข้าเดียวคุณจะสั่ง AI ว่าอะไร
3
Aggregate · กฎที่นั่งอยู่ในทางเข้าเดียว
ตอนที่ 3 · สถานการณ์

ร้านเดิมเปิดคอร์สสดเป็นรุ่น รุ่นละ 30 ที่ สัปดาห์นี้แอดมินขอย้ายผู้เรียนข้ามรุ่น คุณอยากเปิดจองผ่าน LINE และฝ่ายการตลาดจะเปิด flash sale รุ่น 3 ตอนสองทุ่ม

เปิด flash sale รุ่นสด 30 ที่ แล้วมีคนจ่ายเงิน 34 คน

ที่นั่งเปลี่ยนได้ทางเดียว ผ่านกฎของรุ่น
สามทางเข้า ต่างคนต่างแก้ยอดจอง

ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน

ที่นั่งเปลี่ยนได้ทางเดียว ผ่านกฎของรุ่น
สามทางเข้า ต่างคนต่างแก้ยอดจอง
ที่นั่งเปลี่ยนได้ทางเดียว ผ่านกฎของรุ่น
กฎของรุ่น
รุ่นเรียน (กฎที่นั่ง)กฎที่นั่งอยู่ที่นี่ที่เดียว
จองที่นั่ง (เช็กว่าไม่เกิน)คืนที่นั่ง
บันทึกรุ่นบันทึกลงฐานข้อมูล
บันทึก พร้อมเช็กว่าไม่มีใครแก้ตัดหน้า
ทางเข้า · เว็บ หลังบ้าน LINE
จ่ายเงินบนเว็บจ่ายเงินบนเว็บ
ใช้ ← รุ่นเรียน (กฎที่นั่ง)
จ่ายเงิน
หลังบ้านหลังบ้าน
ใช้ ← รุ่นเรียน (กฎที่นั่ง)
ย้ายผู้เรียนข้ามรุ่น
สามทางเข้า ต่างคนต่างแก้ยอดจอง
กฎของรุ่น
ไม่มีไฟล์กฎของรุ่น · ทุกทางเข้าแก้ยอดจองเอง
ทางเข้า · เว็บ หลังบ้าน LINE
จ่ายเงินบนเว็บเช็กเอง บวกเอง
จ่ายเงินอ่านยอดจอง แล้วบวกหนึ่งเอง
หลังบ้านแก้ตัวเลขตรง ๆ
ย้ายผู้เรียนข้ามรุ่นพิมพ์ยอดจองใหม่เอง
ตารางในฐานข้อมูล
ตารางรุ่นตารางรุ่นใครก็แก้ได้
จำนวนที่นั่งทั้งหมดยอดที่จองไปแล้ว (ใครก็แก้ได้)
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากการแก้ยอดจองทั้งสามชิ้น ไปรวมในไฟล์กฎของรุ่น

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

เขียว: ที่แก้หรือเพิ่มประ: ต้องทดสอบซ้ำแดง: ขายเกินที่นั่ง

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

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

ซ้าย ไฟล์กฎของรุ่นมีการจองกับการคืนที่นั่ง หน้าจ่ายเงินกับหลังบ้านเรียกสองตัวนี้ ขวา หน้าจ่ายเงินเช็กแล้วบวกยอดจองเอง ส่วนหลังบ้านพิมพ์ยอดจองใหม่เอง

ขั้นที่ 1แอดมินขอย้ายผู้เรียนจากรุ่น 2 ไปรุ่น 3

ซ้าย AI แก้การย้ายให้คืนที่นั่งรุ่นเดิม แล้วจองรุ่นใหม่ ถ้ารุ่น 3 เต็มจะถูกปฏิเสธ ขวา AI แก้ให้แอดมินพิมพ์ยอดจองใหม่เอง รุ่น 3 ยังไม่เต็ม เลยผ่าน

ขั้นที่ 2เปิดจองรุ่นสดผ่าน LINE

ซ้าย AI เพิ่มบอทที่เรียกการจองที่นั่งตัวเดิม ขวา AI เพิ่มบอทที่เขียนเช็กกับบวกหนึ่งเป็นชุดที่สอง test จองทีละคนผ่าน

ขั้นสุดท้ายฝ่ายการตลาดเปิด flash sale รุ่น 3 ตอนสองทุ่ม ลด 30%

ซ้าย AI แก้ราคาในหน้าจ่ายเงิน คนที่จองชนกันจะโหลดใหม่แล้วลองอีกรอบ คนที่ 31 ถูกปฏิเสธ ขวา AI แก้ราคาเหมือนกัน แต่ 200 คนกดพร้อมกันจากเว็บและ LINE การบวกหนึ่งเลยเขียนทับกัน ตัวเลขบอก 30 แต่จ่ายเงินแล้ว 34 คน

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

กฎที่ต้องจริงเสมอ เช่นห้ามขายเกินจำนวนที่นั่ง ต้องอยู่ในที่เดียว ข้อมูลของมันแก้ได้ผ่านทางเข้าเดียว และทุกช่องทางมาเรียกทางเข้านั้น ชื่อเรียกของเรื่องนี้คือ aggregate

ถามก่อนรับ diffdiff นี้แก้ตัวเลขหรือสถานะของรุ่นตรง ๆ หรือเรียกผ่านทางเข้าที่กฎอยู่

Aggregate (Evans, Domain-Driven Design 2003, ch. 6): a cluster of objects changed as one unit; outside code reaches it only through its root, which keeps its invariants
4
ตอนที่ 4 · แปลงระบบนอกที่ชายแดนฝ่ายบัญชีอัปเกรด ERP แล้ว cron โอนเงินให้ผู้สอนซ้ำทุกใบ
เรื่องย่อ

ร้านเดิมจ่ายเงินให้ผู้สอนทุกเดือนผ่าน ERP ของฝ่ายบัญชี สัปดาห์นี้มีสามงาน แสดงวันที่โอนบนเว็บ แจ้งผู้สอนทาง LINE และฝ่ายบัญชีจะอัปเกรด ERP

ERP ส่งเอกสารมาด้วยรหัสสถานะเป็นตัวเลข วันที่แบบ พ.ศ. และจำนวนเงินเป็นข้อความ บนฝั่งขวา ทุกไฟล์แปลงของพวกนี้เอง และแปลงไม่เหมือนกัน วันที่ ERP เปลี่ยนรหัส ไฟล์ที่ AI หาไม่เจอคือ cron ที่โอนเงิน

ซ้าย ตัวแปลง ERP เป็นไฟล์เดียวที่รู้จักรหัสสถานะ วันที่แบบ พ.ศ. และจำนวนเงินที่เป็นข้อความของ ERP แล้วแปลงเป็นยอดจ่ายในภาษาของเรา ขวา ทุกไฟล์อ่านเอกสาร ERP ดิบ ๆ แล้วแปลงเอง คุณจะแสดงวันที่โอนบนเว็บ แจ้งผู้สอนทาง LINE แล้วอัปเกรด ERP

กล่องบนกระดานนี้ · 4
ส่วนทำอะไรทำไม
ตัวแปลง ERPแปลงเอกสาร ERP เป็นยอดจ่ายของเราERP เปลี่ยน แก้ที่นี่ที่เดียว
ยอดจ่ายผู้สอนยอดจ่ายในภาษาของเราสถานะเป็นคำ วันที่เป็นวันที่จริง เงินเป็นสตางค์
cron โอนใบที่ค้างส่งโอนใบที่ค้างทุกคืนขวา เช็กรหัสของ ERP เอง ERP เปลี่ยนรหัสแล้วโอนซ้ำ
บอท LINEแจ้งผู้สอนว่าโอนแล้วขวา แปลง พ.ศ. เองแล้วได้ปี 3110
4
Anti-Corruption Layer · แปลงระบบนอกที่ชายแดนคุณจะสั่ง AI ว่าอะไร
4
Anti-Corruption Layer · แปลงระบบนอกที่ชายแดน
ตอนที่ 4 · สถานการณ์

ร้านเดิมจ่ายเงินให้ผู้สอนทุกเดือนผ่าน ERP ของฝ่ายบัญชี สัปดาห์นี้มีสามงาน แสดงวันที่โอนบนเว็บ แจ้งผู้สอนทาง LINE และฝ่ายบัญชีจะอัปเกรด ERP

ฝ่ายบัญชีอัปเกรด ERP แล้ว cron โอนเงินให้ผู้สอนซ้ำทุกใบ

ERP ถูกแปลงที่ไฟล์เดียว
ชื่อช่องของ ERP อยู่ในทุกไฟล์

ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน

ERP ถูกแปลงที่ไฟล์เดียว
ชื่อช่องของ ERP อยู่ในทุกไฟล์
ERP ถูกแปลงที่ไฟล์เดียว
จ่ายเงินผู้สอน
ยอดจ่ายผู้สอนสถานะเป็นคำวันที่เป็นวันที่จริง
ยอดจ่าย ในภาษาของเรา
สรุปรายเดือนสรุปรายเดือน
ใช้ ← ยอดจ่ายผู้สอน
สรุปยอดรายเดือน
ที่ใช้ · หน้าจอ บอท cron
cron โอนใบที่ค้างcron ทุกคืน
ใช้ ← ยอดจ่ายผู้สอน
ส่งโอนใบที่ค้างอีกครั้ง
หน้ารายได้ผู้สอนหน้ารายได้ผู้สอน
ใช้ ← ยอดจ่ายผู้สอน
แถวรายได้บนหน้าผู้สอน
ตัวแปลง ERP ที่เดียว
ตัวแปลง ERPรู้จัก ERP ที่เดียว
ใช้ ← ยอดจ่ายผู้สอน, erp-sdk
แปลงเอกสาร ERP เป็นยอดจ่ายของเราตารางแปลงรหัสสถานะแปลงวันที่ พ.ศ. เป็นวันที่จริง
ชื่อช่องของ ERP อยู่ในทุกไฟล์
จ่ายเงินผู้สอน
ยอดจ่ายผู้สอนใช้เอกสาร ERP ตรง ๆ
ใช้ ← erp-sdk
เอกสาร ERP ดิบ ๆจ่ายแล้วหรือยัง (เช็กรหัส ERP เอง)
สรุปรายเดือนแปลงจำนวนเงินเอง
ใช้ ← erp-sdk
สรุปยอดรายเดือนแปลงจำนวนเงินจากข้อความเอง
ที่ใช้ · หน้าจอ บอท cron
cron โอนใบที่ค้างcron ทุกคืนเช็กรหัส ERP เอง
ใช้ ← erp-sdk
ส่งโอนใบที่ยังไม่จ่าย (เช็กรหัส ERP เอง)
หน้ารายได้ผู้สอนหน้ารายได้ผู้สอน
ใช้ ← erp-sdk
แถวรายได้บนหน้าผู้สอน
ตัวแปลง ERP ที่เดียว
ไม่มีตัวแปลง · ชื่อช่องของ ERP อยู่ทุกไฟล์
ขั้นสุดท้าย · ลากขั้นตอนมาแยกเป็นไฟล์ใหม่ตรงนี้+ ไฟล์ใหม่ลากการเช็กรหัส การแปลงจำนวนเงิน และการแปลง พ.ศ. ไปรวมในตัวแปลง ERP

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

เขียว: ที่แก้หรือเพิ่มประ: ต้องทดสอบซ้ำแดง: แปลงผิด หรือโอนเงินซ้ำ

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

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

ซ้าย ตัวแปลง ERP แปลงเอกสาร รหัสสถานะ และวันที่ พ.ศ. ไฟล์อื่นเห็นแค่ยอดจ่ายในภาษาของเรา ขวา ยอดจ่าย สรุปรายเดือน cron และหน้ารายได้ผู้สอน อ่านเอกสาร ERP ดิบ ๆ แล้วแปลรหัสกับจำนวนเงินเอง

ขั้นที่ 1แสดงวันที่โอนในหน้ารายได้ผู้สอน

ซ้าย AI แก้แถวรายได้ให้แสดงวันที่ ที่แปลงมาแล้วจากตัวแปลง ขวา AI เขียนการลบ 543 ไว้ในหน้านี้เอง เพื่อแปลง พ.ศ. เป็น ค.ศ. วันที่ที่แสดงถูก

ขั้นที่ 2แจ้งผู้สอนทาง LINE เมื่อโอนเงินแล้ว

ซ้าย AI เพิ่มบอทที่ใช้วันที่ตัวเดิม ขวา AI ไม่รู้ว่ามีตัวแปลงซ่อนอยู่ในหน้าเว็บ บอทอ่านวันที่ของ ERP เป็น ค.ศ. แล้วบวก 543 อีกรอบ ผู้สอนได้ข้อความว่าโอนวันที่ 14/10/3110

ขั้นสุดท้ายฝ่ายบัญชีอัปเกรด ERP รหัส 02 กลายเป็นคำว่า PAID

ซ้าย AI แก้ตารางแปลงรหัสในตัวแปลงบรรทัดเดียว ขวา AI ค้นหาที่เขียนว่า เท่ากับ 02 แล้วแก้ 3 ไฟล์ แต่ cron เขียนว่า ไม่ใช่ 02 เลยค้นไม่เจอ คืนนั้น cron ส่งโอนซ้ำทุกใบที่โอนไปแล้ว

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

ระบบข้างนอกมีภาษาของมันเอง ให้แปลงเป็นข้อมูลของเราที่ไฟล์เดียวตรงชายแดน ไฟล์ข้างในไม่ควรรู้จักชื่อช่องหรือรหัสของระบบนั้น ชื่อเรียกของเรื่องนี้คือ anti-corruption layer

ถามก่อนรับ diffdiff นี้อ่านชื่อช่องหรือรหัสสถานะของระบบข้างนอก ในไฟล์ที่ไม่ใช่ตัวแปลงหรือเปล่า

Anti-Corruption Layer (Evans, Domain-Driven Design 2003, ch. 14): an isolating layer that translates between another system's model and yours, so its concepts don't leak into your domain
ครบสี่กระดานแล้ว? ทายว่าเส้นแบ่งอยู่ตรงไหนแบบทดสอบแปดข้อ ทุกข้อคือ diff ที่ AI กำลังจะส่งมาให้รีวิว
ทำแบบทดสอบ →

ทั้งสี่ข้อคือเส้นแบ่งกับคำ

พูดแบบคนสั่งงาน: แต่ละส่วนของแอปเก็บข้อมูลของตัวเอง ใช้ร่วมกันแค่รหัส (1) เรื่องหนึ่งใช้คำเดียว ทั้งในโค้ด ตาราง หน้าจอ และแชตที่คุณคุยกับ AI (2) กฎที่ต้องจริงเสมออยู่ในที่เดียว และแก้ได้ผ่านทางเข้าเดียว (3) ระบบข้างนอกถูกแปลงเป็นภาษาของเราที่ไฟล์เดียวตรงชายแดน (4) Evans เรียกรวมว่าการออกแบบตามโดเมน บนกระดาน: ค้นคำที่คุณใช้แล้วเจอครบทุกที่ และงานของส่วนหนึ่งไม่ต้องเปิดไฟล์ของอีกส่วน

สี่กระดานคือร้านขายคอร์สออนไลน์ร้านเดียว: เก็บเงิน · บทเรียน · แคมเปญ · จ่ายเงินผู้สอน · ที่มา: Evans, Domain-Driven Design (2003)คีย์บนกระดาน: Enter / คลิก = ขั้นถัดไป · ⌫ = รีเซ็ต