Build The Seam On Day One
การสร้างแพลตฟอร์มสำหรับข้อมูลปริมาณมหาศาลทำให้คุณต้องตัดสินใจเลือก
คุณต้องการฐานข้อมูลที่รวดเร็วสำหรับการจัดเก็บข้อมูลในระยะยาว แต่การตั้งค่าระบบที่ซับซ้อนตั้งแต่วันแรกนั้นเป็นเรื่องยาก คุณอาจจะยังไม่รู้รูปแบบข้อมูล (data patterns) ของคุณด้วยซ้ำ ทางเลือกที่ปลอดภัยคือการใช้ฐานข้อมูลเชิงสัมพันธ์ (relational database) มาตรฐานที่คุณใช้อยู่แล้ว
ข้อผิดพลาดคือการผูกโค้ดของคุณเข้ากับฐานข้อมูลแรกนั้นโดยตรง หากทุกส่วนของแอปพลิเคชันเรียกใช้งานฐานข้อมูลโดยตรง คุณกำลังสร้างกับดักให้ตัวเอง เพราะการเปลี่ยนไปใช้ฐานข้อมูลที่ดีกว่าในภายหลังจะต้องใช้การ Refactor ครั้งใหญ่
วิธีที่ถูกต้องคือการสร้าง Seam ขึ้นมา
Seam คือสัญญา (contract) มันกำหนดว่าระบบต้องทำอะไร โดยไม่บอกว่าต้องทำอย่างไร
- สร้าง Interface สำหรับงานนั้นๆ
- เขียน Driver พื้นฐานโดยใช้ฐานข้อมูลปัจจุบันของคุณ
- ผูก Driver นั้นเข้ากับ Interface
ส่วนอื่นๆ ทั้งหมดของแอปพลิเคชันจะสื่อสารผ่าน Interface เท่านั้น โดยไม่มีใครรู้ว่ามีฐานข้อมูลใดทำงานอยู่เบื้องหลัง
เมื่อข้อมูลของคุณเติบโตขึ้นและคุณต้องการระบบที่เร็วขึ้น งานนี้จะกลายเป็นเรื่องง่าย คุณแค่เขียน Driver ตัวใหม่ เปลี่ยนโค้ดเพียงบรรทัดเดียว แล้วก็ Deploy ได้เลย โดยที่ Dashboard จะไม่พัง และ Pipeline จะไม่หยุดชะงัก
บางคนเรียกสิ่งนี้ว่าการทำ Abstraction ที่เร็วเกินไป (premature abstraction) พวกเขาบอกว่าคุณยังไม่จำเป็นต้องทำมันตอนนี้
ผมไม่เห็นด้วย การมี Interface เพิ่มขึ้นมาแลกด้วยไฟล์เพียงไฟล์เดียว แต่การข้ามมันไปก็เป็นเพียงการเลื่อนภาระค่าใช้จ่ายไปไว้ในอนาคต เมื่อถึงเวลาที่คุณต้องเปลี่ยนจริงๆ คุณจะต้องตามแก้ไฟล์นับร้อยภายใต้ความกดดัน การมี Interface จึงเปรียบเสมือนการทำประกันราคาถูก
ใช้ 3 นิสัยนี้เพื่อให้ Seam ของคุณแข็งแกร่งยิ่งขึ้น:
ใช้ตัวระบุสองแบบ (dual identifiers): ใช้ Integer ที่ทำงานได้รวดเร็วสำหรับการทำ Join ภายในฐานข้อมูล และใช้ UUID สำหรับข้อมูลใดก็ตามที่ส่งออกไปนอกระบบ วิธีนี้จะช่วยให้ข้อมูลของคุณปลอดภัยและทำให้การ Join ทำได้อย่างรวดเร็ว
ใช้ Enum สำหรับคำศัพท์ที่ใช้ร่วมกัน: อย่าใช้ String แบบสุ่มสำหรับสถานะ (status) หรือระดับความรุนแรง (severity) ให้ใช้ Enum ชุดเดียวเพื่อให้ทุกส่วนของแอปพลิเคชันสื่อสารด้วยภาษาเดียวกัน
ใช้ Versioned Envelopes สำหรับข้อมูล: หากระบบของคุณรับข้อมูลจากหลายแหล่ง ให้ใช้ Schema ที่เข้มงวด ให้เพิ่มเฉพาะฟิลด์ใหม่เท่านั้น ห้ามลบหรือเปลี่ยนชื่อฟิลด์เดิมโดยไม่มีการออกเวอร์ชันใหม่ วิธีนี้จะช่วยให้ Client เวอร์ชันเก่าสามารถทำงานต่อไปได้ในขณะที่คุณกำลังพัฒนาระบบ
หาขอบเขต (boundary) ให้เจอ กำหนดชื่อมันด้วยสัญญา (contract) และเติมเต็มมันด้วยการ Implementation แบบง่ายๆ
สัญญาคือคำมั่นสัญญาของคุณ ส่วน Driver เป็นเพียงวิธีการที่คุณรักษาคำมั่นสัญญานั้นในวันนี้
Source: https://dev.to/nasrulhazim/build-the-seam-on-day-one-the-second-driver-on-day-ninety-26b
