Архитектура программного обеспечения сложна (перевод)
Это перевод статьи на русский (перевод сделан при помощи ChatGPT, поэтому могут быть корявые словосочетания).
Я живу в одном из пригородов Тель-Авива. Однажды утром я проснулся от безумного звука дрели. Началось! Строительство фиолетовой линии легкого метро. «Насколько это будет плохо?» — подумал я...
Спустя несколько недель, просыпаясь в 5 утра в зависимости от начала строительных работ, моя жена сказала, что нам пора съезжать. Пытаясь убедить ее остаться (мне очень нравится этот район!), я попытался найти планы строительства, предполагая, что этап с сильной шумихой не продлится долго.
Когда я ознакомился с планами строительства, как программист, я был поражен. У них были подробные, конкретные планы на три года. Они разделили их на три этапа, с точными измерениями и дорожными структурами для каждого этапа. У них был четкий график. И самое интересное — я легко мог их понять, хотя у меня 0 знаний в гражданской инженерии.
Это, по сути, распространяется и на другие области инженерии и архитектуры. Подумайте о схемах архитектуры здания, электротехники или машиностроения — существуют устойчивые способы записи этих данных, чтобы все другие инженеры в области могли их прочитать. Однако в программной инженерии это не так. Несмотря на то, что легко создать архитектурные диаграммы (используя прямоугольники и стрелки), их чтение и понимание может быть не так просто.
Различия с программной инженерией
В течение моей карьеры инженера я создавал, читал и рецензировал множество диаграмм архитектуры ПО и проектных документов и проводил много интервью на тему проектирования систем. Я пришел к выводу, что люди описывают программное обеспечение очень по-разному.
Эти различия касаются:
Различного уровня абстракции Различного уровня детализации Различных методов иллюстрации/диаграммы Разного акцента на нефункциональных аспектах, таких как надежность, безопасность, конфиденциальность и масштабируемость Такие разрывы в коммуникации часто наблюдаются даже в одной команде, не говоря уже о разных командах, организациях или компаниях. Эти разрывы проявляются, например, в архитектурных диаграммах, которые не являются самоочевидными. Они либо сопровождаются значительным текстовым сопровождением (вспомните 10-страничный проектный документ), либо требуют значительного времени на их объяснение.
Эти разрывы в коммуникации усиливаются из-за недавних тенденций в мире программной инженерии.
Децентрализация роли архитектора
«Архитектура как командный спорт: Архитекторы больше не работают в одиночку, и архитекторы больше не могут думать только о технических вопросах. Роль архитектора значительно варьируется в различных отраслях, и некоторые компании полностью исключили этот титул...»
Отчет о трендах в архитектуре и проектировании ПО от InfoQ — апрель 2023
В прошлом большинство компаний и организаций применяли подход сверху вниз для проектирования и архитектуры программного обеспечения — нанимали архитектора для каждой достаточно большой группы, который выступает в качестве централизованного органа для проектирования продукта/системы. Было обычным делом, что инженеры выполняли задачи по кодированию на основе данной архитектуры, спецификаций и API.
Мир перешел к более децентрализованному подходу, где инженеры всех уровней теперь участвуют в проектировании и архитектонике, а не только в кодировании. Различия между уровнями и навыками инженеров заключается в объеме их работы — например, младшие инженеры могут разрабатывать конкретный компонент, в то время как более старшие инженеры могут разрабатывать систему или многосистемное окружение.
По сути, это смена культуры и мышления от процессор проектирования сверху вниз, централизованного, к процессу, который формируется изнутри и «принадлежит всем».
Стоимость
Эти изменения приносят множество преимуществ: усиление и развитие инженеров всех уровней, повышенное чувство собственности и вовлеченности, устранение единой точки отказа и более широкое распространение знаний по командам.
Однако есть и стоимость:
Качество: архитектор обычно квалифицирован как опытный инженер с накоплением опыта в создании и поддержке программных систем. Распределение этой работы среди всех сотрудников команды означает, что никакой дополнительной квалификации, кроме как быть частью команды, не требуется. Чтобы сохранить высокий уровень качества, команды должны вкладывать в обучение, образование и наставничество, строить хороший процесс проектирования и внедрять культуру открытώςtированного fedbackа. Издержки: наличие четкого процесса проектирования в организации помогает повысить планку качества, но вносит значительную нагрузку. Обычно такие процессы включают создание проектного документа, диаграмм системы, блок-схем и включают процесс обратной связи, который может потребовать нескольких итераций и исправлений проекта.
Реализовать здоровый процесс проектирования в организации сложно. Существует напряжение между издержками, которые он вносит, и полученной прибавкой к качеству. Если процесс слишком легкий или его вовсе нет, то и прибавки к качеству нет. Если процесс слишком тяжелый, это может стать обременительным для инженеров, которые могут не полностью следовать ему или даже пытаться его обойти, что в конечном итоге приводит к снижению эффективности. Сладкое место — как всегда нечто среднее.
Существует напряжение между издержками процесса проектирования и достигнутой прибавкой к качеству. Если процесса нет вовсе, то и преимущества никакого. Если процесс слишком тяжелый, инженеры его обойдут, и преимущества уменьшатся. Сладкое место — это что-то посередине.
Практический вывод: Модель C4
О том, каким должен быть здоровый процесс проектирования, можно многое обсудить, но один практический концепт, который я хочу отметить, — это модель C4.
Визуализации являются ключевой частью в проектировании программного обеспечения. Как упоминалось выше, люди очень по-разному описывают программное обеспечение, особенно когда дело доходит до диаграмм.
Диаграммирование → Моделирование
Модель C4 направлена на то, чтобы превратить короткоживущие, хаотичные методы диаграммирования в долгосрочные, каноничные и стандартизированные техники моделирования. Вы можете думать о ней как о наборе правил и соглашений о том, как должна быть визуализирована и описана архитектура программного обеспечения (аналогично стандартам, существующим в других инженерных областях).
Модель C4 состоит из 4 уровней абстракции (отсюда и название):
1. Контекст системы: самый высокий уровень абстракции. Этот слой содержит внутренние системы, внешние системы, пользователей (если существует несколько типов пользователей, их следует указать) и отношения между ними.
2. Контейнер: когда ваша система определена, вы можете увеличить масштаб и приблизиться к конкретной системе. Система состоит из одного или нескольких контейнеров. Контейнер представляет приложение или хранилище данных, такое как: бекенд-сервис, фронтенд-приложение, мобильное приложение, реляционная БД, key-value хранилище, message bus, объектное хранилище и т. д.
Простым способом думать об этом, по крайней мере с позиции бекенда, является мысль о раздельных процессах/исполняемых модулях. Каждый исполняемый модуль сопоставляется со своим контейнером.
Если вы уже принимали участие в интервью по проектированию системы, обычно это фокусируется на слое контейнера.
3. Компонент: следом, контейнер может быть разбит на несколько компонентов, обычно по функциональности и областям ответственности. Например, если взять бекенд-сервис платежей, он может включать такие компоненты, как: исполнитель платежей, клиент сторонних сервисов, механизм восстановления, записывающий платежи, отправитель уведомлений и т. д.
Это нормально, если компоненты контейнера взаимодействуют с другими контейнерами из уровня 2 — например, механизм восстановления может отправить сообщение в message bus для повторной попытки завершения неудавшегося платежа через определенную задержку.
4. Код: это сопоставление компонентов с фактическими кодами классов/модулей и т. д. Этот слой деталей обычно менее интересен и очень трудно поддерживать и в большинстве случаев не рекомендуется.
Тем не менее, при написании кода может быть полезно думать: «В какой компонент входит мой код?». Если ответ не ясен, либо вы создаете новый компонент, либо нарушаете существующие границы компонентов.
Несколько примечаний к модели C4:
- Критические слои — Контейнер и Компонент. Важны ваши проектные решения на уровне Контейнера, так как они влияют на масштабируемость, надежность, развертывание и возможность развития проекта. Ваши проектные решения на уровне Компонента влияют на скорость разработки, эффективность, поддерживаемость и качество.
- Модель C4 добавляет глубину архитектурным диаграммам программного обеспечения. Думайте о ней как об онлайн-карте — вы начинаете с высокоуровневого обзора и можете увеличивать масштаб в интересующих вас местах. Если вы забрались слишком далеко в детали, вы можете отдалить изображение обратно и оказаться в охватывающей архитектуре.
- Модель C4 является долгосрочной, совместной моделью. Вместо того, чтобы каждый инженер создавал свою случайную диаграмму, модель C4 может быть разделена и отредактирована несколькими инженерами или командами, расширяясь по мере роста организации и продукта.
- Существует множество инструментов, поддерживающих модель C4. В наше время даже распространенные корпоративные программы для создания диаграмм имеют шаблон C4.
Заключение
Проектирование программного обеспечения является важной частью жизненного цикла разработки программного обеспечения и оказывает значительное влияние на конечный результат продукта или системы, скорость исполнения, поддерживаемость и развитие.
С недавними тенденциями в децентрализации роли архитектора и поддержкой «архитектуры как командного спорта» структура команд по разработке программного обеспечения меняется, и организациям необходимо тщательно обдумать, как будет выглядеть их процесс проектирования, и найти правильный баланс между введением дополнительных издержек для поддержания высокого качества.
Еще один интересный вопрос — как долгосрочно разрабатывать и проектировать программное обеспечение под влиянием генеративного ИИ. Мы уже видим изменения в повседневной работе инженеров с использованием AI-инструментов, ко-пилотов и агентов.
Как выглядит процесс проектирования в вашей организации? Видите ли вы его структурированным и имеющим ощутимое значение? Или есть области для улучшения? Будет интереснο услышать ваши мысли в комментариях ниже.