Привет, я Андрей! Ну где ты был, ну открывай статью скорей :-)

За технической инфой я обращался к команде разработчиков, в том числе к backend-разработчику Сергею Колеватову. Он пояснил мне за все технические штуки, а я уже поведаю вам подробнее.

В этот раз расскажу об опыте создания внутренней системы для госкомпании. Загвоздка, как всегда, была в сроках и ресурсах. А продукт нужен сразу порядочный. Готовый шаблон, Symfony Forms и «грязный» код. Выбор пал на скорость вместо качества — продукт запущен за 2 месяца, ноооо… мы получили «технический долг». Как к этому пришли и как решили проблему, расскажу прямо сейчас.

Что за система-то вообще?

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

По сути, это личный кабинет с:

  • таблицей заявок;

  • страницей с детальным заполнением данных;

  • калькулятором, который автоматически подсчитывает сроки (например, дату завершения проверки) и статистику;

  • графиками и дашбордами;

  • календарем ключевых дат по заявкам;

  • возможностью выгрузки отчетов в Excel.

Система упростила внутренние процессы:

  1. Заявитель подает документы и видит статус заявки онлайн.

  2. Сотрудники обрабатывают заявки: вносят данные, пишут замечания, отправляют письма. И все это без бумажной волокиты.

  3. Руководитель Госэкспертизы видит статистику (например, сколько времени заявка провела на каждом этапе).

Этапы заявки:

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

    Заявка на строительство
    Заявка на строительство
  2. Работа с замечаниями: В процессе исправления ошибок заявитель выполняет доработки. После каждого этапа создаются новые замечания, что может продолжаться долго, пока все проблемы не будут устранены.

    Дашборд 1
    Дашборд 1
    Дашборд 2
    Дашборд 2
    Дашборд 3
    Дашборд 3
    Дашборд 4
    Дашборд 4
  3. Редактирование и проверка: Отделы проводят экспертизу, инженерные изыскания, проверяют документы, выявляют замечания и создают первичные или вторичные замечания, отправляют письма, ждут ответов.

  4. Регламент времени: В системе есть регламентированные сроки обработки, чтобы заявки не задерживались более установленного времени.

    Регламент времени
    Регламент времени
    Автоматический расчет сроков проверки
    Автоматический расчет сроков проверки
  5. Агрегация данных, архив: Все эти заявки, замечания, сроки и стадии объединяются, сохраняются в базе, и в итоге формируют итоговые отчеты и архив.

Как разрабатывали: от спешки к порядку

Акт первый — быстрый запуск

Создать функциональный «космолет» в короткие сроки и ограниченные ресурсы — задача проекта.

Мы решили выбрать Symfony, потому что:

  • не тянет с собой тяжелую админ-панель, в отличие от готовых cms

  • позволяет сфокусироваться на бизнес-логике

  • предоставляет удобный шаблонизатор

  • имеет механизм работы с формами;

  • мы обладаем соответствующей экспертизой

В первую очередь необходимо понять: а где мы можем срезать углы?

Фронтенд
Одним из таких углов оказался фронтенд. Для начала было решено использовать готовый шаблон админки, чтобы не заниматься излишним дизайном и версткой.

Далее под нож пошли все мысли о модных подходах на фронте. Вместо них мы использовали связку Symfony Forms и ux-live-component,чтобы:

  • снизить зависимость от фронтенд‑разработчиков;

  • за счёт backend‑команды пр��писывать логику элементов интерфейса.

Для примера: мы получили возможность сразу обновлять поля формы без перезагрузки страницы.

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

Over and over много строк кода

Ещё одним углом, который пришлось срезать, оказалось качество кода.

К сожалению, требования к системе не всегда можно определить заранее, особенно в рамках ограниченного бюджета. Поэтому часть из требований могут формироваться прямо во время написания проекта и ими приходится жонглировать на ходу. А вам это знакомо?

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

Система заработала быстро, но код получился «грязным»:

  • длинные файлов где количество строк стремится к  ∞;

  • тесно связанные блоки кода (изменение в одном месте ломало другое)

  • отсутствие четкой структуры кода

  • дублирование

Короче говоря, возник «технический долг».

Хотел показать вам пример «грязного» кода, но у нас такого уже нет. Шутка:) Немного еще осталось

Пример «грязного» кода, который изначально был сделан в реестре
Пример «грязного» кода, который изначально был сделан в реестре

Собираем рюкзак для релиза: что берем, а что оставляем дома

Что вы собираете рюкзак в поход? Нужно взять самое необходимое, а не все подряд.

В нашем случае:

  • Обязательно:  механизм расчета сроков по отделам.

Одна из частей расчета сроков
Одна из частей расчета сроков
  • Можно отложить: дашборд с данными в реальном времени (удобно, но не критично).

Мы «упаковали» в релиз только самое важное, а остальное положили в «бэклог‑рюкзак» — доберемся, когда будет время и ресурсы. Так, например, пока отложили функцию наследуемых заявок.

Акт второй — борьба с «техническим долгом»

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

Разумеется,  очень важно писать код аккуратно. Однако писать «идеальный» код сразу дорого и занимает много времени. Быстрое решение иногда кажется более привлекательным, но в долгосрочной перспективе – это увеличивает трудозатраты. А все большие трудозатраты будет оплачивать клиент.

Чем опасен «грязный код»:

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

  • его трудно читать, понимать, где что исправлять, и быстро вносить изменения;

  • может достигать тысяч строк, обрастать зависимостями — поддерживать его становится настоящей головной болью;

  • сложнее тестировать, поэтому вероятность ошибок растёт;

  • исправление одной проблемы может «ломать» что‑то в другом месте.

Знаете вот эту ситуацию, когда ты исправишь одну проблему — неожиданно что-то «отваливается» в другом месте?

В Реестре мы столкнулись со всеми этими проблемами:

  • работать с проектом становилось все больнее;

  • оценка на реализацию даже простых фич росла.

Писать «грязно» можно, но осторожно. Мы пошли на это осознанно — как на вынужденную меру. Сначала был сделан минимально рабочий продукт, и это было важнее.

Кривая Технического долга
Кривая Технического долга

Акт третий — доработки

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

Кроме того, что мы наводим порядки в коде, мы сделали интеграцию с Telegram.

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

Совсем недавно появился календарь заявок. «Пропущенные сроки» теперь не про отделы Госэкспертизы:

  • визуализация ключевых дат;

  • привязка к отделам;

  • предупреждение о приближающихся дедлайнах.

Календарь заявок
Календарь заявок

Клиент попросил сделать так, чтобы была полная картина активности: узнавать, кто и что делал в системе.

Эта фича превращает систему в прозрачную и контролируемую площадку. Теперь можно:

  • Видеть историю действий: все операции — кто и когда что сделал — отображаются в едином журнале.

  • Фильтровать по отделам: узнать активность конкретного отдела или группы сотрудников.

  • Упорядочить и анализировать: сортировать записи по времени, пользователю, типу действия или отделу.

  • Удобный и понятный интерфейс: все данные наглядные, структурированные и легко доступны.

Жизненные уроки от проекта

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

Скорость vs качество. Быстрая реализация экономит деньги сейчас, но создает долги на будущее.

Рефакторинг — необходимость. Даже если код работает, его нужно периодически «прибирать», чтобы не утонуть в ошибках.

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

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

«Госэкспертиза Реестр» — пример того, как можно создать эффективный инструмент даже с ограниченными ресурсами.

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