Бэкенд-разработчик C# (Профессиональный уровень)

Курс предназначен для углублённого изучения разработки серверной логики, работы с базами данных, REST API, асинхронного программирования и оптимизации производительности. Вы освоите продвинутые паттерны проектирования, работу с .NET Core, Entity Framework, микросервисную архитектуру и деплой приложений. Курс ориентирован на опытных разработчиков, желающих выйти на новый уровень профессионализма и участвовать в масштабных enterprise-проектах.

Описание программы:

Учебная программа курса «Бэкенд-разработчик C# (Профессиональный уровень)» охватывает углублённое изучение серверной разработки на платформе .NET. В рамках курса слушатели погрузятся в работу с .NET Core, Entity Framework Core, REST API, асинхронное и параллельное программирование, кэширование, сериализацию, работу с сокетами и gRPC. Будут рассмотрены продвинутые паттерны проектирования (CQRS, Mediator, Specification и др.), принципы чистой архитектуры, микросервисная архитектура, работа с Docker, CI/CD, безопасность API, JWT-авторизация, тестирование (xUnit, Moq), логгирование, мониторинг и оптимизация производительности.

 

Ожидаемые результаты после прохождения курса:
Слушатель должен уметь:

— Разрабатывать высокопроизводительные и масштабируемые бэкенд-приложения на C#
— Применять современные практики проектирования и архитектурные паттерны
— Взаимодействовать с реляционными и NoSQL базами данных через ORM и напрямую
— Создавать и документировать RESTful и gRPC API
— Оптимизировать производительность приложений и обрабатывать ошибки на уровне сервера
— Проводить unit- и интеграционное тестирование, использовать DI, логгирование и мониторинг
— Деплоить приложения с использованием Docker, настраивать CI/CD

 

Слушатель должен знать:

 — Углублённо язык C# (включая latest версии — C# 10+)
— Принципы построения enterprise-приложений
— Механизмы авторизации и безопасности веб-сервисов
— Основы работы с RabbitMQ, Kafka или другими системами очередей сообщений
— Подходы к версионированию API, управлению зависимостями и жизненным циклом сервисов
— Инструменты и подходы для отладки и профилирования приложений

 

