Илья Овсенев

Содержание

  1. Кратко
  2. Опыт работы
  3. Стек
  4. Решённые задачи
  5. Собственные проекты
  6. Образование и языки
  7. Как со мной связаться

Илья Овсенев

Backend-разработчик C# / .NET · фронтенд на Vue.js и React

Санкт-Петербург, готов к переезду в Москву. Удалённо, гибрид или офис · полная занятость или проектная работа.

Более 3 лет
в коммерческой разработке на .NET
4182 → 610 МБ
память браузера на тяжёлой странице
40 → 4 с
запрос, на который жаловались клиенты
3 проекта
собственных, от базы до интерфейса

Кратко

Backend-разработчик на C# и .NET. Специализируюсь на сервисах, которые уже работают в проде и упираются в объёмы данных: нахожу узкие места, переписываю запросы и формат выдачи, сокращаю объём ответа и потребление памяти на клиенте.

Сейчас разрабатываю новые сервисы на .NET 8 в крупной системе с многолетней историей и распределённой командой и переношу в них логику из .NET Framework. Довожу фичу от API до интерфейса, когда задача этого требует: Vue.js в рабочем проекте, React с TypeScript — в собственных.

В собственных проектах делаю то, на что в продуктовой работе редко выделяют время: тесты в CI с блокировкой деплоя, наблюдаемость, документацию как часть кода, интеграцию LLM и локальное распознавание речи.

Опыт работы

Июль 2025 — настоящее время

Инженер-программист (backend-разработчик .NET)

Крупная ERP-система с многолетней историей кодовой базы, которой пользуются многие компании-заказчики. Распределённая команда: все разработчики работают удалённо из разных регионов. База данных крупнейшего клиента — десятки гигабайт, кэши службы поиска занимают порядка 20 ГБ оперативной памяти. Требования собираю без аналитика — напрямую с кураторами клиентов.

  • Ускорил две тяжёлые страницы. Страница подбора: облегчённая модель ответа и ссылки $id/$ref — память браузера 4182 → 610 МБ (−85 %), ответ 114,3 → 32,5 МБ. Страница, которая у клиента не загружалась: своя модель ответа (4 МБ → 400 КБ) и обработка фильтров в памяти — поиск 9 с → 2–4 с, фильтры 4–6 с → 10–100 мс (тестовая среда).
  • Переписал запрос списка заказов: фильтры из C# — в SQL, LIKE по тысячам ключей — на JOIN, затем разбил запрос на два с данными из кэшей. На тестовой среде 40 → 4 с; выборка с 2017 года — 5–10 с, раньше даже годовая иногда падала по таймауту. Жалобы клиентов прекратились.
  • Вдвоём с коллегой сократили загрузку службы поиска у крупнейшего клиента примерно с 6 до 3,5–4 ч. Мои части: параллельная загрузка из базы, ограничение параллелизма кэшей, последовательный расчёт фильтров (3:20 → 30–40 с).
  • Исправил фильтр, который считал значения по неполным данным. Вариант выбрал по бенчмарку на базе крупнейшего клиента, 25 тестов MSTest гоняются на билд-сервере. Из фильтра ушли неверные значения (1,4 % от всех) ценой +5,6 % ко времени загрузки кэшей.
  • Спроектировал и написал с нуля сервис централизованных настроек на .NET 8 (Web API, Windows-служба). Горячую перезагрузку перевёл с gRPC-стриминга на SQL Server Change Tracking. По его структуре переделал ещё три core-сервиса; собрал документацию и правила кода core-сервисов и представил команде.
  • Устранил падения после обфускации: перестроил core-сервисы, чтобы связи между проектами стали односторонними, перевёл четыре из них с Ninject на встроенный DI .NET, нашёл причину на стыке EF Core, Expression Trees и SmartAssembly и написал ExpressionVisitor вместо атрибута, отключавшего обфускацию. Команда приняла это как правило.
  • Также: отмена поиска у 17 поставщиков, у части — настраиваемые таймауты и ограничение параллельных запросов; расширенный кэш и устранение гонки у одного из поставщиков; перенос логики в .NET 8, OWIN-авторизация на нескольких нодах, доработки платёжных шлюзов, экраны на Vue.js.

C#, .NET 8, .NET Framework, ASP.NET Core Web API, gRPC, WCF, SOAP, EF Core, EF6, ADO.NET, MS SQL Server, SQL Server Change Tracking, Serilog, Swagger, MSTest, Vue.js, OWIN, ASP.NET MVC 5, WebForms, WinForms

