Топ-25 вопросов для телефонного собеседования

По версии Явина Пола, автора блога javarevisited.blogspot.sg


На дворе XXI век, и уже давно телефонные собеседования являются самым популярным способом отбирать кандидатов на работу. У такого подхода есть свои преимущества — например, кандидату и интервьюеру не надо тратить свое драгоценное время ради встречи. Это вторая часть моего руководства для программистов, ищущих работу. В первой части я разобрал некоторые вопросы с собеседований на должность Java/C++/C-разработчика, и многие просили меня сделать подобную статью про телефонные собеседования.

Чтобы пройти этап телефонного собеседования и поговорить с интервьюером напрямую, вам необходимо правильно ответить на все вопросы. Как правило, случается так, что вопросы задаются не только по вашему языку программирования, но еще и по сопутствующим технологиям: например, SQL, Unix, XML, ООП, структуры данных и алгоритмы, работа с сетями и т.д. Если вы намерены серьезно готовиться к собеседованию, то советую вам прочесть книги «Собеседования на должность программиста» и «Разбор собеседований на должность программиста». Первая — моя любимая. Я читал ее семь лет назад, но в ней до сих пор много полезной информации и вопросов по алгоритмам и структурам данных.

Главное, что вы должны помнить — всегда отвечайте на то, что требуют, и избегайте излишних рассуждений. Интервьюеры во время телефонных собеседований покрывают множество тем, и им не хочется слушать бесполезную болтовню, тратя на нее свое время. Вы сможете показать свое глубокое знание темы при личной встрече. Кстати, вы можете понять, что требует от вас интервьюер, по его реакции на ваши ответы — если он задает наводящие вопросы или просит рассказать побольше, то расскажите по теме столько, сколько можете, а если он быстро переходит к следующему вопросу, то стоит быть кратким.

В основном, вопросы покрывают много тем, но поверхностно — на телефонных собеседованиях обычно проверяют лишь знание самых основ. И хотя нижеприведенные вопросы в основном предназначены для программистов со стажем 2–5 лет, senior-девелоперы также могут почерпнуть из них что-то полезное. Если вы интервьюер, то можете использовать вопросы ниже для того, чтобы быстро оценить кандидата на должность. Я предоставил ответы на эти вопросы и несколько указаний о чем говорить, если вас просят рассказать побольше.

Топ-25 вопросов для телефонного собеседования

algo4interview
Эти вопросы подходят для многих должностей: разработчиков, программных инженеров, QA, так как они покрывают самые базовые аспекты программирования, но лучше всего они подходят для кандидатов на должность разработчика. Кстати, если вы Java-девелопер, то для вас есть отдельный список. Нижеприведенные вопросы подходят для всех: Python-, Ruby-, Perl- и C#-программистов.

1. Сколько времени займет получение элемента из связного списка? Из бинарного дерева поиска? Или из хэш-таблицы? А если в этих структурах будет миллион записей?

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


2. В чем разница между перегрузкой и переопределением чего-либо?

Переопределение выполняется во время работы программы, а перегрузка — во время компиляции. Также переопределение и перегрузка выполняются по-разному: например, в Java перегружаемый метод должен иметь отличную от оригинального метода сигнатуру, а в случае с переопределением она может быть той же самой. Подробнее здесь.


3. В чем разница между разветвлением процесса и созданием нового потока?

При разветвлении процесса создается новый процесс с тем же самым кодом, но в отдельном пространстве в памяти, а при создании нового потока код выполняется одновременно с главным потоком, но в том же пространстве в памяти.


4. Что такое критическая секция?

Критическая секция — это часть кода, которая может быть изменена всеми потоками. Для того, чтобы защитить критическую секцию, используются семафоры и блокировки (в Java это делается с помощью ключевого слова synchronized или через ReentrantLock). Подробнее.


5. В чем разница между типом-значением и типом-ссылкой?

Типы-значения более оптимизированы и хранят в себе значения, в то время как типы-ссылки хранят ссылку на объект. Подробно здесь.


6. Что такое куча и стэк процесса?

Куча и стэк — это две разных области памяти одного процесса. В Java стэк используется, чтобы хранить примитивные значения и типы-ссылки, но сами объекты всегда создаются в куче. Еще одно критическое различие — куча одна для всех потоков, но каждый поток имеет свой собственных стэк. Больше здесь.


