Backend Developer C# / .NET
Уроки с примерами кода; тему можно сразу закрепить вопросами в тренажёре.
Материалы открываются после регистрации на Free.
Уроки по модулям
Язык C#
12 уроковСемантика языка C# и её последствия для производительности: модель типов и обобщения, делегаты и события, исключения, время жизни ресурсов, а также продвинутый слой — pattern matching, records, expression trees, reflection и source generators.
- Как устроены обобщения в .NET
- Делегаты и события — модель и распространённые ловушки
- Исключения: стоимость, типы, паттерны и анти-паттерны
- IDisposable, using и финализаторы
- Nullable reference types — что они на самом деле делают
- Сопоставление с образцом: тест и сужение в одном выражении
- Records: равенство по значению, with и деконструкция
- Деревья выражений: лямбда как данные, описывающие код
- Reflection: модель метаданных и её стоимость
- Source generators — компиляторное метапрограммирование
- Строки: интернирование, StringBuilder и стоимость конкатенации
- Равенство и хеш-код: контракт Equals/GetHashCode и упаковка
Среда выполнения .NET (CLR)
10 уроковКак устроена среда выполнения .NET: загрузка сборок и типов, JIT-компиляция, управление памятью и сборка мусора, пул потоков, граница managed/unmanaged, Native AOT и P/Invoke. Помогает отличать гарантии языка от поведения кода под нагрузкой.
- Архитектура CLR: загрузчик, JIT, GC, метаданные
- JIT, многоуровневая компиляция и ReadyToRun
- Сборки и загрузка типов в .NET
- GC: поколения, фазы, mark/sweep/compact
- Сборщик мусора: server и workstation, задержка против пропускной способности
- Large Object Heap и фрагментация
- Managed и unmanaged ресурсы: SafeHandle, IDisposable, ArrayPool
- Как работает пул потоков и планирование в .NET
- Native AOT: что включается, что выключается
- P/Invoke и interop — что происходит на границе
Асинхронность и многопоточность
4 урокаАсинхронность и многопоточность в .NET: модель async/await и Task как конечный автомат, отличие асинхронной работы от параллелизма, композиция задач, кооперативная отмена и типичные ошибки вроде блокирующих вызовов и взаимоблокировок.
- Что делают async и await на самом деле
- Композиция задач: WhenAll, WhenAny и параллельный ввод-вывод
- Отмена и таймауты: CancellationToken и кооперативная отмена
- Асинхронные потоки: IAsyncEnumerable и await foreach
LINQ и коллекции
3 урокаКоллекции и их стоимость по памяти и времени, и LINQ как декларативный слой запросов: отложенное выполнение, разница между IEnumerable и IQueryable и момент материализации запроса.
- Коллекции и их стоимость: выбор по памяти и времени
- LINQ — внутренняя модель, IEnumerable, deferred execution
- IEnumerable и IQueryable: где выполняется запрос и когда материализуется
Типы, память и упаковка
4 урокаЗначимые и ссылочные типы, их размещение в стеке и куче, упаковка, выбор между struct и record, а также работа с буферами без лишних аллокаций (Span, Memory, stackalloc) и unsafe-контекст. От этих решений зависит нагрузка на сборщик мусора.
- Значимые и ссылочные типы в C#
- Struct vs class на границе производительности
- Span<T>, Memory<T> и stackalloc — работа с буферами без копий
- Unsafe-контекст и указатели в C#
Синхронизация и параллелизм
5 уроковДоступ к общему состоянию из нескольких потоков без гонок и взаимоблокировок: примитивы синхронизации (lock, SemaphoreSlim, Interlocked), модель памяти и видимость изменений, потокобезопасные коллекции и Channels, параллельные паттерны.
- lock, Monitor и гонки данных: модель памяти и видимость
- SemaphoreSlim и асинхронная координация: почему lock не дружит с await
- Interlocked и основы lock-free: атомарные операции и CAS
- Потокобезопасные коллекции и Channels
- Параллельные паттерны: Parallel.For/ForEach и PLINQ
ASP.NET Core
3 урокаКак устроено приложение ASP.NET Core: модель хостинга и запуск через Program.cs, система конфигурации с приоритетом источников и паттерн Options для типобезопасного доступа к настройкам.
- Хостинг и запуск: WebApplication и Program.cs
- Система конфигурации: провайдеры и приоритет источников
- Паттерн Options: IOptions, IOptionsSnapshot, IOptionsMonitor
Внедрение зависимостей
4 урокаКонтейнер внедрения зависимостей в .NET: регистрация сервисов, время жизни transient/scoped/singleton, захват зависимости через несовместимое время жизни и продвинутые способы регистрации.
- Контейнер DI и регистрация сервисов
- Время жизни сервисов: transient, scoped, singleton
- Захваченные зависимости и утечки через время жизни
- Продвинутая регистрация: keyed-сервисы, открытые обобщения, коллекции
Конвейер и маршрутизация
3 урокаКонвейер обработки запроса в ASP.NET Core: middleware и значение их порядка, маршрутизация запроса к обработчику и привязка модели — откуда обработчик получает свои аргументы.
- Конвейер middleware: порядок и короткое замыкание
- Маршрутизация и endpoints: как запрос находит обработчик
- Привязка модели: откуда берутся аргументы обработчика
HTTP и REST-семантика
4 урокаСемантика HTTP независимо от фреймворка: методы и коды состояния, безопасность и идемпотентность, кэширование с условными запросами и согласование содержимого — основа предсказуемого API.
- HTTP-методы и коды состояния: что они означают
- Безопасность и идемпотентность методов
- Кэширование и условные запросы: Cache-Control и ETag
- Согласование содержимого: Accept и форматтеры
Контракты и валидация
4 урокаКонтракт API как обещание клиентам: валидация входных данных, единый формат ошибок, описание через OpenAPI и версионирование, чтобы изменения сервиса не ломали потребителей.
- Валидация модели: DataAnnotations и ModelState
- Единый контракт ошибок: ProblemDetails (RFC 9457)
- Описание API через OpenAPI
- Версионирование API
EF Core
7 уроковКак ORM работает поверх реляционной БД: DbContext и отслеживание изменений, трансляция LINQ в SQL, загрузка связанных данных, миграции и стоимость материализации. Где EF Core экономит время, а где порождает лишние запросы — и когда дешевле Dapper.
- DbContext и отслеживание изменений
- IQueryable против IEnumerable и трансляция запроса в SQL
- Загрузка связанных данных: lazy, eager и explicit
- AsNoTracking, SplitQuery и стоимость материализации
- Миграции: модель, обратная совместимость и откат
- Сырой SQL, хранимые процедуры и блокировки строк
- Dapper против EF Core: когда ORM лишний
Безопасность в ASP.NET Core
4 урокаКак ASP.NET Core реализует аутентификацию и авторизацию: схемы и обработчики, проверка JWT через JwtBearer, авторизация на ролях, claim'ах и политиках, а также безопасное хранение секретов через конфигурацию. Сами протоколы (OAuth2/OIDC/JWT) — отдельный курс; здесь — их прикладной слой в .NET.
- Аутентификация в ASP.NET Core: схемы и обработчики
- Проверка JWT через JwtBearer
- Авторизация: роли, claim'ы и политики
- Конфигурация и секреты в .NET
Готовность к продакшну
2 урокаЧто отличает рабочий сервис от учебного: тесты, наблюдаемость, устойчивость к сбоям, фоновые задачи и предсказуемый деплой — свойства, которые закладываются в код, а не добавляются потом. Модуль задаёт рамку секции и разбирает один сквозной механизм хостинга — корректное завершение процесса под управлением оркестратора.
- Что отличает продакшн-сервис от учебного
- Жизненный цикл хоста и graceful shutdown
Тестирование
4 урокаТесты фиксируют поведение сервиса и защищают от регрессий: пирамида юнит-, интеграционных и end-to-end тестов, изоляция зависимостей через тестовые двойники и проектирование кода под проверяемость. Модуль разбирает, что тестировать на каждом уровне, как заменять зависимости и как проверять код, завязанный на время и базу данных.
- Пирамида тестов: что проверять на каждом уровне
- Юнит-тесты и тестовые двойники
- Проектирование под тестируемость
- Интеграционные тесты ASP.NET Core
Наблюдаемость
4 урокаПод нагрузкой поведение сервиса непрозрачно, и наблюдаемость возвращает прозрачность: логи, метрики и трассировки как три разных канала, структурированное логирование со сквозным идентификатором запроса, health-проверки для оркестратора и распределённая трассировка через OpenTelemetry. Модуль учит видеть, что сервис делает в проде, а не догадываться по симптомам.
- Три канала наблюдаемости: логи, метрики, трассировки
- Структурированные логи и сквозной идентификатор
- Health-проверки и пробы оркестратора
- Метрики и распределённая трассировка
Устойчивость к сбоям
3 урокаСетевые вызовы падают, и сервис должен переживать частичные отказы без каскада: правильное время жизни HttpClient, повторы с таймаутом и выдержкой, размыкатель цепи и деградация вместо полного отказа. Модуль начинает с самой частой .NET-ошибки — исчерпания сокетов из-за неверного обращения с HttpClient — и доводит до набора политик устойчивости.
- HttpClient и исчерпание сокетов
- Повторы, таймауты и выдержка
- Размыкатель цепи и деградация
Фоновая обработка
2 урокаДлительная работа не должна жить в обработчике HTTP-запроса: её выносят в фоновые сервисы, которые живут весь срок процесса. Модуль разбирает hosted-сервисы и их жизненный цикл, типичную ошибку со scoped-зависимостью внутри singleton, очереди работы внутри процесса через Channels и границу, за которой нужна уже внешняя очередь сообщений.
- Hosted-сервисы и их жизненный цикл
- Очереди внутри процесса и Channels
Контейнеры и CI/CD
2 урокаВоспроизводимая сборка делает деплой предсказуемым: сервис упаковывают в контейнер из небольшого образа, конфигурацию выносят в переменные окружения, а сборку, тесты и публикацию автоматизируют конвейером. Модуль разбирает multi-stage Dockerfile для .NET и базовый pipeline сборки и доставки — тонко, по реальному спросу junior/middle.
- Контейнеризация .NET-сервиса
- Конвейер сборки и доставки
Углублённые направления
1 урокНаправления для роста после уверенного владения основой: профилирование, локальная оркестрация, специализированные протоколы и режимы выполнения. Модуль задаёт рамку секции и главный принцип — эти темы изучают по реальной потребности, когда задача действительно их требует, а не впрок.
- Когда тянуться к специализации
Профилирование
2 урокаОптимизация начинается с измерения, а не с догадок: как найти настоящее узкое место профилировщиком и счётчиками, прежде чем что-то менять, и как .NET-инструменты диагностики показывают аллокации, паузы сборщика мусора и горячий код. Модуль учит измерять, а не угадывать, где сервис тормозит.
- Измерять, а не угадывать
- Инструменты диагностики .NET
.NET Aspire
1 урокРаспределённое приложение из нескольких сервисов трудно запускать и настраивать локально. .NET Aspire оркеструет такой набор для разработки: поднимает сервисы и их зависимости вместе, связывает их обнаружением сервисов и включает наблюдаемость по умолчанию. Модуль показывает, какую задачу разработки Aspire решает и где его граница.
- .NET Aspire и локальная оркестрация
gRPC на .NET
1 урокКак gRPC устроен в .NET на практике: контракт в файле .proto, из которого генерируются и сервис, и типизированный клиент, поверх HTTP/2 с бинарным форматом Protobuf и поддержкой стриминга. Модуль — про реализацию gRPC в ASP.NET Core; решение «gRPC или REST» разбирает курс по архитектуре.
- gRPC на .NET: контракт и реализация
Native AOT
1 урокОбычно .NET компилирует код в нативный на лету (JIT) при запуске. Native AOT компилирует приложение в нативный код заранее, при сборке: быстрее старт и меньше потребление памяти ценой ограничений на рефлексию и совместимость. Модуль показывает, что даёт AOT и почему это выбор для специфичных нагрузок, а не дефолт.
- Native AOT и его компромиссы
Real-time и GraphQL
2 урокаДва специализированных способа общения клиента и сервера: двусторонняя связь в реальном времени через WebSockets и SignalR, когда сервер должен сам слать обновления клиенту, и гибкие запросы через GraphQL, когда клиент хочет сам выбирать, какие данные получить. Модуль показывает, какую задачу решает каждый и какой операционной ценой.
- Real-time: WebSockets и SignalR
- GraphQL: клиент выбирает данные
О курсе
Глубокое понимание C# и платформы .NET для backend-разработки. Курс разбирает не синтаксис, а семантику языка и поведение среды выполнения: модель типов и обобщения, асинхронность и многопоточность, работу с памятью и коллекциями, устройство CLR — JIT-компиляцию, сборку мусора, пул потоков, — а также прикладной слой ASP.NET Core и EF Core. Цель — научиться видеть стоимость абстракций и поведение кода под нагрузкой, а не просто заставлять его работать.