دوره آموزش معماری نرم افزار (Software Architecture) یک دوره جامع است که دانشجو در آن با اصول طراحی شی گراء، Domain Driven Design، الگوهای طراحی، تفکر DDD ، الگوی CQRS و همچنین Evevnt Sourcing آشنا می گردد.

دوره آموزش معماری نرم افزار

  • طول دوره: 48 ساعت
  • مدرس: مهندس رضا ارجمند
  • تاریخ شروع: به زودی
  • ساعت برگزاری: پنجشنبه ها ساعت 17 تا 21
  • مبلغ دوره: 8,500,000 تومان

درباره دوره

در این دوره دانشجو با اصول طراحی شی گراء آشنا شده و می تواند کلاس های استاندارد، قابل تست و قابل نگهداری طراحی کند. همچنین با تفکر DDD آشنا شده و میتواند در پروژه های خود از این رویکرد و همچنین تلفیق آن با الگوی CQRS برای توسعه ی نرم افزار استفاده نماید.

سرفصل دوره آموزشی

تعریف معماری نرم افزار

در طول زمان، تعاریف مختلفی برای معماری نرم افزار (Software Architecture) و معمار نرم افزار بیان شده است. معماری نرم افزار، مجموعه ای از روش ها و اصول در طراحی ساختار سیستم های نرم افزاری است، که نحوه تعامل بخش های مختلف سیستم با یکدیگر را مشخص می کند. معمار نرم افزار به فردی اطلاق می شود که مسئول طراحی بنیادین سیستم های نرم افزاری است. این نقش فراتر از برنامه نویسی ساده است و شامل تصمیم گیری های مهم در مورد ساختار کلی و رویکردهای فنی برای یک پروژه نرم افزاری می شود. معماران نرم افزار باید دیدگاهی جامع نسبت به نیازهای کسب و کار و محدودیت های فنی داشته باشند و راه حل هایی را طراحی کنند که هم به لحاظ فنی قابل اجرا و هم منطبق بر اهداف تجاری باشند. در مقابل، معماری نرم افزار به مجموعه ای از اصول و روش هایی اشاره دارد که در طراحی و ساختاردهی سیستم های نرم افزاری به کار می روند. این مفهوم، اساسی ترین بخش های یک سیستم نرم افزاری را شامل می شود و شیوه ی تعامل این بخش ها با یکدیگر را تعریف می کند. این دوره به شما کمک می کند تا با مفاهیم اساسی و پیچیدگی های معماری نرم افزار آشنا شوید و مهارت های لازم برای طراحی و پیاده سازی سیستم های نرم افزاری کارآمد را کسب کنید

  • واژه معماری در Contextهای مختلف
  • معماری نرم افزار (Software Architecture) چیست؟
  • تعریف نقش و کارکرد معماری نرم افزار و تغییرات آن در طول زمان
  • تفاوت و ارتباط طراحی و معماری نرم افزار
  • نقش و اهمیت معماری نرم افزار
  • ابعاد، اجزا و مشخصه های معماری نرم افزار
  • بررسی حوزه های تاثیر معماری نرم افزار
    • حوزه فنی
    • حوزه سازمانی، انسانی و تیمی
    • حوزه محصول، کسب و کار و تجارت

نقش و اهمیت معماری نرم افزار

گام اول در یادگیری اصول معماری، درک عمیق نقش، اهمیت و کارکرد معماری است.

  • اهمیت معماری نرم افزار از زاویه فنی
    • فعال سازی یا بازدارندگی مشخصه های کیفی
    • تغییرات و تکامل نرم افزار در طول زمان
    • تاثیر تصمیمات معماری بر Constraintها در پیاده سازی
    • تاثیر تصمیمات معماری بر نحوه طراحی (Incremental, Iterative, ... )
    • تاثیر معماری و مستندات آن بر درک سیستم در تیم فنی
  • اهمیت معماری نرم افزار از منظر سازمانی، تیمی و انسانی
    • نگاهی بر قانون Conway و تاثیر ساختارهای ارتباطی سازمان بر معماری نرم افزار
    • تغییر و تکامل تیم ها و سازمان در راستای معماری مورد نیاز (The Reverse Conway Maneuver)
    • تاثیر معماری نرم افزار بر سرعت حرکت تیم ها
    • نقش معماری و مستندات آن برای تعامل با Stakeholderها
  • اهمیت معماری نرم افزار از زاویه محصول، کسب و کار و تجارت
    • ابعاد تاثیرات اقتصادی معماری نرم افزار
    • اهمیت درک درست Value Chain و ارتباط آن با معماری

