Привет, Хабр! Меня зовут Василий Сизов. По образованию я инженер-конструктор, а сейчас работаю тимлидом в ВТБ и занимаюсь машинным обучением в CRM и проектами с LLM. 

В какой-то момент мне доверили кросс-функциональную команду — и тут пришлось разбираться не только в моделях, но и в процессах, которые обеспечивают их жизнеспособность. В этой статье расскажу, как мы пересобрали эти процессы и сократили Time to Market на 20%. Возможно, вы узнаете в этих историях свои задачи и вызовы – и найдете идеи, которые помогут их решить.

Если вам ближе видеоформат — с этой темой я выступал на Data Fest 2025.

Кейс 1. «Что тут вообще происходит?» Разбираемся в процессах

Когда я стал тимлидом, к нашей Data Science-команде присоединились инженеры данных и MLOps-специалисты. Команда выросла, а прозрачность – наоборот, упала. Я хорошо понимал DS-логику, но хуже ориентировался в проде и витринах. Поэтому первым шагом решил навести порядок и буквально разложить все по шагам.

Я опросил участников процесса, зафиксировал последовательность действий и описал каждый этап по единому шаблону:

  • Название — чтобы говорить на одном языке;

  • Цель — чтобы отсечь лишние процессы, живущие «по инерции»;

  • Вход и выход — чтобы понимать, что происходит до и после шага;

  • Роли и инструменты;

  • Инструкция — как именно выполняется шаг;

  • Требования и критерии — например, к коду или документации.

Совет из практики: нумеруйте шаги не 1, 2, 3, а 10, 20, 30. Если появится новый шаг, не придется все перенумеровывать — мелочь, а спасает.

Параллельно мы завели базу знаний с ответственным за ее актуальность.

Результат оказался заметным: команда наконец начала говорить на одном языке, onboarding новых коллег стал быстрее и спокойнее, а Time to Market сократился примерно на 20%.

Кейс 2. «Когда всё ломается». Чиним процессы, а не избегаем проблему

Когда процессы наконец описаны, кажется, что все должно работать как часы. Но формальные схемы не спасают от реальности — сбои все равно случаются.

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

2.1. Спиллы в Spark

Иногда проблема выглядит сложной, но решается одной строчкой запроса.

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

Посчитать их быстро мы не могли: в нашей среде не было доступа к Spark API. Решение оказалось простым — запросили доступ через стандартную процедуру. Получили, проверили, зафиксировали.

Скорость вернулась, нервы сэкономили.

Вывод: иногда все решается обычным «попросили — сделали».

2.2. Документация

Казалось бы, базовая задача — оформить документ. На деле на нее уходило слишком много времени.

Разработчик писал в одном формате, аналитик переписывал в другом, после чего документ снова уходил на доработку. Цепочка без добавленной ценности.

Проблема оказалась банальной — у всех был свой шаблон. Мы заранее утвердили итоговую структуру, договорились о формате и закрепили его в базе знаний.

Вывод: стандартизация экономит время и убирает лишние согласования.

2.3. Code-review

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

Мы настроили нормальный git flow с ревью через pull request’ы.

После этого ревью стало живым этапом работы, а не пунктом чек-листа. Повысилось качество кода, и наш подход позже масштабировали на другие команды.

Вывод: ревью должно быть процессом, а не ритуалом.

Кейс 3. «Развитие в рутине». Как мы воспользовались паузой, чтобы прокачать команду

С заказчиком в CRM мы работали уже три года. Модели были готовы: оттоки, прогнозы, look-alike — всё функционировало стабильно, библиотека моделирования использовалась всей командой.

Задач стало меньше, проекты вошли в фазу сопровождения, и наступила привычная рутина.

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

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

Что сделали:

  • попросили коллег из backend-команды провести ревью библиотеки и подсветить проблемные места;

  • начали системно разбирать базу: логирование, типизацию, структуру кода — каждую неделю обсуждали по одному блоку;

  • переписали стандартные скрипты и саму библиотеку, избавившись от костылей и условных конструкций вида if CatBoost, if XGBoost.

Результат:

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

  • библиотека стала модульной: добавление новых фичей теперь не требует обходных путей;

  • T2M сократился, а добавление нового функционала ускорилось примерно в три раза.

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

Что я понял

  1. Даже небольшое изменение процесса может дать результат, который раньше пытались добиться месяцами тюнинга моделей.

  2. Рутину не стоит бояться — она дает время подумать, как сделать систему устойчивее.

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

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

  5. Иногда «починить» процессы — значит сделать шаг к лучшим моделям, более спокойной работе и большему удовольствию от того, что ты делаешь.

Также оставлю ссылку на Telegram-канал DS-сообщества ВТБ. 

Спасибо!

Комментарии (0)