Software Architecture & ML Application

Supawit Kansompoj
CJ Express Tech (TILDI)
4 min readSep 4, 2023

ทุกคนเคยเจอสถานการณ์แบบนี้กันบ้างไหม

  • Software ที่ถูกสร้างไม่ได้คำนึงถึง Business Usecase ทำให้ไม่ตอบโจทย์
  • เจอปัญหา Technical Debt ในระบบบ่อยครั้ง
  • ไม่รู้จะออกแบบ Software ยังไง
  • Developer ลาออก เพราะสร้างแต่สิ่งที่ไม่ make sense

ทั้งหมดนี้ คือเหตุผลที่เราจำเป็นต้องคิดถึง Software Architecture ตั้งแต่ Day 1 ของ การออกแบบ Software Product

ในบทความนี้ผมจะชวนคุยถึง ขั้นตอนในการคิด ออกแบบ Software ขึ้นมาโดยจะโฟกัสไปที่เรื่องของ Software Architect

Content

  1. Software Architect
  2. การกำหนด Architecture Characteristics
  3. ตัวอย่าง Architecture Characteristics ใน ML Application
  4. Architecture Decision Records (ADR)

1. Software Architect ทำอะไร

Photo by Tingey Injury Law Firm on Unsplash

ก่อนปี ค.ศ. 2010 มี Software Architect เป็นอาชีพหนึ่งในสายงานเทคโนโลยี มีหน้าที่ในการออกแบบโครงสร้างของระบบ ช่วงนั้นเครื่องมือต่างๆ มีข้อจำกัด ซับซ้อน และผู้เข้าใจยังเฉพาะกลุ่ม ปัจจุบันยุคสมัยเปลี่ยนไป ทำให้ Software ต้องปรับตัวให้ทันกับธุรกิจ ธุรกิจบางประเภทโดยเฉพาะในกลุ่มของเทคโนโลยี จำเป็นต้องปรับตัว และคำนึงถึงกลุ่มผู้ใช้ทั่วโลก ไม่ใช่แค่มองแค่เฉพาะกลุ่มเหมือนในอดีตที่ผ่านมา เมื่อ Software ต้อง Scale ให้รองรับผู้ใช้จากทั่วโลกได้ Architecture ก็ต้องรองรับ

เทรนของ Data Driven Application ที่นำ Data มาใช้มากขึ้นมากกว่าเดิม เช่น กรณีตัวอย่างของ Netflix มีการนำประวัติการดูคอนเทนต์มาวิเคราะห์ทำ Personalization, และ Generative AI ที่ใช้ User Feedbacks มีใช้เพิ่มประสิทธิภาพ Machine Learning Model

Photo by Stephen Dawson on Unsplash

มิติของการออกแบบ Software มีอะไรมากกว่าเดิม แม้ว่าในปัจจุบันจะมีเครื่องมือเข้ามาช่วยให้เราสร้าง Software ได้ง่ายขึ้น แต่ Software Architecture ก็ยังยากอยู่ดี

การเข้ามาของ Scrum Framework ซึ่งเป็นรูปแบบของการพัฒนา Software ที่อิงมาจาก Agile Principle เป็นอีกสาเหตุหลักที่ทำให้ Software Arcitecture จากที่เคยเป็น Role หนึ่งใน Software Development team กลายเป็น Skill ที่ Development team, Senier Software Engineer, Technical Lead, หรือจนไปกระทั้ง CTO ควรมี

ความสัมพันธ์ระหว่าง Bussiness Requirement และแนวคิด Software Architect

จากแผนภาพข้างต้นเราจะเห็นได้ว่า หน้าที่หลักๆของ Software Architect คือการวิเคราะห์ Bussiness Requirement เอามาแปลงให้ได้มาซึ่ง Architecture Charateristics และ Architecture Patterns

