เกี่ยวกับสถาปัตยกรรม
ปัญหา
โดยปกติ การคุยเรื่องสถาปัตยกรรมจะเกิดขึ้นเมื่อการพัฒนาเริ่มหยุดชะงักเพราะปัญหาบางอย่างในโปรเจกต์
Bus-factor & การ Onboarding
มีคนจำนวนจำกัดที่เข้าใจโปรเจกต์และสถาปัตยกรรมของมัน
ตัวอย่าง:
- "ยากมากที่จะเพิ่มคนเข้ามาช่วยพัฒนา"
- "สำหรับทุกปัญหา ทุกคนมีความเห็นคนละทางว่าจะเลี่ยงยังไง" (แอบอิจฉา Angular นิดๆ นะ)
- "ไม่เข้าใจเลยว่าเกิดอะไรขึ้นในก้อน Monolith ใหญ่นี้"
ผลกระทบที่แฝงอยู่และควบคุมไม่ได้
มี Side effects แฝงเยอะมากระหว่างการพัฒนา/Refactoring ("ทุกอย่างขึ้นอยู่กับทุกอย่าง")
ตัวอย่าง:
- "Feature นี้ Import Feature นั้น"
- "อัปเดต Store ของหน้านึง อีกหน้านึงพังเฉย"
- "Logic กระจายไปทั่วแอป ตามหาไม่เจอเลยว่าเริ่มตรงไหน จบตรงไหน"
การ Reuse Logic ที่ควบคุมไม่ได้
ยากที่จะนำกลับมาใช้ใหม่/แก้ไข Logic ที่มีอยู่
ในขณะเดียวกัน มักจะมี สองขั้วที่สุดโต่ง:
- เขียน Logic ใหม่หมดสำหรับแต่ละ Module (ทำให้มีโค้ดซ้ำซ้อนใน Codebase)
- หรือมีแนวโน้มที่จะยัดทุก Module ลงในโฟลเดอร์
sharedจนกลายเป็นถังขยะใหญ่ๆ (ซึ่งส่วนใหญ่ถูกใช้แค่ที่เดียว)
ตัวอย่าง:
- "ฉันมี Business Logic เดียวกัน N แบบในโปรเจกต์ ซึ่งฉันก็ต้องจ่ายค่าดูแลมันทั้งหมด"
- "มี Component ปุ่ม/Pop-up/... 6 แบบในโปรเจกต์"
- "กองขยะของ Helpers"
ความต้องการ (Requirements)
ดังนั้น ดูเหมือนจะเป็นเหตุเป็นผลที่จะนำเสนอ ความต้องการที่พึงประสงค์สำหรับสถาปัตยกรรมในอุดมคติ:
note
ที่ไหนที่บอกว่า "ง่าย" หมายถึง "ค่อนข้างง่ายสำหรับนักพัฒนากลุ่มกว้าง" เพราะชัดเจนว่า เป็นไปไม่ได้ที่จะทำ Solution ที่สมบูรณ์แบบสำหรับทุกคนครับ
ความชัดเจน (Explicitness)
- ควรจะ ง่ายต่อการเชี่ยวชาญและอธิบาย โปรเจกต์และสถาปัตยกรรมให้ทีมเข้าใจ
- โครงสร้างควรสะท้อน คุณค่าทางธุรกิจของโปรเจกต์ จริงๆ
- ต้องมี Side effects และความเชื่อมโยง ระหว่าง Abstractions ที่ชัดเจน
- ควรจะ ง่ายต่อการตรวจจับ Logic ที่ซ้ำซ้อน โดยไม่รบกวนการ Implement ที่เป็นเอกลักษณ์
- ไม่ควรมีการ กระจัดกระจายของ Logic ไปทั่วโปรเจกต์
- ไม่ควรมี Abstractions และกฎที่หลากหลายเกินไป สำหรับสถาปัตยกรรมที่ดี
การควบคุม (Control)
- สถาปัตยกรรมที่ดีควร เร่งความเร็วในการแก้โจทย์ และการเพิ่มฟีเจอร์
- ควรจะเป็นไปได้ที่จะควบคุมการพัฒนาของโปรเจกต์
- ควรจะง่ายที่จะ ขยาย, แก้ไข, ลบโค้ด
- ต้องรักษา การแยกส่วนและการ Decompose ของฟังก์ชันการทำงาน
- แต่ละ Component ของระบบต้อง แทนที่ได้และลบออกได้ง่าย
- ไม่ต้อง Optimize เพื่อการเปลี่ยนแปลง - เราทำนายอนาคตไม่ได้
- Optimize เพื่อการลบดีกว่า - โดยอิงจากบริบทที่มีอยู่แล้ว
การปรับตัว (Adaptability)
- สถาปัตยกรรมที่ดีควรนำไปใช้ได้ กับโปรเจกต์ส่วนใหญ่
- กับ Infrastructure Solutions ที่มีอยู่
- ในทุกขั้นตอนของการพัฒนา
- ไม่ควรยึดติดกับ Framework และ Platform
- ควรจะเป็นไปได้ที่จะ สเกลโปรเจกต์และทีมได้ง่าย และสามารถพัฒนาแบบขนานกันได้
- ควรจะง่ายที่จะ ปรับตัวตาม Requirement และสถานการณ์ที่เปลี่ยนไป