سری معماری نرم‌افزار

سبک‌های معماری نرم‌افزار

شروع دوره پایان‌یافته
به‌زودی اعلام می‌شود
۱۵
جلسه
۶۳
ساعت محتوا

این دوره چه مباحثی را پوشش می‌دهد؟

۰. مروری بر مفاهیم دوره مبانی معماری نرم‌افزار

مفاهیم کلیدی در شناخت مسئله

مروری بر مفاهیم اساسی مانند Context، Objective، Driver، Constraint، و Force و ... که برای تحلیل و شناخت فضای مسئله در معماری نرم‌افزار ضروری هستند.

مفاهیم حوزه ساختار و Structure

این بخش به مرور مفاهیم ساختاری مانند Structure، Element، Relation، و Interaction می‌پردازد که برای طراحی و سازمان‌دهی اجزای مختلف یک سیستم نرم‌افزاری اهمیت دارند.

Heuristic ها و راه‌حل‌های طبقه‌بندی‌شده

Heuristic ها و راه‌حل‌های طبقه‌بندی‌شده مانند Tactics, Patterns, Principles و ...

Quality Attributes / Characteristics

در این بخش، مشخصه‌های کیفی مانند Maintainability، Scalability، Evolvability و ... از دوره قبل مرور شده و تاثیرات و روابط آن‌ها با یکدیگر بررسی می‌شود.

مفهوم Trade-off

به نقل از کتاب Fundamentals of Software Architecture، یکی از وظایف طراح یا معمار، رسیدن به «least-worst combination of trade-offs» است. در این قسمت، به مرور مفهوم Trade-off و چگونگی توازن Quality Attribute یا Characteristics های مختلف خواهیم پرداخت.

۱. سبک یا Style در معماری نرم‌افزار

بخش اول این دوره به تعریف Architectural Style اختصاص دارد. در این بخش، ابتدا مفهوم Architectural Styles را تعریف می‌کنیم و نگاهی به تاریخچه و تعاریف مختلف این سبک‌ها در طول زمان خواهیم داشت. سپس به تفاوت‌ها و یا ارتباط بین مفهوم Style و مفاهیم دیگر در معماری نرم‌افزار، مانند الگوهای معماری (Architectural Patterns) و معماری مرجع (Reference Architecture) خواهیم پرداخت.

تعریف و شناخت مفهوم Architectural Style
  • تعریف سبک معماری یا Architectural Style چیست؟
  • تفاوت‌های کلیدی بین Architectural Style و Architectural Pattern
  • تفاوت بین Architectural Style و Reference Architecture (معماری مرجع)
  • روش‌های مختلف طبقه‌بندی سبک‌ها
  • ارزیابی سبک‌ها، Trade-off Analysis و معیارهای انتخاب سبک‌ها
ابعاد، مباحث و مفاهیم موجود در Style ها
  • انواع اجزاء (Parts) و المان‌ها (Elements) و روابط بین آن‌ها
  • مجموعه‌ای از Constraint ها، Guideline ها و محدودیت‌های اعمالی سبک
  • مجموعه Heuristic ها و Pattern های تشکیل‌دهنده سبک و یا مرتبط با آن
  • مجموعه Model های استفاده‌شده در سبک و یا مرتبط با آن
۲. Layered Architecture Style

مفهوم لایه‌بندی در معماری نرم‌افزار جدید نیست و از دهه ۹۰ میلادی به عنوان یک تکنیک رایج در طراحی نرم‌افزار مورد استفاده قرار گرفته است. لایه‌ها ساختارهایی در نرم‌افزار هستند که وظایف و عملیات سیستم را به بخش‌های مختلف و مجزا تقسیم می‌کنند، به‌گونه‌ای که هر بخش یا لایه در یک سطح خاص از انتزاع عمل می‌کند.

شناخت و تعریف
  • مروری بر تاریخچه و تحولات معماری لایه‌ای
  • تعریف معماری لایه‌ای
  • نقاط قوت و ضعف معماری لایه‌ای
  • بررسی Quality Attribute های مختلف در این معماری