Дополнительно:
Курс завершается реальным проектом, реализуемым по методологии Agile, с применением всех пройденных технологий и подходов.

  1. Что входит в программу курса «Бэкенд-разработчик C# (Профессиональный уровень)»?
    Программа охватывает углублённое изучение .NET Core, Entity Framework Core, REST API и gRPC, асинхронного программирования, микросервисной архитектуры, паттернов проектирования, CI/CD, Docker, тестирования, логгирования, мониторинга и оптимизации производительности.

  2. Какие технологии используются в рамках курса?
    Основные технологии: C# 10+, .NET Core, ASP.NET Core, Entity Framework Core, SQL / NoSQL БД, Docker, Swagger/OpenAPI, JWT, xUnit/Moq, Serilog, RabbitMQ/Kafka, Git, Azure DevOps/GitHub Actions.

  3. Какой уровень подготовки требуется для участия в курсе?
    Курс рассчитан на опытных разработчиков с базовым знанием C#, основ ООП, работы с базами данных и пониманием HTTP-протокола. Знакомство с ASP.NET и REST API желательно.

  4. Какие навыки приобретёт слушатель к концу курса?
    Слушатель научится создавать масштабируемые серверные приложения, применять современные архитектурные подходы, работать с ORM, реализовывать безопасность, тестировать код, упаковывать сервисы в контейнеры и деплоить их в production.

  5. В чём отличие профессионального уровня от начального?
    Профессиональный уровень включает продвинутые темы: архитектурные паттерны, микросервисы, CI/CD, работа с очередями сообщений, глубокая оптимизация, инфраструктурная автоматизация и enterprise-подходы к проектированию.

  6. Какие паттерны проектирования рассматриваются на курсе?
    Рассматриваются паттерны проектирования, такие как Repository, Unit of Work, Mediator, CQRS, Specification, Strategy, Decorator, Observer, Singleton и другие, применимые в бэкенд-разработке.

  7. Как изучается REST API?
    Изучаются принципы построения RESTful API, маршрутизация, версионирование, сериализация, обработка ошибок, документирование через Swagger/OpenAPI, безопасность, тестирование и оптимизация.

  8. Какие темы по безопасности рассматриваются?
    Темы включают JWT-авторизацию, OAuth2, защиту от CSRF/XSS, использование политик авторизации, шифрование данных, работу с HTTPS, управление секретами и безопасную передачу данных.

  9. Как изучается Entity Framework Core?
    EF Core рассматривается в контексте продвинутого использования: работа с миграциями, raw SQL, тенантность, фильтрация на уровне запросов, performance tuning, работа без миграций, code-first и database-first подходы.

  10. Как изучается асинхронное программирование?
    Асинхронность изучается через async/await, TPL, PLINQ, cancellation tokens, работа с I/O-bound и CPU-bound задачами, обработка исключений в параллельных операциях, deadlock-сценарии.

  11. Какие виды тестирования осваиваются?
    Осваиваются unit-тестирование с xUnit и Moq, интеграционное тестирование, тестирование API, тестирование бизнес-логики, Mock vs Stub, тестирование в DI-контейнере.

  12. Как изучается работа с Docker?
    Обсуждается создание Dockerfile, работа с multi-stage сборкой, контейнеризация приложений .NET, запуск контейнеров, orchestration через Docker Compose, деплой на Linux- и Windows-платформах.

  13. Какие практики CI/CD рассматриваются?
    Рассматриваются pipeline-ы в GitHub Actions, Azure DevOps, Jenkins, автоматическая сборка, тестирование, публикация образов, деплой на staging/prod, управление окружениями.

  14. Как изучается микросервисная архитектура?
    Изучаются принципы микросервисов: декомпозиция, коммуникация через HTTP/gRPC/Message Broker, управление состоянием, согласованность данных, service discovery, circuit breaker, resilience patterns.

  15. Какие инструменты логгирования и мониторинга используются?
    Используются Serilog, ELK Stack, Application Insights, Seq, OpenTelemetry, метрики, трейсы, логирование в файлы и централизованные системы, анализ производительности.

  16. Как изучается работа с системами очередей сообщений?
    Рассматриваются RabbitMQ, Kafka, MassTransit/CAP, publish-subscribe модели, message durability, retry механизмы, dead-letter queues, distributed transactions.

  17. Как изучается работа с базами данных?
    Изучаются реляционные (PostgreSQL, MSSQL) и NoSQL (MongoDB, Redis), работа через ORM и напрямую, query optimization, indexing, transaction management, data migrations.

  18. Как проводится оптимизация производительности?
    Рассматриваются методы profiling, memory leak detection, caching (in-memory, Redis), query tuning, connection pooling, parallelism, precompilation, lazy loading.

  19. Какие аспекты работы с API изучаются?
    Изучаются стандарты REST, swagger-документирование, версионирование, обработка ошибок, rate limiting, pagination, HATEOAS, content negotiation, фильтрация и сортировка.

  20. Как используется Dependency Injection в проектах?
    DI изучается через Microsoft.Extensions.DependencyInjection, жизненные циклы сервисов (Transient/Scoped/Singleton), регистрация зависимостей, внедрение через конструктор/property, тестирование с DI.

  21. Как проводится обучение работе с gRPC?
    gRPC изучается через протобуферы, сервисы, клиентские и серверные стабы, streaming, взаимодействие с REST, сравнение с SOAP и REST, интеграция в микросервисы.

  22. Какие типы проектов реализуются на курсе?
    Слушатели реализуют enterprise-level backend-приложения, включая микросервисы, API Gateway, background workers, ETL-процессы, интеграции с внешними системами и полноценный реальный проект.

  23. Как организовано обучение в ходе курса?
    Обучение сочетает лекции, практические задания, домашние проекты, code review, pair programming, agile-командная работа над итоговым проектом.

  24. Какова длительность курса?
    Курс рассчитан на 4–6 месяцев обучения с еженедельными занятиями, домашними заданиями и проектной работой.

  25. Как завершается курс?
    Курс завершается итоговым проектом — разработкой полного backend-решения по методологии Agile с использованием всех пройденных технологий и подходов, с презентацией и code review.

  1. Какие принципы чистой архитектуры рассматриваются на курсе?
    На курсе изучаются принципы SOLID, DRY, KISS, YAGNI, а также подходы к построению слоистой архитектуры, использование Domain-Driven Design и разделение ответственности между слоями приложения.

  2. Как осваивается работа с API Gateway в микросервисной архитектуре?
    Рассматриваются реализации API Gateway с использованием Ocelot и YARP, маршрутизация запросов, аутентификация, rate limiting, кэширование, балансировка нагрузки и логгирование трафика.

  3. Какие инструменты используются для profiling и диагностики производительности?
    Для диагностики применяются Visual Studio Diagnostic Tools, dotTrace, dotMemory, PerfView, MiniProfiler, а также встроенные средства ASP.NET Core для анализа медленных запросов и утечек памяти.

  4. Как обучают работе с Redis?
    Обучение включает использование Redis как кэша, реализацию distributed cache, работу с Redis Streams и Pub/Sub, сериализацию данных, управление временем жизни ключей и интеграцию с .NET через StackExchange.Redis.

  5. Какие практики обработки ошибок и исключений рассматриваются?
    Изучаются global exception handling, middleware для централизованного перехвата ошибок, создание собственных exception filters, логгирование ошибок, пользовательские response модели и работа с HTTP статусами.

  6. Как реализуется версионирование API?
    Версионирование API изучается через URL, query string, заголовки и media types, а также с использованием библиотек вроде Microsoft.AspNetCore.Mvc.Versioning, с оценкой плюсов и минусов каждого подхода.

  7. Как проводится обучение работе с SignalR?
    SignalR изучается на примере реализации real-time коммуникации, работы с HubContext, клиентскими методами, групповой рассылкой сообщений и интеграцией с backend-логикой.

  8. Какие практики документирования API рассматриваются?
    Документирование осуществляется через Swagger/OpenAPI с использованием Swashbuckle и NSwag, включая аннотации моделей, описание операций, фильтрацию, security схемы и генерацию клиентских SDK.

  9. Как обучают работе с файлами и медиа в бэкенд-приложениях?
    Тема включает загрузку, хранение, стриминг и обработку файлов, использование Azure Blob Storage и локального хранилища, ограничения размера, безопасность загрузок и MIME-типы.

  10. Как изучается работа с background задачами?
    Рассматриваются IHostedService, BackgroundService, Hangfire, Quartz.NET, очередь задач через hosted services, работа с cancellation tokens и запуск периодических задач в ASP.NET Core.

  11. Какие темы по управлению конфигурацией рассматриваются?
    Обсуждается использование IConfiguration, JSON-файлы, User Secrets, Environment Variables, Azure App Configuration, работа с секретами в CI/CD, шифрование и безопасное хранение.

  12. Как изучается работа с мульти-тенантностью?
    Мульти-тенантность изучается через разные стратегии: отдельная БД, одинаковая БД с разделением по tenant ID, динамическое подключение к БД, routing и isolation на уровне бизнес-логики.

  13. Как обучают работе с GraphQL (если входит в программу)?
    GraphQL изучается через Hot Chocolate или Strawberry Shake — создание schema, resolver-ы, работа с DataLoader, фильтрация, пагинация, авторизация и интеграция в существующую систему.

  14. Какие практики использования MediatR и CQRS рассматриваются?
    MediatR используется для реализации паттернов Mediator и CQRS, включая IRequestHandler, INotificationHandler, декораторы, validation pipeline и разделение read/write моделей.

  15. Как изучается работа с Identity и авторизационными сервисами?
    Рассматривается ASP.NET Core Identity, кастомизация пользовательской модели, двухфакторная аутентификация, восстановление пароля, внешние провайдеры (OAuth), JWT Bearer и OAuth2 flows.

  16. Как обучают работе с политиками авторизации?
    Политики создаются через AuthorizationPolicyBuilder, Policy-based authorization, требования (IAuthorizationRequirement) и обработчики, а также использование ролей и claims.

  17. Как изучается работа с OpenAPI и его расширениями?
    OpenAPI изучается через Swashbuckle и NSwag, включая кастомные аннотации, фильтры операций, генерацию клиентского кода, документирование ошибок и поддержку нескольких версий API.

  18. Какие практики управления зависимостями рассматриваются?
    Обсуждаются жизненные циклы сервисов, scoped vs singleton, factory methods, внедрение через конструктор/метод/свойство, тестирование с Mock-объектами и работа с third-party контейнерами.

  19. Как изучается работа с файловыми системами и потоками?
    Работа с потоками (Stream), бинарный и текстовый ввод-вывод, чтение/запись файлов, MemoryStream, BufferedStream, FileProvider API, работа с IFileProvider и абстракциями в .NET.

  20. Как обучают работе с плагинами и динамической загрузкой сборок?
    Изучаются Assembly.Load, Reflection, AppDomain, независимая загрузка dll, выполнение кода на лету, проверка подписей, изоляция и безопасность при динамической загрузке.

  21. Как изучается работа с событийным программированием?
    События изучаются через event handlers, async events, observer pattern, использование IEventAggregator, Mediator-based события и интеграция в бизнес-процессы.

  22. Какие практики работы с миграциями баз данных рассматриваются?
    EF Core Migrations, автоматические и ручные миграции, seed data, миграции в production, управление версиями БД, работа без миграций, сравнение с Flyway/Liquibase.

  23. Как обучают работе с health checks и monitoring?
    Health Checks изучаются через IHealthCheck, кастомные проверки, UI-интерфейсы (например, AspNetCore.Diagnostics.HealthChecks), интеграция с Application Insights и alerting.

  24. Как изучается работа с localization и internationalization?
    Локализация через IStringLocalizer, ресурсные файлы, культура пользователя, fallback культуры, route-based и query-based определение языка, локализация данных и UI.

  25. Как завершается обучение каждым модулем?
    Каждый модуль завершается практическим заданием, code review, unit-тестами и презентацией решения, где слушатель демонстрирует понимание материала и применение на практике.

  1. Какие практики построения domain-моделей рассматриваются на курсе?
    Изучаются принципы Domain-Driven Design, проектирование rich domain моделей, использование value objects, entities, aggregates, repositories и domain events для построения сложной бизнес-логики.

  2. Как обучают работе с event sourcing и CQRS в enterprise-приложениях?
    Рассматривается разделение read и write моделей через CQRS, хранение состояния системы как последовательности событий (event store), восстановление состояния, обработка конфликтов и репликация данных.

  3. Как изучается работа с CAP и распределёнными транзакциями?
    Обсуждается интеграция CAP для реализации distributed event bus, обработка сообщений, автоматическая retry-политика, поддержка idempotency, а также управление транзакциями между БД и шиной сообщений.

  4. Какие практики построения API Gateway с балансировкой нагрузки рассматриваются?
    Рассматриваются реализации с использованием Ocelot, YARP и Kubernetes Ingress, включая round-robin, least connections и другие алгоритмы балансировки, health checks и failover.

  5. Как обучают работе с OpenTelemetry и распределённым трейсингом?
    OpenTelemetry используется для сбора метрик и трейсов, интеграции с Jaeger/Zipkin, контекст распространения (propagation), связь span’ов и логирование запросов между микросервисами.

  6. Как изучается работа с feature toggles и dynamic configuration?
    Рассматриваются библиотеки вроде Unleash, Microsoft.FeatureManagement и LaunchDarkly, динамическое включение/выключение функционала, A/B тестирование и безопасное развертывание новых фич.

  7. Как обучают работе с background задачами в распределённой среде?
    Изучаются подходы к запуску background задач в кластере: использование Quartz.NET с shared storage, MassTransit Sagas, RabbitMQ delayed exchanges и планирование задач через message brokers.

  8. Как изучается работа с async validation и business rules pipeline?
    Рассматривается построение пайплайнов валидации через MediatR pipelines, FluentValidation, async проверки, кастомные исключения и интеграция в бизнес-процессы.

  9. Какие практики работы с multi-threading и thread pool используются?
    Обсуждаются Thread, ThreadPool, TaskScheduler, Parallel.For/ForEach, PLINQ, работа с cancellation tokens, deadlock и race condition prevention, потокобезопасность.

  10. Как обучают работе с raw SQL и Dapper в ASP.NET Core?
    Изучаются сценарии использования Dapper вместо EF Core, работа с ADO.NET, mapping результатов, параметризованные запросы, stored procedures и performance gain при high-load операциях.

  11. Как изучается работа с cross-cutting concerns и их внедрение через middleware и filters?
    Рассматриваются logging, caching, error handling, authentication, rate limiting и прочие cross-cutting concern'ы, реализуемые через middleware pipeline, action filters и DI.

  12. Как обучают работе с circuit breaker и resilience patterns?
    Рассматриваются реализации через Polly — retry, fallback, timeout, circuit breaker, bulkhead isolation, а также интеграция в HTTP клиенты и микросервисы.

  13. Как изучается работа с gRPC streaming и bidirectional communication?
    gRPC streaming изучается через server-side, client-side и bidirectional streaming, передача потоков данных, работа с IAsyncEnumerable, интеграция в real-time приложения.

  14. Как обучают работе с message brokers в условиях высокой нагрузки?
    Рассматриваются стратегии partitioning, batching, compression, dead-letter queues, message deduplication, offset management и parallel consumption в RabbitMQ/Kafka/MassTransit.

  15. Как изучается работа с tenant-aware кэшированием и базами данных?
    Обсуждается кэширование с учётом tenant ID, scoped connection strings, tenant-aware Redis keys, row-level security в PostgreSQL и dynamic filtering в EF Core.

  16. Как обучают работе с code generation и source generators в C#?
    Рассматриваются Roslyn source generators, partial methods, compile-time code generation, снижение runtime overhead и примеры применения в DTO mapping, routing и DI регистрациях.

  17. Как изучается работа с native AOT в .NET 7+?
    Обсуждается компиляция .NET приложений в native код, преимущества и ограничения AOT, работа с trimming, reflection emit и precompilation в ASP.NET Core.

  18. Как обучают работе с telemetry и метриками в production?
    Изучаются Application Insights, Prometheus + Grafana, Serilog с Seq, метрики по latency, throughput, error rate, request count и custom business metrics.

  19. Как изучается работа с audit log и историей изменений?
    Рассматриваются подходы к логированию изменений: temporal tables в MSSQL, shadow properties в EF Core, manual tracking и интеграция с event store для full audit trail.

  20. Как обучают работе с data masking и GDPR в enterprise-системах?
    Обсуждаются стратегии маскирования персональных данных, шифрование полей в БД, PII logging control, обезличивание данных в dev/staging и автоматическое redaction.

  21. Как изучается работа с low-level network programming в .NET?
    TCP/UDP сокеты, работа с Socket, TcpListener/TcpClient, протоколы сериализации (protobuf, MessagePack), реализация собственных серверов и клиентов поверх TCP/IP.

  22. Как обучают работе с WCF migration и legacy interoperability?
    Рассматривается миграция с WCF на gRPC и REST, использование SOAP clients в .NET Core, работа с svcutil, ws-* стандарты и современные альтернативы.

  23. Как изучается работа с CI/CD в многосервисной архитектуре?
    Обсуждаются общие build-стратегии, shared libraries, versioning across services, deployment strategies (canary, blue-green), service mesh и observability в pipeline.

  24. Как обучают работе с custom middleware pipeline в ASP.NET Core?
    Строится понимание IApplicationBuilder, order of execution, branching pipeline, Use/Run/Map методы, создание кастомного middleware с DI, exception handling и short-circuiting.

  25. Как завершается каждый модуль и курс в целом?
    Каждый модуль завершается практическим заданием с code review, unit-тестами и демонстрацией решения. Курс завершается реальным проектом, реализуемым в команде по Agile, с презентацией и защитой кода.

  1. Какой паттерн проектирования используется для разделения логики обработки команд и запросов?
    A) Repository
    B) CQRS
    C) Strategy
    D) Observer
    Правильный ответ: B) CQRS

  2. Какой метод в ASP.NET Core позволяет добавить сервис с областью видимости, ограниченной одним HTTP-запросом?
    A) AddSingleton
    B) AddScoped
    C) AddTransient
    D) AddInstance
    Правильный ответ: B) AddScoped

  3. Какой инструмент используется для построения Docker-образов?
    A) Dockerfile
    B) Dockerhub
    C) Docker Compose
    D) Kubernetes
    Правильный ответ: A) Dockerfile

  4. Какой интерфейс в .NET используется для реализации пользовательской локализации строк?
    A) IStringLocalizer
    B) ILocalizationService
    C) IResourceProvider
    D) ITextManager
    Правильный ответ: A) IStringLocalizer

  5. Какой тип сериализации лучше всего подходит для работы с gRPC?
    A) JSON
    B) XML
    C) Protobuf
    D) BinaryFormatter
    Правильный ответ: C) Protobuf

  6. Какой компонент в микросервисной архитектуре отвечает за маршрутизацию запросов между сервисами?
    A) Service Mesh
    B) API Gateway
    C) Load Balancer
    D) Message Broker
    Правильный ответ: B) API Gateway

  7. Какое утверждение верно относительно async/await в C#?
    A) await можно использовать только в методах, помеченных async
    B) await не влияет на производительность
    C) async методы всегда выполняются в отдельном потоке
    D) await можно использовать в синхронном коде
    Правильный ответ: A) await можно использовать только в методах, помеченных async

  8. Какой механизм в Entity Framework Core используется для управления миграциями баз данных?
    A) Migrate()
    B) Seed()
    C) Update-Database
    D) Scaffold-DbContext
    Правильный ответ: C) Update-Database

  9. Какая библиотека чаще всего используется для тестирования бизнес-логики в .NET?
    A) NUnit
    B) xUnit
    C) MSTest
    D) Moq
    Правильный ответ: B) xUnit

  10. Какой HTTP-метод обычно используется для создания нового ресурса в REST API?
    A) GET
    B) PUT
    C) POST
    D) DELETE
    Правильный ответ: C) POST

  11. Какой тип кэширования применяется при использовании Redis в распределённой системе?
    A) In-memory caching
    B) Local caching
    C) Distributed caching
    D) Session caching
    Правильный ответ: C) Distributed caching

  12. Какой из перечисленных принципов означает «Открыто для расширения, закрыто для модификации»?
    A) Liskov Substitution Principle
    B) Open-Closed Principle
    C) Dependency Inversion Principle
    D) Single Responsibility Principle
    Правильный ответ: B) Open-Closed Principle

  13. Какой компонент в ASP.NET Core отвечает за обработку исключений на уровне middleware?
    A) UseExceptionHandler
    B) UseRouting
    C) UseAuthentication
    D) UseAuthorization
    Правильный ответ: A) UseExceptionHandler

  14. Какой токен используется для передачи информации о правах доступа в REST API?
    A) OAuth Token
    B) JWT
    C) API Key
    D) Session ID
    Правильный ответ: B) JWT

  15. Какой подход позволяет выполнять сборку и развертывание проекта автоматически после каждого коммита?
    A) DevOps
    B) CI/CD
    C) Agile
    D) Waterfall
    Правильный ответ: B) CI/CD

  16. Какой метод в MediatR используется для отправки одного запроса и получения одного ответа?
    A) Send
    B) Publish
    C) Notify
    D) Raise
    Правильный ответ: A) Send

  17. Какой из перечисленных типов тестирования проверяет взаимодействие между несколькими компонентами системы?
    A) Unit-тестирование
    B) Интеграционное тестирование
    C) Системное тестирование
    D) Приемочное тестирование
    Правильный ответ: B) Интеграционное тестирование

  18. Какой тип сообщения в RabbitMQ гарантирует доставку и порядок сообщений?
    A) Direct exchange
    B) Fanout exchange
    C) Delayed exchange
    D) Reliable queue
    Правильный ответ: D) Reliable queue

  19. Какой класс в .NET используется для выполнения фоновых задач, зависящих от жизненного цикла приложения?
    A) BackgroundService
    B) Task.Run
    C) Thread
    D) Timer
    Правильный ответ: A) BackgroundService

  20. Какой из следующих методов позволяет применить фильтр в LINQ к коллекции?
    A) Where
    B) Select
    C) OrderBy
    D) GroupBy
    Правильный ответ: A) Where

  21. Какой из перечисленных элементов не является частью архитектуры Clean Architecture?
    A) Domain Layer
    B) Application Layer
    C) Infrastructure Layer
    D) UI Layer
    Правильный ответ: D) UI Layer

  22. Какой стандарт используется для документирования REST API?
    A) Swagger/OpenAPI
    B) RAML
    C) WSDL
    D) GraphQL SDL
    Правильный ответ: A) Swagger/OpenAPI

  23. Какой тип политики в Polly используется для повторного выполнения операции при ошибке?
    A) RetryPolicy
    B) CircuitBreakerPolicy
    C) FallbackPolicy
    D) TimeoutPolicy
    Правильный ответ: A) RetryPolicy

  24. Какой атрибут в C# 10+ используется для генерации частичных классов и методов?
    A) [Partial]
    B) [GeneratedCode]
    C) [CallerMemberName]
    D) partial
    Правильный ответ: D) partial

  25. Какой из перечисленных принципов требует, чтобы клиенты не зависели от интерфейсов, которые они не используют?
    A) Interface Segregation Principle
    B) Liskov Substitution Principle
    C) Dependency Inversion Principle
    D) Open-Closed Principle
    Правильный ответ: A) Interface Segregation Principle

  1. Какой из перечисленных паттернов используется для разделения логики создания объектов от их использования?
    A) Singleton
    B) Factory Method
    C) Strategy
    D) Decorator
    Правильный ответ: B) Factory Method

  2. Какое утверждение верно относительно scoped сервисов в ASP.NET Core DI?
    A) Создаются один раз на приложение
    B) Создаются один раз на запрос
    C) Создаются каждый раз при запросе
    D) Создаются один раз при регистрации
    Правильный ответ: B) Создаются один раз на запрос

  3. Какой инструмент позволяет запускать и управлять контейнерами в кластере?
    A) Docker
    B) Kubernetes
    C) CI/CD
    D) Swagger
    Правильный ответ: B) Kubernetes

  4. Какой интерфейс в .NET используется для реализации пользовательской валидации в MediatR pipeline?
    A) IValidator
    B) IValidationRule
    C) IRuleHandler
    D) IFluentValidator
    Правильный ответ: A) IValidator

  5. Какой тип сериализации обеспечивает минимальный размер данных и высокую производительность в gRPC?
    A) JSON
    B) XML
    C) MessagePack
    D) Protobuf
    Правильный ответ: D) Protobuf

  6. Какой компонент микросервисной архитектуры отвечает за обнаружение сервисов?
    A) API Gateway
    B) Service Discovery
    C) Configuration Server
    D) Circuit Breaker
    Правильный ответ: B) Service Discovery

  7. Какой метод в C# 10+ позволяет создавать неявные ссылки на глобальные using-директивы?
    A) ImplicitUsings
    B) GlobalUsing
    C) Top-level statements
    D) File-scoped namespaces
    Правильный ответ: A) ImplicitUsings

  8. Какая команда Entity Framework Core применяется для создания миграции?
    A) Add-Migration
    B) Update-Database
    C) Scaffold-DbContext
    D) Script-Migration
    Правильный ответ: A) Add-Migration

  9. Какая библиотека чаще всего используется для mock’инга зависимостей в тестах на .NET?
    A) xUnit
    B) MSTest
    C) Moq
    D) NUnit
    Правильный ответ: C) Moq

  10. Какой HTTP-метод обычно используется для обновления существующего ресурса в REST API?
    A) GET
    B) POST
    C) PUT
    D) DELETE
    Правильный ответ: C) PUT

  11. Какой механизм в .NET позволяет выполнять код асинхронно без блокировки потока?
    A) Thread.Sleep
    B) Task.Run
    C) async/await
    D) Parallel.For
    Правильный ответ: C) async/await

  12. Какой принцип SOLID утверждает, что объекты в программе должны быть заменяемыми экземплярами их подтипов?
    A) Single Responsibility Principle
    B) Open-Closed Principle
    C) Liskov Substitution Principle
    D) Interface Segregation Principle
    Правильный ответ: C) Liskov Substitution Principle

  13. Какой middleware в ASP.NET Core отвечает за маршрутизацию запросов?
    A) UseRouting
    B) UseEndpoints
    C) UseAuthentication
    D) UseAuthorization
    Правильный ответ: A) UseRouting

  14. Какой токен используется для хранения информации о сессии пользователя в клиентском приложении?
    A) OAuth Token
    B) JWT
    C) Session Cookie
    D) API Key
    Правильный ответ: B) JWT

  15. Какой подход к деплою предполагает постепенное переключение пользователей с одной версии сервиса на другую?
    A) Blue-Green Deployment
    B) Canary Release
    C) Rolling Update
    D) A/B Testing
    Правильный ответ: B) Canary Release

  16. Какой метод в MediatR используется для отправки события всем подписчикам?
    A) Send
    B) Publish
    C) Notify
    D) Dispatch
    Правильный ответ: B) Publish

  17. Какой уровень тестирования проверяет систему целиком в условиях, максимально приближенных к боевым?
    A) Unit-тестирование
    B) Интеграционное тестирование
    C) Системное тестирование
    D) Приемочное тестирование
    Правильный ответ: C) Системное тестирование

  18. Какой тип очереди в RabbitMQ гарантирует доставку сообщений только одному потребителю?
    A) Fanout exchange
    B) Direct exchange
    C) Topic exchange
    D) Default exchange
    Правильный ответ: B) Direct exchange

  19. Какой класс в .NET используется для выполнения фоновых задач с поддержкой cancellation token?
    A) BackgroundService
    B) Timer
    C) Thread
    D) TaskScheduler
    Правильный ответ: A) BackgroundService

  20. Какой LINQ-метод используется для объединения двух коллекций по ключу?
    A) Join
    B) GroupJoin
    C) SelectMany
    D) Concat
    Правильный ответ: A) Join

  21. Какой слой Clean Architecture содержит бизнес-правила и доменные модели?
    A) Application Layer
    B) Domain Layer
    C) Infrastructure Layer
    D) Presentation Layer
    Правильный ответ: B) Domain Layer

  22. Какой инструмент в ASP.NET Core используется для автоматической генерации документации к API?
    A) Swashbuckle
    B) NSwag
    C) Swagger UI
    D) All of the above
    Правильный ответ: D) All of the above

  23. Какой тип политики в Polly используется для временного отключения вызова внешнего сервиса при частых ошибках?
    A) RetryPolicy
    B) CircuitBreakerPolicy
    C) FallbackPolicy
    D) TimeoutPolicy
    Правильный ответ: B) CircuitBreakerPolicy

  24. Какой атрибут в C# 10+ используется для указания, что метод является точкой входа?
    A) [EntryPoint]
    B) [Main]
    C) partial
    D) global using
    Правильный ответ: A) [EntryPoint]

  25. Какой принцип требует, чтобы абстракции не зависели от деталей, а детали зависели от абстракций?
    A) Dependency Inversion Principle
    B) Interface Segregation Principle
    C) Liskov Substitution Principle
    D) Open-Closed Principle
    Правильный ответ: A) Dependency Inversion Principle

 

  1. Какой из перечисленных паттернов используется для управления сложными состояниями объекта?
    A) Strategy
    B) State
    C) Template Method
    D) Command
    Правильный ответ: B) State

  2. Какое утверждение верно относительно transient сервисов в ASP.NET Core DI?
    A) Создаются один раз на приложение
    B) Создаются один раз на запрос
    C) Создаются каждый раз при запросе
    D) Создаются один раз при регистрации
    Правильный ответ: C) Создаются каждый раз при запросе

  3. Какой инструмент позволяет оркестрировать несколько контейнеров в локальной среде?
    A) Docker Compose
    B) Kubernetes
    C) Helm
    D) Docker Swarm
    Правильный ответ: A) Docker Compose

  4. Какой интерфейс в .NET используется для реализации кастомной сериализации с помощью System.Text.Json?
    A) JsonConverter
    B) ISerializable
    C) IJsonSerializable
    D) JsonSerializerContext
    Правильный ответ: A) JsonConverter

  5. Какой тип обмена сообщениями в RabbitMQ отправляет одно и то же сообщение всем подписчикам?
    A) Direct exchange
    B) Fanout exchange
    C) Topic exchange
    D) Default exchange
    Правильный ответ: B) Fanout exchange

  6. Какой компонент в микросервисной архитектуре отвечает за управление конфигурациями сервисов?
    A) API Gateway
    B) Service Mesh
    C) Configuration Server
    D) Load Balancer
    Правильный ответ: C) Configuration Server

  7. Какая директива в C# 10+ позволяет не указывать namespace в каждом файле?
    A) global using
    B) file-scoped namespace
    C) implicit namespace
    D) top-level namespace
    Правильный ответ: B) file-scoped namespace

  8. Какая команда Entity Framework Core применяется для генерации SQL-скрипта миграции?
    A) Script-Migration
    B) Add-Migration
    C) Update-Database
    D) Remove-Migration
    Правильный ответ: A) Script-Migration

  9. Какая библиотека используется для построения pipeline тестов в xUnit?
    A) Moq
    B) FluentAssertions
    C) TheoryData
    D) All of the above
    Правильный ответ: D) All of the above

  10. Какой HTTP-метод обычно используется для получения списка ресурсов в REST API?
    A) POST
    B) PUT
    C) GET
    D) DELETE
    Правильный ответ: C) GET

  11. Какой механизм в .NET позволяет выполнять код параллельно с использованием нескольких потоков?
    A) async/await
    B) Task.Run
    C) Parallel.For
    D) Thread.Sleep
    Правильный ответ: C) Parallel.For

  12. Какой принцип SOLID утверждает, что у класса должна быть только одна причина измениться?
    A) Open-Closed Principle
    B) Liskov Substitution Principle
    C) Single Responsibility Principle
    D) Dependency Inversion Principle
    Правильный ответ: C) Single Responsibility Principle

  13. Какой middleware в ASP.NET Core отвечает за завершение pipeline и выполнение endpoint’а?
    A) UseRouting
    B) UseEndpoints
    C) UseAuthentication
    D) UseAuthorization
    Правильный ответ: B) UseEndpoints

  14. Какой токен используется для хранения информации о доступе на стороне клиента без сохранения состояния?
    A) Session Cookie
    B) JWT
    C) OAuth Token
    D) API Key
    Правильный ответ: B) JWT

  15. Какой подход к деплою предполагает одновременное обновление всех экземпляров сервиса?
    A) Rolling Update
    B) Canary Release
    C) Blue-Green Deployment
    D) A/B Testing
    Правильный ответ: A) Rolling Update

  16. Какой метод в MediatR используется для отправки события и ожидания его обработки?
    A) Send
    B) Publish
    C) Notify
    D) Raise
    Правильный ответ: D) Raise

  17. Какой уровень тестирования проверяет соответствие функционала требованиям заказчика?
    A) Unit-тестирование
    B) Интеграционное тестирование
    C) Системное тестирование
    D) Приемочное тестирование
    Правильный ответ: D) Приемочное тестирование

  18. Какой тип очереди в Kafka гарантирует порядок сообщений внутри партиции?
    A) FIFO
    B) LIFO
    C) Priority queue
    D) Delayed queue
    Правильный ответ: A) FIFO

  19. Какой класс в .NET используется для выполнения периодических фоновых задач?
    A) BackgroundService
    B) Timer
    C) HostedService
    D) PeriodicTask
    Правильный ответ: A) BackgroundService

  20. Какой LINQ-метод используется для преобразования элементов коллекции?
    A) Where
    B) Select
    C) OrderBy
    D) GroupBy
    Правильный ответ: B) Select

  21. Какой слой Clean Architecture содержит реализацию внешних взаимодействий (например, баз данных)?
    A) Application Layer
    B) Domain Layer
    C) Infrastructure Layer
    D) Presentation Layer
    Правильный ответ: C) Infrastructure Layer

  22. Какой инструмент в ASP.NET Core используется для автоматической генерации клиентского SDK для API?
    A) Swashbuckle
    B) NSwag
    C) Swagger UI
    D) ReDoc
    Правильный ответ: B) NSwag

  23. Какой тип политики в Polly используется для установки максимального времени выполнения операции?
    A) RetryPolicy
    B) CircuitBreakerPolicy
    C) FallbackPolicy
    D) TimeoutPolicy
    Правильный ответ: D) TimeoutPolicy

  24. Какой атрибут в C# 10+ используется для определения исходного генератора кода?
    A) [SourceGenerator]
    B) [Generator]
    C) [CodeGenerator]
    D) [CustomGenerator]
    Правильный ответ: A) [SourceGenerator]

  25. Какой принцип требует, чтобы ни один клиент не зависел от методов, которые он не использует?
    A) Interface Segregation Principle
    B) Liskov Substitution Principle
    C) Dependency Inversion Principle
    D) Open-Closed Principle
    Правильный ответ: A) Interface Segregation Principle