คำจำกัดความของ Software Architect เป็นไปได้หลากหลายมุมมอง เพราะ Architect สามารถเป็นได้ตั้งแต่ Expert Programmer ไปจนถึง คนที่มีหน้าที่กำหนด Technical Direction ขององกรค์ เพื่อไม่ให้งงไปกว่านี้เรามาดูใน Expectation กันดีกว่า ว่าคนที่มี Skill นี้ควรจะต้องทำอะไรบ้าง

  • Made Software Architecture Decisions
  • Keep current with latest trends
  • Ensure compliance with decisions
  • Diverse exposure and experience
  • Have business domain knowledge
  • Possess interpersonal skills
  • Understand and navigate politics

2. Architecture Characteristics

From: https://requirementsquest.com/nonfunctional-requirement-examples/

สิ่งแรกที่สำคัญสำหรับการออกแบบคือ ทิศทาง

สิ่งแรกที่สำคัญสำหรับการออกแบบคือ ทิศทาง การออกแบบ Software หรือ ML Application ก็เช่นเดียวกันครับ ทิศทางของโครงสร้างระบบจึงสำคัญ ซึ่งเราวิเคราะห์ได้จาก “Software Requirements”

From: https://www.codingninjas.com/studio/library/software-requirements-and-their-types

Requirements ไม่ใช่เพียงแค่ Functional requirement เพียงอย่างเดียว บางครั้งอาจหมายถึง Non-Functional Requirements ที่ไม่ได้มีความเกี่ยวข้องกับ User โดยตรง แต่มีความเกี่ยวข้องกับการออกแบบระบบ และกำหนด Architecture Characteristics

Architecture Characteristics ที่เราพบเจอกันบ่อยๆ เช่น

Scalability, Availability, Reliability, Flexibility,

Security, Maintainability,

ในบทความนี้ผมจะขอไม่ลงรายละเอียดไปแต่ละ Characteristics นะครับ ถ้าสนใจเพิ่มสามารถไปอ่านต่อได้ที่

เรามาดูตัวอย่างใน Machine Learning (ML) Application ในหัวข้อถัดไปกันครับ

3. Architecture Characteristics : ML App Example

ผมมีตัวอย่างมาให้ทุกคนได้ลองคิดตามไปด้วยครับ ในส่วนนี้ผมมีตัวอย่างเคสที่น่าสนใจ มาให้ทุกคนได้ลองคิดไปตามๆ กันครับ

สมมุติว่าผมอยากออกแบบระบบแสกนหน้าเพื่อใช้จ่ายเงินซื้อสินค้าของร้านสะดวกซื้อแห่งหนึ่งมีสาขาทั้งหมด 1,200 สาขาในประเทศไทย และมีแพลนที่จะขยายธุรกิจไปยังต่างประเทศในโซน Southeast Asia จำนวน 2,000 สาขาภายใน 5 ปี ซึ่งมี Usecase Diagram ดังรูป

Usecase Diagram ของระบบแสกนจ่ายด้วยใบหน้า

มาถึงตรงนี้แล้วเพื่อนผู้อ่านคิดยังไงกันบ้างครับ Usecase Diagram เหมือนที่คิดกันไว้ในใจไหมครับ

ผมจะลองนำ Business Requirement และ Usecase Diagram ข้างต้นมาแบ่งออกเป็น Requirement หลักๆ 2 ประเภทได้แก่ Functional และ Non-Functional นะครับ

Functional Requirements

  1. ผู้ใช้งานสามารถยืนยันตัวตนผ่านการแสกนหน้าได้
  2. ผู้ใช้สามารถลงทะเบียน (register) ในหน้าได้

Non-Functional Requirements

Security — เนื่องจากเป็นระบบที่ต้องใช้จ่ายเงินจึงจำเป็นต้องมี Security ที่สูง

Avalibility — ลูกค้าร้านสะดวกซื้อ จะมีปัญหาและติดขัดในการจ่ายเงิน ถ้าหากระบบขัดข้อง

Scalability — ระบบต้องสามารถ Scale เพื่อรองรับกับจำนวนผู้ใช้ และสาขาที่เพิ่มขึ้น

