Перейти к основному содержимому

Вопросы на собеседовании

Вопросы на собеседовании .NET-разработчика

25 вопросов на собеседовании .NET-разработчика: C#, ASP.NET Core, Entity Framework и SQL Server, микросервисы, асинхронность, Docker, поведенческие вопросы.

Мои ответы на эти вопросы — за 30 секунд

Без резюме: опыт и последнее место работы. 25 вопросов в ваших словах, первые три — бесплатно.

Типовые вопросы и подсказки к ответам

Откройте подсказку под вопросом — и тут же проговорите ответ: разбор ИИ придёт в мини-собеседовании.

Технический вопрос

Вопрос 1Для всех уровней

Чем ссылочные типы отличаются от значимых в C# и что такое упаковка?

Как отвечать ▾

Как отвечать: Объясните стек и кучу, семантику копирования, boxing/unboxing для структур и почему это важно для производительности в горячих участках кода.

Пример сильного ответа

Значимые типы — это структуры: значение хранится прямо в переменной или внутри объекта, при присваивании копируется целиком, и по умолчанию это не ссылка на общий объект. Ссылочные типы живут в управляемой куче, переменная держит ссылку, а копирование передаёт только ссылку. Упаковка — это приведение значимого типа к object или к интерфейсу: среда создаёт объект в куче и копирует туда значение, а распаковка возвращает копию обратно. Это лишние аллокации и давление на сборщик мусора, поэтому в горячем коде я держу generic-коллекции и избегаю object. На обработке 500 000 записей переход с ArrayList на List<int> снизил потребление памяти примерно на треть.

  • Показана модель памяти, а не заученное определение
  • Упаковка объяснена через последствия для производительности
  • Есть личный пример с измеримым результатом

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

Вопрос 2Junior

Когда вы выберете интерфейс, а когда абстрактный класс?

Как отвечать ▾

Как отвечать: Назовите ключевые отличия: множественная реализация, состояние и реализация по умолчанию — и приведите пример из своего проекта, где выбор был осознанным.

Пример сильного ответа

Выбор зависит от того, нужно ли переиспользовать общее состояние и реализацию. Интерфейс беру, когда важен только контракт: несколько несвязанных типов должны его реализовать, нужна подмена в тестах и слабая связанность. Абстрактный класс — когда есть общие поля и каркас алгоритма, а наследники уточняют отдельные шаги; но наследование в языке только одно. В одном проекте базовая обработка отчётов отличалась лишь форматом вывода, и общий алгоритм с абстрактным методом сериализации убрал дублирование, а интеграции с внешними сервисами мы оставили интерфейсами: четыре реализации подменяются в тестах, покрытие выросло до 80%.

  • Дан критерий выбора, а не формальный ответ
  • Учтено ограничение одиночного наследования
  • Подкреплено примером из практики

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

Вопрос 3Для всех уровней

Как работает async/await в C# и почему вызов .Result на Task опасен?

Как отвечать ▾

Как отвечать: Расскажите про конечный автомат, SynchronizationContext, «async до самого верха» и механику взаимоблокировки при смешивании синхронного ожидания с асинхронным кодом.

Пример сильного ответа

Метод с async компилятор превращает в конечный автомат. Дойдя до await, среда проверяет задачу: если она уже завершена, продолжение идёт синхронно, если нет — управление возвращается вызывающему, поток освобождается, а продолжение ставится в очередь к контексту синхронизации. Обращение к .Result блокирует поток: в приложениях с контекстом синхронизации это даёт взаимную блокировку, а в пуле потоков — их голодание и падение пропускной способности. Поэтому я провожу async по всей цепочке, использую Task.WhenAll и ConfigureAwait(false) в библиотеках. После перевода синхронных HTTP-вызовов на async при 300 одновременных запросах время отклика сократилось примерно втрое.

  • Объяснена механика конечного автомата и контекста
  • Названы обе причины опасности .Result
  • Есть практики и цифра результата

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

Вопрос 4Middle

Как устроен сборщик мусора в .NET: поколения и куча больших объектов?

Как отвечать ▾

Как отвечать: Объясните поколения 0/1/2, LOH и её фрагментацию, когда стоит думать о Span и пулах объектов — и как вы диагностировали проблемы с памятью на практике.

Пример сильного ответа

