Бэкенд-разработчик C# (Профессиональный уровень)
Описание программы:
Учебная программа курса «Бэкенд-разработчик 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, с применением всех пройденных технологий и подходов.
-
Что входит в программу курса «Бэкенд-разработчик C# (Профессиональный уровень)»?
Программа охватывает углублённое изучение .NET Core, Entity Framework Core, REST API и gRPC, асинхронного программирования, микросервисной архитектуры, паттернов проектирования, CI/CD, Docker, тестирования, логгирования, мониторинга и оптимизации производительности. -
Какие технологии используются в рамках курса?
Основные технологии: 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. -
Какой уровень подготовки требуется для участия в курсе?
Курс рассчитан на опытных разработчиков с базовым знанием C#, основ ООП, работы с базами данных и пониманием HTTP-протокола. Знакомство с ASP.NET и REST API желательно. -
Какие навыки приобретёт слушатель к концу курса?
Слушатель научится создавать масштабируемые серверные приложения, применять современные архитектурные подходы, работать с ORM, реализовывать безопасность, тестировать код, упаковывать сервисы в контейнеры и деплоить их в production. -
В чём отличие профессионального уровня от начального?
Профессиональный уровень включает продвинутые темы: архитектурные паттерны, микросервисы, CI/CD, работа с очередями сообщений, глубокая оптимизация, инфраструктурная автоматизация и enterprise-подходы к проектированию. -
Какие паттерны проектирования рассматриваются на курсе?
Рассматриваются паттерны проектирования, такие как Repository, Unit of Work, Mediator, CQRS, Specification, Strategy, Decorator, Observer, Singleton и другие, применимые в бэкенд-разработке. -
Как изучается REST API?
Изучаются принципы построения RESTful API, маршрутизация, версионирование, сериализация, обработка ошибок, документирование через Swagger/OpenAPI, безопасность, тестирование и оптимизация. -
Какие темы по безопасности рассматриваются?
Темы включают JWT-авторизацию, OAuth2, защиту от CSRF/XSS, использование политик авторизации, шифрование данных, работу с HTTPS, управление секретами и безопасную передачу данных. -
Как изучается Entity Framework Core?
EF Core рассматривается в контексте продвинутого использования: работа с миграциями, raw SQL, тенантность, фильтрация на уровне запросов, performance tuning, работа без миграций, code-first и database-first подходы. -
Как изучается асинхронное программирование?
Асинхронность изучается через async/await, TPL, PLINQ, cancellation tokens, работа с I/O-bound и CPU-bound задачами, обработка исключений в параллельных операциях, deadlock-сценарии. -
Какие виды тестирования осваиваются?
Осваиваются unit-тестирование с xUnit и Moq, интеграционное тестирование, тестирование API, тестирование бизнес-логики, Mock vs Stub, тестирование в DI-контейнере. -
Как изучается работа с Docker?
Обсуждается создание Dockerfile, работа с multi-stage сборкой, контейнеризация приложений .NET, запуск контейнеров, orchestration через Docker Compose, деплой на Linux- и Windows-платформах. -
Какие практики CI/CD рассматриваются?
Рассматриваются pipeline-ы в GitHub Actions, Azure DevOps, Jenkins, автоматическая сборка, тестирование, публикация образов, деплой на staging/prod, управление окружениями. -
Как изучается микросервисная архитектура?
Изучаются принципы микросервисов: декомпозиция, коммуникация через HTTP/gRPC/Message Broker, управление состоянием, согласованность данных, service discovery, circuit breaker, resilience patterns. -
Какие инструменты логгирования и мониторинга используются?
Используются Serilog, ELK Stack, Application Insights, Seq, OpenTelemetry, метрики, трейсы, логирование в файлы и централизованные системы, анализ производительности. -
Как изучается работа с системами очередей сообщений?
Рассматриваются RabbitMQ, Kafka, MassTransit/CAP, publish-subscribe модели, message durability, retry механизмы, dead-letter queues, distributed transactions. -
Как изучается работа с базами данных?
Изучаются реляционные (PostgreSQL, MSSQL) и NoSQL (MongoDB, Redis), работа через ORM и напрямую, query optimization, indexing, transaction management, data migrations. -
Как проводится оптимизация производительности?
Рассматриваются методы profiling, memory leak detection, caching (in-memory, Redis), query tuning, connection pooling, parallelism, precompilation, lazy loading. -
Какие аспекты работы с API изучаются?
Изучаются стандарты REST, swagger-документирование, версионирование, обработка ошибок, rate limiting, pagination, HATEOAS, content negotiation, фильтрация и сортировка. -
Как используется Dependency Injection в проектах?
DI изучается через Microsoft.Extensions.DependencyInjection, жизненные циклы сервисов (Transient/Scoped/Singleton), регистрация зависимостей, внедрение через конструктор/property, тестирование с DI. -
Как проводится обучение работе с gRPC?
gRPC изучается через протобуферы, сервисы, клиентские и серверные стабы, streaming, взаимодействие с REST, сравнение с SOAP и REST, интеграция в микросервисы. -
Какие типы проектов реализуются на курсе?
Слушатели реализуют enterprise-level backend-приложения, включая микросервисы, API Gateway, background workers, ETL-процессы, интеграции с внешними системами и полноценный реальный проект. -
Как организовано обучение в ходе курса?
Обучение сочетает лекции, практические задания, домашние проекты, code review, pair programming, agile-командная работа над итоговым проектом. -
Какова длительность курса?
Курс рассчитан на 4–6 месяцев обучения с еженедельными занятиями, домашними заданиями и проектной работой. -
Как завершается курс?
Курс завершается итоговым проектом — разработкой полного backend-решения по методологии Agile с использованием всех пройденных технологий и подходов, с презентацией и code review.
-
Какие принципы чистой архитектуры рассматриваются на курсе?
На курсе изучаются принципы SOLID, DRY, KISS, YAGNI, а также подходы к построению слоистой архитектуры, использование Domain-Driven Design и разделение ответственности между слоями приложения. -
Как осваивается работа с API Gateway в микросервисной архитектуре?
Рассматриваются реализации API Gateway с использованием Ocelot и YARP, маршрутизация запросов, аутентификация, rate limiting, кэширование, балансировка нагрузки и логгирование трафика. -
Какие инструменты используются для profiling и диагностики производительности?
Для диагностики применяются Visual Studio Diagnostic Tools, dotTrace, dotMemory, PerfView, MiniProfiler, а также встроенные средства ASP.NET Core для анализа медленных запросов и утечек памяти. -
Как обучают работе с Redis?
Обучение включает использование Redis как кэша, реализацию distributed cache, работу с Redis Streams и Pub/Sub, сериализацию данных, управление временем жизни ключей и интеграцию с .NET через StackExchange.Redis. -
Какие практики обработки ошибок и исключений рассматриваются?
Изучаются global exception handling, middleware для централизованного перехвата ошибок, создание собственных exception filters, логгирование ошибок, пользовательские response модели и работа с HTTP статусами. -
Как реализуется версионирование API?
Версионирование API изучается через URL, query string, заголовки и media types, а также с использованием библиотек вроде Microsoft.AspNetCore.Mvc.Versioning, с оценкой плюсов и минусов каждого подхода. -
Как проводится обучение работе с SignalR?
SignalR изучается на примере реализации real-time коммуникации, работы с HubContext, клиентскими методами, групповой рассылкой сообщений и интеграцией с backend-логикой. -
Какие практики документирования API рассматриваются?
Документирование осуществляется через Swagger/OpenAPI с использованием Swashbuckle и NSwag, включая аннотации моделей, описание операций, фильтрацию, security схемы и генерацию клиентских SDK. -
Как обучают работе с файлами и медиа в бэкенд-приложениях?
Тема включает загрузку, хранение, стриминг и обработку файлов, использование Azure Blob Storage и локального хранилища, ограничения размера, безопасность загрузок и MIME-типы. -
Как изучается работа с background задачами?
Рассматриваются IHostedService, BackgroundService, Hangfire, Quartz.NET, очередь задач через hosted services, работа с cancellation tokens и запуск периодических задач в ASP.NET Core. -
Какие темы по управлению конфигурацией рассматриваются?
Обсуждается использование IConfiguration, JSON-файлы, User Secrets, Environment Variables, Azure App Configuration, работа с секретами в CI/CD, шифрование и безопасное хранение. -
Как изучается работа с мульти-тенантностью?
Мульти-тенантность изучается через разные стратегии: отдельная БД, одинаковая БД с разделением по tenant ID, динамическое подключение к БД, routing и isolation на уровне бизнес-логики. -
Как обучают работе с GraphQL (если входит в программу)?
GraphQL изучается через Hot Chocolate или Strawberry Shake — создание schema, resolver-ы, работа с DataLoader, фильтрация, пагинация, авторизация и интеграция в существующую систему. -
Какие практики использования MediatR и CQRS рассматриваются?
MediatR используется для реализации паттернов Mediator и CQRS, включая IRequestHandler, INotificationHandler, декораторы, validation pipeline и разделение read/write моделей. -
Как изучается работа с Identity и авторизационными сервисами?
Рассматривается ASP.NET Core Identity, кастомизация пользовательской модели, двухфакторная аутентификация, восстановление пароля, внешние провайдеры (OAuth), JWT Bearer и OAuth2 flows. -
Как обучают работе с политиками авторизации?
Политики создаются через AuthorizationPolicyBuilder, Policy-based authorization, требования (IAuthorizationRequirement) и обработчики, а также использование ролей и claims. -
Как изучается работа с OpenAPI и его расширениями?
OpenAPI изучается через Swashbuckle и NSwag, включая кастомные аннотации, фильтры операций, генерацию клиентского кода, документирование ошибок и поддержку нескольких версий API. -
Какие практики управления зависимостями рассматриваются?
Обсуждаются жизненные циклы сервисов, scoped vs singleton, factory methods, внедрение через конструктор/метод/свойство, тестирование с Mock-объектами и работа с third-party контейнерами. -
Как изучается работа с файловыми системами и потоками?
Работа с потоками (Stream), бинарный и текстовый ввод-вывод, чтение/запись файлов, MemoryStream, BufferedStream, FileProvider API, работа с IFileProvider и абстракциями в .NET. -
Как обучают работе с плагинами и динамической загрузкой сборок?
Изучаются Assembly.Load, Reflection, AppDomain, независимая загрузка dll, выполнение кода на лету, проверка подписей, изоляция и безопасность при динамической загрузке. -
Как изучается работа с событийным программированием?
События изучаются через event handlers, async events, observer pattern, использование IEventAggregator, Mediator-based события и интеграция в бизнес-процессы. -
Какие практики работы с миграциями баз данных рассматриваются?
EF Core Migrations, автоматические и ручные миграции, seed data, миграции в production, управление версиями БД, работа без миграций, сравнение с Flyway/Liquibase. -
Как обучают работе с health checks и monitoring?
Health Checks изучаются через IHealthCheck, кастомные проверки, UI-интерфейсы (например, AspNetCore.Diagnostics.HealthChecks), интеграция с Application Insights и alerting. -
Как изучается работа с localization и internationalization?
Локализация через IStringLocalizer, ресурсные файлы, культура пользователя, fallback культуры, route-based и query-based определение языка, локализация данных и UI. -
Как завершается обучение каждым модулем?
Каждый модуль завершается практическим заданием, code review, unit-тестами и презентацией решения, где слушатель демонстрирует понимание материала и применение на практике.
-
Какие практики построения domain-моделей рассматриваются на курсе?
Изучаются принципы Domain-Driven Design, проектирование rich domain моделей, использование value objects, entities, aggregates, repositories и domain events для построения сложной бизнес-логики. -
Как обучают работе с event sourcing и CQRS в enterprise-приложениях?
Рассматривается разделение read и write моделей через CQRS, хранение состояния системы как последовательности событий (event store), восстановление состояния, обработка конфликтов и репликация данных. -
Как изучается работа с CAP и распределёнными транзакциями?
Обсуждается интеграция CAP для реализации distributed event bus, обработка сообщений, автоматическая retry-политика, поддержка idempotency, а также управление транзакциями между БД и шиной сообщений. -
Какие практики построения API Gateway с балансировкой нагрузки рассматриваются?
Рассматриваются реализации с использованием Ocelot, YARP и Kubernetes Ingress, включая round-robin, least connections и другие алгоритмы балансировки, health checks и failover. -
Как обучают работе с OpenTelemetry и распределённым трейсингом?
OpenTelemetry используется для сбора метрик и трейсов, интеграции с Jaeger/Zipkin, контекст распространения (propagation), связь span’ов и логирование запросов между микросервисами. -
Как изучается работа с feature toggles и dynamic configuration?
Рассматриваются библиотеки вроде Unleash, Microsoft.FeatureManagement и LaunchDarkly, динамическое включение/выключение функционала, A/B тестирование и безопасное развертывание новых фич. -
Как обучают работе с background задачами в распределённой среде?
Изучаются подходы к запуску background задач в кластере: использование Quartz.NET с shared storage, MassTransit Sagas, RabbitMQ delayed exchanges и планирование задач через message brokers. -
Как изучается работа с async validation и business rules pipeline?
Рассматривается построение пайплайнов валидации через MediatR pipelines, FluentValidation, async проверки, кастомные исключения и интеграция в бизнес-процессы. -
Какие практики работы с multi-threading и thread pool используются?
Обсуждаются Thread, ThreadPool, TaskScheduler, Parallel.For/ForEach, PLINQ, работа с cancellation tokens, deadlock и race condition prevention, потокобезопасность. -
Как обучают работе с raw SQL и Dapper в ASP.NET Core?
Изучаются сценарии использования Dapper вместо EF Core, работа с ADO.NET, mapping результатов, параметризованные запросы, stored procedures и performance gain при high-load операциях. -
Как изучается работа с cross-cutting concerns и их внедрение через middleware и filters?
Рассматриваются logging, caching, error handling, authentication, rate limiting и прочие cross-cutting concern'ы, реализуемые через middleware pipeline, action filters и DI. -
Как обучают работе с circuit breaker и resilience patterns?
Рассматриваются реализации через Polly — retry, fallback, timeout, circuit breaker, bulkhead isolation, а также интеграция в HTTP клиенты и микросервисы. -
Как изучается работа с gRPC streaming и bidirectional communication?
gRPC streaming изучается через server-side, client-side и bidirectional streaming, передача потоков данных, работа с IAsyncEnumerable, интеграция в real-time приложения. -
Как обучают работе с message brokers в условиях высокой нагрузки?
Рассматриваются стратегии partitioning, batching, compression, dead-letter queues, message deduplication, offset management и parallel consumption в RabbitMQ/Kafka/MassTransit. -
Как изучается работа с tenant-aware кэшированием и базами данных?
Обсуждается кэширование с учётом tenant ID, scoped connection strings, tenant-aware Redis keys, row-level security в PostgreSQL и dynamic filtering в EF Core. -
Как обучают работе с code generation и source generators в C#?
Рассматриваются Roslyn source generators, partial methods, compile-time code generation, снижение runtime overhead и примеры применения в DTO mapping, routing и DI регистрациях. -
Как изучается работа с native AOT в .NET 7+?
Обсуждается компиляция .NET приложений в native код, преимущества и ограничения AOT, работа с trimming, reflection emit и precompilation в ASP.NET Core. -
Как обучают работе с telemetry и метриками в production?
Изучаются Application Insights, Prometheus + Grafana, Serilog с Seq, метрики по latency, throughput, error rate, request count и custom business metrics. -
Как изучается работа с audit log и историей изменений?
Рассматриваются подходы к логированию изменений: temporal tables в MSSQL, shadow properties в EF Core, manual tracking и интеграция с event store для full audit trail. -
Как обучают работе с data masking и GDPR в enterprise-системах?
Обсуждаются стратегии маскирования персональных данных, шифрование полей в БД, PII logging control, обезличивание данных в dev/staging и автоматическое redaction. -
Как изучается работа с low-level network programming в .NET?
TCP/UDP сокеты, работа с Socket, TcpListener/TcpClient, протоколы сериализации (protobuf, MessagePack), реализация собственных серверов и клиентов поверх TCP/IP. -
Как обучают работе с WCF migration и legacy interoperability?
Рассматривается миграция с WCF на gRPC и REST, использование SOAP clients в .NET Core, работа с svcutil, ws-* стандарты и современные альтернативы. -
Как изучается работа с CI/CD в многосервисной архитектуре?
Обсуждаются общие build-стратегии, shared libraries, versioning across services, deployment strategies (canary, blue-green), service mesh и observability в pipeline. -
Как обучают работе с custom middleware pipeline в ASP.NET Core?
Строится понимание IApplicationBuilder, order of execution, branching pipeline, Use/Run/Map методы, создание кастомного middleware с DI, exception handling и short-circuiting. -
Как завершается каждый модуль и курс в целом?
Каждый модуль завершается практическим заданием с code review, unit-тестами и демонстрацией решения. Курс завершается реальным проектом, реализуемым в команде по Agile, с презентацией и защитой кода.
-
Какой паттерн проектирования используется для разделения логики обработки команд и запросов?
A) Repository
B) CQRS
C) Strategy
D) Observer
Правильный ответ: B) CQRS -
Какой метод в ASP.NET Core позволяет добавить сервис с областью видимости, ограниченной одним HTTP-запросом?
A) AddSingleton
B) AddScoped
C) AddTransient
D) AddInstance
Правильный ответ: B) AddScoped -
Какой инструмент используется для построения Docker-образов?
A) Dockerfile
B) Dockerhub
C) Docker Compose
D) Kubernetes
Правильный ответ: A) Dockerfile -
Какой интерфейс в .NET используется для реализации пользовательской локализации строк?
A) IStringLocalizer
B) ILocalizationService
C) IResourceProvider
D) ITextManager
Правильный ответ: A) IStringLocalizer -
Какой тип сериализации лучше всего подходит для работы с gRPC?
A) JSON
B) XML
C) Protobuf
D) BinaryFormatter
Правильный ответ: C) Protobuf -
Какой компонент в микросервисной архитектуре отвечает за маршрутизацию запросов между сервисами?
A) Service Mesh
B) API Gateway
C) Load Balancer
D) Message Broker
Правильный ответ: B) API Gateway -
Какое утверждение верно относительно async/await в C#?
A) await можно использовать только в методах, помеченных async
B) await не влияет на производительность
C) async методы всегда выполняются в отдельном потоке
D) await можно использовать в синхронном коде
Правильный ответ: A) await можно использовать только в методах, помеченных async -
Какой механизм в Entity Framework Core используется для управления миграциями баз данных?
A) Migrate()
B) Seed()
C) Update-Database
D) Scaffold-DbContext
Правильный ответ: C) Update-Database -
Какая библиотека чаще всего используется для тестирования бизнес-логики в .NET?
A) NUnit
B) xUnit
C) MSTest
D) Moq
Правильный ответ: B) xUnit -
Какой HTTP-метод обычно используется для создания нового ресурса в REST API?
A) GET
B) PUT
C) POST
D) DELETE
Правильный ответ: C) POST -
Какой тип кэширования применяется при использовании Redis в распределённой системе?
A) In-memory caching
B) Local caching
C) Distributed caching
D) Session caching
Правильный ответ: C) Distributed caching -
Какой из перечисленных принципов означает «Открыто для расширения, закрыто для модификации»?
A) Liskov Substitution Principle
B) Open-Closed Principle
C) Dependency Inversion Principle
D) Single Responsibility Principle
Правильный ответ: B) Open-Closed Principle -
Какой компонент в ASP.NET Core отвечает за обработку исключений на уровне middleware?
A) UseExceptionHandler
B) UseRouting
C) UseAuthentication
D) UseAuthorization
Правильный ответ: A) UseExceptionHandler -
Какой токен используется для передачи информации о правах доступа в REST API?
A) OAuth Token
B) JWT
C) API Key
D) Session ID
Правильный ответ: B) JWT -
Какой подход позволяет выполнять сборку и развертывание проекта автоматически после каждого коммита?
A) DevOps
B) CI/CD
C) Agile
D) Waterfall
Правильный ответ: B) CI/CD -
Какой метод в MediatR используется для отправки одного запроса и получения одного ответа?
A) Send
B) Publish
C) Notify
D) Raise
Правильный ответ: A) Send -
Какой из перечисленных типов тестирования проверяет взаимодействие между несколькими компонентами системы?
A) Unit-тестирование
B) Интеграционное тестирование
C) Системное тестирование
D) Приемочное тестирование
Правильный ответ: B) Интеграционное тестирование -
Какой тип сообщения в RabbitMQ гарантирует доставку и порядок сообщений?
A) Direct exchange
B) Fanout exchange
C) Delayed exchange
D) Reliable queue
Правильный ответ: D) Reliable queue -
Какой класс в .NET используется для выполнения фоновых задач, зависящих от жизненного цикла приложения?
A) BackgroundService
B) Task.Run
C) Thread
D) Timer
Правильный ответ: A) BackgroundService -
Какой из следующих методов позволяет применить фильтр в LINQ к коллекции?
A) Where
B) Select
C) OrderBy
D) GroupBy
Правильный ответ: A) Where -
Какой из перечисленных элементов не является частью архитектуры Clean Architecture?
A) Domain Layer
B) Application Layer
C) Infrastructure Layer
D) UI Layer
Правильный ответ: D) UI Layer -
Какой стандарт используется для документирования REST API?
A) Swagger/OpenAPI
B) RAML
C) WSDL
D) GraphQL SDL
Правильный ответ: A) Swagger/OpenAPI -
Какой тип политики в Polly используется для повторного выполнения операции при ошибке?
A) RetryPolicy
B) CircuitBreakerPolicy
C) FallbackPolicy
D) TimeoutPolicy
Правильный ответ: A) RetryPolicy -
Какой атрибут в C# 10+ используется для генерации частичных классов и методов?
A) [Partial]
B) [GeneratedCode]
C) [CallerMemberName]
D) partial
Правильный ответ: D) partial -
Какой из перечисленных принципов требует, чтобы клиенты не зависели от интерфейсов, которые они не используют?
A) Interface Segregation Principle
B) Liskov Substitution Principle
C) Dependency Inversion Principle
D) Open-Closed Principle
Правильный ответ: A) Interface Segregation Principle
-
Какой из перечисленных паттернов используется для разделения логики создания объектов от их использования?
A) Singleton
B) Factory Method
C) Strategy
D) Decorator
Правильный ответ: B) Factory Method -
Какое утверждение верно относительно scoped сервисов в ASP.NET Core DI?
A) Создаются один раз на приложение
B) Создаются один раз на запрос
C) Создаются каждый раз при запросе
D) Создаются один раз при регистрации
Правильный ответ: B) Создаются один раз на запрос -
Какой инструмент позволяет запускать и управлять контейнерами в кластере?
A) Docker
B) Kubernetes
C) CI/CD
D) Swagger
Правильный ответ: B) Kubernetes -
Какой интерфейс в .NET используется для реализации пользовательской валидации в MediatR pipeline?
A) IValidator
B) IValidationRule
C) IRuleHandler
D) IFluentValidator
Правильный ответ: A) IValidator -
Какой тип сериализации обеспечивает минимальный размер данных и высокую производительность в gRPC?
A) JSON
B) XML
C) MessagePack
D) Protobuf
Правильный ответ: D) Protobuf -
Какой компонент микросервисной архитектуры отвечает за обнаружение сервисов?
A) API Gateway
B) Service Discovery
C) Configuration Server
D) Circuit Breaker
Правильный ответ: B) Service Discovery -
Какой метод в C# 10+ позволяет создавать неявные ссылки на глобальные using-директивы?
A) ImplicitUsings
B) GlobalUsing
C) Top-level statements
D) File-scoped namespaces
Правильный ответ: A) ImplicitUsings -
Какая команда Entity Framework Core применяется для создания миграции?
A) Add-Migration
B) Update-Database
C) Scaffold-DbContext
D) Script-Migration
Правильный ответ: A) Add-Migration -
Какая библиотека чаще всего используется для mock’инга зависимостей в тестах на .NET?
A) xUnit
B) MSTest
C) Moq
D) NUnit
Правильный ответ: C) Moq -
Какой HTTP-метод обычно используется для обновления существующего ресурса в REST API?
A) GET
B) POST
C) PUT
D) DELETE
Правильный ответ: C) PUT -
Какой механизм в .NET позволяет выполнять код асинхронно без блокировки потока?
A) Thread.Sleep
B) Task.Run
C) async/await
D) Parallel.For
Правильный ответ: C) async/await -
Какой принцип SOLID утверждает, что объекты в программе должны быть заменяемыми экземплярами их подтипов?
A) Single Responsibility Principle
B) Open-Closed Principle
C) Liskov Substitution Principle
D) Interface Segregation Principle
Правильный ответ: C) Liskov Substitution Principle -
Какой middleware в ASP.NET Core отвечает за маршрутизацию запросов?
A) UseRouting
B) UseEndpoints
C) UseAuthentication
D) UseAuthorization
Правильный ответ: A) UseRouting -
Какой токен используется для хранения информации о сессии пользователя в клиентском приложении?
A) OAuth Token
B) JWT
C) Session Cookie
D) API Key
Правильный ответ: B) JWT -
Какой подход к деплою предполагает постепенное переключение пользователей с одной версии сервиса на другую?
A) Blue-Green Deployment
B) Canary Release
C) Rolling Update
D) A/B Testing
Правильный ответ: B) Canary Release -
Какой метод в MediatR используется для отправки события всем подписчикам?
A) Send
B) Publish
C) Notify
D) Dispatch
Правильный ответ: B) Publish -
Какой уровень тестирования проверяет систему целиком в условиях, максимально приближенных к боевым?
A) Unit-тестирование
B) Интеграционное тестирование
C) Системное тестирование
D) Приемочное тестирование
Правильный ответ: C) Системное тестирование -
Какой тип очереди в RabbitMQ гарантирует доставку сообщений только одному потребителю?
A) Fanout exchange
B) Direct exchange
C) Topic exchange
D) Default exchange
Правильный ответ: B) Direct exchange -
Какой класс в .NET используется для выполнения фоновых задач с поддержкой cancellation token?
A) BackgroundService
B) Timer
C) Thread
D) TaskScheduler
Правильный ответ: A) BackgroundService -
Какой LINQ-метод используется для объединения двух коллекций по ключу?
A) Join
B) GroupJoin
C) SelectMany
D) Concat
Правильный ответ: A) Join -
Какой слой Clean Architecture содержит бизнес-правила и доменные модели?
A) Application Layer
B) Domain Layer
C) Infrastructure Layer
D) Presentation Layer
Правильный ответ: B) Domain Layer -
Какой инструмент в ASP.NET Core используется для автоматической генерации документации к API?
A) Swashbuckle
B) NSwag
C) Swagger UI
D) All of the above
Правильный ответ: D) All of the above -
Какой тип политики в Polly используется для временного отключения вызова внешнего сервиса при частых ошибках?
A) RetryPolicy
B) CircuitBreakerPolicy
C) FallbackPolicy
D) TimeoutPolicy
Правильный ответ: B) CircuitBreakerPolicy -
Какой атрибут в C# 10+ используется для указания, что метод является точкой входа?
A) [EntryPoint]
B) [Main]
C) partial
D) global using
Правильный ответ: A) [EntryPoint] -
Какой принцип требует, чтобы абстракции не зависели от деталей, а детали зависели от абстракций?
A) Dependency Inversion Principle
B) Interface Segregation Principle
C) Liskov Substitution Principle
D) Open-Closed Principle
Правильный ответ: A) Dependency Inversion Principle
-
Какой из перечисленных паттернов используется для управления сложными состояниями объекта?
A) Strategy
B) State
C) Template Method
D) Command
Правильный ответ: B) State -
Какое утверждение верно относительно transient сервисов в ASP.NET Core DI?
A) Создаются один раз на приложение
B) Создаются один раз на запрос
C) Создаются каждый раз при запросе
D) Создаются один раз при регистрации
Правильный ответ: C) Создаются каждый раз при запросе -
Какой инструмент позволяет оркестрировать несколько контейнеров в локальной среде?
A) Docker Compose
B) Kubernetes
C) Helm
D) Docker Swarm
Правильный ответ: A) Docker Compose -
Какой интерфейс в .NET используется для реализации кастомной сериализации с помощью System.Text.Json?
A) JsonConverter
B) ISerializable
C) IJsonSerializable
D) JsonSerializerContext
Правильный ответ: A) JsonConverter -
Какой тип обмена сообщениями в RabbitMQ отправляет одно и то же сообщение всем подписчикам?
A) Direct exchange
B) Fanout exchange
C) Topic exchange
D) Default exchange
Правильный ответ: B) Fanout exchange -
Какой компонент в микросервисной архитектуре отвечает за управление конфигурациями сервисов?
A) API Gateway
B) Service Mesh
C) Configuration Server
D) Load Balancer
Правильный ответ: C) Configuration Server -
Какая директива в C# 10+ позволяет не указывать namespace в каждом файле?
A) global using
B) file-scoped namespace
C) implicit namespace
D) top-level namespace
Правильный ответ: B) file-scoped namespace -
Какая команда Entity Framework Core применяется для генерации SQL-скрипта миграции?
A) Script-Migration
B) Add-Migration
C) Update-Database
D) Remove-Migration
Правильный ответ: A) Script-Migration -
Какая библиотека используется для построения pipeline тестов в xUnit?
A) Moq
B) FluentAssertions
C) TheoryData
D) All of the above
Правильный ответ: D) All of the above -
Какой HTTP-метод обычно используется для получения списка ресурсов в REST API?
A) POST
B) PUT
C) GET
D) DELETE
Правильный ответ: C) GET -
Какой механизм в .NET позволяет выполнять код параллельно с использованием нескольких потоков?
A) async/await
B) Task.Run
C) Parallel.For
D) Thread.Sleep
Правильный ответ: C) Parallel.For -
Какой принцип SOLID утверждает, что у класса должна быть только одна причина измениться?
A) Open-Closed Principle
B) Liskov Substitution Principle
C) Single Responsibility Principle
D) Dependency Inversion Principle
Правильный ответ: C) Single Responsibility Principle -
Какой middleware в ASP.NET Core отвечает за завершение pipeline и выполнение endpoint’а?
A) UseRouting
B) UseEndpoints
C) UseAuthentication
D) UseAuthorization
Правильный ответ: B) UseEndpoints -
Какой токен используется для хранения информации о доступе на стороне клиента без сохранения состояния?
A) Session Cookie
B) JWT
C) OAuth Token
D) API Key
Правильный ответ: B) JWT -
Какой подход к деплою предполагает одновременное обновление всех экземпляров сервиса?
A) Rolling Update
B) Canary Release
C) Blue-Green Deployment
D) A/B Testing
Правильный ответ: A) Rolling Update -
Какой метод в MediatR используется для отправки события и ожидания его обработки?
A) Send
B) Publish
C) Notify
D) Raise
Правильный ответ: D) Raise -
Какой уровень тестирования проверяет соответствие функционала требованиям заказчика?
A) Unit-тестирование
B) Интеграционное тестирование
C) Системное тестирование
D) Приемочное тестирование
Правильный ответ: D) Приемочное тестирование -
Какой тип очереди в Kafka гарантирует порядок сообщений внутри партиции?
A) FIFO
B) LIFO
C) Priority queue
D) Delayed queue
Правильный ответ: A) FIFO -
Какой класс в .NET используется для выполнения периодических фоновых задач?
A) BackgroundService
B) Timer
C) HostedService
D) PeriodicTask
Правильный ответ: A) BackgroundService -
Какой LINQ-метод используется для преобразования элементов коллекции?
A) Where
B) Select
C) OrderBy
D) GroupBy
Правильный ответ: B) Select -
Какой слой Clean Architecture содержит реализацию внешних взаимодействий (например, баз данных)?
A) Application Layer
B) Domain Layer
C) Infrastructure Layer
D) Presentation Layer
Правильный ответ: C) Infrastructure Layer -
Какой инструмент в ASP.NET Core используется для автоматической генерации клиентского SDK для API?
A) Swashbuckle
B) NSwag
C) Swagger UI
D) ReDoc
Правильный ответ: B) NSwag -
Какой тип политики в Polly используется для установки максимального времени выполнения операции?
A) RetryPolicy
B) CircuitBreakerPolicy
C) FallbackPolicy
D) TimeoutPolicy
Правильный ответ: D) TimeoutPolicy -
Какой атрибут в C# 10+ используется для определения исходного генератора кода?
A) [SourceGenerator]
B) [Generator]
C) [CodeGenerator]
D) [CustomGenerator]
Правильный ответ: A) [SourceGenerator] -
Какой принцип требует, чтобы ни один клиент не зависел от методов, которые он не использует?
A) Interface Segregation Principle
B) Liskov Substitution Principle
C) Dependency Inversion Principle
D) Open-Closed Principle
Правильный ответ: A) Interface Segregation Principle
Экзаменационный билет №1
Теоретическая часть
- Опишите принципы построения микросервисной архитектуры и перечислите основные компоненты, которые обычно в неё входят.
- Объясните разницу между async/await и Task.Run в C#. В каких случаях какой подход использовать?
Ответы на теоретическую часть:
- Микросервисная архитектура строится на основе разделения приложения на независимые сервисы, каждый из которых решает одну бизнес-задачу. Основные компоненты: API Gateway, Service Discovery, Configuration Server, Circuit Breaker, Message Broker, Logging/Monitoring.
- 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
Теоретическая часть
- Что такое паттерн CQRS и в каких ситуациях его стоит применять?
- Охарактеризуйте работу Entity Framework Core с миграциями и опишите, как можно их кастомизировать.
Ответы на теоретическую часть:
- CQRS (Command Query Responsibility Segregation) — это паттерн, разделяющий модель чтения и модель записи. Применяется, когда требуется высокая производительность, сложная бизнес-логика или масштабируемость.
- 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
Теоретическая часть
- Какие преимущества дает использование Docker в современных бэкенд-приложениях?
- Охарактеризуйте принципы SOLID и приведите примеры их реализации в C#.
Ответы на теоретическую часть:
- Docker обеспечивает изоляцию окружения, унификацию сред разработки и продакшена, упрощает деплой, позволяет создавать микросервисы, поддерживает CI/CD и масштабирование.
- 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
Теоретическая часть
- Охарактеризуйте паттерн Repository и объясните, почему он полезен в проектах с использованием ORM.
- Что такое JWT и как он используется в защите API?
Ответы на теоретическую часть:
- Repository инкапсулирует логику доступа к данным и предоставляет абстракцию над ORM. Удобно для тестирования, замены ORM, централизации работы с данными.
- 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
Теоретическая часть
- Какие существуют виды тестирования в разработке ПО и какие из них чаще всего используются в бэкенд-разработке?
- Охарактеризуйте механизм DI в ASP.NET Core и перечислите жизненные циклы сервисов.
Ответы на теоретическую часть:
- Unit-тестирование, интеграционное, системное, нагрузочное, acceptance-тестирование. В бэкенде наиболее распространены unit- и интеграционное тестирование.
- 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
Теоретическая часть
- Охарактеризуйте паттерн Mediator и объясните, в каких сценариях он особенно полезен.
- Что такое OpenTelemetry и как он используется в микросервисных архитектурах?
Ответы на теоретическую часть:
- Mediator — это паттерн, позволяющий уменьшить связанность между компонентами, направляя взаимодействие через посредника. Полезен при сложной логике обработки команд и запросов, особенно в CQRS-архитектуре.
- 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
Теоретическая часть
- Объясните разницу между REST и gRPC. Какой из них предпочтителен в high-load системах и почему?
- Что такое CAP-теорема и как она влияет на выбор архитектуры распределённых систем?
Ответы на теоретическую часть:
- REST использует HTTP и JSON, gRPC — Protobuf и работает поверх HTTP/2. gRPC предпочтителен в high-load системах из-за меньшего размера сообщений и поддержки streaming.
- 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
Теоретическая часть
- Что такое event sourcing и как он отличается от традиционного подхода к хранению состояния системы?
- Объясните назначение и использование IHostedService в .NET.
Ответы на теоретическую часть:
- Event sourcing — это подход, при котором состояние системы хранится как последовательность событий, а не как текущее значение. Отличается возможностью восстановления состояния на любой момент времени и сложностью чтения.
- 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
Теоретическая часть
- Как реализуется пагинация в REST API? Приведите пример URL и структуры ответа.
- Что такое circuit breaker и как он помогает в микросервисных архитектурах?
Ответы на теоретическую часть:
- Пагинация реализуется через параметры
page
иpageSize
Пример URL:/api/users?page=2&pageSize=20
. Пример ответа:{ items: [...], total: 150 }
- 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
Теоретическая часть
- Что такое health checks в ASP.NET Core и как они используются в production-системах?
- Охарактеризуйте принцип работы Entity Framework Core при lazy loading и eager loading.
Ответы на теоретическую часть:
- Health checks — это механизм проверки работоспособности сервиса. Используются в orchestration (Kubernetes), мониторинге и автоматическом переключении трафика.
- 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
Теоретическая часть
- Объясните, что такое паттерн Specification и в каких сценариях он применяется в бэкенд-разработке.
- Что такое distributed tracing и как он помогает в диагностике микросервисных приложений?
Ответы на теоретическую часть:
- Паттерн Specification используется для инкапсуляции бизнес-правил в виде переиспользуемых условий. Применяется в доменных моделях и репозиториях для фильтрации данных на уровне бизнес-логики.
- 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
Теоретическая часть
- Охарактеризуйте принципы Domain-Driven Design (DDD) и перечислите основные элементы этой парадигмы.
- Как работает middleware pipeline в ASP.NET Core и какие задачи он решает?
Ответы на теоретическую часть:
- DDD — это подход к разработке сложных систем через тесное сотрудничество с предметной областью. Основные элементы: Entity, Value Object, Aggregate Root, Repository, Service, Domain Event.
- 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
Теоретическая часть
- В чём отличие между message broker и service mesh? Приведите примеры использования каждого из них.
- Что такое source generators в C# 10+ и зачем они нужны?
Ответы на теоретическую часть:
- Message broker (например, Kafka, RabbitMQ) используется для обмена сообщениями между сервисами. Service mesh (например, Istio, Linkerd) управляет сетевыми взаимодействиями между микросервисами.
- 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
Теоретическая часть
- Что такое AOT-компиляция в .NET и какие преимущества она даёт?
- Объясните назначение и использование IAsyncEnumerable в C#.
Ответы на теоретическую часть:
- AOT (Ahead-of-Time) компиляция преобразует IL-код в нативный на этапе сборки. Преимущества: ускорение запуска, снижение потребления памяти, уменьшение размера runtime.
- 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
Теоретическая часть
- Что такое multi-tenancy и какие стратегии её реализации существуют в enterprise-приложениях?
- Охарактеризуйте работу Polly в части retry и circuit breaker политик.
Ответы на теоретическую часть:
- Multi-tenancy — это архитектурный подход, позволяющий одному экземпляру приложения обслуживать несколько клиентов. Стратегии: отдельная БД на tenant, общая БД с разделением по TenantId, shared schema с row-level security.
- 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 (например, через
IHostedService
MassTransit или 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 через
IHostedService
Hangfire или очередь сообщений (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 — начал падать под нагрузкой после запуска нового клиента, обслуживающего крупную сеть магазинов.
Игроки — команда опытных бэкенд-разработчиков, приглашённых в экстренном порядке для диагностики и восстановления работы сервиса.
Роли в команде
Этапы игры
Этап 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.
- Подготовить его к деплою.
- Обеспечить мониторинг и отказоустойчивость.
Роли в команде
Этапы игры
Этап 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.
- База данных перегружена.
- Команда разработчиков уволилась, оставив запутанный и слабо документированный код.
Вы — новая команда инженеров, приглашённая на аудит и восстановление сервиса. Ваша задача — изучить код, найти проблемы и предложить решение.
Роли в команде
Этапы игры
Этап 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-параметры.
Внезапно служба безопасности обнаружила признаки атаки. Ваша задача — провести внутренний аудит и найти уязвимости, прежде чем их использует реальный злоумышленник.
Роли в команде
Каждый участник поочерёдно играет обе роли в разных раундах.
Этапы игры
Этап 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 решениях.
-
Профессиональный бэкенд на C#
Глубокое погружение в разработку серверных приложений с использованием .NET, EF Core, REST API, микросервисов и CI/CD. -
C# для enterprise-разработки
Курс по созданию масштабируемых и поддерживаемых бэкенд-решений для корпоративных систем. Clean Architecture, DDD, SOLID. -
Бэкенд-разработка уровня Middle+
Подготовка к senior-уровню: продвинутые темы C#, архитектура, тестирование, производительность, безопасность. -
Разработка микросервисов на .NET Core
Изучите проектирование, развертывание и управление микросервисами с использованием Docker, Kubernetes и gRPC. -
Создание API от новичка до профи
Полный цикл разработки REST и gRPC API: маршрутизация, документирование, безопасность, версионирование и тестирование. -
Чистая архитектура на C#
Научитесь строить гибкие и тестируемые приложения с помощью принципов SOLID, DDD, CQRS и Mediator. -
Оптимизация и производительность C#
Узнайте, как диагностировать, улучшать и масштабировать бэкенд-приложения с минимальным overhead’ом. -
Тестирование в .NET: от unit до интеграционного
Освойте xUnit, Moq, TDD, покрытие кода, mock’инг зависимостей и автоматизированное тестирование сервисов. -
EF Core: мощь ORM в ваших руках
Работа с базами данных через Entity Framework Core, raw SQL, query optimization и advanced mapping. -
Асинхронная разработка на C#
Практическое применение async/await,TPL, background задач и обработка ошибок в I/O и CPU-bound операциях. -
Контейнеризация и DevOps для C#-разработчиков
Docker, Kubernetes, CI/CD pipeline и деплой .NET приложений в production среду. -
Масштабируемые приложения на .NET
Строим высокопроизводительные системы: горизонтальное масштабирование, нагрузочное тестирование, caching. -
Реальный проект на C#: от идеи до деплоя
Разработка full-stack приложения в условиях Agile-среды: планирование, реализация, тестирование, deployment. -
Работа с сообщениями: RabbitMQ и Kafka
Обмен данными между микросервисами, очереди, pub/sub, idempotency, retry policy и resilience patterns. -
Безопасность API в .NET
JWT, OAuth2, защита от атак, политики авторизации, шифрование, rate limiting и HTTPS. -
Логгирование и мониторинг в .NET
Serilog, Application Insights, OpenTelemetry, health checks и распределённое трейсирование. -
Продвинутый уровень C# 10+
Изучите record types, source generators, AOT, pattern matching и другие фичи современного C#. -
Работа с Redis и кэширование в .NET
Реализация in-memory и distributed cache, работа с Redis Streams, Pub/Sub и session storage. -
Событийная архитектура и event sourcing
Проектирование систем на основе событий: Event Store, Sagas, replay, versioning и восстановление состояния. -
Паттерны проектирования в C#
От Strategy до CQRS: практическое применение паттернов в реальных enterprise-проектах. -
Dependency Injection и IoC в .NET
Работа с Microsoft.Extensions.DependencyInjection, жизненные циклы сервисов, DI в middleware и background jobs. -
gRPC и high-performance коммуникации
Использование gRPC вместо REST: streaming, contract-first подход, интеграция с ASP.NET Core. -
Работа с файлами, потоками и сериализацией
Binary, JSON, XML, Protobuf, работа с Stream, BufferedStream, Memory и Span<T>. -
SignalR и real-time коммуникации
Создание чатов, уведомлений и live-обновлений в веб-приложениях через SignalR и HubContext. -
Enterprise-подход к разработке на .NET
Курс для тех, кто хочет стать Senior-разработчиком: enterprise architecture, best practices, code quality, team collaboration.
Нет элементов для просмотра