สำรวจแพตเทิร์นสถาปัตยกรรมด้วย Python
(cosmicpython.com)- หนังสือที่ Harry ผู้เขียน "TDD with Python" และ Bob สถาปนิกซอฟต์แวร์ ร่วมกันอธิบายวิธีทำความเข้าใจและจัดการสถาปัตยกรรมซอฟต์แวร์ที่ซับซ้อน
- รวบรวมและแบ่งปันเทคนิคด้านสถาปัตยกรรมที่ใช้งานจริงในบริษัทอีคอมเมิร์ซ
MADE.comเป็นบริษัทขายเฟอร์นิเจอร์ออนไลน์ในยุโรปที่ดำเนินงานซัพพลายเชนระดับโลก- เป้าหมายคือปรับโลจิสติกส์ให้เหมาะสมเพื่อลดสต็อกให้เหลือน้อยที่สุด และประสานให้สินค้าด้านโลจิสติกส์มาถึงพร้อมกับคำสั่งซื้อของลูกค้า
- แต่โลกความเป็นจริงมีความซับซ้อนและคาดเดาไม่ได้ จึงมีการสร้างซอฟต์แวร์อัจฉริยะที่สะท้อนเงื่อนไขเหล่านี้เพื่อทำงานอัตโนมัติ
- หนังสือเล่มนี้กล่าวถึงแพตเทิร์นสถาปัตยกรรมที่ออกแบบมาเพื่อแก้ปัญหาเชิงปฏิบัติเหล่านั้น
ทำไมต้อง Python
- Python เป็นภาษาที่เติบโตอย่างรวดเร็วทั่วโลก และกำลังเผชิญกับปัญหาองค์กรที่ซับซ้อนมากขึ้นเรื่อย ๆ
- หนังสือด้านสถาปัตยกรรมที่มีอยู่เดิมส่วนใหญ่ใช้ตัวอย่างบน Java หรือ C# ทำให้ผู้ใช้ Python เข้าถึงได้ยาก
- หนังสือเล่มนี้นำเสนอแพตเทิร์นสถาปัตยกรรมแบบคลาสสิกในรูปแบบที่เหมาะกับชุมชน Python
แนะนำ TDD, DDD และสถาปัตยกรรมแบบ event-driven
- TDD (Test-Driven Development):
- การพัฒนาโดยให้การทดสอบมาก่อน ช่วยให้รีแฟกเตอร์และเพิ่มฟีเจอร์ได้อย่างมั่นคง
- ควรให้ความสำคัญกับ unit test ที่รวดเร็วและไม่มี dependency ก่อน และลด end-to-end test ที่ช้าและไม่เสถียรให้น้อยที่สุด
- DDD (Domain-Driven Design):
- แม้จะเน้นที่โมเดลโดเมนทางธุรกิจ แต่การลดการพึ่งพาโครงสร้างพื้นฐานและเฟรมเวิร์กก็เป็นสิ่งสำคัญ
- สถาปัตยกรรมแบบ event-driven:
- จัดการความซับซ้อนด้วยการสื่อสารแบบใช้ข้อความระหว่างไมโครเซอร์วิส
- จำเป็นต้องพิจารณาว่าจะผสานเข้ากับเครื่องมือ Python ที่มีอยู่ เช่น Flask, Django, Celery ได้อย่างไร
หมายเหตุ: แพตเทิร์นส่วนใหญ่ที่กล่าวถึงในหนังสือเล่มนี้สามารถนำไปใช้กับสถาปัตยกรรมแบบ monolithic ได้เช่นกัน
- จุดมุ่งหมายของหนังสือเล่มนี้คือการแนะนำแพตเทิร์นสถาปัตยกรรมที่รองรับ TDD, DDD และบริการแบบ event-driven ใน Python พร้อมแนวทางการนำไปใช้
ผู้อ่านเป้าหมายของหนังสือเล่มนี้
- นักพัฒนาที่มีประสบการณ์ในการจัดการแอปพลิเคชัน Python ที่ซับซ้อน
- ไม่จำเป็นต้องมีความรู้พื้นฐานเกี่ยวกับแพตเทิร์นสถาปัตยกรรมหรือ DDD มาก่อน
- ออกแบบให้สามารถติดตามได้แม้จะยังไม่คุ้นเคยกับสไตล์ TDD ที่เขียนการทดสอบก่อนแล้วจึงลงมือพัฒนา
- มีการใช้ Flask, SQLAlchemy, pytest, Docker, Redis ฯลฯ แต่ไม่ใช่ความรู้บังคับ
- เป้าหมายคือการออกแบบสถาปัตยกรรมที่ไม่ผูกติดกับเทคโนโลยีเฉพาะ
ภาพรวมสิ่งที่จะได้เรียนรู้
Part 1
- การทำ domain modeling และ DDD (บทที่ 1, 2, 7)
- แนะนำวิธีสร้างโมเดลโดเมนโดยไม่พึ่งพา dependency ภายนอก
- วิธีเขียน unit test ที่รวดเร็ว และการพิจารณาความสัมพันธ์กับความสมบูรณ์ของข้อมูล
- อธิบายวิธีเลือก Aggregate ที่เหมาะสม
- แพตเทิร์น Repository, Service Layer, Unit of Work (บทที่ 2, 4, 5)
- แยกโมเดลออกจาก dependency ภายนอกด้วยการทำ abstraction ของ persistence layer
- ออกแบบ service layer ให้เป็นจุดเข้าสู่ระบบ
- เหมาะสำหรับการสร้างจุดเข้าระบบแบบบาง เช่น Flask API หรือ CLI
- ข้อคิดเกี่ยวกับการทดสอบและ abstraction (บทที่ 3, 5)
- สำรวจเกณฑ์และบทบาทของการเลือกระดับ abstraction ที่เหมาะสม
- เขียน unit test ในระดับ abstraction ที่สูงขึ้นเพื่อให้ได้ test pyramid
Part 2
- สถาปัตยกรรมแบบ event-driven (บทที่ 8–11)
- แนะนำแพตเทิร์น Domain Events, Message Bus และ Handler
- ใช้ event เพื่อกระตุ้นปฏิสัมพันธ์ภายในระบบ
- อธิบายวิธีผสานการทำงานระหว่างไมโครเซอร์วิสด้วย event
- แยกความแตกต่างระหว่าง command และ event
- เปลี่ยนทั้งแอปพลิเคชันให้กลายเป็นระบบประมวลผลข้อความ
- CQRS (Command-Query Responsibility Segregation) (บทที่ 12)
- แนะนำประสิทธิภาพเชิงโครงสร้างจากการแยกความรับผิดชอบระหว่าง command และ query
- มีตัวอย่างการใช้งานทั้งกรณีที่ใช้ event และไม่ใช้ event
- การฉีด dependency (บทที่ 13)
- จัดระเบียบ dependency แบบ explicit/implicit
- ลงมือสร้างเฟรมเวิร์กสำหรับการฉีด dependency แบบเรียบง่าย
ภาคผนวกและคู่มือภาคปฏิบัติ
- วิธีนำไปใช้กับโปรเจ็กต์เดิม (Epilogue)
- การนำแพตเทิร์นไปใช้กับระบบเดิมยากกว่าการทำตัวอย่างง่าย ๆ
- มีการให้กลยุทธ์การประยุกต์ใช้และแหล่งอ้างอิงสำหรับเรื่องนี้
- แบบฝึกโค้ดและตัวอย่างบน GitHub
- เนื้อหาทั้งหมดของหนังสือถูกรวมเป็นโปรเจ็กต์ตัวอย่างเดียว
- ในแต่ละบทมีโค้ดให้ผ่าน GitHub branch
- รูปแบบการฝึกปฏิบัติ:
- ลงมือสร้างแอปตัวอย่างตามด้วยตนเอง
- ทดลองนำแพตเทิร์นไปใช้กับโปรเจ็กต์ของตนเอง
- ใช้ "Exercise for the Reader" ของแต่ละบทเพื่อฝึกเขียนโค้ด
เคล็ดลับ: แนะนำให้ checkout branch ที่เกี่ยวข้องบน GitHub ตั้งแต่ต้นบท เพื่อเรียนรู้ไปพร้อมกับโค้ดที่ทำงานได้จริง
2 ความคิดเห็น
มีฉบับแปลภาษาเกาหลีออกมาแล้ว Architecture Patterns with Python
ความคิดเห็นจาก Hacker News
หนังสือเล่มนี้เหมือนขุมทรัพย์เกี่ยวกับ architectural patterns ชอบตรงที่ทำให้เข้าใจหัวข้อได้ง่าย
บางส่วนของหนังสือเล่มนี้มีประโยชน์มาก โดยเฉพาะตอนที่พูดถึงแนวคิดซึ่งไม่ได้จำกัดอยู่แค่ Python หรือภาษาใดภาษาหนึ่ง
มองว่า Python เป็นภาษา glue language ที่ดี
ผมเป็นนักพัฒนา TypeScript แต่หนังสือเล่มนี้เป็นหนึ่งในหนังสือด้าน architecture ที่ผมชอบที่สุด และอ้างอิงอยู่เสมอ
เริ่มเขียน Python แบบมืออาชีพตั้งแต่หลายปีก่อน มาจาก Kotlin และ TypeScript แม้ภาษาจะเข้าถึงง่าย แต่ก็ลำบากในการทำให้เกิด loose coupling และ testability
เป็นหนึ่งในหนังสือการเขียนโปรแกรม Python ที่ยอดเยี่ยมจริง ๆ เสียดายที่โค้ดไม่มี static typing แต่ก็เป็นการตัดสินใจโดยตั้งใจของผู้เขียน
ขอบคุณที่แชร์แหล่งข้อมูลดี ๆ
ผมอ่านฉบับปกอ่อนของหนังสือเล่มนี้เมื่อ 2 ปีครึ่งหรือ 3 ปีก่อน สนุกมาก มันทำให้การทดสอบยังคงเป็นหัวข้อระดับ first-class และคอยอัปเดตอย่างต่อเนื่องทุกครั้งที่มีการเพิ่มอะไรเข้าไป
ไม่มีการพูดถึง Polylith เลย สงสัยว่ามันเกี่ยวข้องกันไหม
หนังสือเล่มนี้อ่านสนุกมาก เมื่อ 3 ปีก่อนผมทำงานในสภาพแวดล้อม C#/.NET DDD และตอนนี้กลับมาทบทวนแนวคิดเหล่านี้อีกครั้งใน Python พร้อมกับขัดเกลาส่วนที่เป็นแก่นสำคัญ