این دوره چه مباحثی را پوشش میدهد؟
۰. مروری بر مفاهیم دوره مبانی معماری نرمافزار
مروری بر مفاهیم اساسی مانند Context، Objective، Driver، Constraint، و Force و ... که برای تحلیل و شناخت فضای مسئله در معماری نرمافزار ضروری هستند.
این بخش به مرور مفاهیم ساختاری مانند Structure، Element، Relation، و Interaction میپردازد که برای طراحی و سازماندهی اجزای مختلف یک سیستم نرمافزاری اهمیت دارند.
Heuristic ها و راهحلهای طبقهبندیشده مانند Tactics, Patterns, Principles و ...
در این بخش، مشخصههای کیفی مانند Maintainability، Scalability، Evolvability و ... از دوره قبل مرور شده و تاثیرات و روابط آنها با یکدیگر بررسی میشود.
به نقل از کتاب 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 Pattern
-
تفاوت بین Architectural Style و Reference Architecture (معماری مرجع)
-
روشهای مختلف طبقهبندی سبکها
-
ارزیابی سبکها، Trade-off Analysis و معیارهای انتخاب سبکها
-
انواع اجزاء (Parts) و المانها (Elements) و روابط بین آنها
-
مجموعهای از Constraint ها، Guideline ها و محدودیتهای اعمالی سبک
-
مجموعه Heuristic ها و Pattern های تشکیلدهنده سبک و یا مرتبط با آن
-
مجموعه Model های استفادهشده در سبک و یا مرتبط با آن
۲. Layered Architecture Style
مفهوم لایهبندی در معماری نرمافزار جدید نیست و از دهه ۹۰ میلادی به عنوان یک تکنیک رایج در طراحی نرمافزار مورد استفاده قرار گرفته است. لایهها ساختارهایی در نرمافزار هستند که وظایف و عملیات سیستم را به بخشهای مختلف و مجزا تقسیم میکنند، بهگونهای که هر بخش یا لایه در یک سطح خاص از انتزاع عمل میکند.
-
مروری بر تاریخچه و تحولات معماری لایهای
-
تعریف معماری لایهای
-
نقاط قوت و ضعف معماری لایهای
-
بررسی Quality Attribute های مختلف در این معماری
-
مساله Abstraction Level یا سطح انتزاع
-
Commonality Variability Analysis (CVA)
-
تفکیک Responsibility ها
-
موضوع Cross-Cutting Concerns
-
بررسی برخی اصول و الگوهای طراحی لایهها مثل Separating Policy from Mechanism، Separation of Concerns و ...
-
مفهوم Interface و اصول و الگوهای طراحی آنها
-
روشها و الگوهای Messaging Passing و ارتباط
-
مدیریت خطا در انتقال اطلاعات بین لایهها
-
ترجمه بین لایهها
-
Coupling & Cohesion در طراحی لایهها
-
اصول و Heuristic های مدیریت وابستگیها مثل Stable-Abstraction Principle و ...
-
مفاهیم Inversion of Control و Dependency Injection
-
مفهوم Vertical Layer یا Shared Layer
در این بخش، معماری لایهای را در چندین مورد مختلف بررسی خواهیم کرد؛ از مثالهایی خارج از حوزه نرمافزار مانند لایههای موجود در پروتکلهای ارتباطی نظیر TCP/IP یا مدل OSI، تا بررسی معماری لایهای در یک ابزار متنباز، یک پروژه سازمانی (Enterprise)، و یک نرمافزار سیستمی مانند سیستمعامل.
۳. Pipeline (Pipes and Filters) Architecture
سبک Pipeline (یا Pipes and Filters) یکی از قدیمیترین سبکهای معماری است که دادهها را در مسیری متشکل از Filter های مختلف حرکت میدهد و در این مسیر هر Filter یک وظیفه پردازشی مشخص را بر عهده دارد.
تعریف Pipeline (یا Pipes and Filters)، بررسی Trade-off های مربوط به آن، کاربردها، نقاط قوت و ضعف این سبک.
بررسی شکلهای مختلف طراحی Pipeline از جمله Linear Pipe، Bounded Pipe، Typed Pipe و ... به همراه کاربردشان.
بررسی مفاهیم، اصول و الگوهای مرتبط با Modifiability و Extensibility در معماری Pipeline. موضوعاتی مانند OCP (Open/Closed Principle) و روشهای طراحی برای تسهیل قابلیت توسعه (Extensibility) از جمله Hook، Interception و دیگر الگوهای مشابه.
چگونه میتوان Filter ها را طوری طراحی کرد که Reusable باشند؟ چگونه میتوانیم طراحی Composable داشته باشیم؟ موضوعاتی مانند میزان وابستگی Filter به ExecutionContext، نحوه طراحی Interface ها، استقلال Filter و ...
-
Context کلی اجرا (ExecutionContext) چگونه نگهداری و مدیریت میشود؟
-
دادهها چگونه در Pipeline حرکت میکنند؟
-
تغییر مسیر در اجرای Pipeline (Branch زدن) به چه صورت کنترل میشود؟
-
در چه شرایطی به فیلترهای Stateful نیاز داریم؟
کاربردهایی مانند Stream Processing یا Event Processing در مقیاس بزرگ. ویژگیهایی مانند Scalability و Elasticity و نحوه مقیاسپذیری Pipeline.
بررسی چندین Case Study از جمله فریمورکها و ابزارهایی مانند WCF و ASP.NET Core، سیستمهای Messaging، و کاربردهای این سبک در Complex Event Processing (CEP)، Stream Processing و حوزه Signal Processing.
سبک Microkernel سیستم را به دو بخش کلی تقسیم میکند: هسته اصلی (Core یا Kernel) که قابلیتهای پایهای سیستم را فراهم میکند و Plug-in هایی که با اتصال به این هسته اصلی، قابلیتها و عملکردهای تکمیلی را به آن اضافه میکنند. این سبک در طراحی سیستمهای متنوعی از جمله سیستمعاملها، IDE ها، CMS ها و ... مورد استفاده قرار گرفته است (برای مثال Windows NT و یا Eclipse IDE).
تعریف سبک Microkernel، نقاط قوت، ضعف و Trade-off های آن، مشخصههای کیفی و کاربردهای این سبک.
-
برخی دغدغههای طراحی Kernel (Performance، مدیریت بهینهی سرویسها، منابع، Plugin Isolation و ...)
-
سطح انتزاع در طراحی Core یا Kernel (میزان Generic یا Domain-Specific بودن)
-
طبقهبندیهای مختلف اجزاء در معماری Microkernel (دو سطحی و پنج سطحی)
-
Heuristic های طراحی در معماری Microkernel
-
موضوع تغییر و Backward Compatibility
-
مکانیزمهای نصب و حذف Plugin ها
-
طراحی Plugin Registry
-
انواع ارتباطات (Plugin-to-Kernel, Plugin-to-Plugin, Kernel-to-Plugin)
-
اصول و الگوهای ارتباط بین اجزاء
-
Heuristic های طراحی Interface ها
چگونه یک Microkernel میتواند با ایجاد بستری مناسب، امکان توسعه و اضافه کردن Pluginهای متنوع را در طول زمان فراهم کند؟ تکنیکهایی مانند طراحی Extensibility Points، استفاده از Hookها و Interceptorها.
چگونه میتوان اطمینان حاصل کرد که بروز Failure در یکی از پلاگینها باعث خرابی کل سیستم نشود؟ موضوع Fault Tolerance و الگوهای مدیریت این مساله از جمله Fault Isolation.
کاربردهای (هر چند محدود) این سبک در حالت توزیعشده و چالشهای مرتبط با آن.
بررسی انواع سیستمهای مبتنی بر سبک Microkernel شامل سیستمهای مدیریت محتوا (CMS)، برخی سیستمعاملها (مانند Windows NT) و برخی IDE ها (مثل Eclipse).
سبک Modular Monolith سبکی در راستای طراحی یک سیستم یکپارچه و Monolithic است که بهطور منطقی به ماژولهای مستقل و قابل مدیریت تقسیم میشود. این سبک به دلیل ساختار Monolithic، هزینه و پیچیدگی کمتری نسبت به سیستمهای توزیعشده دارد.
تعریف سبک Modular Monolith، نقاط قوت، ضعف و Trade-off های آن.
-
Abstraction، Decomposition و Granularity ماژولها
-
رویکردهای متفاوت در طراحی Module ها (حول محور Sub-domain ها، حول محور Business Capability ها، Narrow Vertical Slicing)
-
بررسی روشهای مختلف طراحی Presentation در سبک Modular Monolithic
-
اصول طراحی Composite UI و رعایت Modularity در آن
-
الگوهای ارتباط بین Moduleها در Composite UI
-
استفاده از Microkernel برای طراحی Composite UI
-
Modularity در Database
-
مساله Transaction ها و وابستگی تراکنشی Module ها
-
مساله Query های مشترک بین Module ها
-
موضوعات عملیاتی (مثل Backup، Disaster Recovery و ...) در Modular Monolith
-
Transactional vs Eventual Consistency
-
استفاده از Event ها (Domain Event, Integration Event)
-
Orchestration و بررسی الگوهایی مانند Facade و ...
-
Query ها و Materialized View ها
-
وابستگی و 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
-
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
-
بررسی قاعده CAP و Trade-off های حوزه Consistency
-
شناخت مساله Consistency (Consistency Models، ابعاد مختلف Consistency)
-
Guarantee های مختلف مانند MRC, MWC, RYWC, WFRC
-
رویکردهای مواجهه با Eventual Consistency (Preventive مانند Lock/Reservation Pattern؛ Responsive - راهحلهای مبتنی بر عکسالعمل)
-
طراحی سیستمهای 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. ابتدا مدلهای مختلف Coordination (از جمله Choreography و Orchestration) و سپس مبحث Saga. مسائل طراحی در Saga ها مانند الگوهای طراحی آنها، مدیریت State در آنها و ...
وجود تکنیک Implicit Receiver و ترکیب آن با مکانیزمهای Async به معماری EDA این امکان را میدهد که قابلیتهای گستردهای در زمینه Scalability و Elasticity ارائه دهد.
یکی از ویژگیهای برجسته EDA، قابلیتهای آن در زمینه Resiliency و مقابله با Failure است:
-
روشهای Protective (مانند Queue-Based Load Leveling و Queue-Based Rate Limiting و ...)
-
روشهای Responsive (مانند Adaptive LIFO و Controlled Delay و ...)
-
شناخت نیازمندیهای Observability (محتوای پیامها، وضعیت Channel ها و ...)
-
شناخت نیازمندیهای Traceability (مسیر پیامها، ترتیب اتفاقات و ...)
-
طراحی برای Observability و Traceability
-
بررسی تکنولوژیها و ابزارهای مفید در این حوزه
بررسی پردازش موازی و چگونگی افزایش Performance از طریق پردازش موازی در EDA. چالشهایی مانند بههم خوردن ترتیب پیامها و نحوه مدیریت آنها.
آشنایی با حوزههای مرتبط با پردازش Event ها مانند Stream Processing یا Complex Event Processing (CEP).
بررسی تجربیات واقعی شرکتهای بزرگ که از معماری EDA و سیستمهای Messaging استفاده کردهاند، از جمله تجربه Facebook در زمینه Resiliency سیستمها (مقاله Fail at Scale).
نیاز به طراحی سیستمهای ابری بزرگمقیاس در شرکتهایی مثل 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 و انواع آن (Runtime Autonomy و Design-Time Autonomy)
-
بررسی سطوح مختلف Autonomy
-
ارتباط Autonomy با مشخصههای کیفی دیگر
-
فعالیتهای مختلف در حوزه Resiliency (Recognition, Isolation, Protection و ...)
-
تکنیکها و ابزارهای حوزه Recognition مانند Healthchecks, Metrics و ...
-
الگوها و تکنیکهای حوزه Isolation (مانند Bulkhead و ...)
-
الگوهای حوزه Protection (مانند Circuit Breaker، Back Pressure، Load Shedding و ...)
-
مباحث حوزه Mitigate (مانند Compensation، Rollback و ...)
-
بررسی Communication Pattern های مختلف
-
بهرهگیری از EDA و توسعه Event-Driven Microservices
-
موضوعات حول محور طراحی API
-
بررسی Saga و انواع روشهای پیادهسازی
-
مفاهیم Eventual Consistency
-
Horizontal vs Vertical Scalability
-
مفهوم Auto-Scaling
-
مساله Distribution در ابعاد مختلف (سطح سرویسها، سطح دادهها، Cache ها و ...)
-
الگوها، روشها و Heuristic های طراحی سرویسهای Scalable و Elastic
-
Distribution در دادهها (Replication, Partitioning و ...)
-
بررسی برخی الگوهای رایج در سطح API ها (مانند API Gateway، BFF و ...)
-
بررسی سبک Micro Frontend جهت طراحی Frontend
-
نقش Container ها و Orchestrator ها در جریان Deploy سرویسها
-
نقش Practice های DevOps در توسعه و Deploy سرویسها
-
بررسی Service Mesh ها
موضوعاتی مانند Observability، Monitoring، Logging و سایر مسائل مشابه با تمرکز بر ابعاد طراحی.
-
تکاملپذیری و Evolvability در معماری Microservices
-
Adaptability و طراحی سرویسهای Adaptive
-
Extensibility در طراحی سرویسها
-
Case Study: بررسی مسیر تکاملی پیشگامان از جمله Uber، Amazon و ...
بررسی مجموعهای از اشتباهات رایج در زمینههای مختلف (مانند طراحی سرویسها، ارتباط بین سرویسها و ...) که منجر به ایجاد یک Distributed Monolith میشوند.
بررسی چند 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 های آنها بشناسید
هنوز سوالی داری؟
پاسخ بیشترِ پرسشهای رایج را در صفحهی سوالات متداول جمع کردهایم. اگر باز هم ابهامی مانده، مستقیم با من در تماس باش.