Duration 10

Определение архитектуры из Википедии:

Архитектура программного обеспечения (англ. software architecture) — совокупность важнейших решений об организации программной системы. Архитектура включает:

- выбор структурных элементов и их интерфейсов, с помощью которых составлена система, а также их поведения в рамках сотрудничества структурных элементов;
- соединение выбранных элементов структуры и поведения во всё более крупные системы;
- архитектурный стиль, который направляет всю организацию — все элементы, их интерфейсы, их сотрудничество и их соединение.

К вопросам архитектуры так же относятся вопросы технологии разработки и функциональные роли внутри команды. Agile – это тоже часть архитектуры.

Не будут рассматриваться вопросы Enterpise архитектуры (архитектуры предприятия).

Стримы для «играющих» архитекторов, которые работают над личным проектом и планируют его расширение, или участвуют в проектах с проблемами развития.

  1. Уровни архитектуры a. Уровень предприятия b. Уровень системы (приложения) c. Уровень кода
  2. Основные архитектуры приложений a. Микроядерная b. Плагинная c. Многоуровневая и многослойная d. Сервисная/Микросервисная e. Pipes and filters f. Client/Server g. Peer-to-Peer h. Publisher/Subscriber (реактивные архитектуры) i. Asynchronous Data Replication (отличается от pub/sub тем, что предназначена для синхронизации источников данных) j. Distribution Tree (publisher -> distributor -> consumer) k. Integration Hub (отличается от Data Replication тем, что синхронизация данных идет между системами, а не репликами БД) l. Tuple Space
  3. Модель C4
  4. Функциональные/нефункциональные требования a. Сбор b. Анализ
  5. Качественная оценка архитектуры
  6. Монолитность a. Структурная монолитность b. Логическая монолитность c. Архитектурная монолитность
  7. Реактивная архитектура
  8. Эволюционные архитектуры a. Фитнес функция b. Движение короткими шагами
  9. Domain driven design
  10. Разбор готовых архитектур

ВАЖНО! Плохой код – не должен быть нормой, архитектура лишь помогает избавиться от плохого кода и ограничить его негативное влияние, а не жить с ним! Хорошая архитектура не компенсирует недостатки «плохих» разработчиков!

Основные проблемы кодовой базы связаны с постепенным загниванием проекта, накоплением технического долга, скатыванием к Big ball of Mud (программная система с нераспознаваемой архитектурой).

Нет точного места, когда код вдруг стал плохим. Постепенные изменения и невозможность отслеживать влияние изменений приводит к ситуации «А кто это сделал?»

Архитектура помогает:

Проблема Титаника: можно обладать отличной архитектурой, но все равно пойти на дно из-за внешних изменений.

Обычно о проблемах архитектуры вспоминают слишком поздно. В большинстве проектов по которым я делал аудит были одни и те же проблемы:

  1. полный игнор вопросов архитектуры (обычно вспоминают про архитектуру как про палочку-выручалочку когда уже «все плохо»);
  2. неформализованные требования и ограничения;
  3. отсутствие метрик качества и контроля;
  4. приоритет наращивания функциональности (по сути увеличение прибыли, больше возможностей – больше продаж);
  5. широкая вариативность повторного использования компонент, переусложненные компоненты с частичным использованием функциональности (одна и та же форма имеет несколько сценариев поведения, определяемых объектами-конфигураторами);
  6. недостаток механизмов управления командой (нет разделения ответственности, «мы вам платим, вы нам делаете код»);
  7. большое количество «ручного» труда, отсутствие сценариев автоматизации (СI/CD, DevOps);
  8. несколько источников «правды» - кто-то пишет в почту, кто-то в мессенджер, кто-то что-то сказал на планерке, вопросы решаются на бегу;
  9. отсутствие культуры и технологии разработки (команда преимущественно использует структурный подход к разработке, плохо понимает ООП, не понимает принципы изоляции и публичные интерфейсы, рефакторинг сводится к переименованию методов, а не к «прояснению» логики);
  10. не фиксируется технический долг и он обычно уже большой;
  11. разработчики плохо представляют что такое архитектура, не умеют мыслить в отрыве от когда, не понимают абстракций, имеют узкую квалификацию (слабое знание инженерных дисциплин);
  12. Отсутствие тестирования, рефакторинга и прочих техник;
  13. Проблемы при генерации и проверке гипотез (первое решение принимается как правильное).

Порядок улучшения:

Эмпирическое наблюдение: время на «оздоровление» проекта пропорционально времени «загнивания».

Результаты будут ощутимы после выполнения каждого из перечисленных выше пунктов.

Важно! Процесс должен быть итеративным, а не линейным, несмотря на то, что пункты перечислены последовательно, объемы нужно определять исходя из фактических реалий, постепенно их уточняя.

Обычный процесс это постепенная детализация требований к проекту:

Для определения архитектуры проекта необходимо выполнить обратный процесс:

Отдельно определяется архитектурная композиция на уровне приложения и архитектурная композиция на уровне системы.

На каждом уровне может быть «инфраструктурный слой» и средства контроля и мониторинга, они анализируется отдельно, если требуется.

Процесс не обязательно выполнять полностью, обычно требуется понять только силу монолитности проекта, чтобы определить его способность принимать изменения.