
Рассмотрены подходы и технологии, применяющиеся для проектирования информационных систем и подбора инструментов с учетом развития и поддержки программных продуктов. Разобрана теория развертывания, тестирования, автоматизации, балансировки нагрузки и поддержка новых возможностей в развивающемся продукте. Материал теоретической части рассмотрен на основе гипотетической информационной системы для сказочных персонажей. В практической части описанные теоретические концепции применяются в рамках реализации технического задания и в условиях ограниченности ресурсов. Среди рассмотренных примеров – разработка телеграм-бота, интернет-магазина и плагина к редактору для 3D-моделирования.
Для программистов, бизнес-аналитиков, архитекторов IT-решений
Правильные вопросы – ключ к правильным ответам
Перед вами книга о проектировании информационных систем (system design), написанная программистом для программистов.
Проектирование программного обеспечения не сводится к выбору готовых технологий и подходов. Грамотно построенная архитектура упрощает дальнейшую поддержку программного продукта и удешевляет разработку нового функционала, как запланированного, так и неожиданно вклинившегося в требования по проекту. В книге исследованы различные архитектурные подходы и их адаптивность к изменяющимся требованиям бизнеса в долгосрочной перспективе.
Книга состоит из двух частей: теоретической и практической.
- Материал теоретической части рассмотрен на основе гипотетической информационный системы для сказочных персонажей.
- В практической части описанные теоретические концепции применяются в рамках реализации технического задания и в условиях ограниченности ресурсов. Среди рассмотренных примеров — разработка телеграм-бота, интернет-магазина, редактора изображений и инструмента для 3D-моделирования.
- Архитектурные принципы и шаблоны
- Проектирование программных систем
- Тестирование
- Развёртывание
- Автоматизация процессов
- Балансировка нагрузки
- Анализ изменяющихся требований