Integrity — ความถูกต้องของการตรวจสอบใบหน้า ซึ่งส่งผลกับการจ่ายเงินเป็นสิ่งสำคัญ

Reliability — ถ้าหากระบบมีปัญหาระหว่างการใช้งาน ไม่ว่าจะเป็นตรวจสอบใบหน้าผิด ตรวจสอบไม่ผ่าน และอื่นๆ จะส่งผลกับการใช้งาน

เมื่อเราพิจารณาถึง Non-Functional เหล่านี้ในมุมมองของ Architecture Chalacteristics เราจะพบว่า เราสามารถออกแบบระบบ รวมทั้ง Architectureให้ตรงกับ Business Requirement ได้เช่น

Security กับ Integrity เราอาจจะเพิ่มความปลอดภัยโดยการเพิ่มมาตรการการตรวจสอบรูปแบบอื่นเข้ามาควบคู่กับการตรวจใบหน้าเพื่อยืนยันตัวตน เช่น อาจจะให้พนักงานสาขาตรวจสอบใบหน้าของผู้ใช้อีกรอบหลังจากผู้ใช้ยืนยันตัวด้วยใบหน้าแล้ว (Human Verification), หรืออาจจะใช้ 2 Factor Authetication เช่น SMS, บัตรประชาชน, และอื่นๆ

Security เราอาจจะต้องออกแบบส่วน Interface ของ Application และ Model ให้มีความปลอดภัยมากยิ่งขึ้น เช่นใช้การเข้ารหัสข้อมูล ,เข้ารหัสการรับส่งข้อมูล, และอาจมีการออกแบบให้ System เป็นลักษณะของ Managed Services ของ Cloud Provider ที่เชื่อถือได้แทนการ implement เองเพื่อเพิ่มมาตรฐานความปลอดภัย และช่องโหว่ที่อาจจะเกิดขึ้นจากการพัฒนาระบบความปลอดภัยเองและไม่ผ่านการตรวจสอบ

Availability และ Reliability เราสามารถออกแบบ ML Application ให้รองรับการ Inference ของสาขาหลายๆสาขา โดยอาจจะใช้ concept ของ Partitioning, Replication, Clustering, และอื่นๆ ควบคู่กันไป เพื่อลดการเกิด Single Point of Failure และ รวมไปถึงการเลือกใช้ Microservice Architecture เพื่อแก้ปัญหาเรื่อง Reliability

ตัวอย่าง High Availability Architecture

4. Architecture Decision Records (ADRs)

ก่อนจากกันไปขอปิดท้ายด้วยอะไรง่ายๆละกันนะครับ นั่นคือหนึ่งใน Frameworks ที่เป็นที่นิยมใช้เพื่อเก็บข้อมูลการตัดสินใจเกี่ยวกับการออกแบบ Software Architecture อีกทั้งสามารถนำไปใช้สื่อสารภายในทีมหรือองค์กรเกี่ยวกับการออกแบบ

ประกอบไปด้วย

Title: หัวข้อ
Status: สถานะเช่น proposed, accepted, rejected, deprecated, superseded
Context: แรงจูงใจ หรือปัญหาที่ประกอบการตัดสินใจ
Decision: รายละเอียดการตัดสินใจของ Design ที่เสนอ
Consequences: ผลกระทบกับส่วนอื่นๆของระบบ อาจจะเป็นทั้ง Positive หรือ Negative effect

Recap

ขอขอบคุณที่อ่านมาถึงตรงนี้ครับ

สุดท้ายเพื่อนๆคงเข้าใจบริบทของ Software Architecture กับการพัฒนาและออกแบบ Software ในปัจจุบัน และเห็นถึงความจำเป็น ขั้นตอน การนำไปประยุกต์ใช้ของ Software Architecture ไม่มากก็น้อย และหวังว่าบทความนี้จะเป็นประโยชน์กับหลายๆคนครับ ไว้เจอกันใหม่ในโอกาสหน้าครับ

--

--