Сборщик мусора в .NET трассирующий и поколенческий: он определяет живые объекты по ссылкам от корней, а не по счётчикам, и уплотняет память. Поколение 0 — короткоживущие объекты, собирается часто и дёшево; поколение 1 служит буфером; поколение 2 — долгоживущие объекты, его сборка дорогая. Крупные объекты попадают в отдельную кучу больших объектов, которая по умолчанию не уплотняется, поэтому там возможна фрагментация. На практике я сокращаю аллокации: переиспользую буферы через пулы, избегаю временных больших массивов. На сервисе с нагрузкой около 2000 запросов в секунду это заметно снизило частоту длинных пауз.

  • Раскрыты поколения, куча больших объектов и уплотнение
  • Показано, как кандидат снижает давление на GC
  • Есть цифра нагрузки и наблюдаемый результат

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

Вопрос 5Middle

Чем IEnumerable отличается от IQueryable и что такое отложенное выполнение?

Как отвечать ▾

Как отвечать: Покажите разницу между выполнением в памяти и трансляцией в SQL, опасность случайной материализации запроса и пример, где это приводило к лишним запросам к базе.

Пример сильного ответа

IEnumerable описывает перечисление объектов в памяти: LINQ к нему компилируется в делегаты и выполняется на стороне приложения. IQueryable хранит дерево выражений, и провайдер транслирует его в запрос к источнику, например в SQL, поэтому фильтрация и проекция выполняются на сервере. Отложенное выполнение означает, что запрос строится, но не исполняется, пока его не начнут перечислять: foreach, ToList, Count. Отсюда риск случайно вытянуть всю таблицу, если после запроса к базе добавить свой метод или фильтр в памяти. В одном проекте мы перенесли фильтрацию до ToList и добавили проекцию в Select: вместо десятков тысяч строк приходит около 200, ответ ускорился с секунд до десятков миллисекунд.

  • Чётко разделены модель памяти и провайдер запросов
  • Объяснено отложенное выполнение и его риск
  • Пример с конкретным ускорением

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

Вопрос 6Middle

Какие времена жизни сервисов есть во встроенном DI-контейнере .NET?

Как отвечать ▾

Как отвечать: Разберите Singleton, Scoped и Transient, проблему захваченной зависимости (singleton, держащий scoped-сервис) и как это проявляется с DbContext в ASP.NET Core.

Пример сильного ответа

Во встроенном DI-контейнере .NET есть три времени жизни: Transient, Scoped и Singleton. Transient создаётся при каждом запросе, Scoped — один экземпляр на область, обычно на HTTP-запрос, Singleton — один на всё приложение. На практике я чаще всего использую Scoped для репозиториев и DbContext, Singleton — для кэшей и конфигурации, Transient — для лёгких stateless-сервисов. В проекте при переходе с Transient на Scoped для сервиса доступа к базе число открытых соединений удаётся сократить примерно на 30 процентов, нагрузка заметно снижается. Главное — не внедрять Scoped в Singleton напрямую, иначе получаем captive dependency.

  • Чётко перечислены все три времени жизни и их назначение.
  • Приведён практический пример с измеримым результатом.
  • Показано понимание captive dependency — типичной ошибки.

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

Вопрос 7Для всех уровней

Опишите конвейер обработки запроса в ASP.NET Core: middleware, маршрутизация, фильтры.

Как отвечать ▾

Как отвечать: Пройдите по цепочке: middleware в порядке регистрации, endpoint routing, фильтры MVC — и объясните, где правильно размещать аутентификацию, логирование и обработку ошибок.

Пример сильного ответа

Запрос приходит на сервер, дальше идёт цепочка middleware в порядке регистрации: обработка исключений, HSTS, статика, аутентификация, авторизация, маршрутизация. UseRouting сопоставляет путь с endpoint, UseEndpoints его выполняет. Затем подключаются фильтры: authorization, resource, action, exception и result — они привязаны к конкретному действию и умеют работать с его аргументами. Внутри — model binding, валидация, вызов действия, формирование результата. Ключевой момент: middleware видит только HttpContext, а фильтры — контекст действия. Поэтому замер времени выполнения действия ставлю фильтром, а не middleware.

  • Порядок конвейера изложен корректно и по шагам
  • Чётко разделены middleware и фильтры
  • Есть практический вывод про логирование

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

Вопрос 8Middle

