← Что делаем

Разработка сложных веб-сервисов и отраслевых платформ

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

Такие вещи мы и называем сложными веб-сервисами. Признак простой: в системе больше одного типа пользователей, между ними есть правила, а данные должны сходиться.

Что делает веб-сервис сложным

Сложность почти никогда не в количестве экранов. Она в четырех вещах.

Несколько сторон

Заказчик и исполнитель, головной офис и филиал, продавец и покупатель, проверяющий и проверяемый. У каждого свой интерфейс, свои права и своя правда о происходящем.

Правила и расчеты

Тарифы, коэффициенты, лимиты, сроки, штрафы, рейтинги. Именно здесь живет предметная область, и именно это нельзя взять из готового продукта.

Состояния и переходы

Заявка бывает не «новая» и «закрытая», а в десяти состояниях с условиями перехода. Большая часть ошибок в таких системах — не в коде, а в непродуманных переходах.

Внешний мир

Платежи, документы, оборудование, государственные сервисы, чужие API. Каждый стык — место, где что-то пойдет не так, и это надо предусмотреть заранее.

Что происходит с состояниями

Состояния объекта в сложном сервисе и переходы между ними Сверху основной путь заявки из шести состояний. Снизу отклонения: снятие, истекший срок, возврат на доработку и спор. Отклонения занимают большую часть разработки. ОСНОВНОЙ ПУТЬ черновик опубликована есть отклики исполнительвыбран в работе принята А ЕЩЕ НА ЛЮБОМ ШАГЕ снятие и отменакем, когда, с чем остается истекший срокнапоминания и автопереход возврат на доработкусколько раз, за чей счет спор и разборкто решает, чем заканчивается Верхний ряд оценивают все. Нижний — почти никто а по объему работы он сопоставим с основным путем, и всплывает это на третьем месяце
Счастливый путь рисуется за пять минут. Реальный объем работы определяется тем, что происходит при отклонении от него.

Что мы делаем

  1. Разбираем предметную область. Кто участники, какие у них цели, где их интересы расходятся. В сервисах с несколькими сторонами конфликт интересов — это не проблема, а то, что система должна регулировать.
  2. Проектируем состояния и правила. Полная схема переходов со всеми отклонениями. Это самый трудный и самый полезный документ в проекте.
  3. Проектируем данные и права. Кто что видит и на каком основании. В многосторонних сервисах права — не настройка, а часть логики.
  4. Собираем прототип ключевых сценариев. Отдельно для каждой стороны: то, что очевидно заказчику, часто непонятно исполнителю.
  5. Разрабатываем частями. Сначала основной путь целиком, потом отклонения. Работающие блоки появляются каждые одну-две недели.
  6. Запускаем и наблюдаем. В сервисах с внешними пользователями первые недели показывают то, чего не видно на тестах: как люди используют систему не так, как задумано.

Что мы делали и делаем

  • Отраслевые площадки. Заявки, отклики, выбор исполнителя, расчеты и рейтинги внутри конкретной отрасли, где общие площадки не подходят из-за специфики.
  • Системы расчетов. Когда цена или объем считаются по нетривиальным правилам: тарифы, коэффициенты, нормативы, сезонность. Такое невозможно купить готовым.
  • Сервисы для сетей и филиалов. Общие правила, локальные отличия, сводная картина для головного офиса и ограниченный доступ на местах.
  • Публичные сервисы с закрытой частью. Открытый каталог или витрина плюс рабочая система за авторизацией, живущие на одних данных.
  • Сервисы вокруг оборудования и объектов. Данные приходят с устройств или из полей, обрабатываются по правилам и превращаются в задачи для людей.

Нагрузка и надежность

Вопрос «выдержит ли» задают в самом начале, и отвечать на него надо честно: до реальных данных это оценка, а не факт.

  • Считаем сценарии нагрузки, а не абстрактные пользователи. Тысяча человек, читающих каталог, и сто человек, одновременно оформляющих заявку, — совершенно разные задачи.
  • Проверяем на объеме. Система, быстрая на сотне записей, может лечь на пятидесяти тысячах. Тяжелые экраны прогоняем на реальном объеме до запуска.
  • Проектируем поведение при сбоях. Внешний сервис не ответил, платеж завис, связь пропала. Правильное поведение — понятное сообщение и сохранность данных, а не белый экран.
  • Не переусложняем заранее. Архитектура под миллион пользователей при первых ста стоит денег и времени, а нужна оказывается редко. Закладываем возможность вырасти, а не сразу максимум.