مبانی Architectural Design

معمار، با درنظر گرفتن تمام فاکتورهای موجود ( اعم از تیم، پروژه، تکنولوژی، بازار و ... ) Business Driver ها را درک می کند آن ها را تبدیل به دغدغه های معماری می کند. این کار بدون مجهز بودن به تفکر معماری و بعد از آن دانستن اصول و مفاهیم Architectural Design، امکان پذیر نیست.

  • مفهوم و جایگاه Architectural Design
  • مفهوم Architectural Thinking
  • مفهوم Trade-off
  • مفهوم Architectural Drivers و آشنایی با انواع آنها
    • Design Goal
    • Quality Attributes
    • Primary Functionality
    • Concerns
    • Constraints
  • بررسی مفاهیم اولیه در Architectural Design
    • View / Paradigm
    • Functionality
    • Elements
    • Structures
    • Responsibilities
    • Relations
    • Interactions
    • Interfaces
    • Constraints
  • مطالعه اصول طراحی (به عنوان مثال Modularization، Abstraction و ...)
  • راه حل های طبقه بندی شده در معماری نرم افزار
    • تاکتیک ها در معماری نرم افزار
    • مفاهیم الگو و سبک
    • الگوهای معماری (Architectural Patterns)
    • سبک های معماری (Architectural Styles)
  • آشنایی با متدهای طراحی مختلف در معماری نرم افزار (مانند ADD و ... )

دغدغه ها و مشخصه های کیفی معماری نرم افزار

معماری نرم افزار در ابعاد مختلفی ارزیابی می شود، که یکی از مهمترین این ابعاد، بُعد کیفیت و ویژگی های معماری نرم افزار است. عوامل زیادی در کیفیت معماری تاثیر دارند و تقریبا هر تصمیم کلانی از سمت معمار، این مشخصه ها را تحت تاثیر قرار میدهد. این مشخصه های کیفی همانند Functionality و کارکرد صحیح، در آینده نرم افزار تاثیرگذار هستند و این تاثیر میتواند در ابعاد متفاوت باشد:

  • تکنیکال و فنی: بسیاری از سیستم های نرم افزاری، به خاطر هزینه ها و مشکلات زیاد در نگهداری، تست و پشتیبانی، بازنویسی می شوند.
  • بعد تجاری: بسیاری از نرم افزارها به خاطر کیفیت پایین معماری، موقعیت های بازار را از دست می دهند. برای مثال شکنندگی و یا وابستگی زیاد در معماری، باعث کندی سرعت تیم جهت ارائه نرم افزار می شود.
  • سازمانی و انسانی: بسیاری از تیم ها یا سازمان های نرم افزاری، به دلیل مشکل در معماری نرم افزار، دچار اختلال می شوند. برای مثال عدم مرزبندی درست و تفکیک اجزاء در معماری نرم افزار، باعث وابستگی فرآیندی تیم ها به یکدیگر می شود.

در این بخش، به بررسی ابعاد کیفی و مشخصه های معماری نرم افزار می پردازیم.

  • چگونه میتوان فهمید که به چه مشخصه های کیفی و تا چه حدی نیاز داریم؟
  • نیاز به مشخصه های کیفی را (به Stakeholderها، به بقیه اعضای تیم و ...) چطور تشریح و ابراز کنیم؟
  • معماری نرم افزار چگونه نیاز به این مشخصه های کیفی را پاسخ می دهد؟
  • فرآیند، زمان و نحوه تصمیم گیری در مورد این مشخصه های کیفی به چه شکل می باشد؟