Когда логику стоит выносить в middleware, а когда в фильтры или атрибуты?

Как отвечать ▾

Как отвечать: Покажите критерий выбора: сквозные задачи до маршрутизации — в middleware, логика, привязанная к контроллерам и модели, — в фильтры; приведите пример из своего кода.

Пример сильного ответа

Ориентируюсь на область действия и на то, нужен ли доступ к контексту действия. Middleware — когда логика касается всего трафика и не знает про MVC: CORS, сжатие, сквозной correlation-id, обработка исключений, ограничение частоты запросов. Фильтры и атрибуты — когда важно знать действие, его аргументы, модель или результат: валидация входных данных, проверка прав на конкретную операцию, кэширование ответа, единый формат ошибок. В одном проекте перенос части проверок из middleware в фильтр убрал дублирование в сорока действиях и сократил код почти вдвое.

  • Дан чёткий критерий выбора между middleware и фильтрами
  • Приведены уместные примеры для каждого варианта
  • Подкреплено измеримым результатом

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

Вопрос 9Middle

Что такое проблема N+1 в Entity Framework Core и как вы её находите и устраняете?

Как отвечать ▾

Как отвечать: Расскажите про Include и проекции в DTO через Select, разделённые запросы, включение логирования команд EF и как обнаруживаете проблему по трассе SQL.

Пример сильного ответа

Это когда на запрос списка сущностей приходится ещё по запросу на каждую связанную сущность вместо одного join. Нахожу по логам: включаю логирование EF Core и смотрю, сколько SQL уходит на одну операцию. Ещё помогает профилировщик на стенде с реалистичным объёмом данных. Устраняю через Include и ThenInclude, проекцию в DTO через Select, а для сложных выборок — split query, если один join раздувает результат. На одном отчёте такая правка снизила число запросов с нескольких сотен до трёх, а время ответа — примерно в пять раз.

  • Верно объяснена суть проблемы
  • Названы конкретные способы диагностики
  • Есть измеримый результат до и после

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

Вопрос 10Для всех уровней

Как вы применяете миграции EF Core на продакшене без простоя и потери данных?

Как отвечать ▾

Как отвечать: Опишите генерацию SQL-скриптов, обратно совместимые изменения схемы, отдельный шаг миграций в пайплайне и план отката.

Пример сильного ответа

Работаю по схеме обратно совместимых изменений и раскатываю их этапами. Сначала аддитивный шаг: добавляю новую колонку или таблицу как nullable, при необходимости с дефолтом, и заполняю данные отдельным скриптом батчами. Дальше приложение учится писать в оба места, потом переключается на новое. И только на следующем релизе удаляю старое. Миграции применяю отдельным шагом деплоя, а не на старте приложения, и перед этим снимаю бэкап. Так на таблице в несколько десятков миллионов строк переезд обошёлся без простоя и без потери данных.

  • Описан безопасный поэтапный подход к изменениям схемы
  • Учтены бэкап и отдельный шаг применения миграций
  • Есть результат на большом объёме данных

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

Вопрос 11Middle

Запрос к SQL Server вдруг стал работать медленно. Как вы будете искать причину?

Как отвечать ▾

Как отвечать: Назовите инструменты: план выполнения запроса, статистика и её устаревание, сортировки и сканирования вместо поиска по индексу, блокировки — и пример из практики.

Пример сильного ответа

Обычно начинаю с плана выполнения: смотрю, где оптимизатор ошибается — сканирование вместо поиска, лишние сортировки, неверная оценка числа строк. Дальше проверяю статистику и индексы, ожидания сессии и блокировки, при необходимости снимаю трассировку через Extended Events. В одном проекте отчёт тормозил на 8 секунд из-за отсутствующего покрывающего индекса: после его добавления время упало до 200 миллисекунд. Отдельно проверяю, не изменился ли план после обновления статистики и не вырос ли объём данных. Выводы фиксирую в тикете, чтобы похожие запросы не всплывали снова.

  • Показан системный порядок диагностики, а не гадание
  • Есть конкретные метрики до и после оптимизации
  • Упомянуты инструменты, знакомые любому .NET-разработчику

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

Вопрос 12Для всех уровней

Что такое транзакции и уровни изоляции и когда без них нельзя обойтись?

Как отвечать ▾

