diff --git a/.vitepress/config.mts b/.vitepress/config.mts index efa601d..ba202a5 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -41,6 +41,10 @@ export default defineConfig({ base: "/paths/practices/", items: sidebarPractices() }, + "/paths/software-architecture": { + base: "/paths/software-architecture/", + items: sidebarSoftwareArchitecture() + } }, socialLinks: [ { icon: "github", link: "https://github.com/ThaiProgrammer/tpa-path" }, @@ -429,4 +433,23 @@ function sidebarPractices(): DefaultTheme.SidebarItem[] { ] } ] +} + +function sidebarSoftwareArchitecture(): DefaultTheme.SidebarItem[] { + return [ + { + text: "Software Architecture", + items: [ + { + text: "Introduction", + collapsed: true, + base: "/paths/software-architecture/introduction/", + items: [ + { text: "What is software architecture?", link: "software-architecture-intro" }, + { text: "Styles & Patterns", link: "styles-n-patterns" }, + ] + } + ] + } + ] } \ No newline at end of file diff --git a/index.md b/index.md index de6519f..dfec4c7 100644 --- a/index.md +++ b/index.md @@ -50,4 +50,7 @@ features: - title: Azure details: รวบรวมเนื้อหาที่เกี่ยวกับการใช้งาน Microsoft Cloud - Azure ในการพัฒนาระบบ link: /paths/azure + - title: Software Architecture + details: เนื้อหาเกี่ยวกับ Software Architecture รูปแบบต่างๆที่ใช้ในการพัฒนาซอฟต์แวร์ + link: /paths/software-architecture --- \ No newline at end of file diff --git a/paths/software-architecture/index.md b/paths/software-architecture/index.md new file mode 100644 index 0000000..344747e --- /dev/null +++ b/paths/software-architecture/index.md @@ -0,0 +1,13 @@ +--- +outline: deep +title: 'Software Architecture' +description: เนื้อหาและรูปแบบต่างๆของ software architecture +--- + +# Software Architecture Guideline +เนื้อหาในส่วนนี้จะอธิบายเกี่ยวกับ Software Architecture ซึ่งเป็นส่วนสำคัญส่วนหนึ่งในการสร้างและออกแบบซอฟต์แวร์ที่มีคุณภาพ + +โดยที่เนื้อหาในส่วนนี้จะมีการแนะนำและอธิบาย architectural styles และ patterns ต่างๆที่พบเจอได้โดยทั่วไปในการออกแบบ ระบบรวมถึงตัวอย่างการนำไปใช้งานจริง + +หวังว่าเนื้อหาที่แนะนำจะมีประโยชน์ต่อผู้อ่านทุกคนนะคะ + diff --git a/paths/software-architecture/introduction/software-architecture-intro.md b/paths/software-architecture/introduction/software-architecture-intro.md new file mode 100644 index 0000000..a99a19c --- /dev/null +++ b/paths/software-architecture/introduction/software-architecture-intro.md @@ -0,0 +1,12 @@ +# Software Architecture +Software Architecture หรือสถาปัตยกรรมซอฟต์แวร์ คือ **โครงสร้างและความสัมพันธ์ขององค์ประกอบต่างๆในระบบรวมถึง หลักการและแนวคิดในการออกแบบ** ที่ช่วยให้บรรลุเป้าหมายทั้งในด้านประสิทธิภาพ คุณภาพ การบริหารจัดการ และการบำรุงรักษาที่คาดหวัง เพื่อช่วย**ให้ทุกฝ่ายเข้าใจภาพรวมของระบบและสื่อสารการตัดสินใจที่มีร่วมกัน** + +ในปัจจุบัน มีรูปแบบของ architecture ที่ใช้งานกันแพร่หลาย เช่น **microservices** หรือ **monolith** โดยรูปแบบต่างๆนี้เรียกว่า **architectural styles** โดยการออกแบบ software architecture อาจเป็นการผสมผสาน architectural styles และ principles ต่างๆเข้ามาไว้ด้วยกันเพื่อสร้างระบบที่มีความยืดหยุ่นและสามารถตอบโจทย์กลยุทธ์ขององค์กรได้ตามความเหมาะสม โดยพิจารณาจากประโยชน์ ข้อดี ข้อเสีย รวมถึงข้อจำกัดต่างๆที่มี + +Software Architecture ที่ดีจะต้อง**ไม่ใช่สิ่งตายตัว ไม่ได้ออกแบบมาครั้งเดียวแต่จะต้องสามารถเปลี่ยนแปลงและวิวัฒนาการได้**ตามกลยุทธ์และทิศทางของโครงการหรือองค์กรที่มักจะเปลี่ยนแปลงไปตามกาลเวลา การมี software architecture ที่ดีจะเป็นส่วนสำคัญในการสร้างซอฟต์แวร์ที่มีคุณภาพและตอบโจทย์ความต้องการในด้านต่างๆ ทั้งในเชิงกลยุทธ์ การพัฒนาผลิตภัณฑ์ การทดสอบ รวมถึงการบริหารจัดการ และที่สำคัญที่สุดคือผู้ใช้งานหรือลูกค้า ซึ่งจะช่วยสร้างความสามารถในการแข่งขันให้กับองค์กรได้ +## ความสำคัญของ Software Architecture +Software Architecture เปรียบเสมือน blueprint ที่ใช้สื่อสารแนวทางการตัดสินใจที่มีร่วมกันระหว่างผู้มีส่วนได้ส่วนเสีย ซึ่งอาจจะเป็นลูกค้า ผู้บริหารโครงการ ทีมพัฒนาผลิตภัณฑ์ และรวมถึงฝ่ายบริหารต่างๆด้วย โดยมักจะถูกใช้ในการสื่อสารเกี่ยวกับทิศทาง กลยุทธ์ และแนวคิดต่างๆเพื่อให้เกิดความเข้าใจในทิศทางเดียวกัน + +โดย software architecture ช่วยให้ผู้ที่เกี่ยวข้องสามารถ**วิเคราะห์ และประเมินความเสี่ยงต่างๆ เช่น ความเสี่ยงด้านความปลอดภัย ด้านงบประมาณ ด้านเวลา รวมถึงความสอดคล้องกับทิศทางและกลยุทธขององค์กร**ก่อนที่จะลงมือสร้างผลิตภัณฑ์ออกมาอีกด้วย โดย software architecture ที่ดีจะช่วยให้ทุกฝ่ายเข้าใจระบบในทิศทางเดียวกัน ทั้งในด้านการพัฒนา การจัดการ การทดสอบ และการพัฒนาต่อยอดในอนาคตอีกด้วย เช่นการเพิ่มความสามารถใหม่ๆ หรือการ scale ระบบให้รองรับผู้ใช้งานที่มากขึ้น + +โดยในช่วงเวลาหลังๆ นอกจากจะเป็นเครื่องมือที่ใช้ในการสื่อสารเกี่ยวกับการออกแบบระบบแล้ว software architecture ได้เข้ามามีบทบาทสำคัญในการออกแบบทีมในองค์กรสมัยใหม่ โดยมีแนวคิดต่างๆ เช่นการปรับเปลี่ยนรูปแบบทีมให้เข้ากับ architecture ที่ต้องการ ซึ่งช่วยให้ทีมต่างๆสามารถทำงานร่วมกันได้อย่างมีประสิทธิภาพและช่วยลดคอขวดในการสื่อสารและการดำเนินงาน หากสนใจหัวข้อดังกล่าว ขอแนะนำหนังสือ [Team Topologies](https://teamtopologies.com/) เขียนโดยคุณ Ruth Malan ค่ะ \ No newline at end of file diff --git a/paths/software-architecture/introduction/styles-n-patterns.md b/paths/software-architecture/introduction/styles-n-patterns.md new file mode 100644 index 0000000..1d11b8a --- /dev/null +++ b/paths/software-architecture/introduction/styles-n-patterns.md @@ -0,0 +1,54 @@ +# Architectural Styles & Patterns +ในโลกของการพัฒนาซอฟต์แวร์ การออกแบบ architecture ถือเป็นหนึ่งในขั้นตอนที่สำคัญที่สุด เพราะ software architecture นั้น**ทำหน้าที่เหมือน blueprint ที่กำหนดโครงสร้างและการทำงานของระบบทั้งหมด** การเลือกใช้ architectural styles และ patterns ที่เหมาะสมจะช่วยให้ระบบมีความยืดหยุ่น บำรุงรักษาง่าย และสามารถรองรับการเปลี่ยนแปลงในอนาคตได้ + +หากไม่มีการกำหนดรูปแบบของ architecture ที่ดีตั้งแต่เริ่มต้น อาจทำให้เกิดความไม่สอดคล้องกันในการพัฒนาได้ ซึ่งมีความเสี่ยงหลายอย่าง เช่น เกิด coupling ระหว่าง dependencies จำนวนมาก หรือมีความซับซ้อนเกืนความจำเป็น ซึ่งส่งผลให้การบริหารจัดการ และการพัฒนาต่อยอดในอนาคตทำได้ยากมากขึ้น + +โดยเนื้อหาเกี่ยวกับ architectural styles และ patterns ที่พบได้บ่อยในปัจจุบันได้จากหัวข้อด้านล่างนี้เลยค่ะ +## Architectural Styles +Architectural Styles เป็นการอธิบายภาพใหญ่ของ architecture โดย**ให้ความสำคัญกับภาพรวมของระบบที่กำลังออกแบบมากกว่ารายละเอียดในการ implementation เชิงลึก** โดยอาจละเว้นในส่วนของ technologies หรือเครื่องมือที่จะใช้กับองค์ประกอบนั้นๆ แต่จะเป็นการอธิบายภาพรวมและคุณลักษณะขององค์ประกอบนั้นๆ เช่น + +- ระบบย่อยต่างๆ +- ระบบภายนอก +- รูปแบบการเชื่อมต่อระหว่างองค์ประกอบต่างๆ +- การจัดการข้อมูลในระบบ +- กลไกความปลอดภัย +- Layers + +โดย architectural styles ที่เรามักพบเห็นได้บ่อยในปัจจุบัน มีดังนี้ +- **Monolithic Architecture:** เป็นรูปแบบของ architecture ที่ทุกส่วนประกอบของ application เช่น user interface, business logic, หรือ data access ถูกรวมเข้าไว้ใน codebase เดียวกัน โดย application ที่เป็น monolith จะถูกพัฒนา ทดสอบ และบริหารจัดการอยู่ใน package เดียวกัน +- **Microservices Architecture:** เป็นรูปแบบของ architecture ที่ application จะถูกแยกออกไป service ย่อยๆหลายตัว โดยที่แต่ละ service จะทำหน้าที่เฉพาะงานที่เกี่ยวข้องกับตัวเอง และเป็นอิสระจาก service อื่นๆในการพัฒนาและบริหารจัดการ ทำให้มีความคล่องตัวในการพัฒนาและยืดหยุ่นในการเลือกใช้เทคโนโลยี +- **Event-Driven Architecture:** เป็นรูปแบบ architecture ที่ใช้ event ในการสื่อสารระหว่าง service ต่างๆในระบบ โดย events ต่างๆจะแสดงถึงการเปลี่ยนแปลงของข้อมูล หรือเหตุการณ์ต่างๆที่เกิดขึ้นในระบบ รูปแบบ architecture นี้มักจะมีตัวกลางในการรับส่ง events เรียกว่า message broker หรือ event broker +- **Client-Server:** เป็นรูปแบบของ architecture ที่ใช้งานกันแพร่หลาย โดย client หรือผู้ใช้งานจะร้องขอการประมวลผลหรือการทำงานไปที่ server ซึ่งทำหน้าที่ประมวลผลและส่งผลลัพธ์กลับไปที่ client หนึ่งในลักษณะการใช้งานที่พบได้บ่อยที่สุดในปัจจุบันคือ web server ที่ให้บริการ website หรือ web service ต่างๆ + +นอกจากนี้ยังมี architectural styles อื่นๆอีกมากมาย โดยสามารถอ่านเพิ่มเติมจาก [บทความของทาง JavatPoint](https://www.javatpoint.com/architectural-styles-in-software-engineering) โดยในบทความนี้จะเปรียบเทียบข้อดีข้อเสียของแต่ละ architectural styles ให้เห็นด้วยค่ะ +## Architectural Patterns +Architectural Patterns คือแนวทางการและวิธีการต่างๆที่ใช้เพื่อ**แก้ปัญหาที่มักเกิดขึ้นซ้ำๆในการออกแบบ software architecture** เช่น + +- การจัดการกับความซับซ้อน +- ประสิทธิภาพของระบบ +- Scalability +- การ test ระบบ +- การ reuse ส่วนประกอบต่างๆในระบบ + +โดยตัวอย่างของ architectural patterns มีดังนี้ + +- **MVC (Model-View-Controller):** เป็นการแบ่ง software ออกเป็นสามส่วนหลักๆ ได้แก่ models ที่ทำหน้าทีจัดการกับข้อมูล, views ที่ทำหน้าที่ติดต่อกับผู้ใช้ในการแสดงผลและรับคำสั่งต่างๆ, และ controllers ที่ทำหน้าที่ในการประมวลผลต่างๆและเชื่อมโยง views กับ models เข้าด้วยกัน +- **Event Sourcing:** เป็นรูปแบบของ architecture ที่ทุกการเปลี่ยนแปลงของข้อมูลต่างๆใน application เช่น entity หรือ aggregate จะถูกเก็บในลักษณะของ **ลำดับของเหตุการณ์ (sequence of events)** โดยจะเป็นการจัดการข้อมูลในลักษณะ append-only ทำให้สามารถตรวจสอบทุกการเปลี่ยนแปลงของข้อมูลและสามารถนำ events เหล่านี้ไปประมวลผลเพิ่มเติมได้ โดยมักจะใช้คู่กับ pattern แบบ CQRS +- **Command Query Responsibility Segregation (CQRS):** เป็นการแยก application ออกเป็นสองส่วน ได้แก่ ส่วนที่เป็น command ทำหน้าที่เปลี่ยนแปลงข้อมูล และส่วนที่เป็น query ทำหน้าที่เรียกดูข้อมูล โดยทั้งสองส่วนจะใช้ model แยกจากกันชัดเจน ในบางระบบอาจแยกฐานข้อมูล และ process ในการทำงานออกจากกันเพื่อประสิทธิภาพสูงสุด +- **Saga Pattern:** เป็นรูปแบบของการจัดการ long-running transactions ผ่านระบบต่างๆ โดยมักจะถูกใช้ใน architecture ที่เป็น distributed systems เช่น microservices โดยแต่ละ microservice จะทำการประมวลผลและส่งต่อไปยัง microservice ถัดไป + +## ความแตกต่างระหว่าง Architectural Styles และ Patterns +หลายครั้งที่ architectural styles และ patterns มีความแตกต่างกันในมุมมองของ architecture โดยที่ **architectural styles จะเน้นการอธิบายองค์ประกอบของระบบในภาพกว้าง**โดยไม่ลงลึกในรายละเอียดและ tools หรือ frameworks ที่ใช้การพัฒนา โดยส่วนใหญ่แล้วมักจะเป็นการกำหนดรูปร่างของ architecture ของระบบ เช่น จำนวน service ต่างๆ ระบบภายนอก และลักษณะการเชื่อมต่อขององค์ประกอบต่างๆ + +ในขณะที่ **architectural patterns จะเป็นการมองในระดับที่เล็กลงมาและมีรายละเอียดมากขึ้น** โดยเน้นไปที่การแก้ปัญหาเฉพาะจุดของระบบ เช่น รูปแบบในการเก็บข้อมูล รูปแบบในการจัดวาง modules ในระบบ หรือรูปแบบในการรับ-ส่งข้อมูลที่มีความเฉพาะเจาะจงมากขึ้น + +ตัวอย่างเช่น การออกแบบระบบโดยใช้ architectural style แบบ microservice และ event-driven architecture อาจเลือกใช้ architectural pattern แบบ pub/sub โดยมี message broker เป็นตัวกลางเพื่อรับ-ส่งข้อมูลระหว่าง module ต่างๆ + +ตารางด้านล่างเป็นการเปรียบเทียบโดยคร่าวๆระหว่าง architectural styles และ patterns + +| Feature | Architectural Styles | Architectural Patterns | +| ----------------------- | --------------------------- | ------------------------ | +| **Level of Abstraction** | ภาพกว้าง | มีรายละเอียดมากขึ้น | +| **Scope** | รวมของระบบทั้งหมด | การแก้ปัญหาเฉพาะส่วน | +| **Focus** | องค์ประกอบและความสัมพันธ์ต่างๆ | รูปแบบ แนวทางในการแก้ปัญหา | +| **Examples** | Event-Driven Architecture | Pub/Sub, Event Stream Processing, CQRS |