Где здесь искусственный интеллект

В сложных сервисах модели работают на стыках, где раньше сидел человек.

  • Разбор входящего. Заявки и документы приходят текстом, файлами, сканами. Модель приводит их к структуре и заполняет карточку, а человек проверяет.
  • Подбор и сопоставление. Кому показать заявку, какие позиции считать одинаковыми, какой исполнитель ближе по профилю. На объеме это решается лучше, чем фильтрами.
  • Модерация и спорные ситуации. Предварительная фильтрация нарушений и подсветка проблемных случаев для человека. Решение остается за человеком, но разбирать он будет десятки случаев, а не тысячи.
  • Поддержка пользователей. Ответы по правилам сервиса и помощь при заполнении. В многосторонних сервисах львиная доля обращений — это «как у вас тут устроено».
  • Аналитика словами. Вопрос к данным без построения отчета — особенно полезно, когда разрезов много и заранее все не предусмотреть.

Сроки и стоимость

2–4 неделипроектирование: участники, состояния, права, прототипы ключевых сценариев
2–4 месяцапервая рабочая версия с основным путем и одной-двумя сторонами
от 6 месяцевсервис со всеми сторонами, расчетами, платежами и внешними интеграциями

Главный фактор стоимости — не количество экранов, а число состояний и правил. Поэтому оценка без проектирования в таких проектах бессмысленна: разница между «похоже на маркетплейс» и реальным объемом может быть кратной.

Разберем предметную область и оценим реальный объем

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

Обсудить сервис

Схема участников и состояний остается у вас и годится для запроса цены у любого подрядчика.

Публичная часть и рабочая часть

У многих таких сервисов две половины, и их проектируют по разным правилам.

Публичная часть должна быстро открываться, попадать в поиск и быть понятной человеку, который видит сервис впервые. Здесь важны скорость загрузки, читаемые адреса, структура заголовков, микроразметка — то, без чего страницы просто не появятся в выдаче.

Рабочая часть за авторизацией живет по другим законам. Там человек проводит часы, и ценность не в красоте, а в том, сколько действий нужно, чтобы сделать привычную операцию. Лишний клик, повторенный триста раз в день, — это реальные деньги.

Ошибка — делать обе половины по одному шаблону. Публичная часть, спроектированная как рабочая, выглядит казенно и не продает. Рабочая часть, спроектированная как публичная, красива и неудобна.

Как мы оцениваем такие проекты

  1. Считаем стороны и роли. Каждая новая сторона — это не «плюс несколько экранов», а отдельный набор сценариев, прав и уведомлений.
  2. Считаем состояния и переходы. Число переходов между состояниями предсказывает объем работы лучше, чем число экранов.
  3. Считаем правила и расчеты. Формулы, коэффициенты, исключения. Каждое правило требует проверки и тестов, иначе оно сломается при первом же нестандартном случае.
  4. Считаем внешние стыки. Каждая интеграция — это не только подключение, но и обработка того, что она отвалилась, ответила медленно или вернула ерунду.
  5. Считаем модерацию и поддержку. Инструменты для разбора спорных ситуаций — полноценная часть системы, а не «админка, которую сделаем в конце».

Отсюда правило: если подрядчик назвал цену за сложный сервис по описанию в абзац, он не оценил задачу, а угадал. Такая цифра либо с огромным запасом, либо заведомо нереальная — и второе встречается чаще, потому что так проще выиграть проект.