Экзаменационный билет №1

Теоретическая часть

  1. Опишите принципы построения микросервисной архитектуры и перечислите основные компоненты, которые обычно в неё входят.
  2. Объясните разницу между async/await и Task.Run в C#. В каких случаях какой подход использовать?
 

Ответы на теоретическую часть:

  1. Микросервисная архитектура строится на основе разделения приложения на независимые сервисы, каждый из которых решает одну бизнес-задачу. Основные компоненты: API Gateway, Service Discovery, Configuration Server, Circuit Breaker, Message Broker, Logging/Monitoring.
  2. async/await используется для асинхронного выполнения I/O-bound операций без блокировки потока. Task.Run — для CPU-bound задач, выполняемых в фоновом потоке. async/await применяется для работы с файлами, сетью, БД; Task.Run — для вычислений, требующих ресурсов процессора.
 

Практическая часть

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

public async Task<List<int>> GetSortedEvensAsync(List<int> numbers)
{
    return await Task.Run(() =>
    {
        return numbers
            .AsParallel()
            .Where(n => n % 2 == 0)
            .OrderByDescending(n => n)
            .ToList();
    });
}

 

Экзаменационный билет №2

Теоретическая часть

  1. Что такое паттерн CQRS и в каких ситуациях его стоит применять?
  2. Охарактеризуйте работу Entity Framework Core с миграциями и опишите, как можно их кастомизировать.
 

