.NET Tutorial
Senior7 мин чтенияВопрос 6 из 8

Менторинг джунов и проведение технических собеседований

Цель менторинга

Делаю вместе:
парное программирование,
объясняю ход мысли

Делает сам,
я рядом:
отвечаю на вопросы

Делает сам,
я проверяю:
ревью, обсуждение

Самостоятелен:
сам ищет решения,
сам помогает другим

Делаю вместе:
парное программирование,
объясняю ход мысли

Делает сам,
я рядом:
отвечаю на вопросы

Делает сам,
я проверяю:
ревью, обсуждение

Самостоятелен:
сам ищет решения,
сам помогает другим

Путь к самостоятельности

Модель ситуационного лидерства: степень помощи зависит от компетентности в конкретной задаче, а не от «уровня» человека. Опытный джун в знакомом CRUD — самостоятелен, но в первой задаче с очередями ему нужна плотная поддержка.

Практики менторинга

Вопросы вместо ответов.

Вместо Попробуйте
«Тут нужен Include» «Сколько SQL-запросов выполнится на этой странице? Как это проверить?»
«Сделай через IHttpClientFactory» «Что будет с сокетами, если этот метод вызвать 10 000 раз?»
Исправить код за джуна «Давай вместе запустим отладчик и посмотрим, что приходит в метод»

Готовый ответ решает одну задачу, правильный вопрос учит способу решения.

Правило 15–30 минут: договоритесь, что джун пробует сам ограниченное время, а затем обязательно спрашивает, описав, что уже попробовал. Это защищает и от «застрял на 2 дня молча», и от «спрашиваю, не подумав».

Задачи с растущей сложностью: исправление бага → маленькая фича в знакомом модуле → фича через несколько слоёв → задача с неопределённостью → участие в дизайне.

Регулярные встречи 1:1 (30 минут раз в 1–2 недели): что получилось, где было трудно, что хочется изучить, обратная связь в обе стороны.

Онбординг

День 1: доступы готовы,
проект запускается одной командой
(docker compose up), назначен бадди

Дни 2–3: обзор архитектуры и домена,
первая маленькая задача
(good first issue)

Неделя 1: первый PR смёрджен
и выкачен в продакшен

Недели 2–4: задачи в разных частях системы,
участие в ревью, дежурство в паре

Месяцы 1–3: самостоятельные фичи,
обратная связь по плану онбординга

День 1: доступы готовы,
проект запускается одной командой
(docker compose up), назначен бадди

Дни 2–3: обзор архитектуры и домена,
первая маленькая задача
(good first issue)

Неделя 1: первый PR смёрджен
и выкачен в продакшен

Недели 2–4: задачи в разных частях системы,
участие в ревью, дежурство в паре

Месяцы 1–3: самостоятельные фичи,
обратная связь по плану онбординга

Первые недели нового разработчика

Что помогает: README «как запустить», карта сервисов и их ответственности, глоссарий домена (что такое «отгрузка», «резерв»), записи архитектурных решений (ADR), список «кого о чём спрашивать». Каждый новичок улучшает документацию онбординга по итогам — свежий взгляд лучше всего видит пробелы.

Обратная связь: модель SBI

Текст
Situation: «Вчера на ревью PR с экспортом заказов…»
Behavior:  «…ты исправил все замечания, но не ответил в комментариях, что именно изменилось»
Impact:    «…и мне пришлось заново просматривать весь дифф — это заняло час вместо 10 минут.
            Можешь в следующий раз отвечать „Исправил в коммите X“?»
  • Конкретно: не «ты невнимательный», а что именно произошло.
  • Своевременно: через день, а не на ревью через полгода.
  • Хвалить публично и конкретно, критиковать — наедине.
  • Спрашивать обратную связь о себе: «насколько понятно я объясняю?».

Технические собеседования

5 мин
Знакомство,
формат интервью

15 мин
Опыт кандидата:
проект, роль, решения

25 мин
Технические вопросы
от базы к глубине

25 мин
Практика: задача,
ревью кода, дизайн

10 мин
Вопросы кандидата

5 мин
Знакомство,
формат интервью

15 мин
Опыт кандидата:
проект, роль, решения

25 мин
Технические вопросы
от базы к глубине

25 мин
Практика: задача,
ревью кода, дизайн

10 мин
Вопросы кандидата

Структура интервью (60–90 минут)