7. Что такое система контроля версий?

Системы контроля версий используются для того, чтобы эффективно хранить и сравнивать различные версии вашего продукта. При профессиональной разработке всегда используется та или иная система контроля версий: Git, SVN, CVS, PerForce или другая, и чем больше разработчиков участвуют в проекте, тем больше необходимость в такой системе. Системы контроля версий играют важную роль в разрешении конфликтов в коде и поддержке истории проекта. Подробности по ссылке.
прим. перев. Кстати, вот несколько хороших книг на эту тему.


8. Что такое сильнотипизированный язык программирования?

В сильнотипизированных языках компилятор обеспечивает корректность типов данных. Например, вы не можете хранить число в типе String, и наоборот. Java — сильнотипизированный язык, и поэтому в нем есть множество типов вроде int, float, String, char, boolean и т.д. Вы можете хранить значения только в соответствующих им типах. В слаботипизированных языках тип переменной определяется во время компиляции в зависимости от контекста. Популярные слаботипизированные языки: Python и Perl. Подробнее.


9. В чем разница между валидным и хорошо сформированным XML?

Хорошо сформированный XML-файл содержит корневой тэг, все тэги закрыты, все атрибуты в нем правильно определены и т.д. С другой стороны, валидный XML-файл проходит проверку XSD-файлом или схемой. Так что XML может быть и хорошо сформирован, но в то же время не проходить проверку, так как содержит в себе неразрешенные тэги и т.п.


10. В чем разница между DOM- и SAX-парсером XML?

DOM-парсер загружает в память сразу весь XML-файл и создает на его основе DOM-дерево, которое и парсится. Из-за способа работы DOM-парсер не подходит для больших XML-файлов, так как те займут слишком много памяти, зато он работает быстрее. SAX-парсер работает на основе событий: открытия/закрытия тэга, начала/конца атрибута и т.д. Таким образом, SAX-парсер занимает немного памяти, но медленнее DOM-парсера. Подробный ответ здесь.


11. Как между собой соотносятся потоки и процессы?

У одного процесса может быть несколько потоков, но каждый поток может принадлежать только одному процессу. Два процесса запускаются в разных областях памяти и не могут обмениваться между собой данными, а два потока одного процесса всегда запущены в одной области памяти. Подробнее здесь.


12. Что такое неизменяемый класс?

Класс называется неизменяемым, если его состояние не может быть изменено после создания. Например, класс String в Java является неизменяемым. Как только вы создадите строку «Java», вы не можете изменить ее содержание, и любая операция над ней вернет новый объект. Неизменяемые объекты лучше всего применять при многопоточном программировании, так как при их использовании вы можете не беспокоиться о синхронизации. По сути, целая парадигма функционального программирования построена на неизменяемых объектах. Подробно здесь.


13. Зачем нужны Mock-объекты?

Mock-объекты полезны для тестирования какого-то определенного участка в вашем коде. Например, вы создаете программу для отслеживания курсов обмена валют, которая берет данные из интернета, но у вас нет URL, к которому бы можно было подключиться. Создав Mock-объект, имитирующий необходимое вам поведение, вы сможете протестировать свой код. Для Java есть множество библиотек, с помощью которых вы можете создавать Mock-объекты. Например, Mockito и PowerMock. Ответ здесь.


14. Что такое SQL-инъекция?

SQL-инъекция — уязвимость в безопасности системы, при которой злоумышленник вместо данных посылает в базу данных выполняемый SQL-код, таким образом получая полный контроль над БД. Из-за SQL-инъекций часто утекают пароли, логины и личная информация пользователей. SQL-инъекций можно избежать, заранее «подготавливая» поступающие данные.


15. В чем разница между INNER JOIN и LEFT JOIN?

В SQL есть два типа оператора JOIN: INNER JOIN и OUTER JOIN. OUTER JOIN тоже может быть двух видов: LEFT JOIN и RIGHT JOIN. Главная разница между INNER JOIN и LEFT JOIN в том, что в первом случае из обеих таблиц выбираются только подходящие записи, а во втором случае из первой таблицы выбираются все записи, а из второй только подходящие. Всегда обращайте внимание на запросы с «ALL», потому что они, как правило, требуют LEFT JOIN, например, запрос, который требует найти все отделения и количество работников в них. Если вы используете INNER JOIN, то пропустите пустые отделения, в которых никто не работает. Больше здесь.


