Конкретные знания и способность показать их на интервью – две совершенно разные вещи. Первое собеседование на должность программиста – источник постоянного стресса независимо от возраста. Во время собеседования начинают забываться элементарные вещи, а некоторые вопросы ставят в тупик.
Совсем убрать волнение невозможно, но подготовка к интервью может его уменьшить. В этом гайде мы разберем как лучше готовиться к собеседованию.
Учтите, что само интервью может длиться не один час. В некоторые компании нужно пройти 2 и более раундов. Иногда они идут подряд, превращаясь в многочасовой марафон, иногда разбиты на несколько дней.
Двух одинаковых интервью не бывает. Одни и те же люди, проводят каждое собеседование немного по разному. Очень многое зависит от того, в какую сторону пойдет диалог, какие ошибки совершит собеседующийся и куда приведут его размышления. Более того, даже в рамках одной специализации, разные компании могут спрашивать абсолютно разные вещи. Чем сильнее компания, тем больше фундаментальных вопросов и меньше прикладных. И наоборот. В совсем простых ситуациях, интересуются исключительно прикладными навыками, которые нужны конкретно на этой должности.
Процесс собеседования зависит от вашего предыдущего опыта. Если с вами можно поговорить о прошлых проектах, то, скорее всего, вас начнут расспрашивать про них. Если нет, то тогда пойдут в ход тесты на общую сообразительность.
Ключевые темы
О себе. Прошлый опыт.
Обычно собеседование начинается со знакомства. На этом этапе к вам присматриваются, оценивают общую адекватность и ищут зацепки для дальнейшего разговора. В идеале нужно иметь за плечами реальные проекты с вашим участием. Подойдут и учебные проекты, код которых выложен на гитхабе.
На этом этапе будьте готовы ответить на следующие вопросы:
- Какую последнюю книгу по программированию вы прочитали?
- Чем вы больше всего гордитесь как программист?
- Какая самая сложная (интересная) задача, которую вы решали в прошлом проекте или в учебном проекте?
- Как вы тестировали работоспособность кода? (Идеально если вы умеете писать автоматические тесты)
- Как был построен процесс разработки на прошлом месте? (для тех у кого было такое место)
- Почему Вы ушли с предыдущего рабочего места?
- Кем вы видите себя через пять лет?
Рекомендации
- Создайте несколько проектов на гитхабе
- Ответьте для себя на вопросы описанные выше
- Познакомьтесь с идеями экстремального программирования
Ссылки
- Книги, которые стоит читать любому программисту
- Список тестовых заданий от разных компаний
- Проекты Хекслета
Задачи
Задачки на эврику или воображение
Существует категория задач, которые было модным задавать на собеседованиях раньше. Первыми, такое стали спрашивать в Microsoft, затем подтянулись и многие другие. Вот несколько примеров:
- Почему люки круглые?
- Сколько теннисных мячей поместится в автобус?
- Сколько настройщиков пианино в мире?
- Как сдвинуть гору Фудзи?
- Если бикфордов шнур горит один час, то как сделать так чтобы он сгорел за полчаса?
Сами по себе вопросы интересные. Над ними стоит поломать голову в кругу друзей. Проблема в том, что они слабо коррелируют с уровнем разработчика. Эти вопросы не являются логическими в строгом смысле, они больше опираются на воображение и "эврику", такое состояние, когда вы внезапно догадались до ответа. Правда ответов обычно больше чем один.
Считается что сам процесс рассуждения над этими вопросами, показывает как у человека работает мозг. С одной стороны показывает, но с другой, состояние стресса и внезапность таких вопросов обескураживает. Более того, интервьюируемый скорее всего не поймет что от него хотят услышать.
Крупные компании отказались от этих вопросов, но никто не застрахован. Всегда есть вероятность, что вас спросят про люки. Поэтому имеет смысл подготовиться заранее. Посмотреть список наиболее распространенных и порассуждать над ними в домашнем кругу или, например, в сообществе Хекслета.
Рекомендации
- Прочитайте книгу "Как сдвинуть гору фудзи?"
- Найдите списки подобных вопросов и попробуйте ответить на них
Ссылки
- Примеры задач
Задачки на логику
Это другой тип задач. Они имеют вполне конкретные ответы и опираются на формальную логику. Например:
- Сколько раз в день пересекаются стрелки часов?
- Какой угол между часовой и минутной стрелкой если на часах 15:15?
- У Мегамозга есть два одинаковых стеклянных шарика. За какое минимальное число бросков можно гарантированно определить, начиная с какого этажа 100-этажного здания шарики разбиваются?
Последняя задачка очень сильная и ее часто задают. Хотя она и выглядит мультяшно, внутри нее классная алгоритмическая задача.
Периодическое решение таких задач прокачивает алгоритмические навыки, работу с системами счисления, логическими операциями и математикой.
Рекомендации
- Научитесь решать логические задачи
Ссылки
- braingames - сайт и сообщество по решению подобных задач.
Алгоритмы и структуры данных
На этом этапе могут попросить реализовать переворот односвязного списка или выполнить сортировку пузырьком. Более сложные вещи писать не просят, их могут спросить устно. Например:
- Как найти пропущенное число в отсортированном массиве содержащем значения от 1 до 100?
- Чем отличается O(1) от O(n)?
- Какая алгоритмическая сложность у бинарного поиска?
- Как определить наличие цикла в односвязном списке?
- Как эффективно объединить два отсортированных массива?
Этого раздела не стоит пугаться, никто не требует от вас глубокого знания алгоритмов и всего прочитанного Кнута. Достаточно прочитать одну книгу и немного попрактиковаться. В любом случае этот опыт не будет лишним, правильно выбранная структура данных в коде, сделает вашу жизнь значительно легче.
Рекомендации
- Вспомните логарифмы. Они нужны для оценки сложности. Это единственная обязательная математика для книг по алгоритмам.
- Изучите основные алгоритмы (есть в книге из ссылок).
- Изучите основные структуры данных (есть в книге из ссылок).
- Напишите сортировку пузырьком.
- Познакомьтесь с хеш-таблицами.
- Научитесь выполнять бинарный поиск.
- Изучите сбалансированные деревья.
- Выучите нотацию Big O, научитесь определять сложность простых алгоритмов.
Ссылки
- Грокаем алгоритмы
Операционные системы и сети
Сюда входит огромный перечень тем, например, владение командной строкой, понимание tcp/ip, http, dns, event loop и многое другое.
Как правило, эти вопросы не задают напрямую. В основном придумывают различные истории или ситуации. Примеры вопросов:
- Может ли существовать такой ip адрес: 283.12.30.111?
- Что происходит, когда пользователь вбивает в браузер адрес google.com?
- Можно ли в HTTP запросы указывать одновременно query и post параметры?
Рекомендации
- Прочитайте книгу по операционным системам
- Перейдите на Linux (например Ubuntu)
- Изучите сети на базовом уровне: tcp/ip, dns, http
Операции с числами
Популярные задачи на системы счисления и битовые операции.
- Как определить четность числа не выполняя деления?
- Как поменять две переменные местами не используя третью переменную?
Рекомендации
- Изучите системы счисления
- Изучите битовые операции
Problem-Solving задачи
Самый интересный тип задач. В этих задача моделируется реальная ситуация. Вам предстоит придумать способ решения в рамках каких-то ограничений. Например:
- Как реализовать редактор так, чтобы он открывал с одинаковой скоростью файлы любых размеров
Написание кода
Чем меньше у вас опыта, тем выше вероятность того, что вас попросят написать код. Обычно просят написать его на листочке или в среде подобной repl.it. На задачу дают 10-20 минут. Пара примеров:
- Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz».
- Напишите программу, которая переворачивает строку. Предложите несколько способов.
- Напишите программу, которая проверяет сбалансированность скобок в строке.
- Реализуйте программу, которая удаляет директорию со всеми вложенными файлами и директориями (задача на рекурсию)
Во время решения могут попросить рассуждать над задачей вслух. Собеседующий хочет проследить за вашим ходом мыслей.
Эти задачи показывают насколько у интервьюируемого хорошо с логикой, алгоритмическим мышлением, как он владеет базовыми конструкциями языка. Они позволяют отсеять слабых кандидатов, но не помогают определить сильных.
В интернете созданы десятки сервисов, специализирующихся на подобных задачах. Обязательно включите их в свой список для подготовки. Научитесь проходить задачи уровня easy с закрытыми глазами. Этот навык поможет не только для прохождения собеседований, но и в реальном программировании.
Рекомендации
- Потренируйтесь писать код на листочке
- Попробуйте рассуждать вслух во время решения алгоритмических задач
- Найдите удобную платформу и оттачивайте мастерство
Ссылки
- FizzBuzz, или почему программисты не умеют программировать
- 7 платформ для прокачки
Прикладные знания
Сюда входит большая группа вопросов, по тем технологиям с которыми вам придется работать.
Общие
- Базы данных. SQL. Могут попросить составить запрос. Чаще всего интересует знание соединений (joins).
- ООП. На базовом уровне имеется ввиду умение создавать классы и умение моделировать.
- Веб-разработчиков могут спросить про DOM Api.
Специфичные
Здесь проверяется знание библиотек, фреймворков, каких-то особенностей языков. В интернете, особенно на гитхабе, созданы списки по каждому возможному стеку.
- java
- frontend
- python
- javascript
Полезные ссылки
- Искусство проведения интервью (Джоэль Спольски)
- Что руководители и опытные программисты ожидают от джуниора
- Что требуют от джуниоров работодатели: анализ вакансий