دوره آموزشی مبانی معماری نرم افزار - Software Architecture Fundamentals

  • معرفی دوره

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

    معماری نرم‌افزار را می‌توان یکی از کلیدی‌ترین حوزه‌های طراحی نرم‌افزار دانست. معماری نرم‌افزار، نه یک حوزه صرفا فنی، بلکه یک حوزه کاملا راهبردی و استراتژیک است. تصمیمات حوزه معماری نرم‌افزار، تصمیمات کلیدی و فنی-استراتژیک هستند که می‌توانند در موفقیت و یا عدم موفقیت پروژه نقش کلیدی ایفا کنند.

    در طول این دوره، موضوعات مختلفی از جمله تعریف معماری نرم‌افزار، نقش و اهمیت آن، ابعاد مختلف تاثیر معماری نرم‌افزار، و حوزه Architectural Design را بررسی خواهیم کرد. همچنین به بررسی معماری نرم‌افزار، از بعد کیفی میپردازیم و مولفه‌ها و مشخصه‌های کیفی را به تفکیک بررسی میکنیم. سپس به سراغ چرخه تولید نرم‌افزار می‌رویم و نقش و تاثیر معماری و همینطور وظایف و کارکرد معمار را بررسی میکنیم.

    این دوره، اولین دوره در «سری دوره معماری نرم افزار» است و بر مفاهیم اساسی و بنیادین تمرکز دارد.

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

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

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

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

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

    معمار، با درنظر گرفتن تمام فاکتورهای موجود (اعم از تیم، پروژه، تکنولوژی، مارکت و ...) Business Driver ها را درک میکند آن‌ها را تبدیل به دغدغه‌های معماری می‌کند. این‌کار بدون مجهز بودن به تفکر معماری (Architectural Thinking) و بعد از آن دانستن اصول و مفاهیم Architectural Design، میسر نیست. این بخش از کلاس، به 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 و ...)
    • راه حل های طبقه بندی شده در معماری نرم افزار
      • تاکتیک ها (Tactics) در معماری نرم افزار
      • مفاهیم الگو (Pattern) و سبک (Style) و تعاریف متفاوت آنها در طول زمان
      • الگوهای معماری (Architectural Patterns)
      • سبک های معماری (Architectural Styles)
    • آشنایی با متدهای طراحی مختلف در معماری نرم افزار (مانند ADD و ... )
  • تحلیل، نقد و ارزیابی معماری نرم‌افزار

    «آیا نرم افزاری که با این تصمیمات معماری توسعه داده شود، به اهداف کسب و کار میرسد؟» . این سوال شاید کلیدی‌ترین و اساسی‌ترین سوالی باشد که یک معمار نرم‌افزار باید از خود بپرسد. در پاسخ به این سوال، معمار باید بتواند تصمیمات معماری را از زوایا و ابعاد مختلف، تحلیل، بررسی، نقد و ارزیابی کند. Trade-Off های تصمیمات را به دقت تحلیل کند و تاثیرات تصمیمات را جمع آوری و مطالعه کند. در این بخش از کلاس، به این موضوع می-پردازیم که چطور می‌توان معماری را (در تمام ابعاد) تحلیل، نقد و ارزیابی کرد تا بتوان حجم تصمیمات اشتباه را کاهش داد و یا از وقوع مشکلات و یا حادتر شدن مشکلات جلوگیری کرد.

    • تحلیل، بررسی و ارزیابی بر اساس مشخصه‌های کیفی
    • تحلیل، بازبینی و ارزیابی مستمر معماری در طول عمر پروژه
    • فاکتورهای قابل بررسی در ارزیابی معماری
      • Trade-off ها به همراه استدلال‌ها و تحلیل‌های آنها
      • تصمیمات طراحی
      • کیفیت خروجی از طریق Design Evaluation یا Code Inspection
      • Fitness Function ها، Constraint ها و قوانین
      • ساختار تیم‌ها
    • بررسی رویکردهای متفاوت برای تحلیل و ارزیابی معماری
      • رویکردهای مبتنی بر تصمیم (Decision-Centric)
      • رویکردهای مبتنی بر سناریو مانند Architecture Trade-off Analysis Method (ATAM)
      • رویکردهای مبتنی بر سوالات کلیدی (Key-Questions)
  • فرآیند و راهبرد معماری نرم‌افزار

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

    • Architectural Design در چرخه توسعه نرم‌افزار
    • نقش، کاربرد و کارکرد تحلیل (Analyze) در معماری نرم‌افزار
    • تکنیک های تحلیل در معماری نرم افزار
    • تصمیم‌گیری و تصمیم‌سازی در چرخه توسعه
      • تعریف Design Decision
      • فرآیند تصمیم سازی و تصمیم گیری
      • شناسایی عوامل موثر بر تصمیم ها
      • نحوه شناسایی ریسک ها، مشکلات و مسائل
      • آنالیزهای متفاوت برای شناسایی ریسک
      • تحلیل، آنالیز و مطالعه گزینه ها و تاثیر تصمیمات
      • تبیین پروسه Architectural Decision Making
      • مستندسازی تصمیمات معماری با Architectural Decision Records
      • مفهوم RFC (Request for comments)
    • تعریف، اعمال و بازبینی Constraint ها در سطوح مختلف طراحی
    • مستندسازی و انتقال دانش معماری (دوره کامل: مستندسازی معماری نرم افزار، لینک به زودی)
    • فرآیند ارزیابی معماری نرم افزار
    • آشنایی با Continuous Architecture و اصول آن (دوره کامل: معماری نرم افزار در عمل - لینک به زودی)
    • نگاه Evolutionary Architecture (دوره کامل: معماری نرم افزار در عمل - لینک به زودی)
  • دغدغه‌ها و مشخصه‌های کیفی معماری نرم‌افزار

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

    1. تکنیکال و فنی: بسیاری از سیستم های نرم افزاری، به خاطر هزینه ها و مشکلات زیاد در نگهداری، تست و پشتیبانی، بازنویسی می شوند.

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

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

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

    1. چگونه میتوان فهمید که به چه مشخصه های کیفی و تا چه حدی نیاز داریم؟

    2. نیاز به مشخصه های کیفی را (به Stakeholder ها، به بقیه اعضای تیم و ...) چطور تشریح و ابراز کنیم؟

    3. معماری نرم افزار چگونه نیاز به این مشخصه های کیفی را پاسخ می دهد؟

    4. فرآیند، زمان و نحوه تصمیم گیری در مورد این مشخصه های کیفی به چه شکل می باشد؟

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

    • تعریف کیفیت و مشخصه های کیفی
    • بررسی اجمالی و طبقه بندی مشخصه های کیفی
    • تعریف 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
    • Career و آینده شغلی معماران نرم افزار