Книга: первая версия плана
May 25, 2025
План книги
Введение
Эргономичный подход
В этой главе читатель познакомится с Эргономичным подходом:
- какие проблемы он призван решить (четыре проекции большого кома грязи на примере реальных проектов - класс сущности на 100+ полей, граф модели данных, граф зависимостей компонентов (Spring-бинов) системы, граф вызовов методов реализации одной операции)
- чего мне не хватило в существующих подходах:
- Чиста Архитектура - нет чёткого руководства и методик, как избегать кома грязи внутри слоёв.
- DDD - требует, чтобы вся команда (включая заказчика/эксперта предметной области) знала и следовала DDD и участвовала в построении и использовании Ubiquitous language, а так же чтобы в проектировании реализации принимали активное участие эксперты ПО - в моей практике добиться этого не вышло ни разу.
- основными принципами ЭП:
- 100% покрытие поведения системы тестами
- декомпозиция модели на ацикличный граф небольших агрегатов
- декомпозиция состояния системы на лес компонентов
- предпочтение неизменяемым данным и методам без побочных эффектов в реализации.
- основной отличительной чертой - моделью системы на базе эффектов и её составными частями:
- Сигналы - события внешнего мира, на которые реагирует система
- Ресурсы - элементы состояния системы
- Эффекты - операции модификации и записи состояния отдельных ресурсов
- Операции - сложные операции включающие работу с несколькими ресурсами
"Хочу зюзюку"
В этой главе читатель познакомится с проектом, который будем разрабатывать на протяжении книги:
- Предметной областью (йогатерапия)
- Бизнес-процессом йогатерапевта
- Задачами и проблемами, которые заказчик хочет решить с помощью разрабатываемой системы
Сетап "ходячего скелета" проекта
В этой главе мы подготовим проект и инфраструктуру и читатель узнает как инициировать разработку проекта и создать "ходячий скелет" будущей системы:
- Инициализация проекта Spring Boot-приложения;
- Верхнеуровневая структура кода приложения;
- Базовые блоки реализации:
- Контроллеры;
- Репозитории
- Паттерн тестирования "Оптимизация testcontainer-а PostgreSQL";
- Настройка GitHub Actions для верификации проекта перед мёржем Pull Request;
- Настройка GitHub Actions для сборки Docker-образа приложения;
- Покупка VDS и доменного имени (?);
- Подготовка Docker Compose-файла для развёртывания системы;
- Подготовка скрипта деплоя последней версии приложения на сервер.
Здесь же будет обоснован выбор стека - Kotlin, Spring Boot, Spring Data JDBC, PostgreSQL. Частично на базе принципов ЭП, частично на базе "здравого смысла" (Spring Boot и PostgreSQL - проверенные временем и самые распространённые решения с наибольшими базами знаний и специалистов).
Тут же будет ремарка о нестандартном и нерекомендуемом в реальной разработке способе реализации UI - MultiPage Application + Alpine.js для логики внутри страницы, который обусловлен следующими вещами:
- Книга посвящена бакэнд разработке;
- Я не умею делать SPA-приложения и изучение этого сильно замедлит написание книги;
- Львиную долю демонстрационного кода хочется сделать типичным для современных бакендов, и в части АПИ это должно быть HTTP/JSON (aka RESTful) API.
Фича - список клиентов
В этой главе мы реализуем первую фичу системы - список клиентов и читатель узнает о следующих элементах Эргономичного подхода:
- Entity-Relation модель и диаграмма;
- Модель элементов решения (из Basecamp-овского Shape Up);
- Test-Driven Development
- Верхнеуровневая структура кода тестов (? или сначала весь код свалить в один пакет, а потом его растащить под предлогом, что получилась свалка);
- Эпохальная модель времени (? может стоить утащить подальше, чтобы не перегружать главу)
- Элементы модели эффектов:
- Сигнал типа "Поступил HTTP-запрос";
- Ресурсы типа "Репозиторий";
- Базовые блоки реализации:
- Сущности
- DTO команд и запросов;
- DTO представлений;
- Реализация кастомного базового класс Spring Data JDBC-репозиториев;
- Кастомный DSL для динамического построения запросов на базе Spring Data JDBC Criteria API;
- Паттерн тестирования "Параллельная разработка операций создания и чтения сущности"
- Гайдлан именования тестов: "Тестируемый компонент" + "[при условии] должен делать то-то" - "Метод запроса списка клиентов" + "при отсутствии данных в БД должен возвращать пустой список";
- Гайдлан структурирования тела тестов - Arrange/Act/Assert - Сетап/Действие/Проверка;
- Паттерн тестирования "Генерация случайных тестовых объектов";
- Паттерн тестирования "Генерация списков тестовых объектов";
- Паттерн тестирования "Клиенты АПИ";
- Паттерн тестирования "getForResponse методы клиентов АПИ"
- Паттерн тестирования "Тестовые АПИ";
- Паттерн тестирования "Базовый класс тестов";
- Модель ошибок и их обработки
Фича - регистрация и логин терапевтов
В этой главе мы реализуем аутентификацию и авторизацию запросов, а так же операции регистрации и логина терапевта. По ходу дела читатель узнает о:
- Блоках реализации
- Ресурс внешнего сервиса (отправки почты);
- Ресурс конфигурируемого алгоритма;
- Вспомогательный ресурс;
- Ресурс изменяемой структуры данных;
- Сложная операция;
- Доменная операция;
- Паттерне тестирования "Базовая разделяемая фикстура";
- Паттерне тестирования "Noop-энкодер паролей в тестах";
- Паттерне тестирования "Фейковая реализация ресурса";
- Паттерне тестирования "Нарушение инкапсуляции"
- Паттерне тестирование "Использование GreenMail в тестах логики отправки Email-ов".
Фича - журнал клиента
В этой главе мы реализуем журналы клиентов и справочник терапевтических задач и по ходу дела узнаем о:
- Отношениях 1 ко многим и идентифицирующих и неидентифицирующих отношениях;
- Понятии логического и технического агрегата;
- Связях между техническими агрегатами (через идентификатор) и внутри технических агрегатов (через прямую ссылку);
- Модели и диаграмме эффектов;
- Методике транзакционного анализа на базе диаграммы эффектов;
- Понятии субдомена модели предметной области;
- Паттернах работы с БД "createIfAbsent" и "Upsert";
Фича - файлы клиента
В этой главе мы реализуем хранение файлов клиентов (контрольных фотографий, сканов приёмов врачей и результатов различной диагностики и т.п.) и по ходу дела узнаем о:
- Базовом блоке "Составной ресурс"
Фича - справочник упражнений
В этой главе мы реализуем справочник упражнений и по ходу дела узнаем о:
- Классах ресурсов - в системе появится два экземпляра ресурса "Хранилище файлов" для файлов клиентов и изображений шагов упражнений;
- Базовом блоке объект-значение;
- Связи 1 к немногим;
- Примененении Mockito для тестирования кода обработки ошибок инфраструктуры
- Паттерне тестирования ""
Фича - программы занятий
В этой главе мы реализуем составление программ из упражнений и генерацию docx-документов с программами и по ходу дела узнаем о:
- Связях с атрибутами (упражнение У входит в программу П 3-им по порядку);
- Применении возможностей PostgreSQL для работы с JSON для выборки сложных представлений;
- Модели сбалансированной формы системы;
- Паттерне реализации
- Паттерне тестирования "Тестирование генерации docx/xlsx-файлов слепым сравнением структуры";
Фича - расписание приёмов
В этой главе реализуем фичу приёмов с их отображением в виде календаря и по ходу дела:
- Рассмотрим пример реализации сложной логики (построение view-модели календаря) в виде чистых функций;
Фича - интеграция с ics-календарями
В этой главе реализуем интеграцию с ics-календарями и возможность создания приёмов на базе событий из них и по ходу дела узнаем о:
- Абстрактных ресурсах - интерфейс календаря, реализуемый ресурсами приёмов и ics-календарей;
- Сигналах типа "Наступил момент выполнения cron-задачи";
- Применение WireMock для тестирования интеграции с внешними сервисами по HTTP;
Фича - интеграция с Google Calendars
В этой главе реализуем интеграцию с Google Calendars и возможность создания приёмов на базе событий из них и по ходу дела узнаем о:
- Применении Mockito для тестирования интеграций с внешними сервисами через SDK;
Фича - интеграция с Яндекс.Формами
В этой главе реализуем получение WebHook-а от Яндекс.Форм с данными новых клиентов и создание новых карточек клиентов и по ходу дела узнаем о:
- Идентифицирующих связях один к одному
Фича - пуш-уведомления
В этой главе мы добавим в систему WebPush-уведомления и реализуем на их основе напоминания для терапевта о планировании предстоящих приёмов и добавлении записей в журнал о прошедших приёмах, оповещении об автоматическом создании новых карточек клиентов и по ходу дела узнаем о:
- Ресурсах типа "Очередь сообщений";
- Сигналах типа "Поступило новое сообщение в очередь";
- Сигналах типа "Произошло доменное событие"
Заключение
Приложение - Руководство пользователя Эргономичного подхода
Опциональное приложение со статьями с Эрговики о ключевых концепциях ЭП.