Принципы хорошего собеседования

  • Структурированность: список тем и критериев оценки заранее, одинаковый для всех кандидатов на позицию. Снижает влияние симпатии и «первого впечатления».
  • Релевантность: проверять то, что нужно в работе. Для бэкенда на .NET — асинхронность, EF Core, дизайн API, SQL, отладка проблем, а не разворот бинарного дерева на доске.
  • Глубина по спирали: начать с простого и углубляться, пока кандидат уверенно отвечает. Так видна граница знаний.
  • Практика, близкая к реальности: code review фрагмента с проблемами, небольшая задача в IDE, обсуждение дизайна сервиса.
  • Уважение: кандидат нервничает; помогайте наводящими вопросами, не спорьте и не демонстрируйте превосходство. Кандидат оценивает компанию так же, как вы его.

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

Зачем нужен async/await?

Что происходит с потоком
при await незавершённой задачи?

Почему .Result может вызвать
deadlock и где?

Как устроена машина состояний,
что такое SynchronizationContext?

Когда ValueTask лучше Task
и какие у него ограничения?

Зачем нужен async/await?

Что происходит с потоком
при await незавершённой задачи?

Почему .Result может вызвать
deadlock и где?

Как устроена машина состояний,
что такое SynchronizationContext?

Когда ValueTask лучше Task
и какие у него ограничения?

Углубление вопроса про async/await

Junior уверенно отвечает на 1–2, Middle — на 3–4, Senior — на всё с примерами из практики.

Задача: code review

Найдите проблемы (типичное задание на интервью)
public class OrderService
{
    private static readonly HttpClient _client = new HttpClient();
    private readonly AppDbContext _db;

    public async void SendOrders()
    {
        var orders = _db.Orders.ToList().Where(o => o.Status == "New");
        foreach (var order in orders)
        {
            var customer = _db.Customers.First(c => c.Id == order.CustomerId);
            var result = _client.PostAsync("http://erp/api/orders?key=SECRET123",
                new StringContent(JsonSerializer.Serialize(order))).Result;
            order.Status = "Sent";
        }
        _db.SaveChanges();
    }
}
Что должен найти кандидат уровня Middle?

async void (исключения теряются, нельзя дождаться); ToList() до Where — загрузка всей таблицы; N+1 запрос за клиентами (и переменная customer не используется); .Result — блокировка потока и риск deadlock; не проверяется статус ответа; секрет в URL и коде, HTTP без TLS; нет CancellationToken; нет идемпотентности — при сбое на середине часть заказов уйдёт повторно; один SaveChanges в конце — при исключении статус не сохранится у уже отправленных; строковые статусы вместо enum; нет логирования.

Оценка и фидбек

Критерий 1 — нет 2 — частично 3 — уверенно 4 — глубоко
C# и .NET runtime
ASP.NET Core, API
Данные: EF Core, SQL
Дизайн и архитектура
Качество кода, ревью
Коммуникация, рассуждение вслух

Пишите фидбек сразу после интервью, с фактами («не смог объяснить разницу между IEnumerable и IQueryable, после подсказки понял»), а не впечатлениями («слабый»). Решение принимайте независимо от других интервьюеров, до обсуждения — чтобы не было группового влияния.

Вопросы на засыпку

Джун постоянно просит помощи по мелочам. Что делать?

Выяснить причину: неуверенность, непонимание задачи, отсутствие знаний о том, где искать. Договориться о правиле «сначала 20 минут сам, потом вопрос с описанием, что пробовал», научить инструментам (отладчик, логи, поиск по коду), разбирать вопросы группами в фиксированное время. Поощрять самостоятельные находки.

Как дать негативную обратную связь, не демотивируя?

Говорить о поведении и последствиях, а не о личности (SBI), наедине и своевременно, предложить конкретное изменение и помощь, проверить понимание («как ты это видишь?»). Соотношение позитивного и негативного должно быть в пользу позитивного — тогда критика воспринимается как забота, а не атака.

Кандидат не знает ответа на вопрос. Как себя вести?

Дать подсказку или переформулировать, посмотреть, как он рассуждает; перейти к другой теме, не задерживаясь. Ответ «не знаю, но предполагаю, что… и проверил бы так…» — хороший сигнал. Не пытаться «завалить»: цель — найти, что человек умеет.

Зачем Middle-разработчику менторить?

Объясняя, лучше понимаешь сам (эффект обучения через преподавание), растёт влияние на команду и качество кодовой базы, повышается bus factor. Менторинг и участие в найме — обычные ожидания на пути к Senior.

Итог

Менторинг — это путь к самостоятельности подопечного: вопросы вместо готовых ответов, задачи растущей сложности, регулярная конкретная обратная связь и безопасная атмосфера. Хорошее собеседование — структурированное, релевантное работе, с углублением по спирали и практической задачей, проводится с уважением и заканчивается письменным фидбеком на основе фактов.