Декабрь 2023 — июнь 2025

Backend-разработчик (.NET) · проектная работа

Внутренняя система строительной компании: сквозной учёт заявок от объектов строительства через производственно-технический отдел до снабжения. Система развивалась от монолита к набору микросервисов.

  • Внедрил кэширование в Redis с нуля — до этого все обращения шли напрямую в базу: начал с самых тяжёлых запросов, кэшировал и ответы, и сами запросы. В итоге кэшировалось большинство запросов; те, что шли несколько секунд, из кэша отвечали за миллисекунды.
  • Вынес аутентификацию из монолита в отдельный сервис на IdentityServer4, перевёл передачу JWT из заголовка в cookie.
  • Участвовал в декомпозиции монолита на .NET 6 на микросервисы; новые сервисы писал на .NET 8.
  • Строил сложные запросы к PostgreSQL на множестве таблиц, создавал представления, работал с индексами.
  • Разрабатывал REST API; основной паттерн работы с запросами — CQRS. Отправка писем через почтовый сервис по RabbitMQ, внутренний чат на SignalR.
  • Писал unit-тесты; в React — новые компоненты и доработка существующих. Сборка и деплой — на локально развёрнутом GitLab CI: пайплайны и конфигурацию Docker и Nginx дорабатывал при изменениях.

C#, .NET 6 и .NET 8, ASP.NET Core, EF Core, Dapper, PostgreSQL, Redis, RabbitMQ, IdentityServer4, SignalR, Docker, GitLab CI, React

Сентябрь 2023 — ноябрь 2023

Младший специалист по разработке ПО · проектная работа

Та же система, начало работы в ней.

  • Разработка REST API внутренних сервисов, интеграция с почтовым сервисом.

C#, ASP.NET Core, EF Core, PostgreSQL

Стек

Языки
  • C#
  • JavaScript
  • TypeScript
  • SQL
Backend
  • ASP.NET Core
  • Web API
  • REST
  • gRPC
  • WCF
  • SOAP
  • SignalR
  • EF Core
  • EF6
  • Dapper
  • ADO.NET
  • LINQ
  • Expression Trees
  • async/await
  • многопоточность
Базы данных
  • PostgreSQL
  • MS SQL Server (T-SQL)
  • оптимизация запросов
  • индексы
  • SQL Server Change Tracking
  • большие объёмы
Кэш и очереди
  • Redis
  • RabbitMQ
Наблюдаемость
  • OpenTelemetry
  • Serilog
  • Prometheus
  • Grafana
  • Loki
Инфраструктура
  • Git
  • Docker
  • Docker Compose
  • Nginx
  • Linux
  • GitHub Actions
  • GitLab CI
  • Gitea Actions
Архитектура
  • микросервисы
  • модульный монолит
  • SOLID
  • Clean Architecture
  • CQRS
  • Repository
  • DI
Тестирование
  • xUnit
  • MSTest
  • Moq
  • coverlet
  • Testcontainers
LLM и ML
  • Microsoft.Extensions.AI (tool calling)
  • ONNX Runtime
Frontend
  • React
  • Next.js
  • Vue.js
  • TypeScript
  • Vite
  • Mantine
  • TanStack Query
Прочее
  • Swagger / OpenAPI
  • health checks
  • JWT
  • OAuth 2.0
  • ASP.NET MVC 5
  • WebForms
  • WinForms
  • Rust (вне работы)

Решённые задачи

4182 → 610 МБ
память браузера на тяжёлом запросе, −85 %

Тяжёлая страница — почти в 7 раз легче

Крупная ERP-система; страница подбора с большой выдачей и фильтрами.

Облегчённая модель ответа и ссылки $id/$ref вместо повторяющихся копий вложенных объектов: ответ сервера 114,3 → 32,5 МБ, память браузера 4182 → 610 МБ.

9 → 2–4 с
поиск; фильтры 4–6 с → 10–100 мс

Страница, которая не загружалась

Та же система; страница, которая у клиента не открывалась вовсе.

Своя модель ответа — 4 МБ → 400 КБ — и обработка фильтров в памяти. Замеры на тестовой среде.

40 → 4 с
запрос списка заказов, тестовая среда

Запрос, на который жаловались клиенты

Та же система; список с фильтрами за произвольный период.

Фильтры из C# перенёс в SQL, LIKE по тысячам ключей заменил на JOIN, затем разбил запрос на два с данными из кэшей. Выборка с 2017 года — 5–10 с, раньше даже годовая иногда падала по таймауту. Жалобы клиентов прекратились.