تفکیک و Decomposition لایه‌ها
  • مساله Abstraction Level یا سطح انتزاع
  • Commonality Variability Analysis (CVA)
  • تفکیک Responsibility ها
  • موضوع Cross-Cutting Concerns
  • بررسی برخی اصول و الگوهای طراحی لایه‌ها مثل Separating Policy from Mechanism، Separation of Concerns و ...
Communication و ارتباط بین لایه‌ها
  • مفهوم Interface و اصول و الگوهای طراحی آن‌ها
  • روش‌ها و الگوهای Messaging Passing و ارتباط
  • مدیریت خطا در انتقال اطلاعات بین لایه‌ها
  • ترجمه بین لایه‌ها
Dependency و وابستگی بین لایه‌ها
  • Coupling & Cohesion در طراحی لایه‌ها
  • اصول و Heuristic های مدیریت وابستگی‌ها مثل Stable-Abstraction Principle و ...
  • مفاهیم Inversion of Control و Dependency Injection
  • مفهوم Vertical Layer یا Shared Layer
Case Study

در این بخش، معماری لایه‌ای را در چندین مورد مختلف بررسی خواهیم کرد؛ از مثال‌هایی خارج از حوزه نرم‌افزار مانند لایه‌های موجود در پروتکل‌های ارتباطی نظیر TCP/IP یا مدل OSI، تا بررسی معماری لایه‌ای در یک ابزار متن‌باز، یک پروژه سازمانی (Enterprise)، و یک نرم‌افزار سیستمی مانند سیستم‌عامل.

۳. Pipeline (Pipes and Filters) Architecture

سبک Pipeline (یا Pipes and Filters) یکی از قدیمی‌ترین سبک‌های معماری است که داده‌ها را در مسیری متشکل از Filter های مختلف حرکت می‌دهد و در این مسیر هر Filter یک وظیفه پردازشی مشخص را بر عهده دارد.

تعریف و شناخت

تعریف Pipeline (یا Pipes and Filters)، بررسی Trade-off های مربوط به آن، کاربردها، نقاط قوت و ضعف این سبک.

انواع (Variation) های مختلف در پیاده‌سازی سبک

بررسی شکل‌های مختلف طراحی Pipeline از جمله Linear Pipe، Bounded Pipe، Typed Pipe و ... به همراه کاربردشان.

Modifiability, Extensibility

بررسی مفاهیم، اصول و الگوهای مرتبط با Modifiability و Extensibility در معماری Pipeline. موضوعاتی مانند OCP (Open/Closed Principle) و روش‌های طراحی برای تسهیل قابلیت توسعه (Extensibility) از جمله Hook، Interception و دیگر الگوهای مشابه.

Composability & Reusability

چگونه می‌توان Filter ها را طوری طراحی کرد که Reusable باشند؟ چگونه می‌توانیم طراحی Composable داشته باشیم؟ موضوعاتی مانند میزان وابستگی Filter به ExecutionContext، نحوه طراحی Interface ها، استقلال Filter و ...

Context - Control - State
  • Context کلی اجرا (ExecutionContext) چگونه نگهداری و مدیریت می‌شود؟
  • داده‌ها چگونه در Pipeline حرکت می‌کنند؟
  • تغییر مسیر در اجرای Pipeline (Branch زدن) به چه صورت کنترل می‌شود؟
  • در چه شرایطی به فیلترهای Stateful نیاز داریم؟
Pipeline های توزیع‌شده

کاربردهایی مانند Stream Processing یا Event Processing در مقیاس بزرگ. ویژگی‌هایی مانند Scalability و Elasticity و نحوه مقیاس‌پذیری Pipeline.

Case Study

بررسی چندین Case Study از جمله فریم‌ورک‌ها و ابزارهایی مانند WCF و ASP.NET Core، سیستم‌های Messaging، و کاربردهای این سبک در Complex Event Processing (CEP)، Stream Processing و حوزه Signal Processing.

۴. Microkernel Style

سبک Microkernel سیستم را به دو بخش کلی تقسیم می‌کند: هسته اصلی (Core یا Kernel) که قابلیت‌های پایه‌ای سیستم را فراهم می‌کند و Plug-in هایی که با اتصال به این هسته اصلی، قابلیت‌ها و عملکردهای تکمیلی را به آن اضافه می‌کنند. این سبک در طراحی سیستم‌های متنوعی از جمله سیستم‌عامل‌ها، IDE ها، CMS ها و ... مورد استفاده قرار گرفته است (برای مثال Windows NT و یا Eclipse IDE).

