IT General
เอ้า น้องๆ เคยไหม เวลาทำโปรเจกต์ใหญ่ๆ แล้วเจอปัญหา "เฮ้ย ทำไมเราถึงเลือกใช้เทคโนโลยีนี้วะ?" หรือ "ใครเป็นคนตัดสินใจให้ทำแบบนี้?" แล้วไม่มีใครตอบได้! นั่นแหละ คือปัญหาที่ Software Architecture Decision Records (ADRs) เข้ามาช่วย
ADRs คือบันทึกการตัดสินใจเกี่ยวกับสถาปัตยกรรมซอฟต์แวร์ของเรา เป็นเหมือนสมุดบันทึกส่วนตัวของทีม ที่จดทุกอย่างว่าทำไมเราถึงเลือกทาง A แทนทาง B, ข้อดีข้อเสียของแต่ละทางเลือกคืออะไร, แล้วผลลัพธ์ที่ได้คืออะไร
สมัยผมทำร้านเน็ต SiamCafe Blog ยุคแรกๆ พวกนี้สำคัญมาก เพราะเทคโนโลยีเปลี่ยนเร็วมาก การตัดสินใจผิดพลาดครั้งเดียว อาจทำให้เจ๊งได้เลย!
สถาปัตยกรรมซอฟต์แวร์ คือภาพรวมของระบบเรา ว่ามีส่วนประกอบอะไรบ้าง แต่ละส่วนทำงานร่วมกันยังไง คิดภาพเหมือนแปลนบ้าน ถ้าแปลนบ้านไม่ดี บ้านก็อยู่ไม่สบาย
คือการเลือกวิธีการแก้ปัญหาทางเทคนิค ที่มีผลกระทบต่อสถาปัตยกรรมโดยรวม เช่น จะใช้ฐานข้อมูลแบบไหน, จะเขียน API แบบ REST หรือ GraphQL, จะใช้ Microservices หรือ Monolith
การตัดสินใจที่ดี ต้องอยู่บนพื้นฐานของบริบทที่ถูกต้อง คือต้องเข้าใจปัญหาที่แท้จริง, ข้อจำกัดของโครงการ, และเป้าหมายทางธุรกิจ สมัยผมทำร้านเน็ต เคยเจอเคสที่ลูกค้าอยากได้ระบบสมาชิกที่ซับซ้อนมาก แต่พอถามจริงๆ คือแค่อยากรู้ว่าใครมาเล่นเกมอะไรบ้าง! เสียเวลาทำของยากไปเปล่าๆ เลย
ADRs ไม่ใช่เรื่องยากเย็นอะไร เริ่มง่ายๆ ได้เลยน้อง
เริ่มจากสร้าง template สำหรับบันทึก ADRs ก่อนเลย ใน template ควรมีหัวข้อเหล่านี้
# Title: Use REST for API
## Context
We need to build an API for our mobile app. We have two options: REST and GraphQL.
## Decision
We will use REST for our API.
## Consequences
* **Good:** Simple to implement, well-understood, lots of tooling available.
* **Bad:** Can lead to over-fetching or under-fetching of data.
## Status
Accepted
ทุกครั้งที่มีการตัดสินใจที่สำคัญ ให้บันทึกลงใน ADRs อย่ารอให้ผ่านไปนาน เพราะจะลืมรายละเอียด
เก็บ ADRs ไว้ในที่ที่ทุกคนในทีมเข้าถึงได้ง่าย เช่น ใน Git repository, Confluence, หรือ Google Docs
ADRs ไม่ใช่เครื่องมือเดียวที่มีอยู่ ยังมีทางเลือกอื่นอีก แต่ละทางเลือกก็มีข้อดีข้อเสียต่างกัน
| เครื่องมือ | ข้อดี | ข้อเสีย |
|---|---|---|
| ADRs | บันทึกการตัดสินใจอย่างเป็นระบบ, ช่วยให้เข้าใจที่มาที่ไป | ต้องใช้ความพยายามในการบันทึก |
| เอกสารประกอบโครงการ (Project Documentation) | ครอบคลุมทุกอย่างในโครงการ | อาจจะไม่ละเอียดเท่า ADRs, หายาก |
| Wiki | แก้ไขง่าย, ทุกคนช่วยกันสร้างได้ | อาจจะไม่เป็นระบบ, ข้อมูลกระจัดกระจาย |
| การพูดคุย (Verbal Communication) | รวดเร็ว | ไม่มีหลักฐาน, ลืมง่าย |
สรุปแล้ว ADRs เหมาะสำหรับโครงการที่ต้องการความโปร่งใส, ต้องการบันทึกเหตุผลในการตัดสินใจ, และต้องการให้ทีมเข้าใจสถาปัตยกรรมของระบบ
ถ้าใครสนใจเรื่อง IT สมัยก่อน หรือเรื่องราวร้านเน็ตคาเฟ่ในยุคบุกเบิก ลองแวะมาอ่านที่ SiamCafe Blog ได้นะครับ มีเรื่องเล่าสนุกๆ อีกเยอะเลย
เอาล่ะน้องๆ หลังจากที่เราคุยกันเรื่อง Software Architecture Decision Records (ADRs) กันไปแล้ว คราวนี้มาดู Best Practices หรือเคล็ดลับที่พี่เจอมากับตัวตอนทำร้านเน็ต SiamCafe สมัยก่อนกันดีกว่า บอกเลยว่ายุคนั้นไม่มีใครสอน ต้องคลำทางเอง เจ็บจริง ถึงรู้จริง!
ADRs เนี่ย มันเหมือนคู่มือการเดินทางของโปรเจกต์เรา ถ้าทำดีๆ มันจะช่วยลดปัญหาที่จะเกิดในอนาคตได้เยอะมากๆ ไม่ว่าจะเป็นเรื่องการ maintain, การ scale หรือแม้แต่การ onboard ทีมงานใหม่ๆ
สมัยพี่ทำร้านเน็ต จำได้เลยว่า code มันซับซ้อนมากๆ เพราะตอนนั้นอยากโชว์เทพ ใส่ทุกอย่างที่เรียนมา แต่ผลคือ พอมีปัญหา แก้เองยังงง! ADRs ก็เหมือนกัน พยายามเขียนให้เข้าใจง่ายที่สุด ใช้ภาษาที่คนทั่วไปอ่านแล้วเข้าใจ ไม่ต้องใช้ศัพท์เทคนิคเยอะแยะ
# Bad Example
ตัดสินใจใช้ Microservices Architecture เพราะดูเท่และ scale ได้
# Good Example
ตัดสินใจใช้ Microservices Architecture เพื่อให้แต่ละส่วนของระบบสามารถพัฒนาและ deploy แยกกันได้ ทำให้ทีมสามารถทำงานได้เร็วขึ้น และลดผลกระทบเมื่อมีปัญหาเกิดขึ้นในแต่ละส่วน
สำคัญมากๆ! อย่าแค่บอกว่า "ตัดสินใจใช้ Docker" แต่ต้องบอกว่า "ทำไมถึงใช้ Docker" เช่น "เพื่อทำให้ environment ของ development, staging และ production เหมือนกัน ลดปัญหา 'มันทำงานบนเครื่องผมนะ' ได้" การบันทึกเหตุผล จะช่วยให้คนรุ่นหลังเข้าใจ Context และตัดสินใจได้ดีขึ้น
# Bad Example
ตัดสินใจใช้ Docker
# Good Example
ตัดสินใจใช้ Docker เพื่อ containerize application ทำให้ง่ายต่อการ deploy และจัดการ environment ลดปัญหา dependencies และ ensure consistency across different environments
ADRs ไม่ใช่เอกสารที่เขียนครั้งเดียวแล้วจบ ต้องมีการ Review และ Update อยู่เสมอ โดยเฉพาะเมื่อมีการเปลี่ยนแปลง requirements หรือ technology สมัยก่อนพี่ไม่ได้ทำตรงนี้ พอ code เปลี่ยน ADRs ไม่ Update กลายเป็นว่า ADRs ไม่มีความหมาย
ลองนึกภาพว่าเรามีแผนที่ แต่แผนที่นั้นไม่ได้ถูกปรับปรุงตามการเปลี่ยนแปลงของถนนหนทาง สุดท้ายเราก็อาจจะหลงทางได้ ADRs ก็เหมือนกัน ต้อง Update ให้ทันสมัยอยู่เสมอ
การใช้ Template จะช่วยให้ ADRs มีรูปแบบที่สม่ำเสมอ ทำให้ง่ายต่อการอ่านและทำความเข้าใจ ลองหา Template ที่เหมาะกับทีมเรา แล้วปรับให้เข้ากับ workflow ของเรา
พี่เคยเจอ ADRs ที่แต่ละคนเขียนไม่เหมือนกันเลย บางอันยาวเป็นหน้ากระดาษ บางอันสั้นแค่ 2 บรรทัด สุดท้ายก็ไม่มีใครอยากอ่าน เพราะมันไม่ consistent เลย
จำเป็น! ถึงแม้โปรเจกต์จะเล็ก แต่การบันทึกการตัดสินใจ ก็ยังเป็นประโยชน์ในการ maintain และ onboard ทีมงานใหม่ๆ ยิ่งโปรเจกต์เล็ก ยิ่งใช้เวลาน้อยในการทำ ADRs
ควรเก็บไว้ใน Source Control (เช่น Git) คู่กับ code ของเรา เพื่อให้ทุกคนในทีมสามารถเข้าถึงได้ง่าย และสามารถ Track การเปลี่ยนแปลงได้
ทุกคนในทีมควรมีส่วนร่วมในการเขียน ADRs แต่ส่วนใหญ่จะเป็น Technical Lead หรือ Senior Developer ที่มีประสบการณ์ และเข้าใจภาพรวมของระบบ
ละเอียดเท่าที่จำเป็น! ไม่ต้องเขียนทุกอย่าง แต่ให้เน้นที่การบันทึกเหตุผลในการตัดสินใจ และผลกระทบที่อาจเกิดขึ้น
ADRs เป็นเครื่องมือที่มีประโยชน์มากๆ ในการจัดการ Software Architecture แต่สิ่งสำคัญคือ ต้องทำอย่างสม่ำเสมอ และปรับให้เข้ากับ workflow ของทีมเรา อย่ามองว่ามันเป็นภาระ แต่มองว่ามันเป็นการลงทุนเพื่ออนาคตของโปรเจกต์เรา
สมัยพี่ทำร้านเน็ต ถ้ามี ADRs คงไม่ต้องปวดหัวกับการแก้ปัญหา code ที่ตัวเองเขียนเมื่อ 3 ปีก่อนแน่ๆ! ลองเอาไปปรับใช้กันดูนะครับน้องๆ
อย่าลืมแวะไปอ่านบทความอื่นๆ ที่ SiamCafe Blog นะครับ แล้วก็ถ้าใครสนใจเรื่อง Forex ลองดูที่ iCafeForex ได้เลย