Туров Владимир – инженер-программист, более пяти лет занимающийся коммерческой бэкенд-разработкой, закончил Санкт-Петербургский государственный университет информационных технологий по программной инженерии, автор более 80 технических статей на Хабре, выходивших преимущественно в корпоративном блоге компании Selectel https://habr.com/ru/users/Firemoon/. Автор телеграм-канала https://t.me/not_only_msk о тонкостях программирования.
Книгу “Проектирование информационных систем. Профессиональный подход” можно купить в нашем интенет-магазине.
Предисловие…………………………………………………………………………………………….. 9
Часть I. Теория проектирования……………………………………………… 11
Глава 1. Методологии разработки ПО……………………………………………………. 13
Водопадная модель…………………………………………………………………………………………………………………… 13
Спиральная модель……………………………………………………………………………………………………………………. 15
Rational Unified Process……………………………………………………………………………………………………………… 16
Язык моделирования UML………………………………………………………………………………………………………… 18
Сущности UML…………………………………………………………………………………………………………………… 18
Структурные сущности UML…………………………………………………………………………………… 18
Поведенческие и дополнительные сущности UML……………………………………………….. 19
Комментирующие сущности UML………………………………………………………………………….. 19
Отношения UML…………………………………………………………………………………………………………………. 19
Диаграммы UML………………………………………………………………………………………………………………… 20
Диаграмма классов…………………………………………………………………………………………………… 20
Диаграмма состояний………………………………………………………………………………………………. 21
Диаграмма развертывания………………………………………………………………………………………. 21
Диаграмма прецедентов…………………………………………………………………………………………… 22
Диаграмма последовательности……………………………………………………………………………… 22
Гибкие методологии………………………………………………………………………………………………………………….. 23
Scrum…………………………………………………………………………………………………………………………………… 24
Feature-Driven Development……………………………………………………………………………………………….. 26
Глава 2. Выяснение требований…………………………………………………………….. 29
Функциональные требования…………………………………………………………………………………………………… 30
Нефункциональные требования……………………………………………………………………………………………….. 31
Глава 3. Архитектурные шаблоны и стили…………………………………………….. 33
Монолитная архитектура…………………………………………………………………………………………………………. 33
Микросервисная архитектура………………………………………………………………………………………………….. 34
Микроядерная архитектура……………………………………………………………………………………………………… 35
Событийно-ориентированная архитектура……………………………………………………………………………. 36
Многоуровневая архитектура………………………………………………………………………………………………….. 37
Representational State Transfer (REST)……………………………………………………………………………………… 38
Распределенная транзакция……………………………………………………………………………………………………… 39
Протокол двухфазного согласования (2 Phase Commit, 2PC)………………………………………… 40
Протокол трехфазного согласования (3 Phase Commit, 3PC)………………………………………… 41
Оркестрация……………………………………………………………………………………………………………………….. 41
Хореография……………………………………………………………………………………………………………………….. 42
Паттерн SAGA…………………………………………………………………………………………………………………….. 42
Глава 4. Принципы разработки ПО……………………………………………………….. 45
Принцип KISS…………………………………………………………………………………………………………………………….. 45
Принцип YAGNI…………………………………………………………………………………………………………………………. 47
Принцип SOLID………………………………………………………………………………………………………………………….. 47
S — Single Response Principle (принцип единой ответственности)………………………………….. 47
O — Open-Closed Principle (принцип открытости/закрытости)………………………………………. 48
L — Liskov substitution principle (принцип подстановки Барбары Лисков)…………………… 49
I — interface segregation principle (принцип разделения интерфейса)……………………………. 51
D — dependency inversion principle (принцип инверсии зависимостей)…………………………. 52
Инверсия управления………………………………………………………………………………………………………………… 53
Внедрение зависимостей…………………………………………………………………………………………………………… 54
Глава 5. Технологии………………………………………………………………………………. 57
Системы управления базами данных………………………………………………………………………………………. 57
Реляционная модель данных…………………………………………………………………………………………….. 58
Столбцово-ориентированная модель………………………………………………………………………………. 60
Документо-ориентированная модель………………………………………………………………………………. 60
Графовая модель………………………………………………………………………………………………………………… 61
Ключ-значение…………………………………………………………………………………………………………………… 61
Базы данных для временнх рядов………………………………………………………………………………….. 62
Брокер сообщений……………………………………………………………………………………………………………………… 62
Параллельные вычисления……………………………………………………………………………………………………….. 64
Закон Амдала……………………………………………………………………………………………………………………… 64
Многопоточность………………………………………………………………………………………………………………. 65
Синхронизация в многопоточных программах……………………………………………………… 65
Псевдопараллелизм…………………………………………………………………………………………………………… 66
Сопрограммы (корутины)………………………………………………………………………………………………….. 67
Многопроцессорные вычисления…………………………………………………………………………………….. 67
Межпроцессное взаимодействие…………………………………………………………………………….. 67
Распределенные вычисления…………………………………………………………………………………………….. 68
Синхронизация в распределенных системах…………………………………………………………. 69
Вызов функций в распределенных системах………………………………………………………….. 70
GraphQL………………………………………………………………………………………………………………………………………. 70
WebSocket…………………………………………………………………………………………………………………………………… 71
Кеширование……………………………………………………………………………………………………………………………… 73
Кеширование при чтении (сквозное чтение, read-through)……………………………………………… 73
Кеширование при записи (сквозная запись, write-through)……………………………………………… 73
Чтение на стороне (Read aside)…………………………………………………………………………………………. 73
Запись на стороне (Write aside)…………………………………………………………………………………………. 75
Кеширование на опережение (Cache Ahead, Refresh Ahead)…………………………………………. 75
Политики инвалидации……………………………………………………………………………………………………… 76
Идентификация, аутентификация и авторизация……………………………………………………………………. 77
Идентификация…………………………………………………………………………………………………………………… 77
Аутентификация…………………………………………………………………………………………………………………. 77
Авторизация……………………………………………………………………………………………………………………….. 77
Глава 6. Тестирование……………………………………………………………………………. 79
Выбор данных для тестирования…………………………………………………………………………………………….. 81
Юнит-тестирование…………………………………………………………………………………………………………………… 83
Интеграционное тестирование…………………………………………………………………………………………………. 83
Сквозное тестирование (end-to-end)…………………………………………………………………………………………. 84
Полное тестирование………………………………………………………………………………………………………………… 84
Ручное тестирование…………………………………………………………………………………………………………………. 85
Заглушки…………………………………………………………………………………………………………………………………….. 86
Глава 7. Развертывание…………………………………………………………………………. 87
Автоматизация развертывания…………………………………………………………………………………………………. 87
Непрерывная интеграция………………………………………………………………………………………………….. 88
Непрерывная доставка………………………………………………………………………………………………………. 88
Непрерывное развертывание……………………………………………………………………………………………. 89
Масштабирование…………………………………………………………………………………………………………………….. 91
Вертикальное масштабирование……………………………………………………………………………………… 91
Горизонтальное масштабирование………………………………………………………………………………….. 92
Выделенные и облачные серверы……………………………………………………………………………………………. 92
Выделенный сервер……………………………………………………………………………………………………………. 93
Облачный сервер……………………………………………………………………………………………………………….. 93
DBaaS (Database as a Service)………………………………………………………………………………….. 94
Объектное хранилище………………………………………………………………………………………………. 94
Развертывание: контейнеризация…………………………………………………………………………………………….. 95
Технология chroot………………………………………………………………………………………………………………. 96
Технология Jail……………………………………………………………………………………………………………………. 96
Технология Docker……………………………………………………………………………………………………………… 97
Технология Kubernetes………………………………………………………………………………………………………. 99
Технология Nomad…………………………………………………………………………………………………………… 100
Развертывание: обнаружение сервисов…………………………………………………………………………………. 101
Глава 8. Балансировка нагрузки………………………………………………………….. 103
Алгоритмы балансировки……………………………………………………………………………………………………….. 103
DNS 105
GeoDNS……………………………………………………………………………………………………………………………………… 106
Обратный прокси-сервер………………………………………………………………………………………………………… 107
Глава 9. Обслуживание………………………………………………………………………… 109
Логирование…………………………………………………………………………………………………………………………….. 109
Мониторинг……………………………………………………………………………………………………………………………… 111
Оповещение………………………………………………………………………………………………………………………………. 111
Анализаторы исходного кода………………………………………………………………………………………………… 112
Сканеры уязвимостей………………………………………………………………………………………………………………. 113
Аудит-логи……………………………………………………………………………………………………………………………….. 113
Аварийные игры………………………………………………………………………………………………………………………. 114
Миграция схемы и миграция данных…………………………………………………………………………………….. 115
Версионирование…………………………………………………………………………………………………………………….. 116
Глава 10. Отказоустойчивость, резервирование и надежность……………… 119
Надежность системы……………………………………………………………………………………………………………….. 119
Отказоустойчивость………………………………………………………………………………………………………………… 120
Резервирование………………………………………………………………………………………………………………………… 120
Резервное копирование……………………………………………………………………………………………………. 121
Схемы резервирования……………………………………………………………………………………………………. 122
Восстановление после катастроф………………………………………………………………………………………….. 122
Часть II. Примеры проектирования систем……………………….. 125
Глава 11. Проектирование неинтеративного редактора изображений….. 127
Исходные требования……………………………………………………………………………………………………………… 127
Монолитный подход……………………………………………………………………………………………………………….. 127
Модульный подход…………………………………………………………………………………………………………………. 130
Внезапное требование…………………………………………………………………………………………………………….. 134
Рекомендуемые технологии……………………………………………………………………………………………………. 138
Распространение……………………………………………………………………………………………………………………… 138
Заключение………………………………………………………………………………………………………………………………. 139
Глава 12. Проектирование текстового блога………………………………………… 141
Исходные требования……………………………………………………………………………………………………………… 141
Быстрый минимальный вариант…………………………………………………………………………………………….. 142
Проектирование архитектуры………………………………………………………………………………………………… 145
Рекомендуемые технологии……………………………………………………………………………………………………. 150
Безопасность……………………………………………………………………………………………………………………………. 151
Аутентификация………………………………………………………………………………………………………………………. 152
Поиск…………………………………………………………………………………………………………………………………………. 152
Масштабирование…………………………………………………………………………………………………………………… 153
Локализация контента…………………………………………………………………………………………………………….. 153
Логирование и мониторинг…………………………………………………………………………………………………….. 155
Отслеживание популярности материалов…………………………………………………………………………….. 155
Рекомендательная система……………………………………………………………………………………………………… 156
Соблюдение локальных норм………………………………………………………………………………………………… 156
Резервное копирование……………………………………………………………………………………………………………. 156
Заключение………………………………………………………………………………………………………………………………. 157
Глава 13. Проектирование сервиса конвертации файлов……………………… 159
Исходные требования……………………………………………………………………………………………………………… 159
Проектирование архитектуры………………………………………………………………………………………………… 159
Проектирование веб-сервера………………………………………………………………………………………………….. 163
Проектирование агента…………………………………………………………………………………………………………… 164
Проектирование взаимодействия с инструментами конвертации………………………………………. 165
Проектирование фонового процесса……………………………………………………………………………………… 166
Выбор технологий…………………………………………………………………………………………………………………… 167
Ограничение анонимных пользователей………………………………………………………………………………. 167
Запрет использования сервиса в качестве файлового хранилища……………………………… 167
Ограничение количества действий с одного адреса…………………………………………………….. 168
Запрет регистрации с фальшивых почтовых адресов………………………………………………….. 169
Ограничение по объему и форматам……………………………………………………………………………… 169
Безопасность……………………………………………………………………………………………………………………………. 170
Взаимодействие с платежными системами…………………………………………………………………………… 171
Приватность данных……………………………………………………………………………………………………………….. 171
Пароль доступа………………………………………………………………………………………………………………… 171
Шифрование данных……………………………………………………………………………………………………….. 171
Логирование и мониторинг…………………………………………………………………………………………………….. 173
Распределенная архитектура…………………………………………………………………………………………………. 174
Улучшение пользовательского опыта…………………………………………………………………………………… 175
Подробные статусы…………………………………………………………………………………………………………. 175
Хеширование входных файлов……………………………………………………………………………………….. 176
Определение некорректных файлов……………………………………………………………………………….. 177
Добавление новой функциональности…………………………………………………………………………………… 177
Заключение………………………………………………………………………………………………………………………………. 177
Глава 14. Проектирование интернет-магазина в Telegram……………………. 179
Исходные требования……………………………………………………………………………………………………………… 179
Анализ возможностей………………………………………………………………………………………………………. 180
Ограничения……………………………………………………………………………………………………………………… 182
Проектирование интерфейса бота…………………………………………………………………………………………. 183
Проектирование зоны администратора………………………………………………………………………………… 186
Проектирование архитектуры………………………………………………………………………………………………… 188
Выбор технологий…………………………………………………………………………………………………………………… 190
Рассылка уведомлений……………………………………………………………………………………………………………. 190
Горизонтальное масштабирование……………………………………………………………………………………….. 192
Мониторинг……………………………………………………………………………………………………………………………… 193
Дальнейшие улучшения………………………………………………………………………………………………………….. 193
Заключение………………………………………………………………………………………………………………………………. 194
Глава 15. Проектирование плагина для отправки проекта
из программы 3D-моделирования…………………………………………………………. 195
Исходные требования……………………………………………………………………………………………………………… 195
Ограничения…………………………………………………………………………………………………………………………….. 195
Проектирование простой архитектуры…………………………………………………………………………………. 196
Проектирование составной архитектуры……………………………………………………………………………… 198
Выбор технологий…………………………………………………………………………………………………………………… 199
Логирование…………………………………………………………………………………………………………………………….. 199
Потенциальные технические улучшения………………………………………………………………………………. 200
Заключение………………………………………………………………………………………………………………………………. 200
Заключение………………………………………………………………………………………….. 201
Предметный указатель…………………………………………………………………………. 203
