Как строится современное веб-приложение

Результат анализа нескольких десятков проектов, в которых были созданы программные продуктов в виде веб-приложений

Я изложил его в виде списка задач, которые возникают на этапах от проектирования до коммерческой эксплуатации современных веб-приложений.
Список основан на реальных задачах, извлечённых из систем управления задачами, проектами, систем отслеживания ошибок, (Issue & Bug Tracking Software, Project Management Software) таких как Jira, Redmine, Microsoft Project.
Мне встречались задачи разного масштаба: и тысячи мелких багов и глобальные «захватить мир».

Список не стоит рассматривать как набор действий. В проектах разного уровня сложности они могут быть, а могут отсутствовать, могут выполняются в разном порядке. Некоторые задачи могут повторяться многократно по мере роста сложности. Некоторые могут быть не решены никогда, хотя очень хочется сделать их и забыть навсегда.

Как рождается веб-приложение? Это делается постепенно, шаг за шагом, в систему вводятся новые и новые части, между которыми появляется всё больше и больше связей.

Итак, с чего всё начинается? С идеи.

  • анализ предметной области
  • принятие решения о необходимости программной реализации бизнес-процессов — всех или какой-то их части
  • выделение ролей пользователей, то есть групп пользователей, которые будут пользоваться программным продуктом, с разными задачами и полномочиями (например, посетители интернет-магазина, покупатели, сотрудники службы поддержки, сотрудники службы доставки, маркетологи)
  • определение функций, операций или ролевых задач, то есть списков действий пользователей, которые они должны выполнять с использованием программного продукта
  • определение данных, которыми пользователи должны оперировать

На основе анализа строится предположение, как могло бы выглядеть программное решение

  • проектирование интерфейса пользователя
  • описание процессов взаимодействия пользователей с программным продуктом (use-case)

Возможно, в компании уже есть какое-то частичное программное решение для отдельных бизнес-процессов

  • анализ имеющихся программных решений
  • описание процессов взаимодействия существующих программных решений с проектируемым
  • описание форматов данных для обмена
  • описание регламента обмена данными

Возможно, старое программное решение должно быть заменено новым

  • описание модели данных старого приложения
  • описание логики старого приложения
  • описание

Далее вступают в дело архитекторы программных продуктов

  • составление или уточнение модели данных — что будем хранить
  • выбор СУБД для хранения модели — где будем хранить
  • выбор языка программирования
  • выбор архитектуры приложения
  • составление объектной модели приложения

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

  • составление RoadMap — укрупнённого списка задач на далёкую перспективу
  • выделение приоритетных задач
  • декомпозиция задач — разбиение на мелкие подзадачи, которые могут быть достаточно чётко описаны и имеют короткий срок реализации

Наконец дело дошло до разработчиков

  • репозиторий кода
  • реализация программного каркаса приложения, реализация доступа к данным в базе — обычно на базе какого-нибудь фреймворка, но бывает и без него
  • вёрстка интерфейса пользователя
  • реализация модели данных в СУБД и проекции на объектную модель
  • реализация авторизации пользователей
  • реализация регистрации пользователей по инвайтам — это бывает нужно на начальном этапе, чтобы неудачные архитектурные решения не приводили к отказам при нагрузке
  • разделение пользователей по правам
  • система управления контентом — под контентом подразумевается не только статьи в блоге, но и вообще всё, что пользователь может видеть и изменять
  • панель администратора для управления пользователями и контентом
  • параметризованный и полнотекстовый поиск контента
  • реализация API для внешних сервисов, например для выдачи в другое приложение в той же организации или обмен данными с мобильными версиями приложений
  • агрегация данных из внешних источников
  • миграция данных их старых приложений — см выше где «возможно, старое программное решение должно быть заменено»
  • юнит-тесты или модульные тесты
  • непрерывная интеграция

