DRY principle vs WET
DRY ย่อมาจาก Don’t repeat yourself เป็นหลักการในการพัฒนา software ที่ว่าด้วยเรื่องที่ ให้เราพยายามอย่าทำอะไรซ้ำๆ ซึ่งจะตรงข้ามกับ WET principle ที่ย่อมาจาก Write Everything Twice
แต่เมื่อเราพิจารณาให้ดีก็จะรู้ว่า Principle ไม่ได้เป็นแนวทางบังคับให้ต้องปฏิบัติตามแบบไม่ลืมหูลืมตา เอาแค่เรื่อง DRY ที่โดยปกติเวลาคนคิดถึงเรื่องอย่าทำอะไรซ้ำๆ เรามักจะคิดอยู่แค่เรื่อง Logic แล้วจะมีอีกคำยอดนิยม “reuse” มาคู่กัน
นั่นเพราะเราโฟกัสอยู่แค่เรื่องที่ว่า การทำซ้ำคือเรื่อง logic เราจึงคิดอยู่แค่ว่า ถ้ามีงานส่วนไหนที่สามารถแยกไปทำงานอิสระได้ แล้วสามารถ reuse ได้ เราจะประสบความสำเร็จในด้านการออกแบบ
แต่หลายครั้งผมพบว่า ยิ่งเราพยายาม reuse สิ่งไหนมากๆ ที่เราเชื่อว่า เราจะไม่ต้องทำสิ่งนั้นซ้ำแล้วมากเท่าไร เราจะไปเจอกับบางอย่างที่เราจะยิ่งต้องทำมันซ้ำๆหนักขึ้น สวนทางกัน สิ่งนั้นคือ process
ผมยกตัวอย่างเช่น เดิมเรามี API อยู่ตัวหนึ่ง ทำหน้าที่สร้าง user แต่ก่อนจะสร้าง user ได้ จะต้องนำเลขเบอร์มือถือไปตรวจสอบกับอีกระบบหนึ่งก่อน วันหนึ่งเราเลยแยกส่วนที่ใช้ตรวจสอบเบอร์มือถือออกไปเป็น API ตัวใหม่ เนื่องจากมีระบบอีกต้องการจะตรวจสอบเบอร์มือถือด้วยเช่นกัน สมมุติเป็นระบบจ่ายค่ารายเดือนให้เบอร์อื่น
วันหนึ่งระบบจ่ายค่ารายเดือนให้เบอร์อื่นต้องการให้สามารถตรวจสอบเบอร์จากต่างประเทศได้ ในขณะที่ระบบเดิมซึ่งคือระบบสร้าง user ไม่ได้มีความต้องการเดียวกัน แต่ทางระบบปลายทางขอว่า จะต้องทำการส่ง flag มาเพื่อให้แยกว่า ตอนนี้ระบบไหนต้องการใช้ API นี้ด้วย นั่นทำให้ทุกระบบจะต้องแก้ API ของตัวเอง
วันหนึ่งระบบสร้าง user มีความต้องการให้ระบบตรวจสอบเบอร์มือถือ จะต้องตรวจสอบด้วยวิธีการที่รัดกุมขึ้น ในขณะที่ระบบจ่ายค่ารายเดือนให้เบอร์อื่น ไม่ได้ต้องการใช้สิ่งนี้ด้วย ทางระบบตรวจสอบเบอร์มือถือ ก็ได้ทำการแก้ไขให้เรียบร้อย
ถ้าเรากลับมาดูระบบตรวจสอบเบอร์มือถือ ในวันนี้ เทียบกับตอนที่มันเกิดขึ้นมาใหม่ๆ เราจะเห็นว่า มันมาไกลมาก มันไม่ใช่ API ที่ reuse ได้จริงๆแล้ว แต่มันถูก custom ให้แต่ละระบบ ที่มีความต้องการเฉพาะของตัวเอง แต่ผลัก business logic ของตัวเองมากองรวมไว้ที่ระบบตรวจสอบเบอร์มือถือนี่แทน และมันเริ่มห่างไกลจากการเป็นระบบกลางเข้าไปทุกที
ถ้าวันหนึ่ง ระบบตรวจสอบเบอร์มือถือ เกิดการเปลี่ยนแปลงเช่น จำนวนเลขเบอร์มือถือเพิ่มขึ้นอีก 1 digit และถ้าวันนั้น ระบบจ่ายค่ารายเดือนให้เบอร์อื่น เริ่มใกล้จะหมดวาระแล้ว และเบอร์ทั้งหมดที่ทำงานอยู่ ไม่จำเป็นต้องเพิ่ม 1 digit ก็ยังทำงานได้ดี แต่เมื่อต้องเปลี่ยน ทุกระบบก็ต้องเปลี่ยนเหมือนกัน
ตัวอย่างนี้ คือเรา DRY ที่ logic แต่ไปสร้าง Work Everythig Twice(WET) ขึ้นมาแทน
ส่วนตัวผมแค่ชอบที่จะแยกทุกงานให้เหมาะกับตัวมันเองมากกว่า เพราะผมแค่เชื่อว่า ทุกอย่างมันจะเติบโตขึ้น ในทางของตัวมันเอง จนวันหนึ่ง อัตลักษณ์ของมันจะไม่เหมือนใคร 100% และมันจะทำให้เราต้องเหนื่อยมากขึ้นกว่าเดิมมากโดยเปล่าประโยชน์
เรื่องนี้เป็นเพียงความคิดเห็นส่วนตัวนะครับ