Как отвечать: Объясните атомарность на примере перевода денег, кратко разберите Read Committed, Repeatable Read и Serializable, упомяните риски блокировок и дедлоков.

Пример сильного ответа

Транзакция — это набор операций, который либо применяется целиком, либо откатывается. Уровни изоляции задают, какие аномалии чтения допускаются: грязное чтение, неповторяющееся чтение, фантомы. По умолчанию чаще всего работает read committed, но для критичных участков мне приходилось применять snapshot и явные блокировки. Без транзакций не обойтись там, где деньги, остатки на складе, бронирования: списание и зачисление должны быть атомарны. Но важнее не выбрать уровень, а держать транзакции короткими: сокращение длинной транзакции с 3 секунд до 50 миллисекунд убрало блокировки при пиковой нагрузке.

  • Сначала определение, потом практика — логичный порядок мысли
  • Показано понимание компромисса между изоляцией и блокировками
  • Есть измеримый результат оптимизации

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

Вопрос 13Middle

Как вы проектируете Web API: версионирование, валидация, обработка ошибок?

Как отвечать ▾

Как отвечать: Расскажите про версионирование через URL или заголовки, FluentValidation или DataAnnotations, единый формат ошибок ProblemDetails и идемпотентность операций.

Пример сильного ответа

Версионирую через URL-сегмент, например v1 и v2: так проще и клиентам, и логированию. Валидацию делаю декларативно, через атрибуты и FluentValidation, с единым форматом ответа об ошибке — код, сообщение, список полей. Исключения ловлю в middleware: бизнес-ошибки превращаются в понятные коды 4xx, неожиданные — в 500 с correlation id для поиска в логах. Наружу отдаю только отдельные DTO, модели базы не публикую. В одном проекте такой подход сократил число обращений в поддержку по интеграции примерно на треть. Документацию держу в Swagger с примерами.

  • Названы все четыре зоны: версии, валидация, ошибки, контракты
  • Есть бизнес-эффект, а не только технические детали
  • Упоминаются понятные инструменты из экосистемы .NET

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

Вопрос 14Senior

Как вы делите систему на микросервисы и организуете их взаимодействие?

Как отвечать ▾

Как отвечать: Говорите о границах по бизнес-контекстам, синхронном REST/gRPC против событий через RabbitMQ или Kafka, распределённых транзакциях и сагах — с примером из опыта.

Пример сильного ответа

Делю не по слоям, а по бизнес-возможностям: у каждого сервиса своя зона ответственности и своя база, чтобы не было общих таблиц. Границы определяю по домену, спорные места сначала разбираю на схеме взаимодействия. Связь строю асинхронно через брокер для событий и синхронно по HTTP только там, где ответ нужен сразу. Чтобы не тянуть распределённые транзакции, использую саги и идемпотентные обработчики. В проекте с 6 сервисами такой подход позволил командам выпускать изменения независимо, и релизный цикл сократился с двух недель до нескольких дней.

  • Показано понимание границ по домену, а не по технологиям
  • Есть ответ на главную боль — распределённые транзакции
  • Результат измерен в скорости релизов

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

Вопрос 15Senior

Как сделать распределённую систему устойчивой к сбоям зависимостей?

Как отвечать ▾

Как отвечать: Назовите конкретные паттерны: повторные попытки с экспоненциальной задержкой, circuit breaker через Polly, паттерн outbox для надёжной публикации событий, таймауты и health checks.

Пример сильного ответа

Первое — таймауты: без них зависший вызов держит потоки. Дальше повторные попытки с экспоненциальной задержкой и джиттером, и только для идемпотентных операций. Circuit breaker разрывает поток к упавшей зависимости, а bulkhead ограничивает число одновременных вызовов, чтобы отказ одной интеграции не утянул весь сервис. Плюс кэш на время недоступности и осознанная деградация: показать частичные данные вместо ошибки. Обязательны метрики и алерты по ним. После внедрения такого набора в одном проекте доля неуспешных запросов к внешней интеграции упала с 4% до 0,3%.

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

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

Вопрос 16Middle

Какое кеширование вы применяли в .NET и как решаете проблему инвалидации?

Как отвечать ▾

Как отвечать: Сравните IMemoryCache и распределённый кеш на Redis, расскажите про время жизни записей, вытеснение, штамп запросов к кешу и случай устаревших данных из практики.

Пример сильного ответа

