Notatky logo
Published on

Основи архітектури програмного забезпечення

Автори
  • avatar
    Name
    Еклезіаст
    github

Архітектура програмного забезпечення — це фундаментальна структура системи, яка визначає її поведінку, взаємодію компонентів та довгострокові цілі розвитку. Розуміння основних принципів архітектури критично важливе для створення масштабованих, надійних та підтримуваних систем.

Основні компоненти архітектури

Структура системи (System Structure)

Структура системи визначає тип архітектурного стилю, який застосовується в проєкті. До найпоширеніших стилів належать:

  • Монолітна архітектура — єдиний блок для розгортання
  • Мікросервісна архітектура — розподілені незалежні сервіси
  • Багатошарова архітектура — організація за логічними шарами
  • Подієво-орієнтована архітектура — взаємодія через події

Вибір архітектурного стилю безпосередньо впливає на розподіл компонентів, комунікацію між ними та можливості масштабування системи.

Архітектурні характеристики (Architectural Characteristics)

Архітектурні характеристики, також відомі як "іlities" (scalability, reliability, security, maintainability), представляють нефункціональні вимоги системи. Вони визначають, якою має бути система для забезпечення відповідного рівня якості та відповідають на питання "як система має працювати", а не "що система має робити".

Архітектурні рішення (Architectural Decisions)

Архітектурні рішення визначають набір правил, обмежень та принципів, за якими будується система. Ці рішення забезпечують дотримання вимог та досягнення архітектурних цілей, створюючи консистентну основу для розробки.

Принципи дизайну (Design Principles)