Ответы на теоретическую часть:

  1. CQRS (Command Query Responsibility Segregation) — это паттерн, разделяющий модель чтения и модель записи. Применяется, когда требуется высокая производительность, сложная бизнес-логика или масштабируемость.
  2. EF Core использует миграции для изменения схемы БД. Кастомизация возможна через OnModelCreating, написание своих миграционных операций, использование SQL-скриптов, а также переопределение Generate() метода через собственный MigrationsSqlGenerator.
 

Практическая часть

Создайте middleware в ASP.NET Core, который логирует время начала запроса и время его завершения (в миллисекундах). Лог должен выводиться в консоль.

public class RequestTimeLoggerMiddleware
{
    private readonly RequestDelegate _next;

    public RequestTimeLoggerMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        var startTime = DateTime.UtcNow;

        await _next(context);

        var endTime = DateTime.UtcNow;
        var duration = (endTime - startTime).TotalMilliseconds;
        Console.WriteLine($"Request {context.Request.Path} took {duration:F2} ms");
    }
}

// регистрация в Program.cs:
app.UseMiddleware<RequestTimeLoggerMiddleware>();

 

Экзаменационный билет №3

Теоретическая часть

  1. Какие преимущества дает использование Docker в современных бэкенд-приложениях?
  2. Охарактеризуйте принципы SOLID и приведите примеры их реализации в C#.
 

Ответы на теоретическую часть:

  1. Docker обеспечивает изоляцию окружения, унификацию сред разработки и продакшена, упрощает деплой, позволяет создавать микросервисы, поддерживает CI/CD и масштабирование.
  2. SOLID:
    • S — Single Responsibility Principle
    • O — Open-Closed Principle
    • L — Liskov Substitution Principle
    • I — Interface Segregation Principle
    • D — Dependency Inversion Principle
      Пример: использование интерфейсов вместо конкретных классов для зависимости (DIP).

Практическая часть

Напишите REST API контроллер в ASP.NET Core, который возвращает список пользователей из базы данных. Должны быть реализованы методы GET (все пользователи), GET by ID и POST (добавление нового пользователя).

[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
    private readonly AppDbContext _context;

    public UsersController(AppDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        return Ok(await _context.Users.ToListAsync());
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetById(int id)
    {
        var user = await _context.Users.FindAsync(id);
        if (user == null) return NotFound();
        return Ok(user);
    }

    [HttpPost]
    public async Task<IActionResult> Create([FromBody] User user)
    {
        _context.Users.Add(user);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(GetById), new { id = user.Id }, user);
    }
}

 

Экзаменационный билет №4

Теоретическая часть

  1. Охарактеризуйте паттерн Repository и объясните, почему он полезен в проектах с использованием ORM.
  2. Что такое JWT и как он используется в защите API?
 

Ответы на теоретическую часть:

  1. Repository инкапсулирует логику доступа к данным и предоставляет абстракцию над ORM. Удобно для тестирования, замены ORM, централизации работы с данными.
  2. JWT (JSON Web Token) — это стандарт для передачи данных между сторонами в виде JSON-объекта. Используется для аутентификации и авторизации в stateless системах.
 

Практическая часть

Создайте простой background worker в .NET, который каждые 5 секунд проверяет наличие новых записей в таблице «Orders» и выводит количество новых заказов в консоль.

public class OrderWorker : BackgroundService
{
    private readonly IServiceScopeFactory _scopeFactory;

    public OrderWorker(IServiceScopeFactory scopeFactory)
    {
        _scopeFactory = scopeFactory;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using var scope = _scopeFactory.CreateScope();
            var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();

            var newOrdersCount = await context.Orders
                .CountAsync(o => o.CreatedAt > DateTime.UtcNow.AddSeconds(-5), stoppingToken);

            Console.WriteLine($"New orders in last 5 sec: {newOrdersCount}");

            await Task.Delay(5000, stoppingToken);
        }
    }
}

 

Экзаменационный билет №5

Теоретическая часть

  1. Какие существуют виды тестирования в разработке ПО и какие из них чаще всего используются в бэкенд-разработке?
  2. Охарактеризуйте механизм DI в ASP.NET Core и перечислите жизненные циклы сервисов.
 

Ответы на теоретическую часть:

  1. Unit-тестирование, интеграционное, системное, нагрузочное, acceptance-тестирование. В бэкенде наиболее распространены unit- и интеграционное тестирование.
  2. DI в ASP.NET Core — это встроенный контейнер, позволяющий внедрять зависимости. Жизненные циклы: Singleton (один экземпляр на приложение), Scoped (один экземпляр на запрос), Transient (новый экземпляр каждый раз).

Практическая часть

Создайте unit-тест с использованием xUnit и Moq, который проверяет корректную работу метода GetUserById сервиса UserService