تعریف و شناخت

تعریف سبک Microkernel، نقاط قوت، ضعف و Trade-off های آن، مشخصه‌های کیفی و کاربردهای این سبک.

طراحی Kernel و Plugin ها
  • برخی دغدغه‌های طراحی Kernel (Performance، مدیریت بهینه‌ی سرویس‌ها، منابع، Plugin Isolation و ...)
  • سطح انتزاع در طراحی Core یا Kernel (میزان Generic یا Domain-Specific بودن)
  • طبقه‌بندی‌های مختلف اجزاء در معماری Microkernel (دو سطحی و پنج سطحی)
  • Heuristic های طراحی در معماری Microkernel
  • موضوع تغییر و Backward Compatibility
  • مکانیزم‌های نصب و حذف Plugin ها
  • طراحی Plugin Registry
مساله Connectivity و Integration
  • انواع ارتباطات (Plugin-to-Kernel, Plugin-to-Plugin, Kernel-to-Plugin)
  • اصول و الگوهای ارتباط بین اجزاء
  • Heuristic های طراحی Interface ها
Extensibility

چگونه یک Microkernel می‌تواند با ایجاد بستری مناسب، امکان توسعه و اضافه کردن Plugin‌های متنوع را در طول زمان فراهم کند؟ تکنیک‌هایی مانند طراحی Extensibility Points، استفاده از Hook‌ها و Interceptor‌ها.

Faults & Failures

چگونه می‌توان اطمینان حاصل کرد که بروز Failure در یکی از پلاگین‌ها باعث خرابی کل سیستم نشود؟ موضوع Fault Tolerance و الگوهای مدیریت این مساله از جمله Fault Isolation.

Distributed Microkernel

کاربردهای (هر چند محدود) این سبک در حالت توزیع‌شده و چالش‌های مرتبط با آن.

Case Study

بررسی انواع سیستم‌های مبتنی بر سبک Microkernel شامل سیستم‌های مدیریت محتوا (CMS)، برخی سیستم‌عامل‌ها (مانند Windows NT) و برخی IDE ها (مثل Eclipse).

۵. Modular Monolith

سبک Modular Monolith سبکی در راستای طراحی یک سیستم یکپارچه و Monolithic است که به‌طور منطقی به ماژول‌های مستقل و قابل مدیریت تقسیم می‌شود. این سبک به دلیل ساختار Monolithic، هزینه و پیچیدگی کمتری نسبت به سیستم‌های توزیع‌شده دارد.

تعریف و شناخت

تعریف سبک Modular Monolith، نقاط قوت، ضعف و Trade-off های آن.

طراحی Module ها و Boundary ها
  • Abstraction، Decomposition و Granularity ماژول‌ها
  • رویکردهای متفاوت در طراحی Module ها (حول محور Sub-domain ها، حول محور Business Capability ها، Narrow Vertical Slicing)
طراحی Presentation Layer در Modular Monolith
  • بررسی روش‌های مختلف طراحی Presentation در سبک Modular Monolithic
  • اصول طراحی Composite UI و رعایت Modularity در آن
  • الگوهای ارتباط بین Module‌ها در Composite UI
  • استفاده از Microkernel برای طراحی Composite UI
طراحی دیتابیس
  • Modularity در Database
  • مساله Transaction ها و وابستگی تراکنشی Module ها
  • مساله Query های مشترک بین Module ها
  • موضوعات عملیاتی (مثل Backup، Disaster Recovery و ...) در Modular Monolith
Integration & Consistency
  • Transactional vs Eventual Consistency
  • استفاده از Event ها (Domain Event, Integration Event)
  • Orchestration و بررسی الگوهایی مانند Facade و ...
  • Query ها و Materialized View ها
Dependency و وابستگی بین ماژول‌ها
  • وابستگی و Dependency در سطوح مختلف (Database، مدل، Query ها و ...)
  • Anti-Corruption Layer و ترجمه بین ماژول‌ها
  • Shared Kernel، کاربردها، مزایا و معایب
