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

ร้านเดิมโตขึ้น ตอนนี้มีส่วนเก็บเงินรายเดือน ส่วนบทเรียน และส่วนแคมเปญทาง LINE สัปดาห์นี้ฝ่ายการตลาดขอสองงาน ฝ่ายบัญชีขอหนึ่งงาน คุณส่งให้ AI ทีละงาน
ฝ่ายการตลาดขอติดป้ายคนที่คลิกแคมเปญ แล้วระบบเก็บเงินตัดบัตรคนที่ยกเลิกไปแล้ว
ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน
กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย
บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่
ซ้าย ส่วนเก็บเงิน ส่วนบทเรียน และส่วนแคมเปญ ต่างมีข้อมูลลูกค้าของตัวเอง ใช้ร่วมกันแค่รหัสลูกค้า ขวา การตัดบัตร สิทธิ์เข้าเรียน และการยิงแคมเปญ อ่านข้อมูลลูกค้าก้อนกลางก้อนเดียวกัน
ซ้าย AI เพิ่มช่องในข้อมูลผู้ติดต่อของส่วนแคมเปญ ไฟล์เดียว ขวา AI เพิ่มช่องที่ 41 ลงข้อมูลก้อนกลาง แล้ว CI ต้องรัน test ของทั้งสามส่วนที่ใช้ก้อนนี้ ยังไม่มีอะไรพัง
ซ้าย AI เพิ่มการติดป้ายในข้อมูลผู้ติดต่อ เก็บเป็นความสนใจของส่วนแคมเปญเอง ขวา AI เจอช่องสถานะในก้อนกลางอยู่แล้ว เลยตั้งเป็น ใช้งานอยู่ ให้คนที่คลิก แต่การตัดบัตรตัดทุกคนที่สถานะ ใช้งานอยู่ คนที่ยกเลิกแล้วแต่คลิกแคมเปญ เลยโดนตัดเงิน
ซ้าย 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
ร้านเดิม ฝ่ายซัพพอร์ตกับฝ่ายการตลาดส่งงานมาในแชต ทุกคนพูดว่า enrollment หรือ learner คุณส่งต่อให้ AI และ AI ค้นคำนั้นใน repo ก่อนลงมือทุกครั้ง
ฝ่ายซัพพอร์ตขอยกเลิก enrollment แต่ใน repo ไม่มีคำนี้ AI เลยสร้างตารางใหม่
ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน
กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย
บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่
ซ้าย ไฟล์ลงทะเบียนเรียนมีการลงทะเบียนอยู่ที่เดียว หน้าคอร์ส บอท และขั้นหลังจ่ายเงินเรียกตัวเดียวกัน ขวา โค้ดเรียก student หน้าเว็บเขียนว่าสมัครสมาชิก บอทเรียก learner และขั้นหลังจ่ายเงินเรียก customer ทุกตัวเขียนลงตารางเดียวกันที่ชื่ออีกอย่าง
ซ้าย AI เพิ่มการนับในไฟล์ลงทะเบียนเรียน ขวา AI เพิ่มการนับในไฟล์ผู้เรียน ได้ตัวเลขถูก แต่ต้องเปิดบอทกับขั้นหลังจ่ายเงินก่อน เพื่อเช็กว่า learner กับ customer คือ student คนเดียวกันไหม
ซ้าย AI ค้นคำว่า enrollment เจอไฟล์เดียว แล้วเพิ่มการยกเลิกในนั้น ขวา AI ค้นเจอ 0 ไฟล์ เลยสร้างไฟล์กับตารางใหม่ชื่อ enrollment คืนเงินแล้ว แต่แถวในตารางผู้เรียนเดิมยังอยู่ ลูกค้าเลยยังเข้าเรียนได้
ซ้าย 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
ร้านเดิมเปิดคอร์สสดเป็นรุ่น รุ่นละ 30 ที่ สัปดาห์นี้แอดมินขอย้ายผู้เรียนข้ามรุ่น คุณอยากเปิดจองผ่าน LINE และฝ่ายการตลาดจะเปิด flash sale รุ่น 3 ตอนสองทุ่ม
เปิด flash sale รุ่นสด 30 ที่ แล้วมีคนจ่ายเงิน 34 คน
ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน
กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย
บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่
ซ้าย ไฟล์กฎของรุ่นมีการจองกับการคืนที่นั่ง หน้าจ่ายเงินกับหลังบ้านเรียกสองตัวนี้ ขวา หน้าจ่ายเงินเช็กแล้วบวกยอดจองเอง ส่วนหลังบ้านพิมพ์ยอดจองใหม่เอง
ซ้าย AI แก้การย้ายให้คืนที่นั่งรุ่นเดิม แล้วจองรุ่นใหม่ ถ้ารุ่น 3 เต็มจะถูกปฏิเสธ ขวา AI แก้ให้แอดมินพิมพ์ยอดจองใหม่เอง รุ่น 3 ยังไม่เต็ม เลยผ่าน
ซ้าย AI เพิ่มบอทที่เรียกการจองที่นั่งตัวเดิม ขวา AI เพิ่มบอทที่เขียนเช็กกับบวกหนึ่งเป็นชุดที่สอง test จองทีละคนผ่าน
ซ้าย 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
ร้านเดิมจ่ายเงินให้ผู้สอนทุกเดือนผ่าน ERP ของฝ่ายบัญชี สัปดาห์นี้มีสามงาน แสดงวันที่โอนบนเว็บ แจ้งผู้สอนทาง LINE และฝ่ายบัญชีจะอัปเกรด ERP
ฝ่ายบัญชีอัปเกรด ERP แล้ว cron โอนเงินให้ผู้สอนซ้ำทุกใบ
ลูกศร = ไฟล์ไหนพึ่งไฟล์ไหน · เขียว ถูกทิศ · แดง ชี้ผิดทาง · แตะกล่องเพื่อหาไฟล์บนกระดาน
กล่อง = ไฟล์หนึ่งไฟล์ ที่ AI ต้องเปิดเมื่อแก้เรื่องในนั้นขั้นตอนชิ้น = สิ่งที่โค้ดทำ หนึ่งขั้น= ชิ้นที่ลากไปไฟล์ใหม่ได้ ในขั้นสุดท้าย
บนมือถือ: แตะที่กระดานเพื่อไปขั้นถัดไป ขั้นสุดท้ายแตะชิ้นที่ลากได้ แล้วแตะกล่องที่มันควรอยู่
ซ้าย ตัวแปลง ERP แปลงเอกสาร รหัสสถานะ และวันที่ พ.ศ. ไฟล์อื่นเห็นแค่ยอดจ่ายในภาษาของเรา ขวา ยอดจ่าย สรุปรายเดือน cron และหน้ารายได้ผู้สอน อ่านเอกสาร ERP ดิบ ๆ แล้วแปลรหัสกับจำนวนเงินเอง
ซ้าย AI แก้แถวรายได้ให้แสดงวันที่ ที่แปลงมาแล้วจากตัวแปลง ขวา AI เขียนการลบ 543 ไว้ในหน้านี้เอง เพื่อแปลง พ.ศ. เป็น ค.ศ. วันที่ที่แสดงถูก
ซ้าย AI เพิ่มบอทที่ใช้วันที่ตัวเดิม ขวา AI ไม่รู้ว่ามีตัวแปลงซ่อนอยู่ในหน้าเว็บ บอทอ่านวันที่ของ ERP เป็น ค.ศ. แล้วบวก 543 อีกรอบ ผู้สอนได้ข้อความว่าโอนวันที่ 14/10/3110
ซ้าย 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ทั้งสี่ข้อคือเส้นแบ่งกับคำ
พูดแบบคนสั่งงาน: แต่ละส่วนของแอปเก็บข้อมูลของตัวเอง ใช้ร่วมกันแค่รหัส (1) เรื่องหนึ่งใช้คำเดียว ทั้งในโค้ด ตาราง หน้าจอ และแชตที่คุณคุยกับ AI (2) กฎที่ต้องจริงเสมออยู่ในที่เดียว และแก้ได้ผ่านทางเข้าเดียว (3) ระบบข้างนอกถูกแปลงเป็นภาษาของเราที่ไฟล์เดียวตรงชายแดน (4) Evans เรียกรวมว่าการออกแบบตามโดเมน บนกระดาน: ค้นคำที่คุณใช้แล้วเจอครบทุกที่ และงานของส่วนหนึ่งไม่ต้องเปิดไฟล์ของอีกส่วน
อยากรู้ตอนมีกระดานใหม่
ทุกหลักสูตรตอนนี้อ่านฟรี ทิ้งอีเมลไว้ แล้วจะส่งให้เฉพาะตอนมีหลักสูตรหรือกระดานใหม่ ไม่มีอย่างอื่น