В .NET чаще всего применяю двухуровневое кеширование: локальный IMemoryCache для самых горячих данных и распределённый Redis через IDistributedCache — для того, что должно быть общим для всех инстансов. Кеширую справочники, результаты тяжёлых агрегаций и каталог. Инвалидацию решаю комбинацией приёмов: короткий TTL, версионирование ключей и событие в шине — при изменении данных сервис публикует сообщение, и все инстансы сбрасывают свои ключи. Плюс отдельно слежу, чтобы у кеша были лимит по размеру и метрики попаданий. На одном сервисе это дало hit rate около 95% и снизило p95 ответа каталога с 400 до 30 миллисекунд.

  • Показаны два уровня кеша и конкретные инструменты .NET
  • Инвалидация раскрыта через TTL, версии и события
  • Есть измеримый результат: hit rate и p95

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

Вопрос 17Middle

Как вы ищете узкие места производительности .NET-приложения?

Как отвечать ▾

Как отвечать: Назовите инструменты: dotnet-counters и dotnet-dump, профилировщики dotTrace или PerfView, BenchmarkDotNet для микробенчмарков — и подчеркните: сначала замер, потом оптимизация.

Пример сильного ответа

Начинаю не с профилировщика, а с метрик и трейсов: смотрю p95 и p99, работу сборщика мусора, потребление CPU и количество запросов к базе по операциям. Для .NET беру dotnet-counters и OpenTelemetry, дальше — dotnet-trace и dotnet-dump, когда нужно понять распределение времени по методам или состояние кучи. Микробенчмарки делаю через BenchmarkDotNet, а нагрузочные проверки — на staging, чтобы гипотезу можно было подтвердить до прода. Чаще всего узкое место — N+1 в EF Core или лишние аллокации. В одном случае AsNoTracking с проекцией в DTO убрало N+1: p95 упал с 1,2 секунды до 250 миллисекунд.

  • Назван конкретный стек инструментов для .NET
  • Видна логика: метрики, затем профилирование, затем проверка
  • Есть числовой результат оптимизации

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

Вопрос 18Middle

Как устроена сборка и доставка вашего .NET-сервиса: Docker и CI/CD?

Как отвечать ▾

Как отвечать: Опишите многоступенчатый Dockerfile на базе образов Microsoft, публикацию в режиме self-contained или framework-dependent, прогон тестов и миграций в пайплайне, health checks в контейнере.

Пример сильного ответа

У нас многоэтапная сборка: отдельный образ SDK компилирует и публикует приложение, а в финальный образ копирую только результат — на базе aspnet-runtime, с непривилегированным пользователем и без лишних слоёв. Сначала копирую только файлы проектов, чтобы кешировались слои восстановления пакетов. В CI на каждый коммит идут сборка, юнит- и интеграционные тесты, статический анализ, затем сборка образа и пуш с тегом по хешу коммита. Дальше авто-деплой на staging, смоук-тесты и раскатка на прод скользящим обновлением с health-check. Откат — возврат предыдущего тега образа. Полный цикл занимает около шести минут.

  • Раскрыты и Docker, и CI/CD, а не что-то одно
  • Показано понимание кеша слоёв и непривилегированного пользователя
  • Есть план отката и время цикла

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

Бесплатно, без регистрации

Мини-собеседование: .NET-разработчик

Прочитать вопросы мало — на интервью придётся говорить. Ответьте на один вопрос своими словами, 2–3 предложений хватит, и ИИ разберёт ответ по четырём критериям: структура, конкретика, релевантность, убедительность.

123
Технический вопросДля всех уровней

Чем ссылочные типы отличаются от значимых в C# и что такое упаковка?

2–3 предложения достаточно · ещё 20 симв.

Кейс

Вопрос 1Middle

Кейс: в проде у сервиса растёт потребление памяти, а под нагрузкой растёт время ответа. Ваши действия?

Как отвечать ▾

Как отвечать: Покажите методичность: метрики и dotnet-counters, снятие дампа и анализ удерживаемых объектов, типичные причины — статические коллекции, подписки на события, неотпущенные ресурсы, — и проверка исправления бенчмарком.

Пример сильного ответа