بعد به بررسی مفاهیم زیر می پردازیم:

  • تعریف کیفیت و مشخصه های کیفی
  • بررسی اجمالی و طبقه بندی مشخصه های کیفی
  • تعریف Fitness Function و ارتباط آن با ویژگی های کیفی
  • ابعاد مختلف Fitness Function ها و تعریف Systemwide Fitness Function
  • بررسی برخی نمونه های رایج Fitness Functionها
  • مطالعه طبقه بندی انواع Fitness Function
  • اصول Fitness Functionها (Identify Early, Review Frequently, ...)
  • مسائل اساسی حوزه ویژگی های کیفی
    • نحوه تست و یا اندازه گیری یک ویژگی کیفی
    • ارتباط مشکلات با ویژگی های کیفی
    • تاثیر ویژگی های کیفی بر روی یکدیگر
    • پارادایم و مفاهیم متفاوت در ویژگی های مختلف
  • مفهوم Quality Attribute Scenarios و اجزای آن
  • راه های رسیدن به مشخصه های کیفی (Patterns, Tactics, ...)

سپس مشخصه های کیفی را تعریف می کنیم، عوامل تاثیرگذار بر روی آن ها را عنوان می کنیم و ارتباط و تاثیر آن ها بر روی یکدیگر را بررسی می کنیم :

  • Availability
  • Integrability
  • Deployability
  • Modifiability / Adaptability / Extendability / Extensibility / Flexibility
  • Scalability
  • Mobility / Portability
  • Performance / Efficiency
  • Security / Safety
  • Testability
  • Usability
  • Resiliency / Fault Tolerance / Reliability / Recoverability
  • Reusability

سپس برای هر کدام از این مشخصه های کیفی، الگوها، تاکتیک ها، سناریوها و Trade-off ها را مطالعه می کنیم.

نقش معمار نرم افزار

  • تعریف نقش معمار نرم افزار
  • تعاریف نگاه های مختلف در طول زمان به نقش معمار
  • حوزه های وظایف معمار نرم افزار
  • حوزه های خلق ارزش معمار نرم افزار
  • هسته مهارت های معماری
    • مهارتِ دانش محور
    • عملگرایی و تاثیر
    • راهبری و پیشبرد
  • مهارت ها و دانش مورد نیاز معمار نرم افزار
  • تفاوت ها، شباهت ها و ارتباطات نقش معمار با نقش های دیگر در تیم
    • Developers
    • Tech Leads
    • Project Managers
    • Head / Director / VP of Engineering
    • CTO
    • Product Owners / Managers
    • Enterprise Architect
    • Solution Architect
    • Software Architect
    • Chief / Lead Software Architect
    • Application Architect انواع معمار، تفاوت ها و شباهت ها

آشنایی با Domain-Driven Design (DDD)

  • آشنایی با فلسفه، تفکر و رویکرد DDD در طراحی
  • بررسی چالش ها و مزایای استفاده از DDD
  • از DDD در چه پروژه هایی می توان  استفاده کرد؟
  • اصول و توصیه های DDD در طراحی
  • نگاهی بر جنبه های سازمانی DDD
  • بررسی حوزه های تاثیر معماری نرم افزار

Strategic Design

  • آشنایی با مفاهیم Domain ، Sub-Domain و Bounded Context
  • انواع Sub-Domain ها (Core, Supporting, Generic)
  • نگاهی بر متدهای شناخت مساله و استخراج دانش
    • Event storming
    • Domain storytelling
    • User story mapping
  • آشنایی با مفهوم Ubiquitous Language
  • آشنایی با Context Map
  • انواع روابط بین Bounded-Context ها و تیم ها
    • Shared Kernel
    • Partnership
    • Customer-Supplier
    • Conformist
    • Anti-Corruption Layer
    • Open Host Service
    • Published Language
    • Separate Ways
  • مفهوم Perspective (زاویه دید) و تاثیر آن در طراحی

مفاهیم Tactical-Design و Model-Driven Design

  • آشنایی با مفهوم Domain-Model
  • بررسی مفهوم Persistence Ignorance
  • بررسی اجزای سازنده Domain-Model
    • Entity
    • Value Object
    • Aggregate & Aggregate Root
    • Domain Service
    • Domain Event
    • Repositories
    • Factories

