Korat
สถาปัตยกรรม

ติดตั้งโมดูลเสริมเฉพาะที่ร้านใช้ ถอนออกทีหลังได้

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

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

โมดูลหนึ่งตัว ให้อะไรร้านบ้าง

โมดูลหนึ่งประกาศของชุดหนึ่งที่ตายตัว แล้วแอปประกอบทุกอย่างที่เหลือขึ้นมาจากนั้น มันให้ id ให้ประเภทธุรกิจที่มันรับผิดชอบ ซึ่งเป็นตัวตัดสินว่าโมดูลนี้ใช้กับร้านหนึ่งๆ ไหม ให้ป้ายชื่อและหัวข้อแคตตาล็อก ให้ปุ่มหลัก ซึ่งเป็นปุ่มเดียวที่หน้าเพจฝั่งลูกค้านำหน้าด้วย และให้หน้าแคตตาล็อก ซึ่งคือเมนูสำหรับอาหาร ประเภทห้องสำหรับที่พัก บริการสำหรับคลินิก และสินค้าสำหรับค้าปลีก

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

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

โมดูลหลักสี่ตัว มาตามประเภทธุรกิจที่เลือก

โมดูลหลักสี่ตัวไม่ใช่ส่วนเสริมเลย แต่มันคือความหมายของประเภทธุรกิจ Food รับผิดชอบร้านอาหารและคาเฟ่ Stay รับผิดชอบที่พัก โรงแรม รีสอร์ต อพาร์ตเมนต์ คอนโด และหมู่บ้าน หกป้ายชื่อ โมดูลเดียว เพราะการเช่าคอนโดกับการนอนเกสต์เฮาส์หนึ่งคืนต่างกันที่คำเรียก ไม่ใช่ต่างกันที่กลไก Service รับผิดชอบบริการและคลินิก โดยเวอร์ชันคลินิกเปลี่ยนคำเรียกในหน้าจอเป็นนัดหมาย คนไข้ และคอร์สรักษา โดยไม่ต้องแยกโค้ดออกไปอีกชุด ส่วน Retail รับผิดชอบค้าปลีก

เพราะสิ่งเหล่านี้เป็นโมดูล ไม่ใช่กิ่ง if ที่ซ่อนอยู่ในหน้าจอยักษ์หน้าเดียว จอครัวและกลุ่มตัวเลือกของโมดูล Food จึงไม่มีอยู่จริงสำหรับโรงแรม ไม่ใช่ซ่อนไว้หลังแฟล็ก ไม่ใช่ปิดการใช้งาน แต่ไม่มีอยู่ พื้นที่หน้าจอที่ร้านหนึ่งเห็นเป็นฟังก์ชันของสิ่งที่ร้านนั้นประกาศว่าตัวเองเป็น

ปลั๊กอินร้านค้าเจ็ดตัว ติดตั้งเพิ่มได้ทุกประเภทธุรกิจ

บนโมดูลหลักมีส่วนเสริมวางอยู่เจ็ดตัว ซึ่งใช้ได้ทุกตัวไม่ว่าธุรกิจจะเป็นประเภทไหน สิทธิ์ของทีม เป็นตัวที่น่าสนใจที่สุด เพราะมันสร้างขึ้นจากโมดูลตัวอื่น มันประกอบหน้าจอแก้ไขสิทธิ์ขึ้นมาจาก capability ที่โมดูลซึ่งติดตั้งอยู่ทุกตัวประกาศไว้ การติดตั้งโมดูลใหม่จึงได้สิทธิ์ของมันเข้ามาในหน้าแก้ไขเลย โดยไม่ต้องมีใครไปตามอัปเดตรายการ

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

ติดตั้งและถอนออก แยกรายร้าน ข้อมูลไม่หาย

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

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

สิ่งที่ปลั๊กอินร้านค้ายังทำไม่ได้

ปลั๊กอินจากบุคคลที่สามยังไม่เปิด และตัว Plugin Store เองก็เขียนบอกไว้ แทนที่จะบอกเป็นนัยผ่านชั้นวางเปล่าที่เขียนว่า "เร็วๆ นี้" สิ่งที่มีอยู่จริงวันนี้คือสถาปัตยกรรมแบบโมดูลที่มีสัญญาของจริง มีโมดูลหลักสี่ตัวและส่วนเสริมของทีมเราเองเจ็ดตัวที่เขียนตามสัญญานั้น และทั้งหมดโหลดผ่านเส้นทางการลงทะเบียนเดียวกัน การเปิดรับจากบุคคลที่สามคือขั้นถัดไปที่ประกาศไว้ ไม่ใช่ตลาดกลางที่เปิดอยู่แล้ว ยังไม่มีพอร์ทัลนักพัฒนา ไม่มีคิวตรวจสอบ และไม่มี SDK ที่เผยแพร่ออกไป

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

ทำไมเป็นโมดูล ไม่ใช่สวิตช์เปิดปิดฟีเจอร์

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

