В разных компаниях собеседования проводятся по-разному в зависимости от стандартов, продуктов, позиций. Но есть базовые вещи, повторив которые, вы сможете подготовиться к любому собеседованию.
В этом посте я собрал подборку понятий и терминов, которые у вас могут спросить на собеседовании на вакансию Junior С++ разработчика, и описал, к чему в принципе вам стоит готовиться. Предупрежден — значит вооружен. Вкратце о себе: меня зовут Турмец, я работаю в Яндексе, параллельно учусь в Школе Анализа Данных и занимаюсь ревью кода на курсе «Разработчик С++» в Практикуме.
Мы опустим, как именно попасть на собеседование и предположим, что вы уже интересны компании как потенциальный работник и у вас уже назначена дата интервью.
Поехали.
Оценка soft skills
Первая часть собеседования — это знакомство и разговор о вашем образовании и прошлом опыте. Советую перед собеседованием пробежаться по своему резюме, повторить основные проекты и пройденные курсы, чтобы на самом собеседовании не пришлось судорожно вспоминать их.
Образование. Расскажите о том, где учитесь или учились. Если вы прошли дополнительные курсы в Практикуме, на Coursera или еще где-то, обязательно упомяните их. Также не стоит забывать о дополнительном офлайн-образовании. Если у вас в копилке есть какой-нибудь пройденный интенсив или достижения на олимпиадах по программированию, поделитесь и этим.
Предыдущий опыт. Рассказывая о своем опыте, не стоит скромничать, но и не нужно преувеличивать свои достижения. Некоторые люди не хотят показаться наглыми или невоспитанными и стесняются говорить «я написал», «я внедрил», «я спроектировал», но это ошибка. На собеседовании вам нужно на примерах показать, чем вы занимались и какую пользу это принесло.
Говорить нужно только правду, ведь интервьюер может углубиться в тему и задать пару вопросов о проекте. Вы должны быть способны ответить на уточняющие вопросы.
Если у вас мало опыта в коммерческой разработке, расскажите про учебные проекты, которые вы выполняли, pet-проекты, упомяните участие в хакатонах и конкурсах, профильных конференциях.
Помните, что важно рассказывать про опыт, который будет полезен для вакансии. Например, стоит рассказать о владении разговорным английским, но не стоит говорить, что вы ходили на курсы по дайвингу. Не связанные с вакансией вещи вы потом расскажете своим будущим коллегам на кофе-брейке.
В этом блоке важно показать, что вы готовы брать ответственность, умеете работать в команде и можете проявить инициативу.
Заранее продумайте, как вы ответите на такие вопросы.
Случались ли у вас провалы? Расскажите о самом большом из них. Ответ на этот вопрос покажет, как вы умеете рефлексировать над ошибками, какие выводы делаете после неудач.
Какими проектами вы гордитесь? Выберите один-два проекта и в деталях расскажите, как вы участвовали в них: в чем была сложность, как вы подошли к решению, какие проблемы возникали в работе, как вы их решали, какие получились результаты.
Какая была самая сложная ситуация, которую вам удалось разрешить? Ответ на этот вопрос покажет, готовы ли вы брать инициативу, насколько вы самостоятельны, умеете ли работать в стрессовой ситуации, не теряетесь ли в сложных условиях.
Оценка hard skills
В разных компаниях собеседования проводятся немного иначе, но чаще всего после знакомства вы перейдете к технической части. Она бывает разная, обычно это решение какой-то задачки и общение на тему алгоритмов и структур данных.
Еще могут быть вопросы, которые касаются специфики вакансии, например, если вы собеседуетесь на разработчика Qt, то вас спросят, что вы о нем знаете. Если предполагается работа над игровым движком, стоит ожидать вопросов по математике.
Задачи. Интервьюер предложит вам задачку легкого или среднего уровня, по типу такой. Скорее всего, вас попросят решить ее на бумаге или доске, но бывает, что можно решить и на компьютере в каком-нибудь простом текстовом редакторе.
Выслушав условие, не спешите писать код, уточните, верно ли вы поняли задачу, разберите ее на нескольких примерах с собеседующим, подумайте, какие подводные камни возможны, и по необходимости уточните условие. И только если вы уверены, что правильно понимаете задачу, приступайте. Хорошая практика — задавать вопросы по задаче, это показывает интервьюеру, как вы думаете над проблемой, насколько вы способны видеть ее узкие места.
Итак, вы точно поняли задачу, пора решать. В процессе решения рассуждайте вслух: так же как и с вопросами, в этот момент интервьюер делает выводы о вашем подходе к задаче. Я стараюсь идти по следующему пути при решении задачи: 1) предложить самое простое решение; 2) попытаться улучшить узкие места. Если чувствуете, что, скорее всего, сможете решить лучше, так и скажите: «Вот идея навскидку, но будет лучше». То есть идите от простого к сложному.
Давайте предположим, что вам досталась задачка сложного уровня и у вас нет идей. В этом случае снова задавайте вопросы, можете попросить подсказку. Помните, что просить помощи не значит провалить собеседование. Задавать вопросы — это нормально.
Вы придумали решение, что дальше? Нужно его проанализировать и написать. Проанализировать — это значит посчитать асимптотику по времени и памяти. То есть вы должны уметь спрогнозировать, насколько итоговая программа будет быстро работать и сколько памяти ей нужно. Хорошее решение предполагает оптимальное использование времени и памяти.
«Написать» означает, что вы должны реализовать ваше решение без багов, с корректным синтаксисом и адекватным кодстайлом. То есть программа должна компилироваться, правильно работать на всех возможных входах, код должен быть читабельным.
Если вы использовали какие-то алгоритмы из stl (стандартная библиотека шаблонов), вас тоже, скорее всего, попросят оценить, как быстро программа будет работать и сколько ей нужно памяти. Вы должны понимать, как работают функции, которые вызываете, даже если их написали не вы. Иначе вы не сможете подсчитать результирующую асимптотику вашего кода.
Для подготовки к этому этапу я рекомендую прорешать как можно больше задач на сайте leetcode.com — это сайт, на котором собраны сотни задач, похожих на те, что дают на собеседованиях. Вы решаете задачу, сайт автоматически проверяет решение и показывает скорость, с которой это решение выполняется. Кроме этого, на сайте можно обсудить решение с другими разработчиками.
Алгоритмы. Я составил список популярных алгоритмов, которые с большой вероятностью понадобятся на собеседовании. Вас могут спросить непосредственно о них, они могут использоваться в задаче.
Бинарный поиск
Сортировки
Два указателя
Сканирующая линия
Обход в глубину
Обход в ширину
Еще упомяну два важных понятия. Полноценными алгоритмами их не назовешь, но знать их необходимо:
Префикс-/постфикс-сумма, также известная как предподсчет
Рекурсия
Структуры данных. Теперь посмотрим на список по структурам данных, которые необходимо знать:
Вектор
Связный список
Дек
Стек
Очередь
Куча
Деревья поиска, в частности бинарные
Хеш-таблица
Вас могут попросить рассказать, как эти вещи устроены, для каких задач используются и за сколько асимптотически выполняются основные операции, если речь о структурах данных.
Чтобы подготовиться к вопросам об алгоритмах и структурах данных, я рекомендую посмотреть курс Максима Бабенко «Алгоритмы и структуры данных поиска» в Школе анализа данных.
Вопросы про С++. На этом возможные технические вопросы не заканчиваются. Перейдем к тому, что от вас потенциально ожидают с точки зрения языка программирования, в нашем случае — C++.
Конечно, вы должны быть знакомы с синтаксисом. Не обязательно знать все возможные интересные слова, типа explicit, external и volatile, но то, как объявить класс, наследоваться от него и задать оператор меньше, вы знать должны.
Есть базовые знания, которые должны иметь все разработчики, независимо от языка программирования: что такое ООП, базовая работа с Git, базы данных. На этих пунктах я не буду останавливаться. Я сформулировал список обязательных знаний для разработчика С++. Рекомендую изучить его:
Шаблоны
Наследование и полиморфизм, виртуальные методы
Правило пяти
Процесс компиляции и линковки
Инвалидация итераторов
Модель памяти в C++
Move-семантика
Умные указатели
Идиома RAII
Перегрузка операторов
Вам нужно уметь объяснить, как эти вещи устроены и для каких задач используются.
После собеседования
Если вы прошли собеседование и получили должность, поздравляю! Если не получили, не стоит сдаваться, такое случается. Попросите у HR-специалиста обратную связь. Спросите, что вам стоит подтянуть в будущем, чего не хватило для этой должности, и пробуйте снова. Умение проходить собеседования — это тоже навык, которому нужно учиться.
Полезные ссылки для подготовки к собеседованию
leetcode.com — сайт, где вы можете решать задачи, похожие на те, что задают на собеседованиях.
«Информатикс» — ресурс, где можно найти много полезной информации об алгоритмах и структурах данных.
Статья «Как проходят алгоритмические секции на собеседованиях в Яндекс».
Курс лекций Максима Бабенко «Алгоритмы и структуры данных поиска».
arrakisfremen
turmezzz Автор
С огромной вероятностью понадобятся. Может понадобится реализовать их модификацию или что-то еще додумать. Такие вещи уже зависят от команды и задачи.
da-nie
А вы можете показать ваши личные проекты и рассказать, где там эти алгоритмы применяются и в каких объёмах? Если, конечно, это не секрет.
Insurgent2018
могу от себя сказать так, что видел на практике использование следующих:
Обход в глубину, Обход в ширину и разные вариации с деревьями поиска. Но сфера софта была специфическая, в частности — визуализация и укладка графов. И разработчик — прям реализовывал это всё в коде со своими нюансами.
da-nie
Так это понятно. Вряд ли кто-то хоть что-то да не использовал пусть даже пару-тройку раз в своей жизни. Но вот появилось давно уже у меня подозрение, что коль пошёл упор на шаблонные алгоритмы, то программист целиком никогда более-менее сложное приложение не создавал ни разу и не представляет, что там внутри кроме этих самых шаблонных алгоритмов. Вот тут ребята имитатор Союза делали. Думаю, ни единого шаблонного алгоритма не применили, но внутри их приложения модель движения вряд ли такая уж простая. Но даже они не представляют, с чем столкнутся, когда всё же решат перейти на упомянутый ими MFC с Builder ( всё же перейти на Qt будет сейчас им лучше).
lpre
[offtopic] А что это за ребята?
lpre
А-а, сорри, это же рядом было :-) https://habr.com/ru/post/532726/
pfemidi
www.youtube.com/watch?v=IECzFnvQOv4
HEKOT
Обход у меня встречался. Проект — ничего особенно специфического. Древовидный тест-репорт там был.
Но вот сейчас у меня вычислительная геометрия. До этого я ей не занимался. Деревца в проекте тоже прорастают, но не настолько, чтобы прям надо быть каким-то асом.
Вообще, я с удивлением узнал, что собеседование на джуна, скорее всего, не пройду.
titsi
Видно ваш проект связан с «людьми»(с социальными сетями наверное) или картами. Поэтому обход нужен. Это так?
HEKOT
titsi
Соц сети же работают с людьми.Люди как записи в графе со связями. Связи между людьми надо обработать — и тут используют обход.
Про электронику вылетело с головы)))
HEKOT
Ну графы со связями и из обход придумали гораздо раньше, чем социальные сети.
У меня отчёт о тестировании был древовидный.
Вроде, ещё где-то было…
Вот, например, 20 лет назад на Паскале делал какую-то очень хитрую структуру из двусвязанных колец, в каждом узле была ветка на кольцо следующего уровня, а в каждом узле того кольца был линейный двусвязанный список. Всё это симулировало очень-много-процессорную систему.
titsi
Верно.
Узлы были чем представлены?
HEKOT
Класс написал специальный. У нему ещё тест-спецификации подцеплялись.
tandzan
А может не понадобятся, так что пусть все зубрят. Это я к тому, что все мои собеседования на плюсового разработчика напоминали трэш, угар и содомию, поэтому для меня плюсы это теперь исключительно язык для пэт проектов, я их даже на гитхаб теперь не выкладываю.
MomoDev
а как же задача про круглые люки?
Sunchea
Сын первоклассник был в восторге, особенно про монету: фигуры постоянной ширины :)
www.youtube.com/watch?v=WsX2pf5n4zM
DmitriyTitov
Скажите, пожалуйста, где сейчас применяются связные списки кроме совсем низкоуровневых вещей вроде внутренней реализации хеш-таблиц или структур файловых систем.
Мне действительно интересно, без подвоха.
arrakisfremen
Как где? На собеседованиях в Яндекс ))
PyerK
Хороший вопрос на джуна с++.
Ответ: Там где элементы контейнера не имеют (и не могут иметь) конструктора копирования и перемещения.
DmitriyTitov
Я вообще не пишу на Си++ и почти не знаю этого языка.
Мне интересно в каких задачах они используются, а не при каких обстоятельствах. То есть без привязки к языку вообще.
Вот, к примеру, коллизии при вычислении хеш-функции можно разрешить добавив связный список к элементу целевого массива хеш-таблицы. Но это очень низкоуровневое и редкое применение. Кроме того, можно и массивом обойтись.
А где списки применяются для более практических задач?
PyerK
В мире пост с++11 и до появления полиморфных аллокаторов из с++17, в 99% случаях оправдание для применения списка/дека было отсутствие необходимых конструкторов.
Полиморфные аллокаторы внесли смуту в выбор, но это пока что не частый кейс.
Всё остальное — довольно таки слишком специфические требования. Совместные владения объектами, контейнеры где часто не больше 1го элемента (и где SOO не отрабатывает), либо опять же особенности копирования объектов (с сайд эффектами и исключениями) которых необходимо избежать.
turmezzz Автор
Мне кажется неплохой пример использования связных списков — это какие-нибудь кэши, где нужно помнить какой-нибудь итератор на старые данные, чтобы их быстро удалить. А вот быстро удалять это как раз про связные списки. Пример сформулировал совсем не строго, но надеюсь понятно, о чем я :)
PyerK
Итерация по большому списку на х86 архитектуре 2 порядка медленнее, чем по непрерывному участку памяти.
Там где важна производительность односвязных и двусвязных списков в коде не будет.
DmitriyTitov
Итерация — да, а вот вставка/удаление при том, что указатель где надо — сильно эффективнее по памяти в первую очередь.
Так что пример понятен, хотя и не до конца.
suns
Мне недавно при реализации LRU кэша пришлось писать двусвязный список, чтобы алгоритм работал амортмзированно за O(1).
MSC Lock использует односвязные списки
При реализации какого-то ивент-лупа может понадобиться односвязный список
Это из того, что я за полгода могу вспомнить
Playa
Ну и сколько будет такое собеседование длиться? Одних вопросов часа на три.
turmezzz Автор
Все алгоритмы и структурки никто на одном собеседовании не спросит, но что-то из них точно попадется. А собеседование такого типа длится около часа
Cyborg
turmezzz Автор
О, жизненные мемы подъехали :)
Matisumi
Тут где-то была недавно статья о вкусе печенек в Яндексе. Так вот эта статья, похоже, некое ее логическое продолжение (если вы понимаете о чем я)
turmezzz Автор
Печеньки, кстати, реально топовые. Если кто-то будет в Яндексе попробуйте те, которые прямоугольной формы с джемом. Мне ими и платят :)
*шутка юмора*
nullptr
А в 2020-м году начинающие С++ разработчики вообще есть? Мне казалось, что порог входа в язык примерно сравнялся с порогом входа в какое-нибудь ракетостроение и никто в здравом уме через десятилетние дебри фич не полезет.
Overlordff
А через дебри лезть не надо. Достаточно современного подмножества (да и то не все фичи оттуда нужно знать новичку).
AnthonyMikh
А, то есть правило пяти, скажем — это не дебри? И что, на всех проектах используется "современное" подмножество (интересно, кстати, что под эти подразумевается) и со старым кодом не надо взаимодействовать?
Overlordff
Правило пяти это достаточно редкая штука. Сейчас в мете «правило ноля». И для него вообще ничего делать не надо — в этом и простота.
PyerK
Где то 2-3 месяца коуча и на половину сениор с++ позиций можно пройти по теоретическим знаниям (Утверждаю как коуч ). Это если есть фундаментальные знания CS.
Там по современному языку всего то 3 книжки толковых и не сильно тяжелых.
Промышленное кодирование на современном с++ кратно проще того, что было 15 лет назад.
Gremlin92
C++ прямо таки завораживает юных студентов, только вот долго его учить и работать с ним долго приходится, дорого обходится