public class UserServiceTests
{
    [Fact]
    public async Task GetUserById_ReturnsCorrectUser()
    {
        // Arrange
        var mockRepo = new Mock<IUserRepository>();
        mockRepo.Setup(r => r.GetUserByIdAsync(1)).ReturnsAsync(new User { Id = 1, Name = "John" });

        var service = new UserService(mockRepo.Object);

        // Act
        var result = await service.GetUserById(1);

        // Assert
        Assert.NotNull(result);
        Assert.Equal("John", result.Name);
    }
}

 

Экзаменационный билет №6

Теоретическая часть

  1. Охарактеризуйте паттерн Mediator и объясните, в каких сценариях он особенно полезен.
  2. Что такое OpenTelemetry и как он используется в микросервисных архитектурах?
 

Ответы на теоретическую часть:

  1. Mediator — это паттерн, позволяющий уменьшить связанность между компонентами, направляя взаимодействие через посредника. Полезен при сложной логике обработки команд и запросов, особенно в CQRS-архитектуре.
  2. OpenTelemetry — это набор инструментов для сбора телеметрии (логов, метрик, трейсов) в распределённых системах. Используется для мониторинга и диагностики производительности микросервисов.

Практическая часть

Реализуйте метод валидации модели пользователя с использованием FluentValidation в ASP.NET Core. Валидация должна проверять, что имя не пустое и длина пароля не менее 8 символов.

public class UserValidator : AbstractValidator<UserDto>
{
    public UserValidator()
    {
        RuleFor(u => u.Username).NotEmpty().WithMessage("Имя пользователя не может быть пустым");
        RuleFor(u => u.Password).MinimumLength(8).WithMessage("Пароль должен содержать минимум 8 символов");
    }
}

// Регистрация в Program.cs:
builder.Services.AddValidatorsFromAssemblyContaining<UserValidator>();

 

Экзаменационный билет №7

Теоретическая часть

  1. Объясните разницу между REST и gRPC. Какой из них предпочтителен в high-load системах и почему?
  2. Что такое CAP-теорема и как она влияет на выбор архитектуры распределённых систем?
 

Ответы на теоретическую часть:

  1. REST использует HTTP и JSON, gRPC — Protobuf и работает поверх HTTP/2. gRPC предпочтителен в high-load системах из-за меньшего размера сообщений и поддержки streaming.
  2. CAP-теорема утверждает, что в распределённой системе можно одновременно обеспечить только два из трёх свойств: согласованность, доступность, устойчивость к разделению сети. Это влияет на выбор между строгой консистентностью и отказоустойчивостью.

Практическая часть

Создайте middleware в ASP.NET Core, который добавляет к каждому ответу заголовок X-Server-Timeсо значением текущего времени сервера.

public class ServerTimeMiddleware
{
    private readonly RequestDelegate _next;

    public ServerTimeMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        await _next(context);
        context.Response.Headers.Add("X-Server-Time", DateTime.Now.ToString("o"));
    }
}

 

Экзаменационный билет №8

Теоретическая часть

  1. Что такое event sourcing и как он отличается от традиционного подхода к хранению состояния системы?
  2. Объясните назначение и использование IHostedService в .NET.
 

Ответы на теоретическую часть:

  1. Event sourcing — это подход, при котором состояние системы хранится как последовательность событий, а не как текущее значение. Отличается возможностью восстановления состояния на любой момент времени и сложностью чтения.
  2. IHostedService используется для запуска фоновых задач, зависящих от жизненного цикла приложения. Реализуется через StartAsync и StopAsync.

Практическая часть

Создайте background задачу, которая каждые 30 секунд очищает временную директорию /tmp/cacheесли она существует.

public class CacheCleanupService : IHostedService, IDisposable
{
    private Timer _timer;

    public Task StartAsync(CancellationToken ct)
    {
        _timer = new Timer(DoCleanup, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
        return Task.CompletedTask;
    }

    private void DoCleanup(object state)
    {
        var path = "/tmp/cache";
        if (Directory.Exists(path))
        {
            foreach (var file in Directory.GetFiles(path))
                File.Delete(file);
        }
    }

    public Task StopAsync(CancellationToken ct)
    {
        _timer?.Change(Timeout.Infinite, 0);
        return Task.CompletedTask;
    }

    public void Dispose() => _timer?.Dispose();
}

 

Экзаменационный билет №9

Теоретическая часть

  1. Как реализуется пагинация в REST API? Приведите пример URL и структуры ответа.
  2. Что такое circuit breaker и как он помогает в микросервисных архитектурах?
 

Ответы на теоретическую часть:

  1. Пагинация реализуется через параметры page и pageSizeПример URL: /api/users?page=2&pageSize=20. Пример ответа: { items: [...], total: 150 }
  2. Circuit breaker — это паттерн, предотвращающий повторные попытки вызова неотвечающего сервиса. Позволяет повысить отказоустойчивость и избежать cascading failure.

Практическая часть

Напишите метод, который принимает список пользователей и фильтрует их по возрасту (например, старше 18 лет), применяя LINQ и возвращая результат в виде DTO.

public class UserDto
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public List<UserDto> GetAdultUsers(List<User> users)
{
    return users
        .Where(u => u.Age > 18)
        .Select(u => new UserDto { Name = u.Name, Age = u.Age })
        .ToList();
}

 

Экзаменационный билет №10

Теоретическая часть

  1. Что такое health checks в ASP.NET Core и как они используются в production-системах?
  2. Охарактеризуйте принцип работы Entity Framework Core при lazy loading и eager loading.
 

Ответы на теоретическую часть:

  1. Health checks — это механизм проверки работоспособности сервиса. Используются в orchestration (Kubernetes), мониторинге и автоматическом переключении трафика.
  2. Lazy loading подгружает связанные данные по требованию (через virtual-свойства), eager loading — сразу при запросе основной сущности через .Include()

Практическая часть

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

[ApiController]
[Route("[controller]")]
public class TextController : ControllerBase
{
    [HttpPost]
    public IActionResult ToUpper([FromBody] string text)
    {
        return Ok(text.ToUpper());
    }
}

 

Экзаменационный билет №11

Теоретическая часть

  1. Объясните, что такое паттерн Specification и в каких сценариях он применяется в бэкенд-разработке.
  2. Что такое distributed tracing и как он помогает в диагностике микросервисных приложений?
 

Ответы на теоретическую часть:

  1. Паттерн Specification используется для инкапсуляции бизнес-правил в виде переиспользуемых условий. Применяется в доменных моделях и репозиториях для фильтрации данных на уровне бизнес-логики.
  2. Distributed tracing — это механизм отслеживания жизненного цикла запроса между несколькими сервисами. Используется для диагностики производительности, выявления узких мест и анализа логики работы распределённых систем.

Практическая часть

Создайте метод, который принимает список пользователей и фильтрует их по активности IsActive == trueи возрасту старше 21 года, используя LINQ и возвращая отсортированный список по имени.

public class User
{
    public string Name { get; set; }
    public int Age { get; set; }
    public bool IsActive { get; set; }
}

public List<User> GetFilteredUsers(List<User> users)
{
    return users
        .Where(u => u.IsActive && u.Age > 21)
        .OrderBy(u => u.Name)
        .ToList();
}

 

Экзаменационный билет №12

Теоретическая часть

  1. Охарактеризуйте принципы Domain-Driven Design (DDD) и перечислите основные элементы этой парадигмы.
  2. Как работает middleware pipeline в ASP.NET Core и какие задачи он решает?
 

Ответы на теоретическую часть:

  1. DDD — это подход к разработке сложных систем через тесное сотрудничество с предметной областью. Основные элементы: Entity, Value Object, Aggregate Root, Repository, Service, Domain Event.
  2. Middleware pipeline — это последовательность компонентов, обрабатывающих HTTP-запросы и ответы. Он позволяет реализовать логику аутентификации, маршрутизации, обработки ошибок, логгирования и другие cross-cutting concerns.

Практическая часть

Реализуйте простой API контроллер, который обрабатывает POST-запрос с моделью ProductDtoи возвращает HTTP-ответ 201 Created с тем же объектом.

[ApiController]
[Route("[controller]")]
public class ProductsController : ControllerBase
{
    [HttpPost]
    public IActionResult Create([FromBody] ProductDto dto)
    {
        return CreatedAtAction(nameof(Create), new { id = dto.Id }, dto);
    }
}

public class ProductDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

 

Экзаменационный билет №13

Теоретическая часть

  1. В чём отличие между message broker и service mesh? Приведите примеры использования каждого из них.
  2. Что такое source generators в C# 10+ и зачем они нужны?
 

Ответы на теоретическую часть:

  1. Message broker (например, Kafka, RabbitMQ) используется для обмена сообщениями между сервисами. Service mesh (например, Istio, Linkerd) управляет сетевыми взаимодействиями между микросервисами.
  2. Source generators — это возможность генерировать код на этапе компиляции, чтобы уменьшить overhead во время выполнения. Полезны для оптимизации сериализации, DI, маршрутов и других частей кода.

Практическая часть

Напишите unit-тест с использованием xUnit и Moq, который проверяет вызов метода SaveChanges в контексте EF Core.

public class AppDbContextTests
{
    [Fact]
    public void SaveChanges_ShouldBeCalled_WhenUserAdded()
    {
        var mockContext = new Mock<AppDbContext>(new DbContextOptionsBuilder<AppDbContext>().Options);
        mockContext.Setup(c => c.SaveChanges()).Verifiable();

        var user = new User { Name = "Alice" };
        mockContext.Object.Users.Add(user);
        mockContext.Object.SaveChanges();

        mockContext.Verify(c => c.SaveChanges(), Times.Once());
    }
}

 

Экзаменационный билет №14

Теоретическая часть

  1. Что такое AOT-компиляция в .NET и какие преимущества она даёт?
  2. Объясните назначение и использование IAsyncEnumerable в C#.
 

Ответы на теоретическую часть:

  1. AOT (Ahead-of-Time) компиляция преобразует IL-код в нативный на этапе сборки. Преимущества: ускорение запуска, снижение потребления памяти, уменьшение размера runtime.
  2. IAsyncEnumerable — это интерфейс, позволяющий асинхронно перечислять коллекцию по мере получения элементов. Используется в streaming сценариях, например, при чтении больших файлов или потоках данных.

Практическая часть

Создайте метод, который асинхронно считывает строки из файла и выводит их в консоль построчно.

public async Task ReadFileAsync(string filePath)
{
    using var reader = File.OpenText(filePath);
    string line;
    while ((line = await reader.ReadLineAsync()) != null)
    {
        Console.WriteLine(line);
    }
}

 

Экзаменационный билет №15

Теоретическая часть

  1. Что такое multi-tenancy и какие стратегии её реализации существуют в enterprise-приложениях?
  2. Охарактеризуйте работу Polly в части retry и circuit breaker политик.
 

Ответы на теоретическую часть:

  1. Multi-tenancy — это архитектурный подход, позволяющий одному экземпляру приложения обслуживать несколько клиентов. Стратегии: отдельная БД на tenant, общая БД с разделением по TenantId, shared schema с row-level security.
  2. Polly — это библиотека resilience и transient-fault handling. Retry политика повторяет операцию при ошибках. Circuit breaker временно блокирует вызовы при множестве неудачных попыток, предотвращая cascading failure.

Практическая часть

Создайте метод, который принимает строку и возвращает количество слов, содержащих более 5 букв.

public int CountLongWords(string input)
{
    if (string.IsNullOrWhiteSpace(input)) return 0;

    return input
        .Split(' ', StringSplitOptions.RemoveEmptyEntries)
        .Count(word => word.Length > 5);
}

(1) Кейс: "Неожиданный рост нагрузки на микросервис авторизации"


Описание кейса

Вы работаете ведущим бэкенд-разработчиком в компании, занимающейся разработкой платформы для онлайн-образования. Платформа состоит из нескольких микросервисов, один из которых — Auth Service , отвечающий за регистрацию, аутентификацию и управление правами пользователей.

Внезапно команда получает уведомления от мониторинговой системы:

  • Резко увеличилось время отклика сервиса (с 50 мс до 1200 мс).
  • Наблюдается высокая загрузка CPU (до 95%).
  • Увеличилось количество ошибок 500 (Internal Server Error) и таймаутов.
 

Это произошло после запуска рекламной кампании, которая привела к десяткам тысяч новых регистраций и входов в минуту .

 

Текущая архитектура сервиса

  • Технологии: ASP.NET Core 7, Entity Framework Core, MSSQL, JWT-авторизация, Redis для хранения refresh-токенов.
  • Аутентификация: при входе генерируется access-токен (JWT), refresh-токен сохраняется в Redis с TTL = 7 дней.
  • Регистрация: при регистрации проверяются уникальность email и username, отправляется письмо подтверждения через внешний SMTP-сервис.
  • Масштабирование: сервис развёрнут на одном экземпляре в Azure App Service (без горизонтального масштабирования).
  • База данных: одна БД, используется EF Core без явного кэширования.
  • SMTP-сервис: внешний, медленный, не использует async/await корректно.
 

Задача

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

 

Анализ и выявление проблем

Проблема №1: Синхронная работа с внешним SMTP-сервисом

  • При регистрации вызывается блокирующий метод отправки email.
  • Это вызывает задержку выполнения запроса и блокирует потоки в пуле.
 

Решение:

  • Переписать логику отправки email в асинхронную.
  • Использовать background queue (например, через IHostedServiceMassTransit или Hangfire) для отложенной обработки задач отправки сообщений.
  • Внедрить шину сообщений (RabbitMQ/Kafka) для де-каплинга сервисов.
 

Проблема №2: Отсутствие горизонтального масштабирования

  • Сервис работает на единственном инстансе, что ограничивает пропускную способность.
 

Решение:

  • Настроить автоматическое горизонтальное масштабирование (Azure Scale Set / Kubernetes).
  • Убедиться, что состояние сервиса не зависит от конкретного экземпляра (stateless подход).
  • Убедиться, что Redis и БД могут выдерживать увеличенную нагрузку.
 

Проблема №3: Высокая нагрузка на БД при частых проверках уникальности

  • На этапе регистрации происходит частое обращение к БД для проверки уникальности email и username.
  • EF Core выполняет эти операции напрямую, без кэширования или оптимизации.
 

Решение:

  • Добавить кэширование часто запрашиваемых значений (например, существующих email) в Redis.
  • Создать уникальные индексы в БД для полей Email и Username
  • Оптимизировать LINQ-запросы, использовать .AsNoTracking() там, где это уместно.

 

Обучающие моменты

  • Асинхронное программирование

  • Работа с background задачами

  • Горизонтальное масштабирование

  • Оптимизация работы с БД

  • Важность распределённого кэширования

  • Интеграция resilience паттернов

  • Мониторинг и диагностика производительности

  • Rate limiting и защита API

  • Рефакторинг legacy кода

  • Подготовка к росту:


Дополнительные рекомендации

  • Интеграция Polly : добавить retry-политики при работе с внешними сервисами (SMTP, Redis, другие микросервисы).
  • Distributed tracing : внедрить OpenTelemetry или Application Insights для диагностики производительности.
  • Rate limiting : добавить защиту от DDoS и злоупотребления API (через Ocelot, YARP или middleware).
  • Логгирование : использовать Serilog + Seq или ELK Stack для централизованного сбора логов.
  • Health checks : реализовать endpoint /health для мониторинга доступности компонентов сервиса.

 

(2) Кейс: "Падение производительности при массовом импорте данных"


Описание кейса

Вы работаете в компании, разрабатывающей платформу для управления складскими остатками. Один из ключевых сервисов — Inventory Service , отвечающий за хранение и обработку информации о товарах, их количестве, поставках и перемещениях.

В рамках одного из новых функциональных релизов была добавлена возможность массового импорта товаров через CSV-файл , чтобы ускорить начальную настройку системы у крупных клиентов.

 

После запуска этой функции стало поступать множество жалоб:

  • Сервис начинает резко тормозить при загрузке больших файлов (от 10 000 строк).
  • Иногда возникают ошибки 500 , и операция прерывается.
  • CPU и RAM подскакивают до предела.
  • Другие API-методы сервиса начинают работать медленно или вообще не отвечают.
 

Текущая реализация импорта

  • Импорт выполняется синхронно: пользователь загружает файл, сервер его парсит, проверяет данные и записывает в БД через EF Core.
  • Каждая строка файла — это отдельная запись в БД (INSERT).
  • Проверка уникальности артикула выполняется запросом к БД для каждой строки.
  • Логика импорта написана в одном методе контроллера без разбиения на слои.
  • Отсутствует фоновая обработка и прогресс-бар для пользователя.
  • Файлы могут быть размером до 50 МБ.
 

Задача

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

 

Анализ и выявление проблем

Проблема №1: Синхронный и долгий процесс обработки

  • Импорт выполняется в потоке HTTP-запроса, что блокирует его до окончания.
  • При этом используются ресурсы CPU и памяти, что влияет на другие запросы.
 

Решение:

  • Перенести логику импорта в background job через IHostedServiceHangfire или очередь сообщений (RabbitMQ/Kafka).
  • Возвращать пользователю ID задачи и позволять проверять статус импорта отдельным запросом.
 

Проблема №2: Построчная запись в БД

  • Каждый INSERT выполняется отдельно, что приводит к множественным roundtrip’ам к БД и увеличивает время выполнения.
 

Решение:

  • Использовать bulk-операции: либо сторонние библиотеки например, EFCore.BulkExtensionsлибо временный экспорт в DataTable + SqlBulkCopy
  • Уменьшить количество обращений к БД и повысить скорость записи.

Проблема №3: Частые SELECT-запросы для проверки уникальности

  • Для каждой строки проверяется наличие артикула в БД — это дорогостоящая операция при большом объёме данных.
 

Решение:

  • Сначала проверять дубликаты внутри файла LINQ .GroupBy()затем — сверять только уникальные значения с БД.
  • Использовать кэширование уже известных артикулов в Redis.
  • Создать уникальный индекс в БД на поле SKU

Обучающие моменты

  • Асинхронная обработка задач вместо блокировки HTTP-запроса.
  • Bulk-операции с БД для ускорения массового импорта.
  • Оптимизация проверок уникальности через группировку и кэширование.
  • Разделение на слои для читаемости, тестируемости и поддержки кода.
  • Использование background jobs (Hangfire, очереди) для долгих операций.
  • Логгирование и мониторинг процессов импорта.
  • Транзакции и откат изменений при частичных ошибках.
  • Валидация данных до записи в базу.
  • Уведомления о статусе задачи пользователю.
  • Подготовка к росту нагрузки и масштабируемость решений.

Дополнительные задания для самостоятельной работы

  • Реализовать асинхронный импорт CSV с возвратом ID задачи и проверкой статуса.
  • Оптимизировать запись данных в БД с использованием bulk-операций (EFCore.BulkExtensions / SqlBulkCopy).
  • Реализовать проверку уникальности артикулов внутри файла и относительно БД.
  • Разделить логику на слои (DTO, Service, Repository) для лучшей структуры кода.
  • Добавить логгирование и мониторинг этапов импорта.

Ролевая игра №1: "Спасите сервис!"


Цель игры

Научить участников применять навыки проектирования, диагностики и оптимизации бэкенд-архитектуры в условиях реального кризиса.
Участники должны спроектировать или реанимировать нестабильный микросервис под высокой нагрузкой, используя профессиональные практики разработки на C#.

 

Формат

  • Тип: Ролевая командная симуляция (4–6 человек в команде).
  • Продолжительность: 2–3 академических часа.
  • Метод: Иммерсивная ролевая игра + техническое задание + презентация решений.
 

Сеттинг

Компания "SkillBox Logistics" разрабатывает платформу для управления цепочками поставок. Один из ключевых микросервисов — Orders Service — начал падать под нагрузкой после запуска нового клиента, обслуживающего крупную сеть магазинов.

Игроки — команда опытных бэкенд-разработчиков, приглашённых в экстренном порядке для диагностики и восстановления работы сервиса.

 

Роли в команде

Роль
Зона ответственности
Архитектор
Общее проектирование решения, выбор технологий, масштабируемость
DevOps-инженер
Развертывание, мониторинг, логгирование, CI/CD
Бэкенд-разработчик
Реализация бизнес-логики, работа с БД, API
QA-инженер / SRE
Тестирование, диагностика ошибок, проверка отказоустойчивости
Product Owner
Согласование приоритетов задач, взаимодействие с "заказчиком"

Этапы игры

Этап 1: Диагностика проблемы

  • Команде предоставляется описание текущего состояния сервиса:
    • Высокое время отклика.
    • Частые ошибки 500.
    • Проблемы с базой данных.
    • Отсутствие горизонтального масштабирования.
  • Участники анализируют проблему и выделяют возможные причины.
 

Этап 2: Построение плана восстановления

  • Каждый участник предлагает действия в рамках своей роли.
  • Команда совместно формирует дорожную карту:
    • Что изменить в архитектуре?
    • Какие технологии внедрить?
    • Как масштабировать?
    • Как тестировать?
 

Этап 3: Реализация решения (мини-задачи)

  • Участники делятся на пары и выполняют мини-задачи:
    • Написать асинхронный метод обработки заказа.
    • Настроить Redis для кэширования.
    • Реализовать bulk-вставку в БД.
    • Написать health check endpoint.
    • Добавить retry-policy через Polly.
 

Этап 4: Презентация решения

  • Команда представляет своё решение:
    • Как они модернизировали сервис.
    • Какие компромиссы были приняты.
    • Как подготовили систему к росту нагрузки.
  • Преподаватель (играющий роль заказчика) задаёт вопросы и оценивает качество решения.
 

Обучающие эффекты

