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


Михаил Савченко4 мин
Содержание4 раздела
  1. Что общего у всех продуктов
  2. Сколько на самом деле переносится
  3. Чем это подтверждено
  4. Табло, без прикрас

Что общего у всех продуктов

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

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

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

Сколько на самом деле переносится

Обычно в этом месте называют большую долю. Мы измеряли дважды, и обе цифры оказались неудобными.

CRM проката, которую мы перевели на общую основу, - это примерно 145 000 строк на TypeScript и правила, накопленные за четыре года. Из 1872 строк схемы данных отраслевыми оказались 1650, то есть 88%. Общей обвязкой были 222 строки (разбивка по таблицам).

Второй замер жёстче. Мы построили платформу аренды, потом платформу недвижимости. Отрасли соседние: в обеих объект кому-то передают, на время или навсегда. Из 113 бизнес-понятий двух продуктов общими нашлись семь, около 6%; эту цифру мы разбираем отдельно.

Этот вывод полезен не только нам. «У нас такое уже есть, останется настроить» - фраза про обвязку, о вашем бизнесе в ней ничего нет. В тексте откуда берутся четыре недели то же самое разобрано с позиции того, кто выбирает подрядчика.

Чем это подтверждено

Перевод проката на общую основу занял четыре недели. С третьей недели операторы работали в новом приложении и оформляли в нём настоящие брони.

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

Один побочный результат оказался важнее запланированных. Бизнес-правила вроде «нет выдачи машины, пока договор не подписан и залог не внесён» мы встроили прямо в слой, к которому обращаются внешние ИИ-агенты. Теперь агент не может обойти правило, даже если ничего о нём не знает: в ответ он получает отказ и название нарушенного условия. Каждому следующему продукту эта защита достаётся бесплатно.

Табло, без прикрас

СтатусШтук
В эксплуатации1
Пилот2
Ждут миграции4
Расходятся со спецификацией4
Не приведены к основе2
Названы, не начаты3
Заменены другими2
Полное соответствие спецификации0

Счёт взят из реестра на 22 мая 2026 года, он опубликован в CSV.

Из восемнадцати записей в эксплуатации одна, а статуса, который спецификация назначила целью, пока нет ни у одной.

Счётчик продуктов - маркетинговое число, реестр статусов - инженерное, и заметно ошибиться может только реестр. «Восемнадцать продуктов на общей основе» переживёт любое расхождение с реальностью, а строка «одна в эксплуатации, ноль в полном соответствии» задаёт работу.

Если вы строите семейство продуктов у себя, пригодится не наш код, а привычка. До первого продукта решите, какой слой вправе знать об отрасли, выпускайте общую основу версиями и ведите реестр честно - настолько честно, чтобы на него было неприятно смотреть. Реестр, от которого никто не морщится, никто и не обновляет.

Как это выглядит для заказчика, мы разбираем в тексте о сроках внедрения.

Часто задаваемые вопросы

  • Что именно общее, а что пишется каждый раз заново?

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

  • Насколько велика доля, которую приходится писать заново?

    Больше, чем ожидают почти все, и мы сами в начале ожидали меньшего. Обе цифры ниже измерены. В CRM проката, которую мы перевели на общую основу, из 1872 строк схемы данных 1650 оказались отраслевыми, то есть 88%, и только 222 строки были той обвязкой, которую даёт основа. Вторая цифра ещё жёстче: когда мы построили второй продукт в соседней отрасли, у двух продуктов из 113 бизнес-понятий общих нашлось семь, около 6%. Если вы выбираете подрядчика, вывод простой: фраза «у нас такое уже есть, останется настроить» говорит об обвязке, о вашем бизнесе в ней ничего нет. Второй случай мы разобрали в отдельном тексте, потому что цифра там неудобная и требует подробностей.

  • Зачем вообще строить общую основу, если переносится так мало?

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

  • Почему вы публикуете реестр статусов, а не число продуктов?

    Потому что счётчик продуктов - маркетинговое число, а реестр статусов - инженерное, и заметно ошибиться может только реестр. Фраза «восемнадцать продуктов на общей основе» переживёт любое расхождение с реальностью: она верна, пока хоть что-то работает. Строка «одна в эксплуатации, две в пилоте, полного соответствия спецификации нет ни у одной» задаёт работу, потому что каждый статус кто-то должен сдвинуть. Мы ведём реестр вручную и обновляем его при каждом выпуске спецификации как раз затем, чтобы он тихо не съехал к первой формулировке. По той же причине в репозитории спецификации нет исполняемого кода: спецификацию, которая сама поставляет среду выполнения, уже не с чем сверить.

ArchitectureMulti-tenantStrategy