Вопросы на собеседованиях при устройстве на работу программистом

Сегодня я решил поразмышлять о том, какие вопросы задают программистам (и не только) на собеседованиях при устройстве на работу. В данной заметке, я попытаюсь рассказать о том какие вопросы испытывал я лично на своем опыте трудоустройства, читал в журналах и Интернете или задавал сам, когда мне было необходимо найти человека для работы.

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

Вообще, на мой взгляд, собеседование процесс очень интересный, а главное познавательный. Что ожидать от той или иной беседы с руководством организации можно только догадываться, а поэтому в той или иной степени начинаешь ощущать себя студентом, который идет сдавать экзамен. Вопрос готовиться к собеседованию или нет — риторический. Конечно хорошо когда человек подготавливается, однако настоящих знаний это может не показать (я думаю многие из нас не любили в университетах тех, кто сдавал экзамены зазубривая материал, абсолютно не понимая о чем они говорят, по мне здесь ситуация аналогичная). К тому же как показывает практика отличные знания Вашей специализации это еще не гарант приема на работу. Вы можете не понравиться фирме как личность, запросить слишком большую ЗП и многое другое. А еще встречаются и такие организации, где для приема на работу на должность программиста не задают ни одного вопроса о программировании. При этом из сотен претендентов выбирают 1-2 человека. Да, бывает и такое…
Сейчас я не буду акцентировать внимания на таких общих вопросах, как: «кем вы себя видите«, «чем увлекаетесь» и «что знаете о нашей фирме«… Для чего нужны эти вопросы, я думаю, многим известно, а если нет, то в Интернете полно информации по этому поводу. А вот о специализированных вопросах мы поговорим поподробнее.
Давайте представим себе, что мы находимся в какой-нибудь фирме и проходим собеседование на только что освободившуюся должность. Мы поговорили на общие темы, и теперь настало время перейти к теории и практике. Как правило все начинается с очень простых вопросов. Например если мы говорим о должности программиста PHP вопрос может выглядеть так (у программистов C# могут спросить тоже самое):

Какие имена переменных допустимы
$test = 1;
$test123 = 1;
$123test = 1;
$пришелВася = 1;
$_123test = 1;

Так же одним из вопросов может быть «Перечислить типы данных в том или ином языке программирования«. Если речь идет о современных языках программирования стоит помнить про ООП, что это, с чем его едят. А уж речь зашла про объектно-ориентированное программирование готовьтесь услышать «А чем отличается абстрактный класс от интерфейса«. А если речь идет о PHP, то тут уж от вопроса «Главное отличие PHP4 от PHP5» никуда не денешься. Однако, если Вы не полный ноль, эти вопросы воспримутся адекватно и ответить на них у Вас труда не составит. А главное это придаст Вам уверенности в себе. Далее вопросы могут быть очень разнообразными: а что выведет этот код, а что такое это, а что такое то, а что из перечисленного вы хотя бы раз использовали… Однако в целом все сводиться в достаточно общим вопросам, так как человек не может знать все. В целом я всегда симпатизировал фирмам, которые свои собеседования проводят именно в таком духе. Для меня эталоном адекватности фирмы является фраза: «Мы сейчас тебя поспрашиваем, но мы прекрасно понимаем что у нас ты будешь учить почти все заново«. В данном случае фирма ищет не робота, готового с первого же дня приступить к плодотворной работе, а адекватного человека, который умеет что-то делать, и может обучиться делать что-то новое, а главное сможет вписаться в их коллектив. Еще один плюс к копилку фирмы, можно добавить, если на собеседовании выдают тестовое задание. Во-первых это поможет фирме отсеять реально не заинтересованных в должности людей (такова уж человеческая натура), а во-вторых анализ решения кандидата как ни что покажет, что твориться у него в голове. Тестовые задачи, как правило очень простые: для PHP это может быть «Создание гостевой книги«, для C# «Создание двух приложений, которые могут обмениваться данными«, для JS это может быть задача по созданию формы с проверкой заполненности полей«, для 1с это может быть задача «Создание обработки для списка сотрудников» и т.п.



Все хорошо, если бы так было всегда и у всех. Работодатели встречаются разные и порой очень специфические. Я никогда не пойму ситуацию, когда одна фирма приглашает на интервью топового работника другой фирмы и просто заваливает его вопросами, на которые тот не в состоянии ответить. Причем причина этого не в слабых навыках работника, а в совершенно разных сферах деятельности. (например администратор Win сервера абсолютно может быть не компетентен в вопросах Unix, а программист всегда работающий с использованием одного фреймворка, может совершенно не ориентироваться в другом). Так же некоторые фирмы зачем то заваливают кандидатов теоретическими вопросами. Конечно, основу, а в некоторых моментах, чуть больше, знать нужно. Но все это рано или поздно улетучится, если это постоянно не практиковать. Приведу случай из своего собеседования:

Однажды на одном из собеседований мне задали вопрос, который загнал в меня в ступор. А именно меня спросили:
Сколько нормальных форм БД вы знаете? И опишите их.
Я порылся в закромах своей памяти и вспомнил давние лекции, которые нам читали в университете года 3 назад. Я ответил что существует 3 основные нормальные формы и еще 2 дополнительные, которые по сути лишь уточняют или конкретизируют первые три. 
А не мог описать каждую форму, но в целом я мог рассказать об основных моментах, которые они в себе несут. Но как оказалось общие слова их не интересовали. 
Однако проблема не том, что я не знал точного ответа на этот вопрос, а в том как повели себя люди, которые меня собеседовали. Они сказали мне, что это должен знать каждый программист, который хоть как-то работает с базами данных. 
"Плохо" - сказали они и покивали головами. 
После этого, у меня не то что пропало желание работать в данной фирме, я хотел попросить их выйти в соседний кабинет и задать этот вопрос людям которые работают у них сейчас. Не думаю что многие бы смогли ответить полноценно на этот вопрос. 


Как говорил наш преподаватель по физике «Да вы что? Зачем учить эти формулы?! У Вас крыша съедет от такого количества информации! Не просто так же люди придумали документации, книги и справочники. Вам нужно лишь уметь правильно ими пользоваться и быть в состоянии самостоятельно разобрать о чем там пишут.»
Как по мне, замечательные слова…

К плану шизофренических вопросов, я так же могу отнести вопросы плана:

Чем отличается версия PHP 5.x.3 от 5.x.4?
Как база SQL хранит таблицы на жестком диске?
Какая особенность есть у цикла foreach в PHP?
Почему ++i работает быстрее i++?
Чем отличается стандарт кодирования X от стандарта Y?

А ведь как не печально, все это встречается. И одно дело, когда вопрос задается с целью проверки реакции человека (так как скорей всего ответ он не знает). Другое когда ответ на этот вопрос реально хотят услышать.

Далее предоставлю небольшой список возможных вопросов:
Что рекомендуется делать при использовании свойсвт float:left, float:right?
Есть MySQL таблицы A и B c полями `name` и `value`. Необходимо поменять местами значения полей `value` в строках, где значение в поле `name` присутствует как в таблице А, так и в таблице В.
Есть массив A. Переставьте его элементы так, чтобы последний элемент стал первым и т.д.
Чем в C# отличается фоновый поток от не фонового?
Отличается ли в C# структура от класса. Если да то чем?
Какие глобальные переменные есть в PHP?
Если ли в Javascript классы?
Чем отличается POST от GET запроса?
Что такое сложность алгоритма?
Основная проблема многопоточного приложения?
Самое основное отличие 1С от C++ или C#?
Когда целесообразней использовать table вместо div?
Какие парадигмы программирования Вам известны?


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