معماری نرم افزار بر پایه Domain-Driven Design

  • تعریف معماری نرم افزار
  • تاریخچه ی معماری لایه ای
  • ظهور معماری های Domain-Centric
  • انواع معماری های Domain-Centric
    • Ports & Adapters / Hexagonal Architecture
    • Onion Architecture
    • Clean Architecture
  • نگاهی بر لایه های مختلف نرم افزار و وظایف هر یک 
    • Domain Layer
    • Application Layer
    • Infrastructure Layer
    • Service Layer
    • User Interface Layer
  • نگاهی بر اصل Dependency Inversion در SOLID و تاثیر آن در طراحی
  • آشنایی با Event-Driven Architecture
  • آشنایی با CQRS و Event Sourcing
  • مفهوم Eventual Consistency و Transactional Consistency
  • آشنایی با قاعده ی CAP
  • آشنایی با معماری Microservices

پیاده سازی پروژه با رویکرد Domain-Driven Design

  • طرح مساله و شروع تحلیل و شناسایی Sub-Domain ها
  • استارت پروژه ها و شروع به پیاده سازی Bounded Context ها
  • شناسایی Invariant ها و طراحی Aggregate ها
  • پیاده سازی لایه ی Domain
    • نحوه پیاده سازی Entity ها
    • استراتژی های تولید Id
    • نحوه پیاده سازی Value Object ها
    • پیاده سازی Immutability، Replace-ability و Value Equality در Value Object ها
    • پیاده سازی Domain-Service ها
    • استفاده از برخی الگوهای طراحی در لایه Domain
      • Builder
      • Factory Method
      • Prototype
      • Abstract Factory
      • Composite
      • Visitor
      • Composite Specification
      • State
      • Strategy
      • Template Method
    • نحوه ی پیاده سازی Domain-Event ها
    • نحوه استفاده از الگوی Mediator، Observer و Event Aggregator
  • پیاده سازی لایه ی Application
    • مفهوم Application Logic و تفاوت آن با Business Logic
    • بررسی Application Service ها و وظایف آنها
    • پیاده سازی Command و Command Handler ها
  • لایه Service
    • آشنایی با REST و سرویس های RESTful
    • استراتژی پیاده سازی سرویس های REST در معماری های Domain-Centric
    • قوانین پیاده سازی سرویس های REST
    • مدیریت تغییرات و Versioning در REST
    • آشنایی با سرویس های RPC و تکنولوژی gRPC
  • ذخیره سازی داده ها
    • الگوی Repository و Unit of Work
    • ذخیره سازی Aggregate ها در RDBMS ها
      • ذخیره سازی Entity ها و Value Object ها
      • مدیریت Connection و Transaction
      • استراتژی های مدیریت Concurrency
      • نحوه ذخیره سازی Aggregate ها با ORM ها و مقایسه امکانات هر یک (NHibernate و EFCore)
      • بررسی استراتژی های ذخیره سازی داده ها در دیتابیس های NoSql
  • خواندن داده ها
    • بررسی الگوهای CQS و CQRS
    • نحوه پیاده سازی Read-Model
    • استراتژی های Denormal کردن داده ها در Read Model
    • مفهوم Materialized Views
  • نیازهای Cross-Cutting
    • آشنایی با AOP و روش های پیاده سازی آن
    • پیاده سازی Logging, Authorization, Authentication, Caching
  • لایه Presentation
    • نگاهی بر مفهوم Task-Based UI
  • Integration بین Bounded Context ها
    • Integration از طریق Messaging
      • بررسی برخی مفاهیم Messaging (مانند Idempotency, Pub-Sub و ... )
      • بررسی ابزار MassTransit
      • پیاده سازی الگوی Outbox
    • Integration از طریق سرویس های REST
    • پیاده سازی Open Host Service
    • پیاده سازی Shared Kernel
    • پیاده سازی Anti-Corruption Layer

پیش نیاز دوره

با توجه به تخصصی بودن دوره آموزشی معماری نرم افزارهای Enterprise در دات نت مخاطبین می بایست حداقل 3 سال سابقه کار برنامه نویسی داشته باشند.