มันยังจำกัดต้นทุนของการเพิ่มธุรกิจแนวใหม่ด้วย การเพิ่มประเภทธุรกิจที่ Korat ยังไม่รองรับคือการเขียนโมดูลหนึ่งตัว ประกาศประเภทที่มันรับผิดชอบ แคตตาล็อก ปุ่มหลัก และช่องทางเลือกเท่าที่ต้องใช้ โดยไม่ต้องแตะคอนโซล ตัวเรนเดอร์หน้าเพจ หรือระบบสิทธิ์เลย นี่แหละคือสิ่งที่ทำให้ซูเปอร์แอปหนึ่งตัวยังจัดการไหว แทนที่จะค่อยๆ กลายเป็นกองเคสพิเศษที่พอกขึ้นเรื่อยๆ

ยังไม่มีตลาดกลางปลั๊กอินจากบุคคลที่สาม ทุกอย่างที่ติดตั้งได้ในวันนี้เป็นของทีมเราเองทั้งหมด และร้านค้าในแอปก็เขียนบอกไว้แบบนั้น การเปิดรับจากบุคคลที่สามคือขั้นถัดไปที่ประกาศไว้ ตอนนี้ยังไม่มีพอร์ทัลนักพัฒนาและยังไม่มี SDK ที่เผยแพร่ให้เขียนตาม

นอกจากนี้โค้ดของปลั๊กอินยังถูกแพ็กไปกับ APK ทั้งหมด แทนที่จะโหลดแยกรายปลั๊กอินตอนใช้งาน นี่เป็นข้อจำกัดที่เรารู้อยู่ และเป็นเงื่อนไขที่ต้องแก้ก่อนอย่างชัดเจน ถ้าจะเปิดร้านค้าให้คนนอกโครงการเข้ามา

สิ่งที่ต้องประกาศ
id · ประเภทธุรกิจที่รับผิดชอบ · ป้ายชื่อ · หัวข้อแคตตาล็อก · ปุ่มหลัก · หน้าแคตตาล็อก
สิ่งที่ประกาศหรือไม่ก็ได้
capability · ไทล์คอนโซล · หน้าจอคอนโซล · ส่วนบนหน้าเพจฝั่งลูกค้า
โมดูลหลัก
Food · Stay · Service · Retail
ส่วนเสริม
สิทธิ์ของทีม · ช่องทางชำระเงิน · สมาชิกและแพ็กเกจต่ออายุ · การเตือนต่ออายุ · โปรเจกต์และงาน · คลังวัตถุดิบและการผลิต · ระบบอัตโนมัติ
ขอบเขตการติดตั้ง
แยกรายร้าน
การถอนการติดตั้ง
มีกล่องยืนยันที่ระบุว่าข้อมูลจะไม่ถูกลบ
บุคคลที่สาม
ยังไม่เปิด — มีเฉพาะส่วนเสริมของทีมเราเอง

คำถามที่พบบ่อย

ฉันเขียนปลั๊กอินให้ Korat ได้ไหม

ยังไม่ได้ สัญญาของโมดูลมีอยู่จริงและส่วนเสริมที่ติดตั้งได้ทั้งเจ็ดตัวก็เขียนตามสัญญานั้น แต่การส่งงานจากบุคคลที่สามยังไม่เปิด ยังไม่มีพอร์ทัลนักพัฒนา ไม่มีกระบวนการตรวจสอบ และไม่มี SDK ที่เผยแพร่ออกไป

ร้านค้าในแอปเขียนบอกเรื่องนี้ไว้ตรงๆ แทนที่จะโชว์ชั้นวางเปล่าที่บอกเป็นนัยว่ามี

ถ้าถอนการติดตั้งส่วนเสริม ข้อมูลของฉันจะเป็นอย่างไร

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

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

ต้องเลือกประเภทธุรกิจครั้งเดียวแล้วเปลี่ยนไม่ได้เลยไหม

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

ส่วนเสริมทั้งเจ็ดตัวไม่ขึ้นกับประเภท ธุรกิจไหนก็ติดตั้งตัวไหนก็ได้

สิทธิ์ของโมดูลไปโผล่ในหน้าแก้ไขบทบาทได้อย่างไร

ส่วนเสริมสิทธิ์ของทีมสร้างหน้าแก้ไขขึ้นมาด้วยการถามโมดูลที่ติดตั้งไว้ทุกตัวว่าประกาศ capability อะไรบ้าง แทนที่จะอ่านจากรายการหลักที่ต้องคอยดูแลด้วยมือ

นี่คือเหตุผลที่พอติดตั้งโมดูลใหม่ คุณก็ได้สิทธิ์ของมันมาให้มอบหมายทันที และเป็นเหตุผลที่รายการนั้นเก่าไม่ได้

โมดูลหน้าตาต่างจากส่วนอื่นของแอปไหม

ไม่ควรต่าง ชุด UI กลางเป็นตัวจ่ายปุ่ม CTA หลัก แถวแคตตาล็อก ชิป ป้ายหัวข้อ และหน้าจอสถานะว่าง แล้วโมดูลก็สร้างจากของชุดนั้น

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

ดูโมดูลทำงานจริง

สร้างธุรกิจ เลือกประเภทของมัน แล้วคอนโซลจะประกอบตัวเองขึ้นมาจากโมดูลที่รับผิดชอบประเภทนั้น