Частые ошибки

  • Оценивают по счастливому пути. «Заявка, отклик, сделка» — это пять экранов. Отмены, споры, возвраты, сроки и повторы — это еще столько же работы, и о них вспоминают на третьем месяце.
  • Запускают все стороны сразу. В сервисах с двумя сторонами одна всегда должна прийти первой. Запуск обеих одновременно обычно заканчивается пустой площадкой.
  • Откладывают права. «Потом настроим» не работает: в многосторонних сервисах права определяют логику, а не наоборот.
  • Копируют чужой интерфейс. Похожий сервис в другой отрасли решает другую задачу. Заимствуется форма, а вместе с ней приезжают чужие ограничения.
  • Не думают про модерацию. Любой сервис с внешними пользователями получает мусор, спам и злоупотребления. Инструменты для этого нужны с первого дня, а не после первого инцидента.

Отрасли, где это чаще всего нужно

  • Логистика и перевозки. Заявки, перевозчики, ставки, статусы в пути, документы. Много сторон, много состояний и обязательные стыки с внешними системами.
  • Строительство и подряд. Тендеры на работы, подрядчики, этапы, акты, претензии. Правила отбора и расчеты здесь всегда свои.
  • Сельское хозяйство и переработка. Партии, качество, лаборатория, приемка, расчет по фактическим показателям. Цена зависит от параметров, а не от прайса.
  • Энергетика и ЖКХ. Приборы учета, показания, начисления по нормативам и тарифам, работа с потребителями и подрядчиками.
  • Медицина и лаборатории. Направления, исследования, результаты, доступ для пациента и для врача. Требования к данным жесткие, и это влияет на архитектуру.
  • Профессиональные сообщества и отраслевые ассоциации. Реестры участников, проверки, взносы, публичная часть и закрытая для членов.

Что остается у вас

Код в вашем репозитории, доступы к серверам на ваши учетные записи, схема состояний и модель данных как документ, инструкции по развертыванию. Стек распространенный: PHP или Python, PostgreSQL или MySQL, обычный современный фронтенд — поддержит любой грамотный разработчик.

Размещение — на вашей инфраструктуре или на российском хостинге. Если в сервисе есть персональные данные, обработка по 152-ФЗ закладывается при проектировании: в публичных сервисах это особенно важно, потому что данные вносят сами пользователи.

Дальше по теме

Обсудить задачу

Частые вопросы

Что делает веб-сервис сложным?

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

Почему нельзя назвать цену сразу?

Потому что стоимость определяется числом состояний, переходов и правил, а не описанием в абзац. Разница между «похоже на маркетплейс» и реальным объемом может быть кратной. Цена, названная без проектирования, — это угадывание, и чаще всего она занижена, потому что так проще выиграть проект.

Сколько занимает разработка?

Проектирование — участники, состояния, права, прототипы — 2–4 недели. Первая рабочая версия с основным путем и одной-двумя сторонами — 2–4 месяца. Сервис со всеми сторонами, расчетами, платежами и интеграциями — от полугода.

Выдержит ли сервис нагрузку?

До реальных данных это оценка, а не факт, и честно говорить именно так. Мы считаем сценарии нагрузки (тысяча читающих и сто одновременно оформляющих — разные задачи), проверяем тяжелые экраны на реальном объеме до запуска и проектируем поведение при сбоях. Строить сразу под миллион пользователей при первых ста — лишние деньги и время.

Как запускать сервис с двумя сторонами?

Не одновременно. Одна сторона всегда должна прийти первой, иначе получится пустая площадка, на которой никому нечего делать. Какая именно — зависит от предметной области, и это один из первых вопросов на проектировании.

Нужна ли модерация?

Любой сервис с внешними пользователями получает мусор, спам и злоупотребления. Инструменты разбора спорных ситуаций — полноценная часть системы, а не админка, которую делают в конце. Предварительную фильтрацию можно повесить на модели, но решение оставить человеку.

Можно ли сделать публичную часть и закрытую в одной системе?

Да, и это частый случай: открытый каталог плюс рабочая система за авторизацией на одних данных. Но проектируются они по разным правилам: публичная часть — под скорость и поиск, рабочая — под количество действий в привычной операции. Делать обе по одному шаблону — типичная ошибка.

Что остается у нас после разработки?

Код в вашем репозитории, доступы на ваши учетные записи, схема состояний и модель данных как документ, инструкции по развертыванию. Стек распространенный, поддержит любой грамотный разработчик. Размещение — на вашей инфраструктуре или российском хостинге, с обработкой персональных данных по 152-ФЗ.

Начать проект