۶. Event-Driven Architecture (EDA)

Event-Driven Architecture یا EDA یک سبک معماری است که عمدتاً به صورت ترکیبی و در کنار سبک‌های دیگر (مخصوصاً سبک‌های توزیع‌شده مثل Microservices) مورد استفاده قرار می‌گیرد. EDA با تمرکز بر روی Asynchrony، مشخصه‌های کیفی زیادی از جمله Scalability، Elasticity، Autonomy، Fault Tolerance، Extensibility و ... را تحت تاثیر قرار می‌دهد. مباحث این بخش از کلاس به تفصیل در دوره «مفاهیم و مقدمات Event-Driven Architecture» ارائه شده است.

تعریف و شناخت
  • نقاط ضعف، قوت و Trade-off های EDA
  • EDA به عنوان سبک ترکیبی با دیگر سبک‌ها (مانند Event-Driven Microservices)
  • Topology های مختلف در EDA
اصطلاح‌شناسی و Terminology
  • Implicit Invocation، Reactive Integration، Selective Broadcast
  • Consumer, Producer, Flow
  • Command, Event, Message
  • Sync vs Async Communication
  • Channel, Endpoint, Delivery
  • Queue, Stream
  • Broker, Mediator, Bus
  • Consumer-Driven vs Producer-Driven Subscription
Eventual Consistency
  • بررسی قاعده CAP و Trade-off های حوزه Consistency
  • شناخت مساله Consistency (Consistency Models، ابعاد مختلف Consistency)
  • Guarantee های مختلف مانند MRC, MWC, RYWC, WFRC
  • رویکردهای مواجهه با Eventual Consistency (Preventive مانند Lock/Reservation Pattern؛ Responsive - راه‌حل‌های مبتنی بر عکس‌العمل)
مروری بر برخی از مفاهیم و الگوهای Messaging
  • طراحی سیستم‌های Messaging در EDA مبتنی بر Pipes and Filters
  • مفاهیم پایه‌ای Messaging مانند (Message, Channel, Delivery, Endpoint و ...)
  • شناخت Delivery Guarantee ها (At-least-once, At-most-once و ...)
  • الگوهای Routing (مانند Aggregator, Splitter, Content-Based Router و ...)
  • الگوهای Transformation و تغییر پیام‌ها (مانند Content Enricher, Envelope Wrapper و ...)
  • الگوهای طراحی Endpoint ها (مانند Idempotent Receiver, Gateway و ...)
Transaction در EDA

بررسی Transaction ها در EDA. ابتدا مدل‌های مختلف Coordination (از جمله Choreography و Orchestration) و سپس مبحث Saga. مسائل طراحی در Saga ها مانند الگوهای طراحی آن‌ها، مدیریت State در آن‌ها و ...

Scalability, Elasticity

وجود تکنیک Implicit Receiver و ترکیب آن با مکانیزم‌های Async به معماری EDA این امکان را می‌دهد که قابلیت‌های گسترده‌ای در زمینه Scalability و Elasticity ارائه دهد.

Resiliency

یکی از ویژگی‌های برجسته EDA، قابلیت‌های آن در زمینه Resiliency و مقابله با Failure است:

  • روش‌های Protective (مانند Queue-Based Load Leveling و Queue-Based Rate Limiting و ...)
  • روش‌های Responsive (مانند Adaptive LIFO و Controlled Delay و ...)
Observability و Traceability
  • شناخت نیازمندی‌های Observability (محتوای پیام‌ها، وضعیت Channel ها و ...)
  • شناخت نیازمندی‌های Traceability (مسیر پیام‌ها، ترتیب اتفاقات و ...)
  • طراحی برای Observability و Traceability
  • بررسی تکنولوژی‌ها و ابزارهای مفید در این حوزه
پردازش موازی در EDA

بررسی پردازش موازی و چگونگی افزایش Performance از طریق پردازش موازی در EDA. چالش‌هایی مانند به‌هم خوردن ترتیب پیام‌ها و نحوه مدیریت آن‌ها.

معرفی برخی مسائل حوزه Event Processing

آشنایی با حوزه‌های مرتبط با پردازش Event ها مانند Stream Processing یا Complex Event Processing (CEP).

Case Study