Сначала смотрю на графики: растёт ли managed heap, что происходит с Gen2 и LOH, как меняются паузы сборщика мусора и время ответа. Параллельно снимаю dotnet-counters по процессу и делаю снимки dotnet-gcdump или dotnet-dump, чтобы понять, какие типы держат память. Если память растёт вместе с нагрузкой, а ответы замедляются, причины чаще всего такие: утечка через статические коллекции, подписки на события и неосвобождённые ресурсы, кеш без лимита, нехватка потоков из-за sync-over-async. Быстрое действие — масштабировать и перезапустить, затем убрать причину. Один раз помогло ограничение кеша по размеру: потребление упало с 2,5 ГБ до 600 МБ, и время ответа вернулось в норму.

  • Есть план: сначала диагностика, потом стабилизация, потом фикс
  • Перечислены типичные причины роста памяти
  • Есть цифры до и после исправления

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

Эти вопросы задают всем. По вашему резюме спросят другое. Перерывы, переходы, цифры — покажем 5 вопросов, которые зададут именно вам.

Вопросы по моему резюме

Поведенческий вопрос

Вопрос 1Для всех уровней

Расскажите о самом сложном баге, который вы нашли и исправили.

Как отвечать ▾

Как отвечать: Ответьте по STAR: симптомы и влияние на пользователей, как вы локализовали причину, что оказалось корнем проблемы и какую защиту от повторения добавили.

Пример сильного ответа

Самый неприятный баг проявлялся только под нагрузкой: примерно один запрос из тысячи отваливался по таймауту, а локально воспроизвести не получалось. Порядок действий такой: метрики thread pool и распределённые трейсы — они показали, что счётчик свободных рабочих потоков падает до нуля, а время в очереди растёт. По стеку вызовов удалось найти смесь асинхронного кода с блокирующими вызовами: обращение к результату задачи и синхронные вызовы внутри асинхронного пайплайна. Правка: вся цепочка переведена на честный await, блокировки убраны, тест нагрузки добавлен в CI. После этого p99 снизился примерно с пяти секунд до трёхсот миллисекунд, таймауты прекратились.

  • История построена по схеме ситуация — действие — результат
  • Показан ход диагностики, а не только вывод
  • Есть метрика до и после и защита от повторения

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

Вопрос 2Для всех уровней

Как вы реагируете, когда на код-ревью ваше решение критикуют?

Как отвечать ▾

Как отвечать: Покажите, что обсуждаете код, а не себя: разбираете аргументы по существу, приводите контрпримеры и бенчмарки, готовы менять решение и воспринимаете ревью как обучение.

Пример сильного ответа

Код-ревью для меня — это способ улучшить решение, а не оценка личности, поэтому на комментарии реагирую спокойно. Обычная практика: сначала перечитываю замечание, задаю уточняющий вопрос, если мотив непонятен, и только потом правлю код. Если аргумент ревьюера сильнее, соглашаюсь без спора и фиксирую вывод, чтобы не повторять ошибку. Если вижу, что предложение спорное, привожу факты: замеры, тесты, влияние на поддержку. В одном спринте из 12 комментариев к моему пул-реквесту 9 были учтены сразу, а по трём развернулось обсуждение с примерами и метриками. В результате доля замечаний к моим пул-реквестам за квартал снизилась примерно на треть.

  • Показана зрелость: критика воспринимается как рабочий инструмент
  • Есть конкретика и цифры вместо общих слов
  • Видно умение и соглашаться, и аргументировать

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

Вопрос 3Middle

Расскажите о ситуации, когда вы понимали, что не успеваете к дедлайну.

Как отвечать ▾

Как отвечать: Опишите раннее предупреждение команды, декомпозицию и отсечение необязательного, согласование приоритетов с тимлидом — и выводы, которые сделали для планирования.

Пример сильного ответа

Была задача по переносу части монолита на отдельный сервис, срок — три недели. К концу первой недели по скорости закрытия задач стало видно, что в график не укладываемся: из 14 пунктов плана закрыто четыре, а часть интеграций оказалась сложнее, чем при оценке. Тянуть до последнего смысла не было, поэтому уже на следующий день на планёрке — расчёт с вариантами: сократить объём до критичного минимума и перенести остальное. В итоге ключевая функциональность вышла в срок, на неделю позже ушла только второстепенная часть, и заказчик был в курсе заранее.

  • Честность вместо героизма: проблема поднята рано
  • Есть цифры и понятные варианты решения
  • Показан результат и для продукта, и для заказчика

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

