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