  • Практика применения паттернов проектирования (CQRS, Repository, Mediator).
  • Написание асинхронного кода , использование background jobs .
  • Внедрение bulk-операций , кеширования , health checks .
  • Работа с EF Core , Redis , Polly , Docker .
  • Диагностика производительности и устранение узких мест.
  • Командная работа, распределение ролей, согласование решений.
 

Возможные проблемы и вызовы во время игры

  • Недостаточно информации : участники должны уточнять детали у преподавателя.
  • Ограниченное время : нужно выбирать наиболее критичные задачи.
  • Конфликты ролей : например, DevOps хочет всё автоматизировать, Product Owner — быстрее выпустить фикс.
  • Технические сложности : реализация части задач может быть нетривиальной без подсказок.
 

Дополнительно:

Добавить внешние зависимости:

  • Необходимость интеграции с платежным шлюзом.
  • Логирование событий в Kafka.
  • Реализация fallback-политики при падении зависимого сервиса.

 

Ролевая игра №2: "Запуск сервиса в production"


Цель игры

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

 

Формат

  • Тип: Командная ролевая игра с элементами проектирования, разработки и DevOps.
  • Продолжительность: 3–4 академических часа.
  • Метод: Проектирование + написание кода + презентация решения.
 

Сеттинг

Компания "SkillBox Media" запускает новый стартап — платформу для публикации и чтения статей. Нужно создать Article Service , который будет отвечать за хранение, поиск и редактирование статей авторов.

 

Игроки — команда из опытных бэкенд-разработчиков и инженеров, которым нужно:

  • Спроектировать архитектуру.
  • Реализовать минимальный MVP.
  • Подготовить его к деплою.
  • Обеспечить мониторинг и отказоустойчивость.
 

Роли в команде

Роль
Зона ответственности
Архитектор
Выбор архитектуры (слои, паттерны, технологии)
Бэкенд-разработчик
Реализация API, работа с БД, бизнес-логика
DevOps-инженер
Docker, CI/CD, окружения, деплой
QA/SRE-инженер
Тестирование, health checks, resilience
Product Owner
Постановка задач, приоритизация, взаимодействие с заказчиком

Этапы игры

Этап 1: Проектирование сервиса

  • Определить основные требования:
    • Создание, чтение, обновление и удаление статей.
    • Поиск по заголовкам и тегам.
    • Учет просмотров статьи.
  • Выбрать технологический стек:
    • .NET Core / ASP.NET Core
    • EF Core или Dapper?
    • PostgreSQL / MongoDB?
    • Redis для кэширования?
  • Продумать архитектурное разделение: слои, DI, паттерны (Repository, CQRS и т.д.)
 

Этап 2: Реализация MVP

  • Написать минимальный функционал:
    • CRUD через REST API.
    • Модель данных (Article, Tag).
    • Примеры контроллеров, сервисов, репозиториев.
  • Добавить базовые проверки:
    • Валидация входящих данных.
    • Логгирование.
    • Health check endpoint.
 

Этап 3: Подготовка к production

  • Участники настраивают:
    • Контейнеризацию через Docker.
    • CI/CD pipeline (GitHub Actions / Azure DevOps).
    • Автоматическое тестирование.
    • Настройку конфигураций для разных окружений.
    • Логгирование и мониторинг (Serilog, Application Insights).
 

Этап 4: Презентация и защита решения

  • Команда представляет:
    • Как выглядит архитектура.
    • Что реализовано.
    • Как подготовлено к production.
  • Преподаватель (в роли технического директора) задаёт вопросы:
    • Как масштабировать?
    • Как обеспечить безопасность?
    • Что добавите в следующем релизе?
 

Обучающие эффекты

  • Проектирование production-ready сервиса с нуля.
  • Применение архитектурных паттернов (Repository, CQRS, Mediator).
  • Использование Docker , CI/CD , health checks , logging .
  • Написание REST API , работа с EF Core и ORM .
  • Практика командной работы , распределения ролей и согласования решений.
  • Анализ компромиссов между производительностью, простотой и масштабируемостью.
 

Возможные проблемы и вызовы во время игры

  • Разногласия в выборе архитектуры: один хочет чистую архитектуру, другой — быстрее запустить.
  • Ограниченное время на реализацию MVP.
  • Недостаточно опыта с Docker или CI/CD.
  • Неочевидные моменты в организации слоёв и DI.
  • Сложности с написанием unit- и интеграционных тестов.
 

Дополнительно:

Добавить дополнительные требования:

  • Интеграция с внешними сервисами (например, Notification Service через RabbitMQ).
  • JWT-авторизация.
  • Rate limiting и защита API.
  • Асинхронная обработка просмотров статей.

 

Ролевая игра №3: "Сломайте и восстановите сервис"


Цель игры

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

 

Формат

  • Тип: Техническая командная симуляция с элементами ревью кода, профилирования и рефакторинга.
  • Продолжительность: 3–4 академических часа.
  • Метод: Анализ существующего проекта с "подготовленными" проблемами → поиск и описание найденных ошибок → предложение решений → презентация изменений.
 

Сеттинг

Компания "SkillBox Travel" разрабатывает платформу для поиска и бронирования отелей. Сервис Accommodation Service работает, но:

  • Время ответа растёт.
  • Периодически возникают ошибки 500.
  • База данных перегружена.
  • Команда разработчиков уволилась, оставив запутанный и слабо документированный код.
 

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

 

Роли в команде

Роль
Зона ответственности
Архитектор
Оценка структуры, выявление anti-patterns, предложение архитектурных изменений
Бэкенд-разработчик
Поиск проблем в логике, API, работе с БД
QA/SRE-инженер
Диагностика через тестирование, profiling, мониторинг
DevOps-инженер
Анализ CI/CD, окружений, конфигураций
Product Owner
Согласование приоритетов исправлений, взаимодействие с заказчиком

Этапы игры

Этап 1: Исследование сервиса

  • Участникам предоставляется:
    • Исходный код (например, ASP.NET Core + EF Core).
    • Примеры запросов Postman / Swagger.
    • Логи, метрики, базовые данные о нагрузке.
  • Игроки изучают код и ищут явные и скрытые проблемы.
 

Этап 2: Составление списка найденных проблем

  • Каждый участник фиксирует найденные проблемы в своей области:
    • Неправильное использование async/await.
    • Частые обращения к БД без кэширования.
    • Отсутствие пагинации.
    • Множество SELECT N+1.
    • Неэффективные LINQ-запросы.
    • Нарушение SRP, DI, SOLID.
    • Отсутствие транзакций или их некорректное применение.
    • Проблемы с тестированием, логгированием, health checks.
 

Этап 3: Предложение решений

  • Команда обсуждает:
    • Какие изменения наиболее критичны?
    • Какой порядок исправления?
    • Какие компромиссы допустимы?
  • Формируется дорожная карта рефакторинга.
 

Этап 4: Презентация изменений

  • Команда представляет:
    • Перечень найденных проблем.
    • Приоритизацию.
    • Конкретные предложения по исправлению.
    • Как будет проверено успешное выполнение изменений.
  • Преподаватель (в роли технического лидера) задаёт вопросы, предлагает edge case’ы, проверяет глубину понимания.
 

Обучающие эффекты

  • Развитие навыков технического аудита и ревью кода .
  • Диагностика и устранение производительности и стабильности сервиса .
  • Понимание распространённых анти-паттернов в C# и .NET.
  • Применение async/await , EF Core best practices , кеширования , bulk операций .
  • Обнаружение архитектурных дыр и методы их закрытия.
  • Командная работа и распределение ролей в условиях неопределённости.
 

Возможные проблемы и вызовы во время игры

  • Разные интерпретации одной и той же проблемы.
  • Сложно определить, что является "главной" проблемой.
  • Ограниченное время на исследование и обсуждение.
  • Недостаточно информации о нагрузке и среде.
  • Некоторые ошибки могут быть хорошо замаскированы.
 

Дополнительно:

Добавить внешние зависимости:

  • Интеграция с другим микросервисом через gRPC.
  • Использование Redis, RabbitMQ или Kafka.
  • Реализация Circuit Breaker, Retry Policy.
  • Восстановление после partial failure.

 

Ролевая игра №4: "Атака на API: безопасность под угрозой"


Цель игры

Научить участников проектировать, анализировать и защищать REST API от распространённых уязвимостей.
Участники должны выступить в роли разработчиков-защитников и тестировщиков-атакующих , чтобы понять, как обнаруживать и предотвращать уязвимости в бэкенд-приложениях.

 

Формат

  • Тип: Командная ролевая игра с элементами защиты и тестирования безопасности.
  • Продолжительность: 3–4 академических часа.
  • Метод: Разделение на пары («защитники» vs «атакующие») + презентация найденных проблем и решений.
 

Сеттинг

Вы работаете в компании "SkillBox Finance" , которая разрабатывает платформу для онлайн-платежей. У вас есть сервис Payments API , который позволяет:

  • Просматривать список транзакций.
  • Создавать новые платежи.
  • Получать данные по пользователям (с правами доступа).
  • Фильтровать данные через query-параметры.
 

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

 

Роли в команде

Роль
Зона ответственности
Защитник (Defender)
Проектирует и реализует безопасный API, внедряет защитные меры
Атакующий (Attacker)
Ищет уязвимости, пытается взломать API, эмулирует типичные атаки

Каждый участник поочерёдно играет обе роли в разных раундах.


Этапы игры

Этап 1: Подготовка API

  • Защитники получают задание:
    • Реализовать минимальный API (например, ASP.NET Core + JWT).
    • Добавить базовые проверки:
      • Авторизация и роли пользователей.
      • Валидация входящих данных.
      • Ограничения на фильтрацию и пагинацию.
      • Логгирование запросов.
  • Преподаватель предоставляет шаблон проекта с возможностью расширения.
 

Этап 2: Атака на API

  • Атакующие получают:
    • Swagger-документацию к API.
    • Postman-коллекцию с примерами запросов.
    • Возможность использовать инструменты (Postman, curl, Burp Suite и др.).
  • Задача: найти и продемонстрировать хотя бы 3 из следующих уязвимостей:
    • Insecure Direct Object Reference (IDOR)
    • SQL Injection
    • XSS / Command Injection
    • Brute-force атака на авторизацию
    • Mass Assignment
    • Отсутствие rate limiting → DDoS
    • Перебор ID (Insecure Pagination)
    • Неправильная обработка ошибок → утечка информации
 

Этап 3: Обсуждение и защита решений

  • Команда обсуждает:
    • Какие уязвимости были найдены?
    • Как они могли быть предотвращены?
    • Какие практики безопасности стоит внедрить?
  • Защитники представляют своё решение с исправлениями.
 

Этап 4: Преподавательский разбор