بررسی تجربیات واقعی شرکت‌های بزرگ که از معماری EDA و سیستم‌های Messaging استفاده کرده‌اند، از جمله تجربه Facebook در زمینه Resiliency سیستم‌ها (مقاله Fail at Scale).

۷. Microservices Style

نیاز به طراحی سیستم‌های ابری بزرگ‌مقیاس در شرکت‌هایی مثل Amazon و Netflix، زمینه‌ساز به وجود آمدن سبک Microservices شد. این سبک، سبکی توزیع‌شده و مبتنی بر توسعه سرویس‌های Granular، مستقل و جدا است. از زمان ظهور Microservices تا به امروز، تغییرات زیادی در نگرش به این سبک ایجاد شده است. برای مثال در سال 2020، Uber که یکی از پیشگامان استفاده از این سبک بود، به سمت Domain-Oriented Microservice Architecture تغییر مسیر داد. همچنین در سال 2023، سرویس Amazon Prime Video تصمیم به بازگشت به ساختار Monolithic گرفت.

تعریف و شناخت

تعریف و شناخت سبک Microservices، و بررسی مزایا، معایب، و Trade-off‌های آن، به همراه نگاهی بر سیر تحول Service-Orientation در حوزه معماری نرم‌افزار.

طراحی سرویس‌ها
  • مساله Decomposition و تفکیک سرویس‌ها (Domain-Oriented Microservice Architecture)
  • مساله سایز و Granularity سرویس‌ها (بررسی Integrator و Disintegrator ها)
  • مساله Abstraction و سطح انتزاع سرویس‌ها
  • طراحی Boundary و مرز سرویس‌ها
استقلال و Autonomy سرویس‌ها
  • تعریف Autonomy و انواع آن (Runtime Autonomy و Design-Time Autonomy)
  • بررسی سطوح مختلف Autonomy
  • ارتباط Autonomy با مشخصه‌های کیفی دیگر
مواجهه با Failure و طراحی سرویس‌های Resilient
  • فعالیت‌های مختلف در حوزه Resiliency (Recognition, Isolation, Protection و ...)
  • تکنیک‌ها و ابزارهای حوزه Recognition مانند Healthchecks, Metrics و ...
  • الگوها و تکنیک‌های حوزه Isolation (مانند Bulkhead و ...)
  • الگوهای حوزه Protection (مانند Circuit Breaker، Back Pressure، Load Shedding و ...)
  • مباحث حوزه Mitigate (مانند Compensation، Rollback و ...)
Communication و Integration بین سرویس‌ها
  • بررسی Communication Pattern های مختلف
  • بهره‌گیری از EDA و توسعه Event-Driven Microservices
  • موضوعات حول محور طراحی API
  • بررسی Saga و انواع روش‌های پیاده‌سازی
  • مفاهیم Eventual Consistency
Scalability و Elasticity
  • Horizontal vs Vertical Scalability
  • مفهوم Auto-Scaling
  • مساله Distribution در ابعاد مختلف (سطح سرویس‌ها، سطح داده‌ها، Cache ها و ...)
  • الگوها، روش‌ها و Heuristic های طراحی سرویس‌های Scalable و Elastic
  • Distribution در داده‌ها (Replication, Partitioning و ...)
طراحی Frontend و API ها
  • بررسی برخی الگوهای رایج در سطح API ها (مانند API Gateway، BFF و ...)
  • بررسی سبک Micro Frontend جهت طراحی Frontend
Microservices و مساله Deployment
  • نقش Container ها و Orchestrator ها در جریان Deploy سرویس‌ها
  • نقش Practice های DevOps در توسعه و Deploy سرویس‌ها
  • بررسی Service Mesh ها
مایکروسرویس‌ها در Production

موضوعاتی مانند Observability، Monitoring، Logging و سایر مسائل مشابه با تمرکز بر ابعاد طراحی.

Evolution & Evolvability
  • تکامل‌پذیری و Evolvability در معماری Microservices
  • Adaptability و طراحی سرویس‌های Adaptive
  • Extensibility در طراحی سرویس‌ها
  • Case Study: بررسی مسیر تکاملی پیشگامان از جمله Uber، Amazon و ...
Distributed Monolith Anti-Patterns