Админы стоят на подмоге

  • управление доменными именами
  • управление хостингом
  • доступ к серверам
  • бакапы баз данных
  • бакапы пользовательских данных — картинки, документы и прочее
  • установка новых версий приложений на сервер приложений — хотя бы вручную
  • автоматизированное обновление сервера приложений — а вот это уже не вручную
  • автоматическая миграция данных при обновлениях
  • откат обновлений — если в последней версии обнаружили неустранимую ошибку
  • распределённый обмен данными — хотя бы через Dropbox

Тестировщики проверяют соответствие решений и исходных требований, помогают улучшать интерфейсы и заботятся о безопасности

Маркетологи хотят много аналитических данных и захватить мир

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

Служба поддержки хочет иметь возможность более тесно взаимодействовать с пользователями системы

  • организация обратной связи из приложения через веб-сайт
  • … и через почту
  • … и через телефон
  • … с авто-ответчиком
  • … и регистрацией всех обращений в базе данных (CRM)
  • … а ошибок — в системе отслеживания ошибок
  • работа с почтовыми службами, например, дублирование переписки с пользователям через веб-сайт и через электронную почту

Вопросы безопасности и стабильности когда-нибудь выходят на первый план

  • защита от взлома — ограничение на количество попыток входа, блокировка по IP, более строгие проверки
  • защита от роботов, которые пытаются выдать себя за реальных пользователей, а на самом деле ищут способы внедрить спам и вирусы
  • защита файлов от изменений (системные утилиты)
  • автоматическое восстановление из бакапов

Количество пользователей растёт и пора оптимизировать её работу

  • оптимизация запросов в СУБД
  • кэширование данных
  • инвалидация данных в кэше
  • щадящая, выборочная инвалидация данных
  • сквозное кэширование
  • прогревка кэша
  • поиск неоптимальных программных алгоритмов
  • реализация долгих операций в асинхронном режиме, по расписанию или через постоянные демоны, а также через очереди

В системе начинают проявляться проблемы роста нагрузки, пришла пора highload
(возвращаемся к этапу выбора архитектуры, если текущая версия не позволяет увеличить производительность)

  • разделение данных на несколько баз данных, горизонтальное масштабирование
  • разделение данных на несколько баз данных, вертикальное масштабирование
  • зеркалирование данных (readonly + read/write)
  • миграция данных с учётом масштабирования баз данных
  • мониторинг характеристик серверов в режиме реального времени
  • уведомления о сбоях серверов
  • оперативная замена основного сервера базы данных зеркалом + режим readonly
  • автоматическая замена серверов при сбоях
  • балансировка нагрузки сервера приложений
  • автоматизированное обновление нескольких серверов при балансировке нагрузки
  • автоматическое введение новых узлов сети (при использовании облаков)
  • отдельный сервер для пользовательского медиаконтента — фотографий, видео, музыки
  • несколько серверов для пользовательского медиаконтента

Админы заметили, что сервера используются неоптимально

  • регулярная автоматическая чистка места на дисках

База пользователей стала большой

  • массовые рассылки электронных сообщений

На сайте нужен приём платежей

  • интеграция с платёжными системами

Пользователи хотят мгновенных уведомлений о разных событиях

  • интеграция с SMS шлюзами
  • интеграция с системами сообщений через социальные сети
  • интеграция с сервисами сообщений типа Telegram

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

  • интерация с системами CRM
  • интерация с системами сбора аналитических сведений

Остались за кадром, но тоже требуются

  • создание настольной (desktop, standalone) версии приложения
  • создание мобильного приложения
  • интеграция с социальными сетями, например приложения для vKontakte
  • SEO-оптимизация

Что я забыл? Вписывай в комментарии.

Павел Волынцев

Уже более 15 лет занимаюсь разработкой веб-проектов. Fullstack Senior Developer. IT евангелист — доношу свет знаний об информационных технологиях. Профессиональные цели: Дать людям возможность дать людям больше.

Читайте также:

  • Что я забыл? Вписывай в комментарии.

  • Интересная статья на ту же тему http://olgashavrina.com/system_design С чего начать проектирование
    большой и сложной системы