.NET Tutorial
Уровень Middle

Трек Middle: 76 вопросов

Как всё устроено внутри: async/await, GC, DI, EF Core, индексы и транзакции, архитектурные паттерны, очереди, тестирование, Docker и наблюдаемость.

C# и .NET углублённо11

  1. 1 Как работает сборщик мусора (GC) в .NET: поколения, LOH, финализация? GC — трассирующий, поколенческий, компактирующий сборщик: он находит живые объекты от корней (стек, статики, регистры, GC handles), всё остальное считается мусором. Три … Middle10 мин
  2. 2 Как работает async/await под капотом? Что такое SynchronizationContext? Компилятор превращает async-метод в конечный автомат (state machine): код режется на части в точках await, локальные переменные становятся полями структуры. await провер… Middle7 мин
  3. 3 Разница Task, ValueTask, Thread, ThreadPool? Thread — настоящий поток ОС: свой стек (~1 МБ), дорогое создание. Нужен редко — для долгой выделенной работы с особыми требованиями (приоритет, STA, foreground). ThreadP… Middle6 мин
  4. 4 Как работает LINQ: отложенное выполнение, деревья выражений? LINQ-операторы вроде Where, Select, OrderBy не выполняются сразу — они строят цепочку итераторов (или дерево выражений для IQueryable). Выполнение происходит при перечис… Middle6 мин
  5. 5 Generics: constraints, covariance/contravariance (in/out)? Generics — параметризованные типы и методы: типобезопасность на этапе компиляции, без приведения типов и без boxing для значимых типов. Ограничения (where T : ...) сообщ… Middle6 мин
  6. 6 Что такое events, multicast delegates, утечки памяти через события? event — обёртка над полем-делегатом, которая снаружи разрешает только += и -=. Вызвать событие или перезаписать список подписчиков может только класс-владелец. Делегат с… Middle5 мин
  7. 7 Атрибуты: создание, чтение через Reflection, компилируемые атрибуты? Атрибут — декларативные метаданные, прикреплённые к сборке, типу, методу, свойству, параметру. Сам по себе атрибут ничего не делает — его читает кто-то другой: компилято… Middle6 мин
  8. 8 Pattern matching: switch expressions, property patterns, when guards? Pattern matching — проверка «имеет ли значение определённую форму» с одновременным извлечением данных: if (obj is Order { Total: > 1000 } o). Switch expression (C# 8) — … Middle5 мин
  9. 9 Как работает интерфейс IAsyncEnumerable<T>? IAsyncEnumerable<T> (C# 8) — асинхронная последовательность: элементы приходят по одному по мере готовности, а ожидание каждого не блокирует поток. Потребление: await fo… Middle5 мин
  10. 10 Примитивы синхронизации: lock, Monitor, Mutex, SemaphoreSlim, ReaderWriterLockSlim, Interlocked? lock (= Monitor.Enter/Exit в try/finally) — взаимное исключение внутри процесса; быстрый (спин + ожидание), реентерабельный. Нельзя await внутри. В .NET 9 появился тип S… Middle6 мин
  11. 11 ConcurrentDictionary, ConcurrentQueue, ImmutableDictionary — когда что? ConcurrentDictionary<K,V> — потокобезопасный словарь: чтение без блокировок, запись блокирует только один сегмент (stripe). Атомарные GetOrAdd, AddOrUpdate, TryUpdate. Л… Middle7 мин

ASP.NET Core10

  1. 12 Что такое Filters: Authorization, Action, Result, Exception — порядок выполнения? Фильтры — точки расширения внутри MVC, вокруг выполнения действия контроллера. В отличие от middleware, они знают о контроллере, действии, аргументах, ModelState и резул… Middle6 мин
  2. 13 Authentication vs Authorization: JWT, Cookie, OAuth2 / OIDC? Аутентификация — «кто ты?»: проверка учётных данных/токена и формирование ClaimsPrincipal (HttpContext.User). Ошибка — 401 Unauthorized. Авторизация — «что тебе можно?»:… Middle6 мин
  3. 14 Что такое ClaimsPrincipal, Identity, Roles vs Policy-based auth? Claim — утверждение о субъекте в виде «тип — значение»: sub=42, email=ann@x.uz, role=Manager, department=Sales. ClaimsIdentity — набор claims, выданный одним источником … Middle6 мин
  4. 15 Logging: ILogger, Serilog, Structured Logging, correlation ID? ILogger<T> — абстракция логирования .NET; реализации (провайдеры) подключаются отдельно: Console, Debug, EventSource, OpenTelemetry, Serilog, NLog. Структурное логирован… Middle6 мин
  5. 16 Health checks, Liveness vs Readiness probes? Health checks — эндпоинты, по которым оркестратор, балансировщик или мониторинг узнают состояние сервиса. В ASP.NET Core: AddHealthChecks() + MapHealthChecks("/health"),… Middle5 мин
  6. 17 Как работает SignalR: WebSockets, Long Polling, Server-Sent Events? SignalR — библиотека для двусторонней связи в реальном времени между сервером и клиентами (браузер, .NET, Java, Swift). Абстрагирует транспорт и даёт RPC-модель: сервер … Middle6 мин
  7. 18 gRPC в .NET — Protobuf, streaming, отличие от REST? gRPC — RPC-фреймворк поверх HTTP/2: контракт описывается в .proto-файле, из него генерируются клиент и сервер (C#, Go, Java, ...). Вызов удалённого сервиса выглядит как … Middle6 мин
  8. 19 Rate Limiting в ASP.NET Core 7+? Rate limiting ограничивает число запросов за период, чтобы защитить сервис от перегрузки, злоупотреблений (брутфорс, парсинг) и обеспечить справедливое распределение рес… Middle5 мин
  9. 20 Output Caching vs Response Caching — отличия? Response Caching (UseResponseCaching) — реализует HTTP-кэширование по стандарту: ориентируется на заголовки Cache-Control, Vary; учитывает заголовки клиента (Cache-Contr… Middle6 мин
  10. 21 Как правильно обрабатывать ошибки: ProblemDetails, middleware, ExceptionHandler? Ошибки обрабатываются централизованно, а не try/catch в каждом контроллере: UseExceptionHandler + IExceptionHandler (.NET 8) — одно место, где исключение превращается в … Middle6 мин

Entity Framework Core5

  1. 22 Как работает DbContext: Unit of Work, Identity Map, Change Tracker? DbContext — сессия работы с БД: запросы, отслеживание изменений, сохранение. Лёгкий, не потокобезопасный, живёт недолго (обычно Scoped — один на HTTP-запрос). Unit of Wo… Middle6 мин
  2. 23 Миграции: создание, применение, откат, squash? Миграция — C#-класс с методами Up (применить) и Down (откатить), описывающий изменение схемы. Создаётся командой dotnet ef migrations add Name сравнением текущей модели … Middle7 мин
  3. 24 Транзакции в EF Core: SaveChanges, BeginTransaction, Ambient transactions? SaveChanges сам оборачивает все накопленные изменения в одну транзакцию — для большинства сценариев явная транзакция не нужна. Database.BeginTransactionAsync() — явная т… Middle6 мин
  4. 25 Raw SQL, FromSql, ExecuteSql — когда уходить от LINQ? FromSql($"...") — запрос, возвращающий сущности (можно продолжить LINQ: Where, Include, OrderBy — EF обернёт SQL в подзапрос). Интерполяция автоматически превращается в … Middle6 мин
  5. 26 Конкурентный доступ: Optimistic vs Pessimistic Concurrency? Проблема: два пользователя читают одну запись, оба меняют и сохраняют — второй затирает изменения первого (lost update). Optimistic concurrency — «конфликты редки»: не б… Middle6 мин

Базы данных и SQL7

  1. 27 Уровни изоляции транзакций: Read Uncommitted → Serializable, аномалии? Аномалии параллельных транзакций: dirty read (чтение незафиксированного), non-repeatable read (повторное чтение строки даёт другое значение), phantom read (повторный зап… Middle7 мин
  2. 28 Индексы: Clustered vs Non-Clustered, Covering Index, когда не помогают? Индекс — отдельная упорядоченная структура (обычно B-Tree), позволяющая найти строки без полного сканирования таблицы. Ускоряет чтение, замедляет запись и занимает место… Middle7 мин
  3. 29 EXPLAIN / Query Plan — как читать и оптимизировать? План выполнения — дерево операций, которое выбрал оптимизатор на основе статистики и оценок стоимости. EXPLAIN показывает план и оценки, EXPLAIN ANALYZE — выполняет запр… Middle7 мин
  4. 30 Window Functions: ROW_NUMBER, RANK, LAG, LEAD, PARTITION BY? Оконная функция вычисляет значение для каждой строки на основе набора связанных строк («окна»), не схлопывая строки, в отличие от GROUP BY. Синтаксис: функция() OVER (PA… Middle7 мин
  5. 31 CTE (WITH) vs подзапросы vs временные таблицы — разница? Подзапрос — запрос внутри запроса (в WHERE, FROM, SELECT). Бывает коррелированным (зависит от строки внешнего запроса) и некоррелированным. CTE (WITH name AS (...)) — им… Middle6 мин
  6. 32 Deadlocks — почему возникают и как избежать? Deadlock — две (или больше) транзакции ждут друг друга по кругу: T1 держит ресурс A и ждёт B, T2 держит B и ждёт A. Сами они никогда не завершатся. СУБД обнаруживает цик… Middle6 мин
  7. 33 Виды индексов: Clustered, Non-Clustered, Unique, Filtered, Partial, Composite, Full-Text? Clustered — определяет физический порядок строк, один на таблицу (SQL Server, InnoDB). Non-clustered — отдельная структура со ссылками на строки, много на таблицу. Uniqu… Middle7 мин

Архитектура и паттерны11

  1. 34 Clean Architecture vs Onion Architecture — отличия? Onion (Jeffrey Palermo, 2008), Hexagonal / Ports & Adapters (Alistair Cockburn, 2005) и Clean (Robert Martin, 2012) — вариации одной идеи: бизнес-логика в центре, инфрас… Middle6 мин
  2. 35 CQRS: Command/Query разделение, зачем и когда? CQS (Бертран Мейер) — на уровне методов: метод либо изменяет состояние (command), либо возвращает данные (query), но не то и другое сразу. CQRS (Command Query Responsibi… Middle6 мин
  3. 36 Mediator pattern (MediatR) — как работает, плюсы и минусы? Паттерн Mediator — объекты общаются не напрямую, а через посредника, что уменьшает связанность «многие-ко-многим». MediatR — популярная .NET-библиотека: mediator.Send(re… Middle5 мин
  4. 37 Repository + Unit of Work pattern — смысл и критика? Repository — абстракция коллекции доменных объектов: «дай заказ по id», «сохрани заказ». Скрывает детали хранения от бизнес-логики. Unit of Work — отслеживает изменения … Middle6 мин
  5. 38 Domain-Driven Design: Entity, Value Object, Aggregate, Domain Event? DDD — подход к сложным доменам: модель кода отражает язык и правила бизнеса. Стратегическая часть: Ubiquitous Language (единый язык с экспертами), Bounded Context (грани… Middle8 мин
  6. 39 API Gateway pattern — зачем нужен? API Gateway — единая точка входа для внешних клиентов в систему микросервисов. Клиент знает один адрес, а шлюз маршрутизирует запросы к нужным сервисам. Типичные функции… Middle6 мин
  7. 40 Outbox pattern — зачем нужен при работе с очередями и БД? Проблема dual write: нужно изменить БД и отправить сообщение в брокер. Это две разные системы — атомарно не получится: упадёт между шагами → либо данные есть, а события … Middle7 мин
  8. 41 Circuit Breaker, Retry, Bulkhead — паттерны отказоустойчивости? В распределённой системе зависимости будут отказывать: сеть, перегрузка, деплой. Задача — не допустить каскадного отказа и восстанавливаться автоматически. Timeout — не … Middle6 мин
  9. 42 Что такое Event-Driven Architecture? EDA — архитектура, где компоненты взаимодействуют через события: факты о произошедшем («заказ оформлен»), которые публикуются без знания о получателях. Производитель и п… Middle5 мин
  10. 43 GoF паттерны, которые реально встречаются в .NET: Factory, Decorator, Strategy, Observer, Proxy? Factory / Factory Method / Abstract Factory — инкапсулируют создание объектов: IHttpClientFactory, ILoggerFactory, DbProviderFactory, фабрики в DI (AddScoped(sp => ...))… Middle6 мин
  11. 44 Что такое Strangler Fig — постепенная миграция legacy? Strangler Fig (Мартин Фаулер, по аналогии с фикусом-душителем) — постепенная замена legacy-системы: новая система растёт вокруг старой, забирая функциональность по частя… Middle6 мин

Тестирование4

  1. 45 Как тестировать код с DI: TestServer, WebApplicationFactory? WebApplicationFactory<TEntryPoint> (пакет Microsoft.AspNetCore.Mvc.Testing) поднимает всё приложение в памяти: реальный Program.cs, DI, конфигурацию, middleware, маршрут… Middle6 мин
  2. 46 Как тестировать EF Core: InMemory vs реальная БД vs Testcontainers? InMemory-провайдер — быстрый, но не реляционный: нет транзакций, FK и уникальных ограничений, SQL-трансляции (запросы выполняются как LINQ-to-Objects), ExecuteUpdate/raw… Middle6 мин
  3. 47 TDD vs BDD — в чём разница, когда применять? TDD (Test-Driven Development) — техника разработки: сначала пишем падающий тест (Red), затем минимальный код, чтобы он прошёл (Green), затем улучшаем код (Refactor). Кор… Middle6 мин
  4. 48 Как тестировать асинхронный код в .NET? Тестовые методы — async Task (не async void!), внутри — await. Все фреймворки (xUnit, NUnit, MSTest) ждут завершения Task. Никогда .Result / .Wait() в тестах — риск dead… Middle5 мин

Очереди и асинхронная обработка5

  1. 49 At-least-once vs At-most-once vs Exactly-once delivery? At-most-once — «не больше одного раза»: сообщение может потеряться, но не будет дублей. Реализация: подтвердить (ack/commit offset) до обработки или вообще без подтвержд… Middle6 мин
  2. 50 Идемпотентность — что это и как обеспечивать? Идемпотентная операция — повторное выполнение с теми же входными данными даёт тот же результат и не создаёт дополнительных побочных эффектов: f(f(x)) = f(x). Зачем: в ра… Middle7 мин
  3. 51 Как работает MassTransit или другой .NET-клиент для брокеров? MassTransit — фреймворк сообщений для .NET поверх транспорта (RabbitMQ, Azure Service Bus, Amazon SQS, Kafka-rider, in-memory для тестов). Скрывает низкоуровневые детали… Middle6 мин
  4. 52 Что такое Backpressure? Backpressure (противодавление) — механизм, с помощью которого медленный потребитель сигнализирует быстрому производителю притормозить, чтобы система не переполнилась. Бе… Middle6 мин
  5. 53 Channels в .NET (System.Threading.Channels) — для чего? System.Threading.Channels — высокопроизводительные асинхронные очереди в памяти для паттерна producer-consumer внутри процесса. Channel<T> состоит из ChannelWriter<T> (W… Middle5 мин

Производительность и диагностика7

  1. 54 Как профилировать .NET приложение: dotnet-trace, PerfView, BenchmarkDotNet? Правило №1: сначала измерь. Интуиция о «медленном месте» ошибается чаще, чем кажется. dotnet-counters — метрики в реальном времени (CPU, GC, потоки пула, исключения, зап… Middle7 мин
  2. 55 Что такое GC паузы и как минимизировать аллокации? GC-пауза — время, когда сборщик приостанавливает управляемые потоки (фазы пометки и уплотнения). Эфемерные сборки (Gen 0/1) — доли–единицы мс; Gen 2 / LOH — десятки–сотн… Middle7 мин
  3. 56 Memory leaks в .NET — типичные причины, как находить? В .NET утечка — это объекты, которые больше не нужны, но остаются достижимыми от корней GC (статик, синглтон, живой поток, таймер), поэтому GC не может их собрать. Плюс … Middle6 мин
  4. 57 CPU-bound vs I/O-bound задачи — как правильно распараллеливать? I/O-bound — время уходит на ожидание внешних систем (БД, HTTP, диск, сеть). Решение — асинхронность: async/await, Task.WhenAll для параллельных независимых вызовов. Пото… Middle6 мин
  5. 58 Как работает кэширование: IMemoryCache, IDistributedCache, Redis? Кэш хранит результаты дорогих операций (запросы к БД, вызовы API, вычисления) ближе к месту использования. Эффект: меньше задержка, меньше нагрузка на источник. Цена — у… Middle6 мин
  6. 59 Что такое connection pooling для БД и HTTP? Установка соединения дорогая: TCP handshake + TLS + аутентификация (для БД ещё и создание серверного процесса/сессии) — единицы–десятки миллисекунд. Пул держит открытые … Middle6 мин
  7. 60 HTTP/2 и HTTP/3 — преимущества для .NET сервисов? HTTP/1.1: текстовый протокол, один запрос за раз на соединение (pipelining на практике не используется) → браузеры открывают 6 соединений на хост, заголовки повторяются … Middle6 мин

DevOps и инфраструктура8

  1. 61 Kubernetes basics: Pod, Deployment, Service, ConfigMap, Secret? Kubernetes — оркестратор контейнеров: вы описываете желаемое состояние (YAML-манифесты), контроллеры постоянно приводят кластер к нему (перезапуск упавших, масштабирован… Middle7 мин
  2. 62 Как настроить CI/CD для .NET проекта (GitHub Actions, GitLab CI, Azure DevOps)? CI (Continuous Integration) — каждый push/PR автоматически: restore → build → тесты → анализ (линтеры, форматирование, уязвимости, покрытие). Цель — быстро узнать, что и… Middle7 мин
  3. 63 Что такое Helm chart и зачем он нужен? Helm — пакетный менеджер Kubernetes. Chart — пакет: набор шаблонов манифестов (Deployment, Service, Ingress, ConfigMap, HPA...) + файл параметров values.yaml + метаданны… Middle7 мин
  4. 64 Как реализовать blue-green и canary деплой? Rolling update (по умолчанию в Kubernetes) — поды заменяются постепенно; старая и новая версии работают одновременно; откат — такой же постепенный. Blue-green — два полн… Middle6 мин
  5. 65 Что такое OpenTelemetry и как его подключить в .NET? OpenTelemetry (OTel) — открытый вендор-нейтральный стандарт (CNCF) и набор SDK для сбора телеметрии: трассировок (traces), метрик (metrics) и логов (logs). Один способ и… Middle6 мин
  6. 66 Distributed tracing: TraceId, SpanId, как связывать логи? Трассировка (trace) — полная история одного запроса через все сервисы; состоит из spans — операций с началом, длительностью, атрибутами и статусом (HTTP-обработка, SQL-з… Middle6 мин
  7. 67 Метрики: Prometheus + Grafana, .NET Metrics API? Метрика — числовое измерение во времени с набором меток (labels/tags): http_server_request_duration_seconds{route="/orders", status="500"}. Дёшево хранить и агрегировать… Middle6 мин
  8. 68 Секреты: Vault, Azure Key Vault, Kubernetes Secrets — лучшие практики? Секрет — всё, что даёт доступ: пароли БД, API-ключи, строки подключения, сертификаты, ключи подписи JWT, ключи шифрования. Утечка = компрометация системы. Никогда: в код… Middle7 мин

Безопасность7

  1. 69 OWASP Top 10 — какие актуальны для .NET приложений? OWASP Top 10 — рейтинг самых критичных рисков веб-приложений (редакция 2021; готовится обновление), основанный на данных реальных уязвимостей. A01 Broken Access Control … Middle7 мин
  2. 70 JWT: структура, подпись, хранение, refresh токены, отзыв? JWT = header.payload.signature — три части в Base64Url. Header: алгоритм (alg) и тип, ключ (kid). Payload: claims — sub, iss, aud, exp, iat, nbf, jti + свои (role, scope… Middle7 мин
  3. 71 OAuth 2.0 и OpenID Connect: в чём разница, какие flow использовать? OAuth 2.0 — протокол делегированной авторизации: пользователь разрешает приложению (client) доступ к своим ресурсам на resource server, не передавая пароль. Результат — … Middle8 мин
  4. 72 Как хранить пароли: BCrypt, Argon2, PBKDF2 — и почему не SHA-256? Пароли не шифруют (шифрование обратимо — утечёт ключ, утекут все пароли), а хэшируют специальной медленной функцией с солью. Соль — уникальная случайная строка для каждо… Middle6 мин
  5. 73 HTTPS, TLS и сертификаты в .NET: как работает и как настроить? TLS обеспечивает три вещи: конфиденциальность (шифрование), целостность (данные не изменены) и аутентификацию сервера (вы говорите именно с bank.uz). HTTPS = HTTP поверх… Middle6 мин
  6. 74 Чувствительные данные в логах и ответах API: как не допустить утечки? Чувствительные данные: пароли, токены, API-ключи, строки подключения, номера карт (PCI DSS), паспортные данные, телефоны, email, адреса, медицинские данные — всё, что по… Middle7 мин
  7. 75 Уязвимые зависимости: как находить и обновлять NuGet-пакеты? Код приложения — это на 80–90% чужой код: NuGet-пакеты и их транзитивные зависимости, базовые Docker-образы, сам .NET runtime. Уязвимость в любом из них — уязвимость при… Middle6 мин

Работа в команде и процессы1

  1. 76 Горящий дедлайн: что делать, если не успеваете? Главное правило: сообщить рано. Проблема, о которой узнали за 2 недели, — управляемый риск; за день до срока — провал и потеря доверия. Железный треугольник: объём (scop… Middle6 мин
Трек Junior →Трек Senior →