Архитектурная ката

Архитектурная ката

07.12.2024

Архитектурные каты — это групповые упражнения, которые помогают развивать навыки проектирования программ. Слово ката пришло из японского языка, оно означает приём, который ученики отрабатывают путём многократного повторения. В программировании каты популяризировал Роберт Мартин. Есть упражнения по TDD, алгоритмам, паттернам и, в том числе, по архитектуре.

В субботу 7 декабря московский клуб программистов провёл архитектурный ретрит. Приглашали тех, кто пишет бекенд, миддлов, сеньоров и тимлидов, тех, кому интересна архитектура и кто хотел в ней прокачаться.

Собрались в анти-кафе CheckPoint. Ката шла около двух часов. Поделились на команды и решали архитектурную задачку.

Платформа для совместной разработки

Мы хотим разработать платформу для совместной разработки — аналог GitHub, GitLab, Bitbucket. Пользователи: сотни тысяч разработчиков. Требования: Пользователи могут:

  • Регистрироваться
  • Создавать репозитории
  • Управлять доступами
  • Работать с задачами (issues): создавать, проводить по статусам, комментировать. Статусная модель фиксированная.
  • Делать форки
  • Работать с запросами на изменение (pull requests): создавать, одобрять, сливать, оставлять замечания, видеть историю изменений.

Последующие требования: Если осталось время, можно подумать про:

  • Масштабирование (что если десять миллионов разработчиков).
  • Уведомления (в браузер, на почту, SMS, push).
  • Внешняя аутентификация через OAuth, LDAP (Active Directory).
  • Десктоп и мобильные клиенты.
  • Прикрепление файлов (изображений, видео) к задачам и комментариям.

Правила

  • Сначала каждый участник оценивает свой опыт проектирования: опытный, неопытный и нулевой. Нулевой уровень означает, что участник не обладает опытом разработки, например, он менеджер проекта или владелец продукта.
  • Затем разбиваем участников на команды по 4–6 человек. Сначала распределяем опытных участников: их должно быть приблизительно поровну в каждой команде. Затем распределяем остальных участников. Важная рекомендация: не идти в одну команду со своими коллегами.
  • Команды получают одну и ту же задачу. Цель — разработать архитектуру веб-приложения. Задача формулируется в общем виде. Команды могут задавать модераторам уточняющие вопросы. Сбор требований обычно длится 15-20 минут, но вопросы можно задавать до самого конца обсуждения.
  • Основную часть выделенного времени команда обсуждает разные варианты архитектуры и готовит проект. Важные аспекты проекта перечислены в нашей Памятке, которая выдаётся каждой команде.
  • Команда должне не только разработать архитектуру, но и представить её другим участникам. На это выделяется 20–30 минут в конце обсуждения. Надо выбрать участников, которые будут представлять архитектуру, их может быть несколько. Подготовьте план презентации. У вас будет флип-чарт и фломастеры. На представление выделяется 5 минут.
  • Ещё несколько минут другие участники могут задавать команде уточняющие вопросы. Вопросы могут быть самые разные, например: почему здесь реляционная база, а не документная? Как приложение будет масштабироваться, если на сайт придёт миллион человек? Не надо вступать в дискуссию, за этим будут следить модераторы. Дискуссии можно продолжить после завершения официальной части.
  • После презентации участники в зале оценивают проект путём голосования. Есть три варианта:
    • команда знает, как решать технические сложности;
    • команда в целом знает, как решать технические сложности, но некоторые аспекты не проработаны;
    • в представленном проекте есть существенные пробелы, в представленном виде он не заработает;
  • В конце подводим итоги, делимся инсайтами. Затем — неформальное общение.

План проведения

Предполагаемое количество участков: 10 и больше. Предполагается, что в каждой команде будет около 5 человек, так что если собирается 25 участников, всего получится 5 команд.

00:00-00:10 Объяснение правил В это время народ может собираться. Правила лучше распечатать и раздать командам.
00:10-00:20 Разбиение на команды Каждый участник должен оценить себя как опытного или неопытного. Нужно следить за тем, чтобы количество опытных людей в каждой команде было приблизительно одинаковым.
00:20-01:30 Проектирование Сбор требований, непосредственно проектирование, подготовка презентации.
01:30-02:00 Презентация проектов Каждой команде выделяется 5 минут на презентацию. Другие участники могут задавать вопросы, но не вступать в дискуссии. В конце участники оценивают проект (большой палец вверх, вбок, вниз).

Памятка

  • Доступность и Надёжность
    • Распределение на несколько дата-центров
    • Балансировка нагрузки
    • WebSockets, polling, stream API
    • CDN (Content Delivery Network)
    • DNS
    • Метрики
    • Недоступность внешних сервисов
  • Безопасность
    • Аутентификация/Авторизация
    • Rate limiting (ограничение числа одновременных запросов)
    • Circuit Breaker
    • Шифрование данных
    • Аудит
    • Спам, вандализм
    • Резервное копирование
  • Масштабирование
    • UUID/автоинкремент/автоинкремент с шагом
    • Идемпотентность
    • Распределённые транзакции
    • Конкурентность
    • Горизонтальное, вертикальное
  • Кэширование
    • Объём дисковой и оперативной памяти
    • Инвалидация
    • Очистка (eviction)
  • Базы данных
    • Реляционные, колоночные, документные, ключ-значение, графовые, географические, full-text
    • Шардирование, партиционирование, репликация
    • ACID/CAP
  • Внешние сервисы
    • Платёжные системы
    • Google Maps, Open Maps
    • 1С, CRM, HR-директории в компании
    • SMS-шлюзы, E-mail, Push-сервисы
  • Сопутствующие сервисы
    • Уведомления
    • Логирование
    • Поиск
    • Аналитика
  • Технические решения
    • Фоновые процессы, задачи по расписанию
    • Очереди сообщений
    • Файловые хранилища
    • Стриминг (видео, аудио)
  • Развёртывание
    • CI/CD