😰 Ozon позвал на техничку, а ты не знаешь, чего ждать
Приглашение от Ozon радует недолго. Потом приходит тревога: большая компания, сильные собеседующие и никакого понимания, что именно спросят.
Читаешь отзывы, а там "гоняли два часа" и "спросили какую-то дичь про lock". И это никак не помогает.
Я разобрал 25 записей технических собеседований наших учеников в Ozon по C#. На таком объёме видно, что вопросы там не случайные, и "дичь про lock" спрашивали в 13 из 25.
🧵 Блокировки в асинхронном коде
Примитивы синхронизации всплывали в 21 из 25. Формулировки: "Почему нельзя await внутри lock?", "Ошибка будет при компиляции или при выполнении?", "Будет ли работать lock(42)?".
Типичная ошибка: сказать "так нельзя, будет дедлок" и замолчать. У интервьюера в голове сразу вопрос: "Он понимает почему или выучил запрет?".
> Отвечай через механику. С lock код с await просто не скомпилируется. С Monitor.Enter скомпилируется, и это ловушка. Продолжение после await может выполниться на другом потоке, а блокировка принадлежит потоку, который её взял. Exit с чужого потока бросит исключение, блокировка останется висеть, и следующий вызов встанет навсегда. Для асинхронной критической секции нужно использовать SemaphoreSlim с ограничением по одному потоку.
⚙️ Что происходит на await
Тема встречалась в 18 из 25. "Что происходит с потоком на первом await?", "Есть ли смысл помечать async метод, который считает факториал?", "Во что разворачивается async/await?".
Главная ошибка: считать, что на каждом await переключается поток, и путать await с Task.Run.
> Разложи по шагам. Код до первого await выполняется синхронно. На ожидании сети или диска поток возвращается в пул, а метод сохраняет состояние в машине состояний, которую сгенерировал компилятор. Когда операционная система сообщает, что ответ пришёл, продолжение ставится в очередь пула.
🗄 SQL руками
Вопросы по базе были в 22 из 25, живой запрос писали в 10.
Чаще других попадалась задача "сотрудники с максимальной зарплатой в каждом департаменте", пять раз. После подзапроса с MAX сразу звучит: "А если у двоих одинаковая зарплата?" и "Можно через оконную функцию?".
> В собесе по теории любимый вопрос: "Запрос всегда работал, а утром начал тормозить. Индексы есть. Куда смотреть?". Ответ "добавлю индекс" здесь не засчитают. Расскажи про план через EXPLAIN ANALYZE, актуальность статистики, VACUUM и селективность.
📨 Outbox — обязательный вопрос
Outbox прямо спрашивали в 13 из 25. "Нужно создать пользователя и гарантированно отправить событие в брокер. Как?", "Какие таблицы и компоненты добавишь?", "Что будет ключом идемпотентности в Inbox?".
Типичный провал: назвать паттерн и не объяснить, какую проблему он решает и как устроена отправка.
> Событие пишется в таблицу outbox в той же транзакции, что и данные. Фоновый процесс читает таблицу и отправляет события в брокер. Отправка может повториться, поэтому гарантия здесь "хотя бы один раз". На стороне получателя нужен Inbox с идентификатором сообщения, по которому отсекаются дубли.
🎯 Главное
Во всех четырёх темах проверяют одно: что случится с потоком, запросом или сообщением, когда что-то пойдёт не так.
Напиши в комментариях, на чём тебя ловили на техничке: на блокировках, на медленном запросе или на Outbox.
Это первый пост серии, дальше Pyrus, Сбер, X5, Касперский и Т-Банк. Полный список вопросов и задач с собеседований в Ozon по C# в боте @booster_tbot.
Если идёшь в Ozon и хочешь готовиться с ментором, который знает, что там спросят, напиши мне.
#техничка #csharp
Приглашение от Ozon радует недолго. Потом приходит тревога: большая компания, сильные собеседующие и никакого понимания, что именно спросят.
Читаешь отзывы, а там "гоняли два часа" и "спросили какую-то дичь про lock". И это никак не помогает.
Я разобрал 25 записей технических собеседований наших учеников в Ozon по C#. На таком объёме видно, что вопросы там не случайные, и "дичь про lock" спрашивали в 13 из 25.
🧵 Блокировки в асинхронном коде
Примитивы синхронизации всплывали в 21 из 25. Формулировки: "Почему нельзя await внутри lock?", "Ошибка будет при компиляции или при выполнении?", "Будет ли работать lock(42)?".
Типичная ошибка: сказать "так нельзя, будет дедлок" и замолчать. У интервьюера в голове сразу вопрос: "Он понимает почему или выучил запрет?".
> Отвечай через механику. С lock код с await просто не скомпилируется. С Monitor.Enter скомпилируется, и это ловушка. Продолжение после await может выполниться на другом потоке, а блокировка принадлежит потоку, который её взял. Exit с чужого потока бросит исключение, блокировка останется висеть, и следующий вызов встанет навсегда. Для асинхронной критической секции нужно использовать SemaphoreSlim с ограничением по одному потоку.
⚙️ Что происходит на await
Тема встречалась в 18 из 25. "Что происходит с потоком на первом await?", "Есть ли смысл помечать async метод, который считает факториал?", "Во что разворачивается async/await?".
Главная ошибка: считать, что на каждом await переключается поток, и путать await с Task.Run.
> Разложи по шагам. Код до первого await выполняется синхронно. На ожидании сети или диска поток возвращается в пул, а метод сохраняет состояние в машине состояний, которую сгенерировал компилятор. Когда операционная система сообщает, что ответ пришёл, продолжение ставится в очередь пула.
🗄 SQL руками
Вопросы по базе были в 22 из 25, живой запрос писали в 10.
Чаще других попадалась задача "сотрудники с максимальной зарплатой в каждом департаменте", пять раз. После подзапроса с MAX сразу звучит: "А если у двоих одинаковая зарплата?" и "Можно через оконную функцию?".
> В собесе по теории любимый вопрос: "Запрос всегда работал, а утром начал тормозить. Индексы есть. Куда смотреть?". Ответ "добавлю индекс" здесь не засчитают. Расскажи про план через EXPLAIN ANALYZE, актуальность статистики, VACUUM и селективность.
📨 Outbox — обязательный вопрос
Outbox прямо спрашивали в 13 из 25. "Нужно создать пользователя и гарантированно отправить событие в брокер. Как?", "Какие таблицы и компоненты добавишь?", "Что будет ключом идемпотентности в Inbox?".
Типичный провал: назвать паттерн и не объяснить, какую проблему он решает и как устроена отправка.
> Событие пишется в таблицу outbox в той же транзакции, что и данные. Фоновый процесс читает таблицу и отправляет события в брокер. Отправка может повториться, поэтому гарантия здесь "хотя бы один раз". На стороне получателя нужен Inbox с идентификатором сообщения, по которому отсекаются дубли.
🎯 Главное
Во всех четырёх темах проверяют одно: что случится с потоком, запросом или сообщением, когда что-то пойдёт не так.
Напиши в комментариях, на чём тебя ловили на техничке: на блокировках, на медленном запросе или на Outbox.
Это первый пост серии, дальше Pyrus, Сбер, X5, Касперский и Т-Банк. Полный список вопросов и задач с собеседований в Ozon по C# в боте @booster_tbot.
Если идёшь в Ozon и хочешь готовиться с ментором, который знает, что там спросят, напиши мне.
#техничка #csharp