Вопрос 4Для всех уровней

Приходилось ли вам отстаивать техническое решение перед тимлидом или архитектором?

Как отвечать ▾

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

Пример сильного ответа

Да, такое случается. Показательный эпизод — выбор между синхронным вызовом и очередью для обмена данными между сервисами. Архитектор настаивал на синхронном варианте как более простом, а у меня были сомнения по устойчивости при пиках. Подготовка: замеры профиля трафика, прототип на очереди, нагрузочный тест и оценка стоимости поддержки обоих вариантов. На встрече — сравнение по цифрам: при пике втрое выше среднего очередь давала меньше ошибок и не блокировала вызывающий сервис. Решение приняли в пользу очереди, а прототип лёг в основу боевой реализации.

  • Спор идёт фактами, а не амбициями
  • Видно уважение к позиции архитектора
  • Есть измеримый результат: решение внедрено в продакшен

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

Вопрос 5Для всех уровней

Почему вы выбрали .NET и как развиваетесь как разработчик?

Как отвечать ▾

Как отвечать: Свяжите ответ с реальным интересом к платформе: что читаете и пробуете, пет-проекты, новые версии .NET, вклад в команду — конкретика важнее общих слов про саморазвитие.

Пример сильного ответа

Платформа привлекла ещё на старте: строгая типизация, понятная экосистема, инструменты отладки и профилирования, которые экономят время. Со временем важным стало другое: .NET спокойно живёт в продакшене годами и хорошо держит нагруженные сервисы, а это как раз мой профиль — последние годы основная работа связана с высоконагруженным API. Развиваюсь по трём направлениям: язык и платформа, архитектура сервисов, производительность. Регулярно читаю исходники и релизные заметки, раз в квартал разбираю чужой открытый проект и делаю внутренний доклад для команды — за последний год таких докладов было пять.

  • Ответ про мотивацию, а не только про технологии
  • Показано системное и регулярное развитие
  • Есть конкретика: доклады, исходники, направления роста

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

Вопрос 6Для всех уровней

Почему вы хотите работать .NET-разработчиком именно у нас?

Как отвечать ▾

Как отвечать: Изучите компанию заранее: свяжите ответ с её продуктом, стеком и масштабом задач, покажите, чем вы будете полезны конкретно этой команде, избегая фраз про стабильность.

Пример сильного ответа

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

  • Связь с реальным опытом, а не комплименты
  • Названы понятные критерии выбора компании
  • Звучит честно, без шаблонных фраз

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

Что спросят именно вас?

Типовые задают всем. По резюме спросят другое — «В резюме перерыв с 2024 года, чем вы занимались?». Покажем 5 таких вопросов бесплатно, а готовые ответы на них — под вашу вакансию и резюме — за 99 ₽.

Поделиться подборкой:TGVKWA

📈 Готовитесь к собеседованию? Получайте свежие вакансии .NET-разработчик на почту или в Telegram — и откликайтесь, пока подготовка свежая.

бесплатно
PRO

Проверьте себя: первый разбор — бесплатно

Прочитать вопросы — это старт. Настоящая подготовка — проговорить ответ и услышать, что с ним не так. Первый разбор ИИ бесплатный и без регистрации, прямо на этой странице. Полная симуляция — в PRO или разово, без подписки.

  • ✓ Реальные вопросы по вашей роли
  • ✓ Разбор ответов с ИИ
  • ✓ Оценка и советы

Как пройти собеседование на позицию .NET-разработчика

1. HR-этап

Подготовьте рассказ о себе на 1–2 минуты: последнее место работы, главный результат и причина интереса именно к этой вакансии. Для роли «.NET-разработчик» HR чаще всего проверяет мотивацию и зарплатные ожидания — заранее сверьте их с медианой по рынку — 153 000 ₽ (блок «Зарплата» ниже на этой странице).

2. Профессиональный этап

Основная часть собеседования — вопросы по ключевым навыкам: C# и платформа .NET, ASP.NET Core и Web API, Entity Framework Core. Разберите категории «Язык C# и платформа .NET» и «ASP.NET Core, Entity Framework и базы данных» из подборки выше и подготовьте по одному примеру из своего опыта на каждую — с цифрами и результатом.

3. Финальный этап

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