≈6 → 3,5–4 ч
у крупнейшего клиента, вдвоём с коллегой

Загрузка службы поиска — почти вдвое быстрее

Та же система; служба поиска, кэши которой занимают порядка 20 ГБ памяти.

Мои части: параллельная загрузка из базы, ограничение параллелизма кэшей и последовательный расчёт фильтров — он один ускорился с 3:20 до 30–40 секунд.

Правило команды
решение на стыке EF Core и SmartAssembly

Падения после обфускации

Та же система; core-сервисы падали после обфускации сборок.

Перестроил core-сервисы, чтобы связи между проектами стали односторонними, и перевёл четыре из них с Ninject на встроенный DI .NET. Затем нашёл причину в Expression Trees и написал ExpressionVisitor вместо атрибута, который отключал обфускацию. Команда приняла это как правило.

секунды → мс
тяжёлые запросы из кэша Redis

Кэш там, где его не было

Внутренняя система строительной компании; все обращения шли напрямую в базу.

Внедрил Redis с нуля: начал с самых тяжёлых запросов, кэшировал и ответы, и сами запросы. В итоге кэшировалось большинство запросов; те, что шли несколько секунд, из кэша отвечали за миллисекунды.

Собственные проекты

Расшифровка звонков без облака

Сервис для связки телефонии и CRM, в разработке: распознаёт русскую речь локально на CPU — записи разговоров не уходят наружу.

GigaAM на ONNX Runtime, детектор речи, свой расчёт лог-мел спектрограммы. Очередь задач на SQLite с арендой и повторами; тезисы разговора локальной LLM — в разработке. Модульный монолит, порты и адаптеры, 212 тестов.

.NET 10, ONNX Runtime, SQLite.

Платформа заявок с ролевым доступом

Helpdesk-система для B2B: заявки, задачи, комментарии, вложения, история изменений.

Права хранятся в базе и динамически резолвятся в JWT: роль — настраиваемый набор прав, а не константа в коде. JWT на RSA, refresh-токены в httpOnly cookie, защита от CSRF, публикация JWKS; аудит изменений — перехватчиком сохранения EF Core. ИИ-ассистент в разработке: agent loop и tool calling с проверкой прав пользователя на каждый инструмент. Типы клиента генерируются из OpenAPI, наблюдаемость сквозная, включая браузер; 740 тестов в CI блокируют сборку и деплой.

.NET 10, EF Core 10, PostgreSQL, Microsoft.Extensions.AI, OpenTelemetry, Loki, Prometheus, Grafana, Docker Compose, Gitea Actions. Фронтенд — React 18, TypeScript, Vite, Mantine, TanStack Query.

Платформа рыночных данных

Сбор рыночных данных онлайн-игры из внешнего API и статической базы: дерево рынка, поиск, карточка предмета с ордерами.

Перевёл с микросервисов на модульный монолит за 9 этапов, границы модулей держат 8 архитектурных тестов. Фоновый сбор биржевого стакана пишет в базу одной транзакцией только изменения — новые через COPY, изменившиеся через UPDATE … FROM: первый полный сбор — 405 029 ордеров за 74,9 с. Клиент внешнего API соблюдает его лимиты. 727 тестов, включая Testcontainers; предупреждения приравнены к ошибкам, транзитивные версии пакетов прижаты по конкретным CVE.

.NET 10, gRPC, EF Core 10, PostgreSQL, Polly, OpenTelemetry, Serilog, Loki, xUnit, Moq, Testcontainers, GitHub Actions. Фронтенд — Next.js 16, React 19, TypeScript.

Плагины для Claude Code

Конвейер разработки из пяти ролей — анализ, архитектура, реализация, ревью, отчёт.

Состояние передаётся только через файлы репозитория, машиной состояний: артефакт этапа принимает человек, возвраты на доработку идут автоматически с ограничением числа кругов. Плагин ревью .NET-кода — производительность и аллокации, лишние проходы, повторы, проектирование; прогоняю его по diff своих изменений в рабочем проекте.

Образование и языки

Санкт-Петербургский государственный лесотехнический университет, 2016 — «Промышленное и гражданское строительство», высшее.

Русский — родной. Английский — A2, читаю техническую документацию.

Как со мной связаться

Пишите в Telegram — отвечаю быстрее всего. Если удобнее почта, адрес рядом.

Полный послужной список с названиями компаний — в резюме на hh.ru.