Разработка сложных веб-сервисов и отраслевых платформ
Есть задачи, для которых нет готового решения, потому что они слишком специфичны для коробки и слишком велики для сайта. Биржа заявок в узкой отрасли, система расчетов по своим правилам, сервис, где встречаются заказчики и исполнители, платформа для сети филиалов с разными правами.
Такие вещи мы и называем сложными веб-сервисами. Признак простой: в системе больше одного типа пользователей, между ними есть правила, а данные должны сходиться.
Что делает веб-сервис сложным
Сложность почти никогда не в количестве экранов. Она в четырех вещах.
Несколько сторон
Заказчик и исполнитель, головной офис и филиал, продавец и покупатель, проверяющий и проверяемый. У каждого свой интерфейс, свои права и своя правда о происходящем.
Правила и расчеты
Тарифы, коэффициенты, лимиты, сроки, штрафы, рейтинги. Именно здесь живет предметная область, и именно это нельзя взять из готового продукта.
Состояния и переходы
Заявка бывает не «новая» и «закрытая», а в десяти состояниях с условиями перехода. Большая часть ошибок в таких системах — не в коде, а в непродуманных переходах.
Внешний мир
Платежи, документы, оборудование, государственные сервисы, чужие API. Каждый стык — место, где что-то пойдет не так, и это надо предусмотреть заранее.
Что происходит с состояниями
Что мы делаем
- Разбираем предметную область. Кто участники, какие у них цели, где их интересы расходятся. В сервисах с несколькими сторонами конфликт интересов — это не проблема, а то, что система должна регулировать.
- Проектируем состояния и правила. Полная схема переходов со всеми отклонениями. Это самый трудный и самый полезный документ в проекте.
- Проектируем данные и права. Кто что видит и на каком основании. В многосторонних сервисах права — не настройка, а часть логики.
- Собираем прототип ключевых сценариев. Отдельно для каждой стороны: то, что очевидно заказчику, часто непонятно исполнителю.
- Разрабатываем частями. Сначала основной путь целиком, потом отклонения. Работающие блоки появляются каждые одну-две недели.
- Запускаем и наблюдаем. В сервисах с внешними пользователями первые недели показывают то, чего не видно на тестах: как люди используют систему не так, как задумано.
Что мы делали и делаем
- Отраслевые площадки. Заявки, отклики, выбор исполнителя, расчеты и рейтинги внутри конкретной отрасли, где общие площадки не подходят из-за специфики.
- Системы расчетов. Когда цена или объем считаются по нетривиальным правилам: тарифы, коэффициенты, нормативы, сезонность. Такое невозможно купить готовым.
- Сервисы для сетей и филиалов. Общие правила, локальные отличия, сводная картина для головного офиса и ограниченный доступ на местах.
- Публичные сервисы с закрытой частью. Открытый каталог или витрина плюс рабочая система за авторизацией, живущие на одних данных.
- Сервисы вокруг оборудования и объектов. Данные приходят с устройств или из полей, обрабатываются по правилам и превращаются в задачи для людей.
Нагрузка и надежность
Вопрос «выдержит ли» задают в самом начале, и отвечать на него надо честно: до реальных данных это оценка, а не факт.
- Считаем сценарии нагрузки, а не абстрактные пользователи. Тысяча человек, читающих каталог, и сто человек, одновременно оформляющих заявку, — совершенно разные задачи.
- Проверяем на объеме. Система, быстрая на сотне записей, может лечь на пятидесяти тысячах. Тяжелые экраны прогоняем на реальном объеме до запуска.
- Проектируем поведение при сбоях. Внешний сервис не ответил, платеж завис, связь пропала. Правильное поведение — понятное сообщение и сохранность данных, а не белый экран.
- Не переусложняем заранее. Архитектура под миллион пользователей при первых ста стоит денег и времени, а нужна оказывается редко. Закладываем возможность вырасти, а не сразу максимум.
Где здесь искусственный интеллект
В сложных сервисах модели работают на стыках, где раньше сидел человек.
- Разбор входящего. Заявки и документы приходят текстом, файлами, сканами. Модель приводит их к структуре и заполняет карточку, а человек проверяет.
- Подбор и сопоставление. Кому показать заявку, какие позиции считать одинаковыми, какой исполнитель ближе по профилю. На объеме это решается лучше, чем фильтрами.
- Модерация и спорные ситуации. Предварительная фильтрация нарушений и подсветка проблемных случаев для человека. Решение остается за человеком, но разбирать он будет десятки случаев, а не тысячи.
- Поддержка пользователей. Ответы по правилам сервиса и помощь при заполнении. В многосторонних сервисах львиная доля обращений — это «как у вас тут устроено».
- Аналитика словами. Вопрос к данным без построения отчета — особенно полезно, когда разрезов много и заранее все не предусмотреть.
Сроки и стоимость
Главный фактор стоимости — не количество экранов, а число состояний и правил. Поэтому оценка без проектирования в таких проектах бессмысленна: разница между «похоже на маркетплейс» и реальным объемом может быть кратной.
Разберем предметную область и оценим реальный объем
Опишите, что за сервис и кто в нем участвует. В ответ — схема участников и состояний, состав первой версии, этапы и вилка стоимости. Заодно скажем, где в задумке спрятана сложность, которую обычно не замечают на старте.
Схема участников и состояний остается у вас и годится для запроса цены у любого подрядчика.
Публичная часть и рабочая часть
У многих таких сервисов две половины, и их проектируют по разным правилам.
Публичная часть должна быстро открываться, попадать в поиск и быть понятной человеку, который видит сервис впервые. Здесь важны скорость загрузки, читаемые адреса, структура заголовков, микроразметка — то, без чего страницы просто не появятся в выдаче.
Рабочая часть за авторизацией живет по другим законам. Там человек проводит часы, и ценность не в красоте, а в том, сколько действий нужно, чтобы сделать привычную операцию. Лишний клик, повторенный триста раз в день, — это реальные деньги.
Ошибка — делать обе половины по одному шаблону. Публичная часть, спроектированная как рабочая, выглядит казенно и не продает. Рабочая часть, спроектированная как публичная, красива и неудобна.
Как мы оцениваем такие проекты
- Считаем стороны и роли. Каждая новая сторона — это не «плюс несколько экранов», а отдельный набор сценариев, прав и уведомлений.
- Считаем состояния и переходы. Число переходов между состояниями предсказывает объем работы лучше, чем число экранов.
- Считаем правила и расчеты. Формулы, коэффициенты, исключения. Каждое правило требует проверки и тестов, иначе оно сломается при первом же нестандартном случае.
- Считаем внешние стыки. Каждая интеграция — это не только подключение, но и обработка того, что она отвалилась, ответила медленно или вернула ерунду.
- Считаем модерацию и поддержку. Инструменты для разбора спорных ситуаций — полноценная часть системы, а не «админка, которую сделаем в конце».
Отсюда правило: если подрядчик назвал цену за сложный сервис по описанию в абзац, он не оценил задачу, а угадал. Такая цифра либо с огромным запасом, либо заведомо нереальная — и второе встречается чаще, потому что так проще выиграть проект.
Частые ошибки
- Оценивают по счастливому пути. «Заявка, отклик, сделка» — это пять экранов. Отмены, споры, возвраты, сроки и повторы — это еще столько же работы, и о них вспоминают на третьем месяце.
- Запускают все стороны сразу. В сервисах с двумя сторонами одна всегда должна прийти первой. Запуск обеих одновременно обычно заканчивается пустой площадкой.
- Откладывают права. «Потом настроим» не работает: в многосторонних сервисах права определяют логику, а не наоборот.
- Копируют чужой интерфейс. Похожий сервис в другой отрасли решает другую задачу. Заимствуется форма, а вместе с ней приезжают чужие ограничения.
- Не думают про модерацию. Любой сервис с внешними пользователями получает мусор, спам и злоупотребления. Инструменты для этого нужны с первого дня, а не после первого инцидента.
Отрасли, где это чаще всего нужно
- Логистика и перевозки. Заявки, перевозчики, ставки, статусы в пути, документы. Много сторон, много состояний и обязательные стыки с внешними системами.
- Строительство и подряд. Тендеры на работы, подрядчики, этапы, акты, претензии. Правила отбора и расчеты здесь всегда свои.
- Сельское хозяйство и переработка. Партии, качество, лаборатория, приемка, расчет по фактическим показателям. Цена зависит от параметров, а не от прайса.
- Энергетика и ЖКХ. Приборы учета, показания, начисления по нормативам и тарифам, работа с потребителями и подрядчиками.
- Медицина и лаборатории. Направления, исследования, результаты, доступ для пациента и для врача. Требования к данным жесткие, и это влияет на архитектуру.
- Профессиональные сообщества и отраслевые ассоциации. Реестры участников, проверки, взносы, публичная часть и закрытая для членов.
Что остается у вас
Код в вашем репозитории, доступы к серверам на ваши учетные записи, схема состояний и модель данных как документ, инструкции по развертыванию. Стек распространенный: PHP или Python, PostgreSQL или MySQL, обычный современный фронтенд — поддержит любой грамотный разработчик.
Размещение — на вашей инфраструктуре или на российском хостинге. Если в сервисе есть персональные данные, обработка по 152-ФЗ закладывается при проектировании: в публичных сервисах это особенно важно, потому что данные вносят сами пользователи.
Дальше по теме
Частые вопросы
Что делает веб-сервис сложным?
Не количество экранов, а четыре вещи: несколько типов пользователей со своими правами и интересами, правила и расчеты предметной области, множество состояний с условиями перехода и стыки с внешним миром — платежами, документами, чужими API. Счастливый путь рисуется за пять минут, реальный объем определяют отклонения от него.
Почему нельзя назвать цену сразу?
Потому что стоимость определяется числом состояний, переходов и правил, а не описанием в абзац. Разница между «похоже на маркетплейс» и реальным объемом может быть кратной. Цена, названная без проектирования, — это угадывание, и чаще всего она занижена, потому что так проще выиграть проект.
Сколько занимает разработка?
Проектирование — участники, состояния, права, прототипы — 2–4 недели. Первая рабочая версия с основным путем и одной-двумя сторонами — 2–4 месяца. Сервис со всеми сторонами, расчетами, платежами и интеграциями — от полугода.
Выдержит ли сервис нагрузку?
До реальных данных это оценка, а не факт, и честно говорить именно так. Мы считаем сценарии нагрузки (тысяча читающих и сто одновременно оформляющих — разные задачи), проверяем тяжелые экраны на реальном объеме до запуска и проектируем поведение при сбоях. Строить сразу под миллион пользователей при первых ста — лишние деньги и время.
Как запускать сервис с двумя сторонами?
Не одновременно. Одна сторона всегда должна прийти первой, иначе получится пустая площадка, на которой никому нечего делать. Какая именно — зависит от предметной области, и это один из первых вопросов на проектировании.
Нужна ли модерация?
Любой сервис с внешними пользователями получает мусор, спам и злоупотребления. Инструменты разбора спорных ситуаций — полноценная часть системы, а не админка, которую делают в конце. Предварительную фильтрацию можно повесить на модели, но решение оставить человеку.
Можно ли сделать публичную часть и закрытую в одной системе?
Да, и это частый случай: открытый каталог плюс рабочая система за авторизацией на одних данных. Но проектируются они по разным правилам: публичная часть — под скорость и поиск, рабочая — под количество действий в привычной операции. Делать обе по одному шаблону — типичная ошибка.
Что остается у нас после разработки?
Код в вашем репозитории, доступы на ваши учетные записи, схема состояний и модель данных как документ, инструкции по развертыванию. Стек распространенный, поддержит любой грамотный разработчик. Размещение — на вашей инфраструктуре или российском хостинге, с обработкой персональных данных по 152-ФЗ.