16. Что означает буква V в аббревиатуре MVC?

V — это View в паттерне MVC. View — это то, что видит пользователь, просматривая вашу веб-страницу. Идея паттерна MVC состоит в том, что все веб-приложение разделяется на три независимые друг от друга части, которые можно редактировать, не боясь затронуть другие: Model, View, Controller. Модели — это сами бизнес-объекты (например, пользователь, разработчик, директор и т.д.), а контроллер — то, что управляет моделями. Для Java существует множество фреймворков, реализующих MVC — например, Struts 2 или Spring MVC. Подробности по ссылке.
прим. перев. Также о парадигме MVC вы можете прочитать здесь.


17. В чем разница между классом и объектом?

Класс — это «чертеж», по которому создается объект. Он описывает возможное поведение создаваемого объекта, а объект реализует это поведение. Нельзя создать объект без класса, соответствующего ему. Подробнее.


18. Что такое слабая связанность (англ. loose-coupling)?

Слабая связанность — желаемое качество ПО, при котором один его модуль может быть свободно изменен без влияния на второй. Например, если вы вносите изменения в пользовательский интерфейс, то это никак не должно отразиться структуре классов на бекэнде.


19. В чем разница между композицией, агрегацией и ассоциацией?

При ассоциации два объекта связаны между собой, но могут существовать и отдельно. Композиция — форма ассоциации, когда один объект состоит из нескольких других, которые могут существовать только вместе. Например, человеческое тело — это композиция органов. Какой-то один определенный орган не может работать сам по себе вне тела. Агрегация — это коллекция объектов. Например, город — это агрегация горожан. Подробный ответ.


20. В чем разница между интерфейсом и абстрактным классом?

Классика. Интерфейс — это чистая абстракция, которая не содержит в себе ничего, кроме названий методов, в то время как абстрактный класс может содержать себе еще и код. Разница может отличаться в зависимости от языка — в Java класс может унаследовать только один абстрактный класс, но сразу несколько интерфейсов. Подробнее здесь.


21. Что такое юнит-тестирование?

Юнит-тестирование — это способ протестировать поведение не всего приложения в целом, а какого конкретного участка кода. Существует множество способов проводить юнит-тестирование в разных языках. В Java для этого существуют библиотеки JUnit и TestNG. Как правило, юнит-тесты запускаются автоматически во время компиляции или в среде вроде Jenkins. Пример здесь.


22. Какие три вида тестирования существуют?

Юнит-, системное и дымовое тестирование. Юнит-тестирование используется для того, чтобы протестировать какой-то конкретный участок кода, системное тестирование — для того, чтобы проверить всю систему, а дымовое тестирование проводят для того, чтобы убедиться в работоспособности главного и наиболее часто используемого функционала системы, например, на сайте для бронирования билетов на самолет должно работать само бронирование и его отмена.


23. В чем разница между итерацией и рекурсией?

Итерация использует цикл для того, чтобы повторить какое-то действие несколько раз, а рекурсивная функция вызывает сама себя. Зачастую рекурсия может предоставить более чистое и понятное решение для некоторых задач, например: «башни Ханоя», переворот связного списка или строки. С другой стороны, каждый вызов функции уменьшает свободное место в стэке, и через какое-то время вы можете получить ошибку переполнения стэка. По этой причине итерация обычно предпочтительнее рекурсии. Больше здесь.


24. В чем разница между операторами & и &&?

& — это битовый оператор, а && — логический. & может быть применим как к целым числам, так и к булевым типам, в то время как && — только к булевым. & применяется к каждому биту обеих сравниваемых переменных, в то время как при использовании && второй аргумент может быть не задействован вовсе, если первый ложен. Мне нравится этот вопрос, и я часто задаю его как джуниорам, так и сениор-девелоперам. Подробности здесь.


25. Каков результат операции 1 xor 1?

Ответ: 0, потому что xor возвращает единицу только в том случае, если один из аргументов равен единице, а другой нулю. Например, 0 xor 0 и 1 xor 1 равны нулю, а 1 xor 0 и 0 xor 1 — единице.

Источник: «Top 50 programmer phone interview questions»