Инженер-программист (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