  • Преподаватель демонстрирует эталонное решение с комментариями:
    • Как правильно внедрить JWT-авторизацию.
    • Как защититься от SQLi и XSS.
    • Как ограничить нагрузку на API.
    • Как скрывать детали ошибок от клиента.
 

Обучающие эффекты

  • Понимание основных типов уязвимостей в REST API .
  • Применение JWT-авторизации , политик доступа , валидации данных .
  • Настройка rate limiting , фильтрации , пагинации с учётом безопасности.
  • Обнаружение и предотвращение SQLi, XSS, IDOR, Mass Assignment и других угроз.
  • Развитие мышления "как хакер", чтобы лучше защищать собственный код.
  • Практика написания безопасного и отказоустойчивого C#-кода .
 

Возможные проблемы и вызовы во время игры

  • Не все уязвимости очевидны без указания.
  • Требуется знание основ OWASP Top 10.
  • Некоторые атаки сложно воспроизвести без глубокого понимания HTTP.
  • Может возникнуть сложность с выбором приоритетов при исправлении.
 

Дополнительно:

Добавить дополнительные требования:

  • Интеграция с OAuth2 или OpenID Connect.
  • Шифрование конфиденциальных данных в БД.
  • Реализация двухфакторной аутентификации.
  • Обнаружение и блокировка подозрительных запросов.

Интеллект-карта 1: «Путь профессионального бэкенд-разработчика на C#»

Ветки:

  • Начальный уровень

    • Основы языка C#
    • Работа с .NET
    • ООП и паттерны
    • Простая работа с БД
  • Средний уровень

    • ASP.NET Core
    • REST API
    • Entity Framework
    • Тестирование
    • DI и middleware
  • Продвинутый уровень

    • Архитектурные паттерны (CQRS, Mediator)
    • Чистая архитектура
    • Микросервисы
    • gRPC, SignalR
    • CI/CD, Docker
  • Экспертный уровень

    • Производительность и оптимизация
    • Безопасность API
    • Распределённые системы
    • Event sourcing
    • Облачные решения
 

Интеллект-карта 2: «Технологический стек бэкенд-разработчика C#»

Ветки:

  • Основы

    • C# 10–12
    • .NET 6 / .NET 7+
    • LINQ, async/await
    • ООП
  • API

    • RESTful API
    • Swagger/OpenAPI
    • gRPC
    • Middleware pipeline
  • Базы данных

    • SQL, T-SQL
    • EF Core
    • Redis, MongoDB
    • Query optimization
  • Архитектура

    • Clean Architecture
    • DDD
    • CQRS, Mediator
    • Repository + UoW
  • Инфраструктура

    • Docker
    • Kubernetes
    • CI/CD (GitHub Actions, Azure DevOps)
    • Logging & Monitoring (Serilog, AppInsights)
  • Безопасность

    • JWT, OAuth2
    • Rate limiting
    • HTTPS
    • Anti-forgery
  • Тестирование

    • xUnit / NUnit
    • Moq
    • Integration tests
    • Test Driven Development
 

Интеллект-карта 3: «Модульная структура курса»

Ветки:

  • Модуль 1: Продвинутый C#

    • Advanced language features
    • Memory management
    • Source Generators
    • Native AOT
  • Модуль 2: Веб-API и HTTP

    • ASP.NET Core
    • Routing
    • Middleware
    • Filters
  • Модуль 3: Работа с данными

    • EF Core (advanced)
    • Raw SQL
    • Dapper
    • NoSQL
  • Модуль 4: Архитектура приложений

    • SOLID, DRY, KISS
    • Паттерны проектирования
    • Clean Architecture
    • Domain-Driven Design
  • Модуль 5: Микросервисы и контейнеры

    • Docker
    • API Gateway
    • Service Discovery
    • Message Brokers (Kafka/RabbitMQ)
  • Модуль 6: CI/CD и DevOps

    • GitFlow
    • Build pipelines
    • Deployment strategies
    • IaC (Infrastructure as Code)
  • Модуль 7: Безопасность

    • Authentication
    • Authorization
    • JWT, OAuth2
    • Rate limiting, filtering
  • Модуль 8: Производительность и тестирование

    • Performance tuning
    • Profiling
    • Unit и интеграционное тестирование
    • Mocking, stubbing
  • Модуль 9: Реальный проект

    • Agile подход
    • Командная разработка
    • CI/CD в бою
    • Production deployment
 

Интеллект-карта 4: «Жизненный цикл запроса в микросервисной системе»

Ветки:

  • Клиентский запрос

    • HTTP-запрос
    • Авторизация через JWT
  • API Gateway

    • Маршрутизация
    • Rate Limiting
    • Load Balancing
  • Микросервис

    • Получение запроса
    • Валидация
    • Бизнес-логика
    • Работа с БД или другими сервисами
  • Работа с базой данных

    • ORM / raw SQL
    • Кэширование
    • Транзакции
  • Внешние вызовы

    • gRPC
    • Message Broker
    • Circuit Breaker
  • Логгирование и мониторинг

    • Serilog
    • Application Insights
    • OpenTelemetry
  • Ответ клиенту

    • JSON/XML
    • Статус код
    • Error handling

1. "C# 10 and .NET 6 — Modern Cross-Platform Development" — Mark J. Price

  • Тип: Учебник
  • Описание: Современное руководство по C# и .NET 6, охватывает основы и продвинутые темы: ASP.NET Core, микросервисы, EF Core, Docker и REST API.
  • Для кого: Подходит как для среднего, так и для профессионального уровня.
  • Практика: Много примеров, упражнений и проектных задач.
 

2. "Pro ASP.NET Core 6: Develop Dynamic Web Applications" — Adam Freeman

  • Тип: Учебное пособие
  • Описание: Глубокое погружение в ASP.NET Core, включая MVC, Razor Pages, Web API, безопасность, тестирование и хостинг.
  • Для кого: Для разработчиков, уже знакомых с C#.
  • Методика: Примеры кода, пошаговые объяснения, реальные сценарии.
 

3. "Domain-Driven Design: Tackling Complexity in the Heart of Software" — Eric Evans

  • Тип: Научная/хрестоматийная литература
  • Описание: Классический труд по проектированию сложных систем, DDD, моделированию предметной области.
  • Для кого: Для разработчиков на уровне middle и выше.
  • Значимость: Основополагающий текст по enterprise-архитектуре.
 

4. "Patterns of Enterprise Application Architecture" — Martin Fowler

  • Тип: Хрестоматия / справочник
  • Описание: Систематизированный обзор архитектурных паттернов, применяемых в enterprise-приложениях.
  • Для кого: Профессионалы, технические лиды, архитекторы.
  • Польза: Понимание структуры и логики построения бэкенд-систем.
 

5. "ASP.NET Core in Action" — Andrew Lock

  • Тип: Учебное пособие + задачник
  • Описание: Практическое руководство по созданию приложений на ASP.NET Core, включая микросервисы, DI, безопасность, тестирование и деплой.
  • Для кого: Разработчики с базовым знанием C#.
  • Уникальность: Четкая структура, фокус на production-ready решениях.
  1. Профессиональный бэкенд на C#
    Глубокое погружение в разработку серверных приложений с использованием .NET, EF Core, REST API, микросервисов и CI/CD.

  2. C# для enterprise-разработки
    Курс по созданию масштабируемых и поддерживаемых бэкенд-решений для корпоративных систем. Clean Architecture, DDD, SOLID.

  3. Бэкенд-разработка уровня Middle+
    Подготовка к senior-уровню: продвинутые темы C#, архитектура, тестирование, производительность, безопасность.

  4. Разработка микросервисов на .NET Core
    Изучите проектирование, развертывание и управление микросервисами с использованием Docker, Kubernetes и gRPC.

  5. Создание API от новичка до профи
    Полный цикл разработки REST и gRPC API: маршрутизация, документирование, безопасность, версионирование и тестирование.

  6. Чистая архитектура на C#
    Научитесь строить гибкие и тестируемые приложения с помощью принципов SOLID, DDD, CQRS и Mediator.

  7. Оптимизация и производительность C#
    Узнайте, как диагностировать, улучшать и масштабировать бэкенд-приложения с минимальным overhead’ом.

  8. Тестирование в .NET: от unit до интеграционного
    Освойте xUnit, Moq, TDD, покрытие кода, mock’инг зависимостей и автоматизированное тестирование сервисов.

  9. EF Core: мощь ORM в ваших руках
    Работа с базами данных через Entity Framework Core, raw SQL, query optimization и advanced mapping.

  10. Асинхронная разработка на C#
    Практическое применение async/await,TPL, background задач и обработка ошибок в I/O и CPU-bound операциях.

  11. Контейнеризация и DevOps для C#-разработчиков
    Docker, Kubernetes, CI/CD pipeline и деплой .NET приложений в production среду.

  12. Масштабируемые приложения на .NET
    Строим высокопроизводительные системы: горизонтальное масштабирование, нагрузочное тестирование, caching.

  13. Реальный проект на C#: от идеи до деплоя
    Разработка full-stack приложения в условиях Agile-среды: планирование, реализация, тестирование, deployment.

  14. Работа с сообщениями: RabbitMQ и Kafka
    Обмен данными между микросервисами, очереди, pub/sub, idempotency, retry policy и resilience patterns.

  15. Безопасность API в .NET
    JWT, OAuth2, защита от атак, политики авторизации, шифрование, rate limiting и HTTPS.

  16. Логгирование и мониторинг в .NET
    Serilog, Application Insights, OpenTelemetry, health checks и распределённое трейсирование.

  17. Продвинутый уровень C# 10+
    Изучите record types, source generators, AOT, pattern matching и другие фичи современного C#.

  18. Работа с Redis и кэширование в .NET
    Реализация in-memory и distributed cache, работа с Redis Streams, Pub/Sub и session storage.

  19. Событийная архитектура и event sourcing
    Проектирование систем на основе событий: Event Store, Sagas, replay, versioning и восстановление состояния.

  20. Паттерны проектирования в C#
    От Strategy до CQRS: практическое применение паттернов в реальных enterprise-проектах.

  21. Dependency Injection и IoC в .NET
    Работа с Microsoft.Extensions.DependencyInjection, жизненные циклы сервисов, DI в middleware и background jobs.

  22. gRPC и high-performance коммуникации
    Использование gRPC вместо REST: streaming, contract-first подход, интеграция с ASP.NET Core.

  23. Работа с файлами, потоками и сериализацией
    Binary, JSON, XML, Protobuf, работа с Stream, BufferedStream, Memory и Span<T>.

  24. SignalR и real-time коммуникации
    Создание чатов, уведомлений и live-обновлений в веб-приложениях через SignalR и HubContext.

  25. Enterprise-подход к разработке на .NET
    Курс для тех, кто хочет стать Senior-разработчиком: enterprise architecture, best practices, code quality, team collaboration.

Заявка ученика, студента, слушателя
Заявка преподавателя, репетитора админу сети.
19:32
10
Посещая этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.