Так уж получилось, что нелёгкая занесла меня в Нью-Йорк, где мне пришлось искать работу программистом. Думаю, многим будет любопытным узнать, как “там” (точнее тут) проходят собеседования и что на них спрашивают, поэтому я решил поделиться своим опытом. Если интересно, жмите "далее", иначе прошу прощения за спам.
Исходные данные: имеется опыт чуть более 5 лет на С++ и столько же на Яве, а самое главное - есть гринкарта, так что заставлять работодателя оформлять рабочую визу не приходится.
Для начала несколько общих слов.
Начинается всё с того, что тебе звонит рекрутер. В большинстве случаев, сотрудник кадрового агентства, ищущий сотрудника для своего клиента. Как правило, с ним разговор за жизнь: с чем работал? сколько опыта в ...? Почему ушёл с прошлой работы и т.д. Технических вопросов здесь, как правило, не задают. Хотя один раз мне повезло нарваться на сказочно стереотипный технический телефонный тест с человеком, не фига в программировании не шарящим (вопросы были в стиле ай-эн-ти ай equals to one semicolon new line ай плас плас семиколон new line system dot out dot prшntln open bracket ай close bracket semicolon, какой будет результат?).
В одном случае рекрутер перед тем, как презентовать меня клиенту, устроил ещё и внутреннее телефонное собеседование с кем-то вроде сотрудника кадрового агенства (или, возможно, с человеком, не так давно ими трудоустроенным).
В другом случае прислали примерно такое тестовое задание (перевод мой):
- реализовать shuffle массива без использования стандатной библиотеки;
- Есть класс “Человек” с полями id, имя. Есть класс “Счёт” с полями id, id человека, сумма (связь “один человек - много счётов”). Есть класс “Результат” с полями id человека, коллекция его счетов, общая сумма денег на его счётах. Реализовать метод, принимающий на вход коллекцию людей и коллекцию счётов и возвращающий коллекцию результатов.
- Есть класс “Бабло” с полями: общая сумма; процент, определяющий, какая часть лежит в банке; процент, определяющий, какая часть лежит в кармане; процент, определяющий, какая часть лежит где-то ещё (гарантируется, что сумма всех трёх процентных полей равна единице). Написать метод, принимающий коллекцию таких объектов и возвращающий результирующий объект (с полями: общее количество денег, процент, сколько денег из общего количества лежит в банках, и т.д.) Всё реализовать на 5-й или 6-й яве, предоставить юнит-тесты.
- Пользователь набирает в своём любимом браузере http://bla-bla-bla.com, получает какую-то страницу. Расскажите как можно более подробнее, что происходит между нажатием enter и отображением страницы. Что изменится, если набрать https?
- Расскажите, как бы вы реализовали hash map (забегая вперёд, скажу, что имплементация hashmapa - это по- моему самый популярный вопрос, не было ни одного интервью, где бы его не было). Какова сложность вставки / поиска элемента?
- Как бы вы реализовывали такую функцию: на вход массив intов и еще один int. Вывести все пары из массива, сумма которых равна указанному числу. Какова сложность такого алгоритма?
- Приведите пример, объясняющий, что такое полиморфизм.
- Дано двоичное дерево (значения не обязательно отсортированы, просто двочичное). Предложить алгоритм, определяющий, симметричное ли оно.
- Дан текстовый файл, содержащий слова. Предложить алгоритм, которая печатает 10 самых частых слов. Какова его сложность?
- Предложить структуру объектов для представления записей из телефонной книжки. У каждой человека может быть телефон, адрес, etc. Какие изменить эти объекты, если у каждого человека может быть несколько телефонов или адресов, и т.д.
- Дан связанный лист. Определить, есть ли в нём циклы.
- Чем hash table отличается от hash map? Кстати, на другом интервью был другой вопрос на ту же тему: чем hash table отличается от hashset? :-) впрочем, я подозреваю, что интервьюер оговорился.
- Чем процесс отличается от потока?
- Есть класс с двумя методами, оба - synchronized. Создаётся объект класса и два потока, объект передаётся в потоки. Первый поток дёргает первый метод, второй - второй. Что произойдет? Что изменится, если один из методов сделать static? А если оба?
- В чём отличия состояний running и runnable у потока? Если поток уже running, можно ли его вернуть в состояние runnable? Что делает метод yeiild?
- У класса Thread в Яве есть метод stop, который deprecated с незапамятных времён. Как вы думаете, почему? Если Вам требуется похожая на stop функциональность, как бы Вы её реализовали?
- Какие можете припомнить различия между struts 1 и struts 2?
- Чем вам нравится и чем не нравится spring?
- В чём разница между JSP и сервлетом?
- Серверная часть посылает JSON-response. Что должен сделать JavaScript на стороне клиента, чтобы этот JSON распарсить?
- Как трекается сессия?
- Как предотвратить SQL injection в Яве.
- Первый пользователь в 9 утра загружает запись из БД для редактирования и идёт курить. Второй пользователь загружает ту же запись в 9.30, меняет одно поле и быстро сохраняет. Первый в 10.00 заканчивает редактирование другого поля и сохраняет всю запись, в результате чего изменение от второго пользователя благополучно теряется. Какие есть стратегии для предотвращения такой ситуации.
- Что-нибудь не очень сложное по SQL, типа написать запрос, который извлекает запись с максимальной датой.
- Есть программа на Яве, при запуске валится с outofmemory. Как можно пофиксить? Исходя из вашего опыта, можете припомнить максимальное значение этого волшебного аргумента в случае 32-разрядной ява-машины? Но он ощутимо меньше, чем разрешённые 4 gb, куда остальная память девается?
- Создаётся объект какого-то класса, складывается в hash map. Затем у объекта модифицируется какое-то поле, влияющее на hash code. Затем у hashmap’ы спрашивают, содержит ли она такой объект. Что она ответит?
- Есть массив из 999 различных чисел, каждое от 1 до 1000 (то есть фактически представлены все числа от 1 до 1000, кроме одного). Как оптимально определить, какое число осутствует.
- Также было несколько вопросов про фреймворки ( в зависимости от требований, одни спрашивали про struts, другие про GWT). Из уже приводить не буду. Но, в целом, достаточно базовые. И надо сказать, что спрашивают честно: если ты говоришь, что с чем-то никогда не работал, то про него никогда и не спросят.
- Ещё что бывает - тыкнут пальцем в какую-нибудь framework из резюме и попросят объяснить, как с ней работать, что в ней нравится, что нет. Затем выберут из резюме другую из той же области, попросят их сравнить - что лучше в одной, а что в другой.
- А вообще кое-кто может и про остальные пункты из резюме поспрашивать, вне зависимости от срока давности. Например, если в 2001 ты работал в области криптографии, то кто-нибудь спросит, с какими алгоритмами имел дело. И какой, например, размер блока у Rijndael. Самым неожиданным для меня вопросом был: " в одна тысяча девятьсот девяносто восьмом году вы работали в институте ядерных проблем, а почему вы оттуда ушли? Ядерные проблемы - это ведь так актуально".
- Интервьюер набросал на доске кусок программы на яве, работающий со строками ( конкатенациия, substring и тд). Нарисовать на доске, что на каждом шаге происходит в памяти.
- Тоже хороший вопрос: сколько примерно воды в океанах.
- Довольно известная - дано две бутылки, вместимостью на 5 и на 3 галона, и неограниченный источник воды. Отмерить 4 галона.
- Также довольно известная - в тёмной шляпе 10 белых носков и 10 чёрных. Сколько (минимально) носков нужно достать, чтобы гарантированно иметь два носка одинакового цвета.
- (Лёша, привет!) 4 человека на одном берегу реки, около моста. Есть один зонтик на 4, он вмещает 2 человека. Всем нужно перейти на другой берег, не промокнув. Первый переходит за 1 минуту, второй за две, 3-й за 5, 4-й за 10. Если двое идут под зонтиком рядом, скорость равна скорости самого медленного. Решение в лоб первый идёт со вторым (2 мин), потом первый возвращается (2 + 1 мин), потом первый идёт с третьим (2 + 1 + 5 мин), потом первый возвращается (2 + 1 + 5 + 1), потом первый идёт с четвёртым даёт 2+1+5+1+10=19 минут. А как перейти за 17 минут?
Релоцировались? Теперь вы можете комментировать без верификации аккаунта.