В городских ИТ-системах редко встречаются задачи, когда нужно «переписать все с нуля в сжатые сроки». Чаще необходимо параллельно развивать функциональность, держать совместимость с различными модулями, ускорять узкие места и подтягивать качество кода до уровня, на котором проект можно спокойно масштабировать и сопровождать.
К аутстаффинговой компании iStaff-it обратились сотрудники городского Департамента информационных технологий, чтобы мы подключили к их задачам специалиста C#/.NET. Наш эксперт аккуратно встроился в Scrum-процесс, взяв на себя развитие модулей, рефакторинг и инженерную инфраструктуру.
Контекст и задачи проекта
Проект развивался итеративно: параллельно шли доработки бизнес-логики и «оздоровление» существующей кодовой базы. Важное требование — внедрить .NET 8 во всех модулях, не сломав контракты и сценарии взаимодействия между сервисами, и при этом улучшить предсказуемость производительности.
Фокус был на практичных вещах: договориться об архитектурных правилах, разделить зоны ответственности по слоям, сократить технический долг и собрать конвейер, в котором качество проверяется автоматически — до деплоя.
Что было закрыто по работам:
- разработка новых модулей и рефакторинг существующих;
- внедрение .NET 8 во всех модулях и выравнивание зависимостей;
- оптимизация производительности через ADO.NET и Dapper;
- архитектура на Clean Architecture + Repository/UnitOfWork;
- GitLab CI/CD — автотесты, сборка, деплой;
- SonarQube — качество, code smells, уязвимости, coverage-гейты;
- внутренние библиотеки для Kafka и ClickHouse;
- SOAP-сервисы для взаимодействия с банковскими системами;
- архитектурный надзор и планирование Scrum-активностей.
После фиксации задач команда работала итерациями: часть работ шла в feature-ветках, часть — отдельными техническими эпиками (миграция на .NET 8, перформанс, инфраструктура качества).
Архитектура и стек
Чтобы изменения не «расползались» по проекту, архитектуру выстраивали вокруг принципов Clean Architecture: изолировали доменную модель, доступ к данным вынесли за интерфейсы, интеграции оформили через адаптеры. Это упростило рефакторинг и позволило подключать модули без правок в ядре.
Отдельно договорились о правилах зависимостей и границах модулей: где допускаются shared-компоненты, какие пакеты считаем «core», а какие — инфраструктурой, и что проверяется линтерами или анализаторами на CI.
Ключевые технологии:
- C# / .NET 8;
- Clean Architecture;
- Repository / UnitOfWork;
- ADO.NET, Dapper;
- Kafka, ClickHouse;
- SOAP (XML-контракты, обработка ошибок);
- GitLab CI/CD;
- SonarQube.
Каркас, построенный с помощью аутстафф-разработки, помог совместить две реальности. Заказчику нужно было развивать функциональность, а инженерной команде — держать систему управляемой и тестируемой.
.NET 8 — внедрение и рефакторинг модулей
Переход на .NET 8 — это не только смена Target Framework. Важно выровнять зависимости, убедиться, что библиотеки совместимы, и не получить сюрпризы в рантайме на стыках модулей. Поэтому миграцию делали поэтапно — от инвентаризации проектов и NuGet-пакетов до регресса ключевых сценариев.
Параллельно с апгрейдом шел рефакторинг. Наш специалист упрощал сложные участки, резал сервисы, выносил повторяющиеся куски в доменные сервисы и приводил исключения к единому формату.
Как организовали миграцию:
- аудит модулей: версии пакетов, совместимость, критичные зависимости;
- обновление csproj и базовых библиотек, фиксация различных правил сборки;
- правки по возникающим предупреждениям компилятора и анализаторам;
- прогон автоматизированных тестов + выборочный регресс критичных сценариев;
- поэтапный выпуск, чтобы не копить «большой взрыв» в одном релизе.
В результате переход на .NET 8 превратился в контролируемый процесс: с понятными чек-листами и предсказуемым влиянием на соседние модули.
Производительность — ADO.NET и Dapper
Часть сервисов упиралась в скорость работы с данными и накладные расходы. Для таких участков применили более «прямой» доступ к БД: ADO.NET и Dapper. Цель была прагматичной: сократить аллокации, уменьшить время маппинга и сделать поведение запросов более прозрачным.
Параллельно приводили к порядку транзакционность и работу с соединениями: где нужен explicit transaction, где достаточно read-only, как управлять таймаутами, чтобы не провоцировать лавину повторов при деградациях.
Что наш эксперт оптимизировал точечно:
Что наш эксперт оптимизировал точечно:
- горячие запросы и сценарии с высокой частотой чтения;
- батч-операции и массовые вставки/обновления;
- маппинг DTO без лишних преобразований;
- контроль таймаутов и явное управление транзакциями;
- повторное использование соединений там, где это безопасно.
Такой подход принес множество «быстрых побед» без переписывания всей системы. Под ускорение попал только тот список IT-услуг, где это действительно влияло на нагрузку и время ответа.
Интеграции — Kafka, ClickHouse и SOAP
Для событийного обмена и потоковой обработки понадобились внутренние библиотеки под Kafka. С единым способом публикации и чтения сообщений, а также стандартизацией заголовков, ключей, сериализации и обработки ошибок. Это снизило количество реализаций и упростило сопровождение интеграций между командами.
Под ClickHouse закрывали задачи аналитического чтения и выборок. Важно было не просто «подключиться», а договориться о подходах к запросам, формированию батчей и обработке больших объемов, чтобы не ловить деградации на пике.
Интеграционный контур включал:
- библиотеку-обертку над Kafka (публикация/консьюмеры, ретраи, логирование);
- унифицированные утилиты для ClickHouse (подключение, параметры, базовые паттерны запросов);
- SOAP-сервисы для банковских интеграций: контракты, валидация, обработка fault-ответов и журналирование.
За счет унификации библиотек команда ускорила разработку новых интеграций и снизила риск «разъезда» по форматам и правилам обработки.
CI/CD и качество кода — GitLab + SonarQube
Чтобы изменения не зависели от ручных проверок, наш эксперт собрал конвейер в GitLab CI/CD: сборка, тесты, статический анализ, затем деплой. На этом же уровне были зафиксированы минимальные критерии качества — чтобы не тянуть технический долг дальше.
SonarQube использовался как системный фильтр — code smells, потенциальные уязвимости, дубли, базовые метрики поддерживаемости, а также quality gate под merge request. Под автоматизацию попали:
- сборка и прогон unit-тестов на MR;
- статический анализ (SonarQube) и блокирующие гейты;
- единый шаблон пайплайна под модули;
- деплой по согласованным правилам (окружения, теги, артефакты).
В итоге качество стало измеримым: меньше спорных ситуаций «можно ли мержить», больше прозрачности по рискам до выкладки.
Объем работ и результаты
Совокупный объем работ — 553 часа. За это время эксперт нашей компании закрыл развитие и рефакторинг модулей, выровнял проект под .NET 8, ускорил критичные сценарии через ADO.NET и Dapper, а также собрал инфраструктуру качества на GitLab CI/CD + SonarQube.
Отдельным итогом стали внутренние библиотеки для Kafka и ClickHouse и оформленные интеграции по SOAP (с предсказуемыми контрактами и единым подходом к ошибкам). Проект получил понятные правила архитектуры и процесс, который не зависит от героизма.
Нужны эксперты C#/.NET под развитие сложного продукта, интеграции и CI/CD? iStaff-it подберет разработчиков под ваш стек и подключит в формате IT-outstaffing. С аккуратным входом в процессы и понятным результатом на каждом этапе.