โมดูลคือคำตอบของ 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
- ส่วนเสริม
- สิทธิ์ของทีม · ช่องทางชำระเงิน · สมาชิกและแพ็กเกจต่ออายุ · การเตือนต่ออายุ · โปรเจกต์และงาน · คลังวัตถุดิบและการผลิต · ระบบอัตโนมัติ
- ขอบเขตการติดตั้ง
- แยกรายร้าน
- การถอนการติดตั้ง
- มีกล่องยืนยันที่ระบุว่าข้อมูลจะไม่ถูกลบ
- บุคคลที่สาม
- ยังไม่เปิด — มีเฉพาะส่วนเสริมของทีมเราเอง