Принципи дизайну слугують довгостроковими орієнтирами для інженерів протягом усього життєвого циклу проєкту. Найвідоміші принципи включають:

  • SOLID — принципи об'єктно-орієнтованого програмування
  • DRY (Don't Repeat Yourself) — уникнення дублювання коду
  • KISS (Keep It Simple, Stupid) — простота як основа якості
  • YAGNI (You Aren't Gonna Need It) — не реалізувати функціональність "на випадок"

Закони архітектури

Сфера архітектури програмного забезпечення є надзвичайно широкою та спирається на багатий досвід поколінь розробників. Дослідження в цій галузі виявили два фундаментальні закони, які завжди слід враховувати при проектуванні систем:

1. Компроміси є всюди (Everything is a Trade-off)

Будь-яке архітектурне рішення передбачає певні втрати в одному аспекті для досягнення вигоди в іншому. Наприклад:

  • Продуктивність vs Простота: Високопродуктивні рішення часто є більш складними у реалізації
  • Масштабованість vs Складність: Розподілені системи забезпечують кращу масштабованість, але збільшують складність
  • Швидкість розробки vs Якість: Прискорення розробки може призвести до зниження якості коду

2. ЧОМУ важливіше за ЯК (Why is More Important Than How)

Глибоке розуміння мотивації та причин архітектурних рішень має пріоритет над технічними аспектами реалізації. Архітектор повинен розуміти бізнес-контекст, обмеження та цілі проєкту перед тим, як обирати конкретні технології або підходи.

Модульність

Модульність є одним з ключових принципів архітектури програмного забезпечення. Термін "модуль" використовується для опису логічного об'єднання пов'язаного коду (класи, функції, компоненти тощо). Якість модульності оцінюється через три фундаментальні концепції:

Cohesion (Зв'язність)

Зв'язність описує, наскільки тісно пов'язані частини модуля між собою. Ідеальний модуль — той, у якого всі елементи підтримують одну чітко визначену функцію або відповідають за одну відповідальність.

Принцип: Високий рівень зв'язності всередині модуля забезпечує кращу читабельність, тестованість та підтримуваність коду.

Розділення модуля призведе до збільшення зв'язків і втрати читабельності.
— Larry Constantine

Coupling (Залежність)

Залежність показує, наскільки модуль залежить від інших модулів системи. Визначаються як вхідні (залежності, які модуль використовує), так і вихідні зв'язки (модулі, які залежать від поточного).

Принцип: Мінімізація залежностей між модулями спрощує тестування, зменшує складність системи та підвищує її гнучкість.

Connascence (Сопричетність)

Два компоненти є сопричетними, якщо зміни в одному з них потребують відповідних змін у іншому для підтримання коректності системи. Сопричетність може бути:

  • Статичною — залежність від структури коду
  • Динамічною — залежність від поведінки під час виконання

Зміни в одному компоненті вимагають змін в іншому.
— Meilir Page-Jones

Характеристики архітектури

Архітектура системи має відповідати не лише функціональним вимогам, але й забезпечувати відповідний рівень якості, надійності та продуктивності. Архітектурні характеристики визначають нефункціональні аспекти системи та відповідають на питання "як система має працювати".

Ключові критерії архітектурних характеристик:

1. Відмінність від бізнес-вимог

Архітектурні характеристики враховують нефункціональні аспекти, які визначають якість та поведінку системи, а не її функціональність.

2. Структурні впливи

Досягнення певних характеристик часто вимагає структурних змін в архітектурі системи, що може вплинути на всі компоненти.

3. Критичність для успіху

Не всі характеристики є однаково важливими для успіху проєкту. Деякі можуть істотно підвищити вартість розробки або збільшити час виходу на ринок.

Основні архітектурні характеристики:

  • Scalability — здатність системи обробляти зростаюче навантаження
  • Performance — швидкість відгуку та пропускна здатність
  • Reliability — стабільність роботи та відсутність збоїв
  • Security — захищеність від загроз та несанкціонованого доступу
  • Maintainability — простота внесення змін та підтримки
  • Extensibility — можливість розширення функціональності
  • Testability — простота тестування компонентів та системи
  • Deployability — простота розгортання та оновлення

Вибір характеристик має бути виправданий потребами бізнесу, адже кожна з них може значно вплинути на загальну архітектуру.

Бізнес потребаХарактеристики
Злиття та розширенняScalability, Interoperability, Extensibility
Швидкий вихід на ринокAgility, Testability, Deployability
Задоволення користувачівPerformance, Availability, Testability, Deployability, Security, Agility
Конкурентні перевагиAgility, Scalability, Availability, Deployability, Fault Tolerance
Час та коштиSimplicity, Feasibility

Архітектурні стилі

Архітектурний стиль визначає загальну організацію та структуру системи, тоді як архітектурний паттерн є конкретним шаблоном реалізації для вирішення специфічних проблем. Вибір архітектурного стилю є критичним рішенням, яке впливає на всі аспекти розробки та підтримки системи.

Основні категорії архітектурних стилів:

Монолітні архітектури (Monolithic)

Багатошарова архітектура (Layered Architecture)

Найпоширеніший стиль для невеликих та середніх додатків. Компоненти організовані за логічними шарами:

  • Presentation Layer — інтерфейс користувача
  • Business Layer — бізнес-логіка
  • Persistence Layer — робота з даними
  • Database Layer — зберігання даних

Переваги: Простота розуміння, легкість розробки та тестування Недоліки: Обмежена масштабованість, тісна зв'язаність між шарами

Мікроядро (Microkernel Architecture)

Складається з основної системи (core system) та плагінів (plug-ins), що забезпечує високу розширюваність та адаптивність.

Переваги: Гнучкість, можливість додавання нової функціональності Недоліки: Складність архітектури, потенційні проблеми з продуктивністю

Розподілені архітектури (Distributed)

Сервісно-орієнтована архітектура (Service-based)

Гібридна модель з меншою складністю порівняно з мікросервісами, підходить для систем середньої складності.

Подієво-орієнтована архітектура (Event-driven)

Актуальна для масштабованих та високопродуктивних систем. Використовує події для комунікації між компонентами. Основні топології:

  • Mediator — централізований координатор подій
  • Broker — розподілена система обміну подіями

Просторово-орієнтована архітектура (Space-based)

Підходить для систем, що потребують високої масштабованості. Центральна база даних замінена реплікованими таблицями в пам'яті.

Мікросервісна архітектура (Microservices)

Відомий стиль, який забезпечує незалежність та автономність сервісів. Критично важливо правильно визначити межі сервісів (service boundaries) для ефективної роботи.

Переваги: Незалежність розгортання, технологічна різноманітність, масштабованість Недоліки: Складність управління, проблеми з мережею, складність тестування

Особливості розподілених архітектур:

Розподілені системи мають специфічні виклики, які не існують в монолітних архітектурах:

  • Ненадійність мережі — необхідно враховувати затримки, пропускну здатність та безпеку
  • Зміни топології — зміни в структурі мережі можуть призвести до непередбачуваних наслідків
  • Витрати ресурсів — запити через мережу коштують більше ресурсів ніж локальні виклики
  • Складність налагодження — відстеження проблем у розподілених системах є складнішим
  • Управління транзакціями — забезпечення консистентності даних у розподілених системах

Висновок

Архітектура програмного забезпечення є фундаментальною основою для створення якісних, масштабованих та підтримуваних систем. Розуміння основних компонентів архітектури, законів, які нею керують, та різних архітектурних стилів дозволяє розробникам приймати обґрунтовані рішення.

Ключові принципи, які слід пам'ятати:

  1. Компроміси є всюди — кожне рішення має свої переваги та недоліки
  2. ЧОМУ важливіше за ЯК — розуміння контексту та мотивації критично важливе
  3. Модульність — правильна організація коду забезпечує якість системи
  4. Архітектурні характеристики — нефункціональні вимоги впливають на структуру
  5. Вибір стилю — відповідає конкретним потребам та обмеженням проєкту

Пам'ятайте: не існує універсального рішення. Найкраща архітектура — це та, яка найкраще відповідає вашим конкретним потребам, обмеженням та цілям.


Рекомендована література:

Mark Richards & Neal Ford. Fundamentals of software architecture. O'Reilly. 2020