План подготовки

  1. 1Повторите фундамент платформы: типы значений и ссылок, сборщик мусора, async/await и устройство Task, LINQ и отложенное выполнение.
  2. 2Освежите ASP.NET Core: конвейер middleware, внедрение зависимости и времена жизни сервисов, версионирование API и ProblemDetails.
  3. 3Разберите свои проекты с Entity Framework: найдите в памяти случаи N+1, настройки индексов и безопасного применения миграций на проде.
  4. 4Подготовьте 2–3 истории по STAR: сложный баг, спор о архитектуре, работа с дедлайном — с конкретными цифрами и результатом.
  5. 5Пройдите пробное интервью в тренажёре Rabota-Help и потренируйтесь объяснять сложные темы простым языком за 2–3 минуты.

Частые ошибки

  • Зазубрить определения, но не суметь применить их: объясняет boxing, но не понимает, где он убивает производительность в его коде.
  • Писать LINQ поверх IQueryable, не задумываясь, какой SQL получится, и удивляться проблеме N+1 на собеседовании.
  • Отвечать про микросервисы модными словами без примеров: собеседник быстро проверяет, доводил ли кандидат систему до прода.
  • Оптимизировать «на глаз» и не уметь назвать ни один инструмент профилирования — для middle и senior это красный флаг.
  • Негативно отзываться о бывшей команде и код-ревью — работодатель слышит это как прогноз конфликтов.
  • Не задать вопросов о стеке, версии .NET, устройстве пайплайна и зоне ответственности в команде.
Практика интервью

От вопросов — к тренировке интервью

Прочитайте вопросы, выберите 5–7 самых сложных и пройдите пробное интервью. ИИ-интервьюер поможет структурировать ответы, проверить аргументацию и подготовиться к реальному разговору.

Открыть тренажёр для роли .NET-разработчик
Зарплата

Зарплата .NET-разработчик в России

По данным 36 вакансий

Полная статистика →

P25 (ниже среднего)

131 000 ₽

Медиана

153 000 ₽

50% вакансий

P75 (выше среднего)

160 000 ₽

Медиана по уровню опыта

1–3 года

153 000 ₽

Вопрос с каждого собеседования

«Какие у вас зарплатные ожидания?» — что ответить на собеседовании .NET-разработчика

Называйте диапазон: от типичной зарплаты для вашего опыта до суммы на 10–15 % выше, но не выше уровня, который платит лишь четверть работодателей. Суммы на руки по России (данных пока немного — ориентир); в Москве и Санкт-Петербурге обычно выше.

Называйте 155 000 ₽ – 160 000 ₽ на руки.

Пример ответа рекрутеру — для типичной вакансии по России

«Рассматриваю предложения от 155 до 160 тысяч на руки — итоговая сумма зависит от задач и состава компенсации».

В поле «желаемая зарплата» — одна цифра, нижняя граница диапазона: 155 000 ₽. До вычета налога это ≈ 180 000 ₽.

Посчитать для вашего города и опыта

Покажем вашу сумму, готовые фразы на «сколько получаете сейчас» и «у нас бюджет до…», а если уже есть предложение — сравним его с рынком.

Навыки

Востребованные навыки .NET-разработчика

Частота упоминания в вакансиях работодателей

Все навыки →
1
.NET19%
↑
2
ASP.NET19%
↓
3
API10%
↑
4
JavaScript5%
5
Jenkins5%
6
Git5%
↑
7
Jira5%
8
Confluence5%
Специалисты

Профили .NET-разработчика на Rabota-Help

Реальные специалисты, открытые к предложениям

Все специалисты →

Вы готовитесь к собеседованию. А работодатели уже ищут .NET-разработчика.

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

Работодатели уже ищут: .NET-разработчик · от 153 000 ₽

Создать анонимный профиль — бесплатно

Пройдите мини-собеседование, добавьте резюме на экране результата — профиль создадим за минуту, с вашего согласия.

Вы нанимаете .NET-разработчика? Профили кандидатов и подбор для работодателей →

Вакансии

Свежие вакансии .NET-разработчика: 275

Откройте подходящие предложения и откликнитесь после подготовки к собеседованию.

Смотреть вакансии →

Откликаетесь на вакансии .NET-разработчика? Приложите сопроводительное письмо

Пример письма для этой профессии и генератор, который напишет письмо под текст вакансии. Первое письмо — бесплатно.