ทุกคนคุ้นชินกับ Functional Requirement กันอยู่แล้ว ซึ่งมันจะบอกว่า ระบบทำอะไรได้ (What)
แต่ Architecture Characteristics จะเป็นตัวที่บอกว่าระบบจะทำงานได้ดีแค่ไหน (How Well)
เปรียบเทียบก็เหมือนกับเราจะซื้อรถยนต์ Functional คือ รถต้องวิ่งได้ มี 4 ล้อ แอร์เย็น (ทุกคันทำได้เหมือนกัน)
แต่ Characteristics คือ รถคันนี้ประหยัดน้ำมันไหม (Performance/Cost), ปลอดภัยชนแล้วถุงลมกางไหม (Security/Reliability), หรือซ่อมง่ายหาอะไหล่ตามอู่ทั่วไปได้ไหม (Maintainability)
Architecture Characteristics (บางทีเรียก Quality Attributes หรือ NFR in architecture level) คือ คุณสมบัติของระบบที่สถาปัตยกรรมต้องรองรับ เพื่อให้ระบบอยู่ได้จริงใน production
มันคือคำที่ “ลึกกว่า NFR ทั่วไป” เพราะใช้เป็นตัวตัดสิน architecture design เลย
Characteristics ที่นิยมใช้
เราสามารถแบ่งออกมาได้เป็น 2 กลุ่มใหญ่ๆ คือ
1.ฝั่ง Operational (ขณะระบบทำงาน)
- Performance: ระบบต้องตอบสนองไว (เช่น โหลดหน้าเว็บใน 1 วินาที)
- Scalability: รองรับคนใช้งานเพิ่มขึ้นจาก 1,000 เป็น 100,000 คนพร้อมกันได้
- Availability: ระบบต้องเปิดตลอดยี่สิบสี่ชั่วโมง ห้ามล่ม (เช่น ระบบธนาคาร)
- Security: ป้องกันข้อมูลรั่วไหล และควบคุมสิทธิ์คนใช้งาน
2.ฝั่ง Structural (โครงสร้างหลังบ้าน/การพัฒนา)
- Maintainability: โค้ดอ่านง่าย แก้ไขบั๊กหรือปรับปรุงได้เร็ว ไม่กระทบส่วนอื่น
- Testability: เขียนเทสอัตโนมัติได้ง่าย มั่นใจได้ว่าแก้โค้ดแล้วระบบไม่พัง
- Deployability: เอาโค้ดใหม่ขึ้นระบบได้บ่อยและปลอดภัย (ทำ CI/CD ง่าย)
เราจะหา Characteristics เจอได้ยังไง
เรามีหลากหลายวิธีในการค้นหา บางตัวลูกค้าจะเดินมาบอกเราตรงๆ (Explicit) เช่น ขอระบบเร็วๆ ไม่ล่ม แต่บางครั้งลูกค้าจะไม่พูดออกมา แต่ถ้าเราไม่ทำระบบจะมีปัญหาแน่ (Implicit) เช่น ระบบห้ามโดนแฮก, ห้ามล้ม เป็นต้น
Explicit vs. Implicit Characteristics
Explicit Characteristics ถูกเขียนหรือระบุไว้อย่างเป็นลายลักษณ์อักษรในความต้องการทางธุรกิจ (Requirements) หรือ ได้มาจากการพูดคุยกับผู้มีส่วนได้ส่วนเสีย (Stakeholders) โดยตรง มันจะจับต้องได้ และ มักจะมีตัวเลขชี้วัด (Metrics) ที่ชัดเจน
ลักษณะเด่น: มีระบุในเอกสารชัดเจน
ตัวอย่าง:
- Performance: ระบบต้องรองรับการกดจ่ายเงินและตอบกลับภายใน 2 วินาที
- Scalability: ระบบต้องรองรับผู้ใช้งานพร้อมกัน 50,000 คนในช่วงแคมเปญ 11.11
- Availability: ระบบต้องเปิดใช้งานได้ 99.99% (ล่มได้ไม่เกิน 52 นาทีต่อปี)
Implicit Characteristics ไม่มีใครเขียนบอกไว้ในความต้องการ แต่ในฐานะ Engineer สิ่งนี้ "จำเป็นต้องทำ" เพราะมัน คือ มาตรฐานขั้นต่ำที่ระบบที่ดีต้องมี
หากไม่มีข้อเหล่านี้ แม้ระบบจะทำงานได้ตามโจทย์ แต่ก็อาจสร้างความเสียหายร้ายแรงในอนาคต
ลักษณะเด่น: ลูกค้า หรือ ฝ่าย business มักจะไม่พูดถึง (เพราะเขาคิดว่าเราต้องทำให้อยู่แล้ว) Engineer ต้องเป็นคนดึงมันออกมาเอง
เลือกแต่ละตัวลง domain ยังไง
การเลือกว่าแต่ละ domain ควรจะให้ความสำคัญเรื่องไหนบ้างนั้น ขึ้นอยู่กับแต่ละ domain เลย เพราะแต่ละ domain อาจให้ความสำคัญแต่ละเรื่องไม่เท่ากัน
เช่น
- payments: ให้ความสำคัญเรื่อง Availability, Security
ถ้าหากเราไม่รู้ว่าจะเลือกยังไง มี 3 คำถามขั้นต่ำที่ต้องตอบให้ได้
1. Value สูงสุดของ Domain นี้ ในเชิงธุรกิจ คือ อะไร?
- ความน่าเชื่อถือของตัวเลขเงิน เลือก Security / Reliability
- ความเร็วในการส่งของให้ลูกค้า เลือก Performance
2. ถ้าสิ่งนี้พังหรือไม่มี ธุรกิจจะเจ๊งทันทีใช่หรือไม่?
- ถ้าระบบล่มไป 5 นาทีแล้วโดนปรับเป็นล้าน เลือก Availability
- ถ้าหน้าตาเว็บเปลี่ยนบ่อยทุกสัปดาห์ตามโปรโมชั่น แต่ล่มบ้างไม่เป็นไร เลือก Extensibility / Deployability
3. เรากำลังแข่งกับอะไร?
- แข่งกับเวลาและการตลาด (ต้องออกฟีเจอร์ใหม่ทุกสัปดาห์) เลือก Deployability / Maintainability
- แข่งกับจำนวนผู้ใช้งาน (คนแห่มาถล่มพร้อมกันช่วงสิ้นเดือน) เลือก Scalability / Elasticity
นี่น่าจะพอ guild ให้ได้ในระดับหนึ่งแล้ว
เมื่อเราได้ Architecture Characteristic แล้ว ต่อไปเราสามารถเอาไปเลือก Architecture Styles ได้