
Предыстория
За последний год работы в компании мне довелось провести более 50 собеседований. Большинство из них проводилось на позицию программист-стажер\программист C\C++.
Отмечу, что мне очень нравится беседовать с новыми людьми, особенно с программистами. Ведь очень интересно, чем занимаются люди в IT и какие проекты делают в других компаниях.
Когда мне первый раз предложили провести собеседование нового кандидата, у компании не было четкого порядка проведения собеседований, не было списка вопросов или тестовых заданий. Коллеги, которые проводили собеседования, имели некоторый стандартный список вопросов в своей голове, которые и предлагались кандидатам. Когда я сам устраивался в компанию, я отвечал именно на эти вопросы.
Мне такой слегка хаотичный порядок сразу не понравился. Собеседования проводят разные люди, при этом вопросы у каждого в голове свои и отличаются от вопросов коллег. Это может привести к тому, что одна из областей не будет затронута вообще и вы возьмете неподходящего кандидата. Дабы избежать таких проблем, мы составили 2 списка вопросов (для стажеров и опытных программистов), а затем и небольшой тест, который проходят кандидаты перед собеседованием. Данный тест позволяет оценить базовые знания кандидата и не тратить время на дальнейшее собеседование в случае, если такие знания отсутствуют. Также мы используем лист с тестом для записи комментариев и оценок по каждой области после собеседования. Он отлично помогает вспомнить каждого конкретного кандидата после проведения собеседований.
Тест вряд ли будет кому-то интересен, поэтому и публиковать его я не буду. А вот наши вопросы приведу в новых постах. Постараюсь так же опубликовать ответы, которых мы ждём от кандидатов. Возможно эти вопросы помогут кому-то в подготовке к собеседованию (почему-то в интернете не так много вопросов для подготовки к собеседованию на должность программиста С\С++).
Зачем вообще публиковать вопросы?
Хочется собедовать «активного», подготовленного кандидата. Я всегда надеюсь, что кто-то из наших кандидатов придет подготовленным. С 2016 года компания высылает вопросы кандидатам перед собеседованием и предлагает им потратить хотя бы 3-5 дней на освяжение своих знаний. Однако, это никак не сказалось на подготовке кандидатов. 90% кандидатов, которые приходят к нам в компанию, обладают крайне низким уровнем знаний. Конечно, студент, приходящий на собеседование, редко обладает большим багажом знаний и навыков. Но когда технический специалист после 3-4 курса института не знает, что такое DNS, как применяется ключевое слово static, то это п….ечально. Еще печальнее, что такие знания порой отсутствуют у людей имеющих 1-2-3 года работы на схожих позициях :(.
Хочется знать, почему так происходит. Пока, к сожалению, я не могу назвать причину происходящего. Возможно, дело в том, что компания предлагает среднюю зарплату в городе. Или в том, что серьёзные программисты едут работать из Зеленограда в Москву. Или дело просто в падении среднего уровня технических знаний у студентов.
P.S. Замечу, что помимо вопросов к собеседованию я планирую постепенно публиковать ответы, которые мы ожидаем от кандидатов. Cписок вопросов достаточно обширный и захватывает многие около-компьютерные вопросы. Стоит отметить, что мы не мучаем кандидата всеми этими вопросами. Но если мы понимаем, что в данной области человек обладает какими-то знаниями, то мы стараемся копнуть как можно глубже, чтобы выяснить границу его знаний.
Вопросы
Итак, первая часть вопросов — Системные вещи:
- Что такое архитектура процессора? Чем x86 отличается от x64?
- Что такое защищенный и реальный режимы работы? Сегменты, IDT, GDT, LDT, TSS(TR)?
- Что такое режим ядра и режим пользователя? CPL, RPL, DPL?
- Как происходит взаимодействие между режимом пользователя и ядра? SYSENTER, int2e?
- Что такое виртуальная память? Как работает paging? PAE, x64, IOMMU?
- Что такое прерывание? Какие они бывают? Как происходит их обработка? Что со стеками?
- Подробно как происходит загрузка компьютера? А с UEFI?
- Что такое ядро ОС? Какие функции оно выполняет? Почему DOS не является ОС?
- Что такое драйвер? Чем он отличается от обычной программы?
- Что такое поток? Что он включает? Как и кем создается? В каких состояниях может быть?
- Что такое HAL? Зачем он нужен?
- Форматы исполняемых файлов(ELF, COFF(PE)). Секции, таблица релокаций, PIC?
- Что такое реестр? Как он устроен? Где храниться?
- Что такое сервис (служба)? Чем он отличается от обычной программы?
- Что такое Unicode, какое отношение к нему имеют UTF16, UCS2LE, UTF8 и т.д.?