ในการออกแบบซอฟต์แวร์ขนาดใหญ่ในองค์กร มักจะมีการทำงานร่วมกันโดยคนจำนวนมาก หากเราต่างคนต่างเขียนซอฟต์แวร์ไปในทางที่ตัวเองเห็นว่าดี ซอฟต์แวร์ที่แต่ละคนทำก็อาจจะทำงานร่วมกันไม่ได้หรือมีปัญหาตอนที่ Integrate เป็น Solution ใหญ่ ดังนั้น การทำซอฟต์แวร์ในระดับนั้นจึงจำเป็นต้องมีการแบ่งสันปันส่วน และมีการออกแบบ Software Architecture เพื่อให้ทำงานร่วมกันได้ดีและมองเห็นภาพรวมไปในทางเดียวกัน ทั้งระหว่างนักพัฒนาในทีมพัฒนากันเอง และระหว่างทีมพัฒนาและทีมธุรกิจ รวมไปถึงทีมอื่นๆที่เกี่ยวข้อง นอกจากนี้หลังพัฒนาเสร็จยังต้องสามารถดูแลต่อได้ทั้งงานซัพพอร์ต แก้ไขปัญหาบั๊ก และการพัฒนาต่อยอดเพิ่มเติมได้ในอนาคต
องค์ความรู้ Software Architecture Design เป็นหนึ่งใน Hard Skill ที่เชื่อมกับ Soft Skill สำคัญของ Programmer ที่ควรเรียนรู้ หากคุณต้องการเติบโตในสายงาน Tech ไม่ว่าจะเป็น Senior Software Developer หรือ Tech Lead ซึ่งสำคัญมาก ๆ ที่ต้องมองภาพรวมของโครงสร้างระบบให้ออก โดยเฉพาะ Programmer ที่ต้องพัฒนาซอฟต์แวร์อยู่บนระบบขนาดใหญ่ในระดับองค์กร
เรามาดู 3 Software Architecture Patterns พื้นฐานที่นิยมใช้ในการออกแบบซอฟต์แวร์ขนาดใหญ่ โดยเน้นไปที่เรื่องของรูปแบบการร่วมมือ (Collaboration Pattern) ต่าง ๆ จะมีข้อมูลน่าสนใจยังไงบ้างไปดูกันเลย
Table of Contents
Specialist Collaboration
ในการพัฒนาซอฟต์แวร์ระบบขนาดใหญ่ที่มีหลายส่วนการทำงานของทีม Developer หลาย ๆ ทีม (Specialist Team) รวมกัน ทำให้มี Class หรือ มี Object จำนวนมากในระบบจึงต้องมีการจัดกลุ่ม เพื่อที่จะสามารถแบ่งโค้ดส่วนต่าง ๆ ได้อย่างเป็นระเบียบ ให้ทีม Developer ทำงานร่วมกันได้ง่ายขึ้น
เพราะระบบซอฟต์แวร์ขนาดใหญ่ย่อมมีการพัฒนาระบบอยู่สม่ำเสมอ เพื่อแก้ไขปัญหาต่าง ๆ ที่เกิดขึ้น หรือ พัฒนาต่อยอดระบบให้การใช้งานดีขึ้นไม่ว่าจะเป็นฝั่ง Front End, Back End หรือ Database การพัฒนาหรือการแก้ไขบางอย่าง อาจสร้างผลกระทบกับโค้ดส่วนอื่น ๆ ที่เกี่ยวข้องได้ นักพัฒนาจึงต้องออกแบบโครงสร้างจัดกลุ่มให้กับโค้ดส่วนต่าง ๆ เพื่อให้ทีม Developer มองภาพรวมของโค้ดหลาย ๆ ส่วน จัดสรรเป็นระเบียบมากขึ้น นอกจากจะช่วยให้การพัฒนาต่อยอดง่ายขึ้นแล้ว การแก้ไขหรือวิเคราะห์ปัญหาก็สามารถทำได้ทันทีไม่ต้องงมโค้ดหลายแสนบรรทัดให้เสียเวลา และช่วยให้ทีม Developer แต่ละทีมสามารถสื่อสารทำงานได้อย่างราบรื่น การทำงานเป็นทีม Productive มากขึ้น
โดยมีคอนเซปที่ใช้กันในการออกแบบ Software architecture ดังนี้
N-Tier Architecture
การแบ่ง Class ออกเป็นจำนวน Tier หลาย ๆ ชั้น โดยจะมีการจัดระดับ Tier ที่อยู่ระดับสูงกว่าจะได้รับผลกระทบเมื่อมีการแก้ไข Class ที่อยู่ในกลุ่ม Tier ที่อยู่ระดับต่ำกว่า ทำให้เมื่อนักพัฒนาต้องมีการแก้ไข หรือ พัฒนาต่อยอดโค้ดส่วนไหนของระบบ ทำให้สามารถตรวจสอบได้ว่าจะมีระบบส่วนไหนที่ได้ผลกระทบบ้าง นักพัฒนาจะมองเห็นเป็นสัดส่วนโดยการจัดกลุ่มของ N-Tier Architecture โดยมีคอนเซปที่นิยมใช้ดังนี้
-
MVC หรือ Model View Controller
การออกแบบโครงสร้างให้มีระบบ Core System ที่สามารถ Input / Output ข้อมูลไปยังหลายระบบได้ โดยออกแบบให้มี Layer ที่จะช่วยเป็นตัวกลางแปลงข้อมูลให้ระหว่างระบบที่ต้องทำงานร่วมกันได้ โดยรูปแบบ MVC จะเน้นเรื่องของการทำงานเชื่อมต่อกันทั้งในระบบภายในที่มีหลายส่วน
-
Clean Architecture
เกิดจากระบบขนาดใหญ่ที่มี Module ภายนอกจำนวนมากเข้ามามีส่วนร่วม โดยการเขียน Dependency rule เพื่อกำหนดให้ส่วน Adaptor เขียนตามระบบของ 3rd party ทำให้สามารถแบ่งส่วนของ 3rd party จำนวนมากได้ เมื่อ 3rd party มีการเปลี่ยนแปลง ทำให้นักพัฒนาสามารถแก้ไขแค่เฉพาะ Adaptor ไม่ต้องแก้ไขในส่วนระบบภายใน ช่วยลดโอกาสการเกิดผลกระทบกับระบบส่วนอื่น ๆ
Business Collaboration
นอกจากทีม Developer จะต้องทำงานร่วมกันกับทีม Developer หลากหลายทีมแล้ว ทีม Business ก็เป็นอีกทีมหนึ่งที่ต้องมีการร่วมงานกัน เพื่อกำหนดให้ระบบซอฟต์แวร์สามารถทำงานตามจุดประสงค์ของ Business model ขององค์กรอีกด้วย อีกทั้งยังต้องออกแบบโครงสร้างให้ทีม Developer และ ทีม Business สามารถใช้ทำงานร่วมกัน มองเห็นภาพรวมไปในทิศทางเดียวกันได้ ทำให้การสื่อสารระหว่าง 2 ทีมมีประสิทธิภาพมากขึ้น โดยมีคอนเซปที่ใช้กันคือ
Domain Driven Design หรือ DDD
แบ่งออกเป็น 3 ขั้นตอนได้แก่
-
Domain Discovery
คือวิธีการก็บ Requirement ของ Business ออกมาให้เป็นภาพที่จะสามารถเขียนออกแบบเป็นโครงสร้างพัฒนาซอฟต์แวร์ได้ง่ายที่สุด และสามารถนำกลับมาวิเคราะห์ออกมาเห็นภาพรวมการทำงาน และผลกระทบต่าง ๆ เพื่อใช้ในการสื่อสารกับทีม Business ได้ สร้างความเข้าใจตรงกันมากขึ้นโดยปราศจากกำแพงภาษา Technical ที่เข้าใจยาก
-
Strategic Domain Driven Design
การวางกลยุทธ์แบ่ง Domain ย่อยให้แต่ละทีม Developer สามารถแบ่งงานไปพัฒนาบนระบบซอฟต์แวร์ขนาดใหญ่ได้
-
Tactical Domain Driven Design
การวางระบบการพัฒนาซอฟต์แวร์อย่างไรให้ตอบโจทย์กับแผน Business model ขององค์กร ตามที่ได้รับจาก Requirement ได้
Organization Collaboration
การออกแบบโครงสร้างระบบซอฟต์แวร์ขนาดใหญ่ในองค์กรที่มีหลากหลายทีมแต่มีการทำงานที่แตกต่างกัน เป้าหมาย KPI ที่แตกต่างกัน ให้สามารถใช้อยู่ในระบบเดียวกันได้อย่างไม่เกิดความขัดแย้งกัน โดยมีคอนเซปในการออกแบบโครงสร้างดังนี้
Conway’s law
การออกแบบโครงสร้างระบบซอฟต์แวร์ให้ล้อกับโครงสร้างการทำงานขององค์กร ทำให้เห็นภาพการทำงานของระบบซอฟต์แวร์ได้ตรงกับความเป็นจริงมากขึ้น
Cross-Functional Team
การออกแบบโครงสร้างที่ไม่ยึดตามตำแหน่งเช่น Front End หรือ Back End แต่ออกแบบโดยยึดตามการทำงาน Function ของระบบ ทำให้แต่ละทีมสามารถช่วยกันรับผิดชอบ Features และ Business Goal ตั้งแต่ต้นจนจบ ลดเรื่องลำดับขั้นตอนการทำงาน แต่ยังคงร่วมกันทำงานในระบบเดียวกันเช่น Front End, Back End, Database, DevOps ช่วยกันรับผิดชอบส่วนงานนั้น ๆ โดยมีวิธีการแบ่งการทำงานร่วมกัน 2 วิธีได้แก่
-
Monolith
คือรูปแบบการทำงานของทีม Developer ที่ร่วมกันทำงานอยู่บน Codebase เดียวกัน แต่แบ่งงานตาม Namepaces, Libraries หรือ Folder structure เป็นต้น
-
Multi-services
คือรูปแบบที่ให้แต่ละทีมสามารถแบ่ง Codebase ของตัวเองและทำการ Deploy ระบบเป็นส่วน ๆ แยกกัน โดยมีการสื่อสารกันระหว่างกันผ่านระบบ Network
————————————————————————————
ทั้งหมดเป็นเพียงส่วนหนึ่งของเนื้อหาทั้งหมด คุณสามารถเรียนรู้เพิ่มเติมให้เข้าใจถึงแก่นแท้จุดประสงค์ของ Software Architecture Design แต่ละแบบ พร้อมเสริมแนวคิดและวิธีการนำไปประยุกต์ใช้ในองค์กรของคุณได้
คอร์สออนไลน์ Software Architecture Design จะพาคุณมาทำความรู้จักกับ Software Architecture Patterns ต่างๆ ที่นิยมใช้ในการออกแบบ Software ขนาดใหญ่ ให้คุณเข้าใจ Concept ของแต่ละรูปแบบ สามารถวิเคราะห์ข้อดี-ข้อเสีย ของแต่ละ Pattern เสริมแนวคิดให้ผู้เรียนเข้าใจหลักการใช้งาน และสามารถนำไปเลือกใช้ได้ตรงกับงานและโมเดลขององค์กรได้
สอนโดย คุณชาคริต ลิขิตขจร – Senior Consultant, ThoughtWorks
คอร์สนี้เหมาะกับใคร
Software Developer ที่ต้องการเข้าใจพื้นฐานการพัฒนาซอฟต์แวร์ขนาดใหญ่ที่ต้องทำงานร่วมกันเป็นทีม
Software Developer ที่ต้องการเริ่มต้นการทำงานเป็น Software Architect
Software Developer ขององค์กรขนาดใหญ่
Software Architect ที่ต้องการทำความเข้าใจกับ Patterns แต่ละรูปแบบอีกครั้ง
สมัครเรียนเลยเพื่อเตรียมพร้อมในสายงานนี้ https://to.skooldio.com/MsbFoSGIMrb