Илья Томин.

Python Backend Engineer

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

Опыт работы

МАР 2024 — АВГ 2026

Python Backend Engineer

HR-платформаРаботал над архитектурой сервисов, внедрил журнал действий на Kafka и ускорил CI-тесты.

Результаты

  • Отвечал за архитектурное разделение HRTech-бэкенда, RabbitMQ-контракты и code review работы двух разработчиков. После комплексных архитектурных и ресурсных изменений пиковый успешный HTTP RPS вырос примерно с 1 500 до 8 000.
  • Внедрил в production журнал действий сотрудников на Kafka и transactional Outbox: отдельная PostgreSQL-база истории, защита от дублей по UUIDv7, диагностический DLQ и разграничение доступа.
  • Настроил параллельный CI-прогон через pytest-xdist: около 2 000 тестов стали выполняться за 1,5 минуты вместо 20.
  • Вынес бизнес-логику Django Views/ViewSets в независимые от ORM Use Cases: по оценке, количество зависимостей между модулями сократилось примерно с 321 до 201 (~37%). Объединил логику получения пользователя и проверки прав, повторявшуюся примерно в 13 местах; unit-тесты стали работать без Django и БД.
  • После массового UPSERT исследовал запрос списка кандидатов PostgreSQL через EXPLAIN ANALYZE. При повторных замерах в production наблюдал переход Seq Scan → Index Scan по существующему индексу и снижение SQL Execution Time с ~17 с до ~100 мс после изменения порогов autovacuum.
PythonPostgreSQLKafkaRabbitMQ
Подробнее о нагрузке
СЕН 2021 — ФЕВ 2024

Backend Developer & ML Engineer

НИЛ «Текстовая Аналитика»Разрабатывал управление экзаменационными вариантами и правами доступа; ruBERT-классификатор жанров показал F1 0,83 на валидации.

Результаты

  • Дообучил ruBERT для классификации текстов; F1 на валидационной выборке составил 0,83.
  • Разработал NLP-модуль извлечения терминов из учебных текстов на spaCy NER и эталонных словарях: ~5 секунд автоматического извлечения против ~20 минут ручного поиска и проверки на сопоставимом тексте. Автоматическую выдачу лингвисты проверяли отдельно.
  • Разработал в Visual Studio Windows-приложение на базе Chromium с доступом только к сайту экзаменационной платформы. Решение помогло избежать закупки сторонней системы прокторинга стоимостью около 500 000 ₽.
  • Участвовал во внедрении GitFlow и переходе команды из трёх разработчиков к параллельной работе. Сопоставимый объём задач стали выполнять примерно за 2,5 вместо 5 рабочих дней (≈2× быстрее).
PythonNLPruBERT

Технические кейсы

Нагрузка на API, журнал действий на Kafka, ускорение CI и бизнес-логика, которую можно тестировать без Django и БД.

От ~1 500 до ~8 000 успешных HTTP RPS.

Определил границы сервисов и спроектировал RabbitMQ-контракты для декомпозиции HR-бэкенда; команда выделила бота и фоновые задачи.

Мой вкладОпределял границы сервисов, проектировал RabbitMQ-контракты и проводил ревью работы двух разработчиков.

архитектура / нагрузка

PythonRabbitMQGranianOutbox
~5,3×пиковый успешный HTTP RPS
Технические детали

Мы выделили Telegram-бота и фоновые задачи, ввели взаимодействие через RabbitMQ и Outbox для уведомлений. Одновременно увеличили число Python-воркеров Granian с одного до четырёх и лимиты CPU/RAM, не добавляя Kubernetes pod.

Открыть полный кейс

Kafka: история действий сотрудников.

Внедрил общий журнал действий на HR-платформе: смены статусов кандидатов, загрузки документов, выгрузки отчётов и утверждения.

Мой вкладРеализовал обработку событий через Kafka, отдельную базу истории и доступ по правам сотрудников.

событийная архитектура / аудит

KafkaTransactional OutboxPostgreSQLDLQ
Kafkaжурнал действий в production
Технические детали

Изменение бизнес-данных и запись в Outbox сохранялись одной транзакцией; для выгрузки отчётов создавалось отдельное audit-событие. Publisher периодически читал Outbox и отправлял события в Kafka с ключом employee_id. Отдельный consumer записывал историю в PostgreSQL, защищаясь от дублей уникальным event_id (UUIDv7) и подтверждая offset после сохранения. Для загрузки паспорта в событии были только идентификатор, ссылка и метаданные, без самого файла. Ошибочные события попадали в отдельный Kafka topic для диагностики, без автоматического повторного запуска.

Открыть полный кейс

2 000 тестов: CI с 20 до 1,5 минуты.

Настроил параллельный запуск pytest-xdist и отдельные таблицы тестовых данных для каждого воркера.

Мой вкладНастроил pytest-xdist и отдельные тестовые таблицы для воркеров.

ci/cd / тестирование

Pythonpytestpytest-xdistPostgreSQL
~13×сокращение времени CI
Технические детали

Для изоляции данных PostgreSQL фикстуры pytest использовали worker_id и создавали отдельные ORM mappings/metadata объектов таблиц для каждого xdist-воркера. У каждого были свои тестовые таблицы, а не отдельная база или схема.

Открыть полный кейс

От Django Views к тестируемым Python Use Cases.

Вынес бизнес-правила из Django Views/ViewSets в независимые от ORM Use Cases, которые можно тестировать без запуска Django и базы данных.

Мой вкладОтделил бизнес-логику от Django и объединил повторявшиеся проверки пользователя и прав.

архитектура / тестируемость

PythonDjangoClean ArchitectureUnit Testing
Use Casesunit-тесты бизнес-логики без Django и БД
Технические детали

Django остался HTTP-слоем, а бизнес-логика перешла в независимые Use Cases. В unit-тестах вместо запуска Django и реальной БД использовались подставные репозитории. Конкретный пример рефакторинга — получение пользователя и проверка прав, которые раньше повторялись примерно в 13 местах.

Открыть полный кейс

Технический стек

Основной стек — Python, FastAPI, PostgreSQL, Kafka и RabbitMQ. Также работал с Keycloak и инструментами CI.

Backend и API

Python, FastAPI, Django, aiohttp, Pydantic, REST, WebSocket

Данные и очереди

PostgreSQL, SQLAlchemy, Redis, Kafka, RabbitMQ, PgBouncer, Outbox pattern

Инфраструктура и CI

Docker, Linux, Nginx, GitLab CI, GitHub Actions, pytest, pytest-xdist

Безопасность и архитектура

Keycloak, OAuth2 / OIDC, RBAC, S3, Clean Architecture, DDD, Unit of Work