بررسی مجموعه‌ای از اشتباهات رایج در زمینه‌های مختلف (مانند طراحی سرویس‌ها، ارتباط بین سرویس‌ها و ...) که منجر به ایجاد یک Distributed Monolith می‌شوند.

Case Study

بررسی چند Case Study از تجربه‌های موفق و ناموفق در استفاده از Microservices:

  • سیر تکاملی Uber در طراحی سرویس‌ها و حرکت به سمت Domain-Oriented Microservices
  • تجربه بازگشت به ساختار Monolithic در سرویس Amazon Prime Videos
  • مسیر مهاجرت Netflix به Cloud و معماری Microservices
۸. Architectural Governance

هر سبک معماری با مجموعه‌ای از اصول، راهنمایی (Guideline)، و Heuristics های طراحی همراه است که باید در طراحی سیستم توسط تیم رعایت شوند. این بخش از کلاس راهکارهای مختلفی برای اطمینان از رعایت اصول و قواعد سبک‌های معماری را بررسی می‌کند.

  • مروری بر تکنیک‌های بهبود جریان تصمیم‌گیری در تیم‌های توسعه از دوره قبل
  • نحوه مستندسازی جهت انتقال دقیق و جامع Guideline های سبک معماری
  • نحوه ساخت درک مشترک از Guideline ها و اصول موردنظر در سبک
  • نحوه برگزاری جلسات Design Review
  • به‌کارگیری Architecture Tests برای شناسایی و کنترل نقض قوانین (ابزارهایی مانند ArchUnit و ...)
۹. سبک‌ها و پویایی‌های انسانی

از سال 1968 و با مطرح شدن قانون Conway، ثابت شد که همه سیستم‌های نرم‌افزاری شامل این قانون می‌شوند: «سازمان‌هایی که سیستم‌ طراحی می‌کنند، ناگزیر طراحی‌هایی انجام می‌دهند که بازتابی از ساختارهای ارتباطی این سازمان‌هاست.»

  • مروری بر قانون Conway: بررسی چگونگی تأثیر ساختار سازمانی بر طراحی سیستم‌ها
  • The Reverse Conway Maneuver: نحوه ایجاد بهبود در طراحی سیستم‌ها از طریق تغییرات در ساختار سازمانی و تیمی
  • مروری بر مفاهیم Team Topologies: آشنایی با انواع تیم‌ها و تعاملات بین تیمی
  • Cognitive Load – بار شناختی: تاثیر سبک‌های معماری مختلف بر «بار شناختی» افراد و تیم‌ها
  • سبک‌ها و ساختار تیم‌ها و تعاملات تیمی: بررسی تأثیر سبک‌های مختلف معماری بر ساختار تیم‌ها و نحوه تعامل آن‌ها و بالعکس
مخاطبین دوره

این دوره برای چه کسانی مناسب است؟

  • ✓ درک صحیح و عمیق از مبانی طراحی و معماری نرم‌افزار.
  • ✓ پیش‌زمینه مطالعاتی در مورد سبک‌های معماری و تجربه عملی در به‌کارگیری آن‌ها، حتی اگر محدود و حداقلی باشد.
  • ✓ این دوره، دوره‌ای برای «آشنایی» با سبک‌های معماری نیست؛ تمرکز مباحث کلاس بر تحلیل و بررسی عمیق‌تر ابعاد مختلف این سبک‌هاست.

آنچه در این دوره یاد می‌گیرید

01

مفهوم سبک‌ها (Styles) را درک کنید

02

سبک‌ها را در Abstraction Level های مختلف مطالعه کنید

03

درک کنید که سبک‌ها چه تاثیراتی در ابعاد مختلف دارند (کیفیت محصول، نحوه تعامل تیم‌های توسعه، نحوه تغییرات آینده محصول و ...)

04

سبک‌های رایج در توسعه نرم‌افزارهای امروز را به همراه Trade-off های آن‌ها بشناسید

هنوز سوالی داری؟

پاسخ بیشترِ پرسش‌های رایج را در صفحه‌ی سوالات متداول جمع کرده‌ایم. اگر باز هم ابهامی مانده، مستقیم با من در تماس باش.

سوالات متداول تماس با من