PHP: Собеседование

Interview

Довольно часто (постоянно) мне приходиться проводить собеседование людей желающих устроитсья в мой отдел на должность “junior PHP developer” и “PHP developer”. И, с завидным постоянством, я и team-lead отдела задаем одни и те же вопросы…

Каждое собеседование начинается с одного и того же вопроса:

– Почему PHP?

И, как ни странно, некоторые умудряются “засыпаться” уже на нем:
– Пробывал язык N – такой сложный, и поэтому решил учить PHP
или еще лучше:
– Решил пока поработать в PHP отделе, а потом перейти в отдел .Net
Но чаще всего слышим один из следующих ответов:
– Делал страничку – понадобилась динамика – выбор пал на PHP
– Кто-то, зачем-то посоветовал
– Преподавали в ВУЗе – только PHP и смог осилить

Далее, приближаемся к программированию, мы пытаемся понять имеет ли собеседуемый хоть какое-нить представление о ООП, о абстракции, наследовании, инкапсуляции и полиморфизме. Ага, кто-то лекции прогуливал в университете ;)

А теперь начинается самое оно:

– Под какую версию PHP писали? В чем различия между четвертой и пятой версиями?
– Какими сторонними библиотеками пользовались?
– Опыт работы с различными CMF/CMS?
– Типы данных в PHP? (их всего 8, не верите – читайте мануал)
– Назови по памяти функции для работы с массивами, строками
– Что такое сериализация?

И далее несколько практических вопросов…

– Что такое Apache? А mod_rewrite?

– Аббревиатура SVN и CVS о чем-нить говорят?

– Багтрекинг системы? BugZilla? JIRA?

Не забываем и о БД:
– Что такое реляционная база данных?
– Нормализация, денормализация
И чуть-чуть практики (связь многое-ко-многим в MySQL, каталог товаров произвольной вложенности)

HTML + CSS + W3C (знания HTML на базовом уровне считаю обязательным):
– Нарисуй-ка простенькую форму для отправки файла
– CSS знаешь? В чем разница между записью #my и .my?
– Расшифруй вот такую запись в CSS … (и далее что-то невообразимое, но вполне читабельное, задаю не часто, если только испытуемый заявляет что знает CSS)
– Что такое стандарты W3C?

Linux:
– С *nix знаком?
– Apache и PHP сетапил?

Сетевые технологии и не только:

– Знаешь что такое уровни модели OSI? Назови хотя бы их количество. (это вопрос на “пять”)
– По какому протоколу осуществляется передача данных в сети Интернет?
– Расскажи что поисходит, когда в строке браузера набираешь адрес и нажимаешь Enter?

Иностранные языки:
Тут особо не мучаем, если же в резюме указан уровень знания английского как “хорошо” – вот тогда нам на помощь спешит COTOHA – лучше правдиво пишите – уровень университета или начальной школы… ;)

Бывает, озадачиваем каким-нить тестом на сообразительность (поменяй-ка друг значение переменных A и B местами не используя третью переменную)

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

100 thoughts on “PHP: Собеседование”

  1. Это у вас ещё вопросы взрослые :)
    У меня на порядок проще, и без задачек на логику, без теории ООП, без HTML/CSS, и все равно народ ТАКУЮ ахинею несет.
    На все вопросы простого вопросника из 20 пунктов, на базовые знания PHP, уже не отвечал никто наверное год :) Да и 10ти правильных ответов хватило бы.

    Ещё они же потом выходят и рассказывают “Да там сидят 2 оболтуса задают глупые ненужные задачки и понтуются своей крутостью”

    Вообщем я отчаялся найти программера, которого можно будет обучить, среди тех, у кого PHP был первым языком программирования.
    Я таких называю “переверстальщики” и последние пол-года стараюсь таких фильтровать на этапе прочтения резюме.

  2. > поменяй-ка друг значение переменных A и B местами не используя третью переменную

    Подобные вопросы – бессмысленны. Если знает ответ заранее – ответит (но это говорит только о том, что у собеседуемого неплохая память или просто задачка ему почему-то запомнилась), если не знает – в рамках собеседования не додумается.

  3. засыпался на вопросе про CSS :) и еще поразили ответы на первый вопрос, это каким же дураком нужно быть, чтоб так отвечать?
    а так собеседование в принципе не сложное.
    to wicharek : ради интереса решил тест на сообразительность за полторы минуты, хотя решение не помнил вообще(привычка с олимпиад)

  4. 2 wicharek

    а в чём проблема догадаться? тут некоторые просят реверсивровать строку с помощью рекурсии. слабо? а переменные менять это понты :)

  5. Менять – это конечно понты, вот только за все время с этой задачей справилось не так много испытуемых…

  6. 2 voituk:
    с чем согласен?

    если не знает – в рамках собеседования не додумается

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

    плюс задачи такого плана должны решаться вслух – типа демонстрация того, как человек думает. многие как оказывается не думают, а тупят, что показательно.

  7. Вопросы-то не сложные..Проблема в людях, которые пишут хоумпаг и считают, что уже знают PHP.

    Хотя я уверен, что пятую нормальную форму мало кто правильно опишет ибо в практике они-то и не встречаются, а теория быстро забывается. Так что смотря насколько глубоко распрашивать..

  8. Описать пятую нормальную форму? Для начала было бы не плохо получить ответ на вопрос: “Сколько всего нормальных форм?”.

    Люди приходят на собеседования без знания основ ООП и БД в принципе, а в графе “желаемая ЗП” красуется 400 у.е., только не понятно за что им платить… Приходиться извращаться и пытаться выявить самородки, которых можно будет легко обучить, пока более или менее это получается…

    Вот, вспомнилось, приходила девушка на должность web-дизайнера – рисую сайты, но не верстаю, хочу 500, т.к. муж получает 1000…

  9. Веб-дизайнер и не должен верстать. Аргументаця у нее конечно совсем никакая (муж получает 1000), а вот то, что дизайнер не должен верстать – это 100%. У меня дизайнеры могут получать от 1000 долларов в месяц и не сверстать в жизни ни одной странички.

  10. Я и не утверждаю, что должен, меня просто поразила именно аргументация – смотрю на ЗП мужа, делю на 2 – и получаю свою, а что в портфолио? – “Вот такие буклетики делала”, а дизайны сайтов? – “А какая разница?”. Ааа… спасите нас, от таких кадров…

  11. 400$ ну вы и изверги… я бы за такие деньги…ммм даже не знаю..разве что студентом пошел на подработку. И то на несложные проекты

  12. Ой еще можно уточнить
    “поменяй-ка друг значение переменных A и B местами не используя третью переменную”
    1переменная=”первое значение”
    2переменная=”второе значение”
    Где в качестве строк указано именно строковое значение или булевское, либо это обьект,либо ссылка.
    Не правильная постановка задачи, мне кажеться. Возможно ошибаюсь…

  13. А проверка разная бывает, и спецы разные бывают. Вот как я начинал свой путь в PHP. Пришел, поговорили, взяли. Знаний у меня было по языку ровно большой НУЛЬ… и дали мне проект, написанный индусам. Базис был на VBulletin, ни шаблонов, ни БД ни нормального описания. И сказали вот тут маленькое дело, нужно сделать так, что бы заработало. Просидел я возле него 2 месяца (платили кста по 300$ за полдня работы, ибо еще учился в универе)… и сделал таки! у начальства были глаза по полтиннику. На этот проект садили 3 программеров до меня, и в течении года ни один не смог его сделать. Это я не ради саморекламы, а вот к чему. Есть программеры, которые очень хорошо выполняют рутинную работу, не сложную, в которой нужно сделать систему быстро. А есть программеры, которые очень хорошо идут на проекты сложные, громоздкие. На своей практике, так же, посчастливилось поработать в качестве team-leader и были ребята различные в подчинение. Одни могли работать в команде, другие больше подходили для корректировки, третьи были ассы, четвертые хорошо проектировали итд итп.
    Ой много слов, а суть то не высказал. Суть! Нужно выбирать не по тестам, а именно немного вопросов + внутреннее чутье. А то можно, например, взять асса, а в ходе работы окажется, что он просто как человек говно и с ним никто работать не будет.

  14. Sany: Начну по порядку:
    – 400 хороший старт для студента, но если этот студент отвлекает пол-отдела на своё обучение – я считаю – это слишком накладно…
    – условие задачи действительно не полное: переменные типа integer (и float тоже подойдет), решение не привязываем к языку программирования (например на python’е эта задачка решается одной строчкой)
    – для выяснения сможет ли человек с нами сработаться, и понять как человек работает в общем – есть испытательный срок, но не могу не согласиться – если нутро говорит, что толку не будет – значит нам с ним не по пути

  15. на PHP тоже одной строчкой, зарублю я вам, ребята вопрос, уж извините, придумайте более каверзный:
    ($a = $a + $b) && ($b = $a – $b) && ($a = $a – $b);
    :-D

  16. Я вот только не понял про CSS+HTML+W3C.

    Вам верстальщик нужен или программер? Вы же сами пишете что “ощущение что взяли переверстальщика”.

    Суп отдельно, мухи отдельно.

  17. Насчет “переверстальщика” это писал не я, а вот насчет того, что PHP разработчик должен знать HTML хотя бы на уровне написания форм – это я требую…
    Еще такой момент – дизайн к движку сайта прикручивает сам разработчик, заполняет тоже разработчик, а если он не знает даже того, что в XHTML тэги всегда должны закрываться – то при валидации обязательно вылезет бяка…
    И насчет CSS – дизайнер/верстальщик дал дизайн, в CSS прописаны все необходимые стили, а разработчик его не понимает – то куда это годиться? Потом вылавливать по всему коду font’ы да styl’ы…

  18. Какой город и какая зарплата(вилка)? Люди которые прийдут на 300$ в Москве и на 1500$ в Харькове или Одессе это будут совсем разные люди.

  19. > поменяй-ка друг значение переменных A и B местами не используя третью переменную

    #!/usr/bin/env python
    a, b = b, a

    :)

    На самом деле тут объекту типа tuple присваивается другой объект такого эе типа: (a, b) = (b, a), так что используется два дополнительных объекта, итого – 4 переменных.

    >Подобные вопросы – бессмысленны. Если знает ответ заранее – ответит (но это говорит только о том, что у собеседуемого неплохая память или просто задачка ему почему-то запомнилась), если не знает – в рамках собеседования не додумается.

    Года три назад, на местном конкурсе детского компьютерного творчества я додумался за 5-10 минут.

    PS: а вопросы-то совсем простые. Вам unix-админ случаем не нужен?

  20. :) а чего вы ждали от МЛАДШЕГО PHP разработчика?
    у МЛАДШЕГО PHP разработчика спрашивать Почему PHP? – верх глупости. А если у вас на приём на работу МЛАДШЕГО PHP разработчика ключевыми вопросами являются Нормализация, денормализация и наследовании, инкапсуляции и полиморфизме – то могу вам только посочувствовать – вы скорее всего пропустили мимо перспективных молодых людей. На поей практике студенты, которые могли ответить на такие теоретические вопросы – кроме теории и знать-то ничего не знали. Младший и должен быть младшим, что бы учиться.

  21. Позвольте вмешаться.
    ИМХО, брать из текста собеседующего задачку и тыкать носом того же собеседующего в нее с фразой “айайай, что ж вы так тупите-то, батенька, задачка-то паршивенькая” сверх невежливо и немного низковато – эти задачи приводились как пример, как объяснение того, почему собеседующий считает именно так, а не иначе.
    По поводу разработчика (Младшего, старшего, аса и т.д.) – есть база, которую не отнять, и которую должен знать любой человек, который собирается быть РАЗРАБОТЧИКОМ. Я бы поспорил с Антоном по поводу той или иной технологии, но я абсолютно поддерживаю его в том, что человек ОБЯЗАН знаь эти ПРОПИСНЫЕ вещи. Без них ему дорога либо в обучение (тогда он не будет младшим РАЗРАБОТЧИКОМ, он будет курсантом, студентом, etc.), либо сменить взгляды на жизнь и уйти физически трудоемкую область (сварить, шлифовать, etc.).

  22. 2 Vlad Rusinov – ИМХО самое быстрое решение.
    2 Sany – задачка-то задаётся не для тогщ, чтобы в ней уточнять что-то. Хотя по этому признаку тоже можно что-то вылавливать в претендующих. Но это всего-лишь проверка логического мышления. У меня, допустим, даже с предположенными int’ами без выяснения всех обстоятельств пляски над переменными ушло минуты две посидеть, посмотреть на значения да вспомнить чуток арифметику.
    На счёт уровня зарплат – Тут каждому своё. Очень много по этому поводу сказано и очень многие ломали копья именно на этом вопросе, т.к. как бы ты ни любил программирование – кушать хочется всегда. Но замечу, что сумма в 400 для начинающего девелопера – вполне нормально.

    Краеуглльным камнем во всех этих спорах стоит одна единственная вещь – Что выгоднее? Взять сотрудника на обучение и вышлифовать из него Нечто (Алмаз или кусок Глины – чаще всего видно после прошествия какого-либо времени), либо же не брать, но при этом остаться без разработчика?

    При том в первом случае теряется часть времени тех, кто будет учить. Во втором случае теряется время проекта. Вот, собственно, та же простая арифметика.

    Моё ИМХО: собеседование, как таковое, есть обычное выяснение, что человек умеет и чему он может научиться. А так же косвенное выяснение его желаний. Те же самые “уровни знаний” с галочками – проверка самооценки и “планки вранья” конкретного человека. Мне, допустим, было очень стыдно писать хорошую ЗП (а 400 – 450 баков по тем временам для меня были просто Отличными деньгами), если уровень моих знаний явно недотягивал. Если у человека есть желание программировать – он будет к этому стремиться. Если нет желания – он будет стремиться к хорошей ЗП, к удобному месту, к чему угодно, но только не к программированию.

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

    Что-то я совсем в полемику ударился…

  23. мне сразу в голову пришел такой вариант :

    extract(array(‘a’ => $b, ‘b’ => $a));

    =)

  24. php’шный аналог питоновского a, b = b, a:
    list($a, $b) = array($b, $a);

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

  26. Хорошие вопросы. Задаю приблизительно такие же. Только из своей области.

    Теоретические вопросы задаю редко, теоретики мне не нужны, из них обычно практики плохие. По себе замечал :-)
    А вот практические вопросы которые человеку встретяться на проекте задаю обязательно. И те теоретические которые без которыех ну никак на проекте не выжить – тоже.

    Задачка а-ля “поменяйте местами переменные” – это только начальная зацепка для дискуссии.
    Например выше было решение со сложением-вычитанием. Хорошее решение, вот только на многих языках работает не на всем множестве интов к примеру. Потому что банальное переполнение. А про XOR помнят единицы.

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

  27. php’шный аналог питоновского a, b = b, a:
    list($a, $b) = array($b, $a);

    Там вообщето массив объявляется, это уже третья переменная, хоть и не очевидная.

  28. Недавно подумалось, что на собеседованиях на вопрос о различии между 4 и 5 версиях PHP буду сначала рассказывать о наличии в пятерке функций вывода времени восхода и захода солнца для разных широт. Пусть сначала собеседующие головы поломают да в доки полезут проверят (опыт подсказывает, что те, кто себя считает гуру – не во всем гуру). Вопросы не каверзные, но смысла нет во многих из них…

  29. – Почему PHP?

    Ответьте сами на этот вопрос, пожалуйста.

  30. 2 rep1k
    думаете сложно? любой осознанный выбор достаточно легко аргументируется…

  31. 2 rep1k
    На данный вопрос я бы рассказал историю о том, как я пристрастился к PHP и вступил в клуб анонимных PHP-тов…

    А если серьезно – создал сайт, понадобилась динамика – начал изучать PHP. Потом еще один сайт, потом еще один…

  32. Почему же глупо просить претендента решить простенькую задачку, на переменные? ИМХО, нормально: если человек знал решение, значит ему повезло; если не знал, то это хороший способ проверить элементарные знания математики! Не зная решения, но владея математикой на уровне 6-го класса, данную задачу можно решить за минуту.

    А то что ее не решает, говорит только об одном, что у нас появилось куча горе-программистов, которые по математики “двойки” и “тройки” получали и логически думать не могут.

    Для них “программирование” и “язык программирования” – это тождественные понятия!!!

  33. 2Pastor:

    Вы не правы… В данном случае переменная не создается, просто используется участок памяти, который сразу же и освобождается за счет того, что ссылка на него тут же “убивается”.

    Вот вы знаете, что конструкция $i++ в отличие от ++$i больше памяти отжирает? За счет того, что создается такая же “виртуальная переменная” как и в предыдущем примере.

    Вот что говорит Википедия: Переменная в традиционных языках программирования — поименованная ячейка памяти, имя которой можно использовать для осуществления доступа к данным, находящимся по данному адресу.

    От себя поправлю: “может использовать программист для осуществления доступа к данным из программы”.

  34. ну вообще в оригинале просят не “не использовать 3ю переменную”, а “не использовать больше памяти”

  35. А теперь начинается самое оно:
    – Под какую версию PHP писали? В чем различия между четвертой и пятой версиями?

    С 4 писал, в 5 версие продвинули ООП, подробнее у них на сайте :) там куча правок, все изучить тяжело. Сейчас работаю исклюительно на 5, тк 4 закрыта и не актуальна :)

    – Какими сторонними библиотеками пользовались?

    В основном никакими, люблю своё даже если это тяжело. Люблю новое и сложное

    – Опыт работы с различными CMF/CMS?

    DLE пытался переделать (писал CMS по аналогу), смотрел Битрикс(аццтой), немножко копался в других… Опять же хочеться делать своё :)

    – Что такое Apache?

    вебсервер

    А mod_rewrite?

    обьяснение по тупому: изменение некоторых настроек с нтаккес файлов. Применяют для ЧПУшек :) (тут мог запороться, тяжело мысль выразить)

    – Аббревиатура SVN и CVS о чем-нить говорят?

    Контроль версий вроде :)

    Багтрекинг системы? BugZilla? JIRA?

    говорит 1) остальное не юзал :)

    Не забываем и о БД:
    – Что такое реляционная база данных?

    хз, не силён в терминологие

    – Нормализация, денормализация

    тоже

    И чуть-чуть практики (связь многое-ко-многим в MySQL, каталог товаров произвольной вложенности)

    HTML + CSS + W3C:
    – Нарисуй-ка простенькую форму для отправки файла

    запросто :)

    – CSS знаешь? В чем разница между записью #my и .my?

    ПХП программер не всегда должен знать КСС, но разница в том, что 1 вариант привязан в елементу с ID = my, a 2 class = my

    – Расшифруй вот такую запись в CSS (и далее что-то невообразимое, но вполне читабельное)

    давай)

    – Что такое стандарты W3C?

    принятие веб косорциумом стандарты :) иногда соблюдаються браузерами (ИЕ исключение -.-) у них ещё чекер есть xD

    Linux:
    – С *nix знаком?

    нет

    – Apache и PHP сетапил?
    на винду – да, и часто :)
    а ещё мускл сетапил) не люблю готовые паки типа денвера :) своё своё своё

    беглые ответы на вопросы :)))) Я прошёл? :)

  36. Признаться, на обмене переменных, завалился бы. Просто не сработал бы мозг, т.к. задача сама по себе абсурдна и не имеет никакого практического применения — ну не экономят так на памяти.
    Остальные вопросы действительно простые и стандартные. Такие встречаешь практически на каждом собеседовании. Единственное исключение в моей жизни — опросник на 20 вопросов из с серии “чем отличается echo от print”.

  37. [quote]list($b, $a) = array($a, $b)[/quote]
    Тоже додумался до этого, пока страничку листал, чтобы отпостить – омг, не успел :P

    На самом деле собеседование простое, я в свои 16 лет его бы сейчас сдал на 8-9/10 баллов :) А после вуза думаю знаний-то должно быть более :)

    PHP MY LOVE :) Как вспомню тот C++, фу, гемор :)

  38. Тут как я понял, или никто не написал правильный ответ (математическое решение), или их трут постоянно :)
    Если первое, то я буду первым.
    Решение задачки на сообразительность.
    a = a – b;
    b = a + b;
    a = b – a;

    Решение простое. Задача с подковыркой. Вообще, считаю что на собеседованиях такие вопросы задавать нельзя. Просто получается, что человеку задают заранее придуманные головоломки, которые от него требуют тут же решить. Это с чего бы? Ни в одном месте в программировании не пригодиться данная задача. Зачем людей мучить тем, чем они возможно никогда не увлекались (разгадыванием шарад)? Проверка на сообразительность в стрессовых ситуациях? :) Смешно. Это какие стрессовые ситуации. Что бы на сайте случилась какая то нестандартная ситуация, нужны или кривые руки (да встречается часто) или высоконагруженная система. И не те “высоконагруженные” что в день имеют по 5 – 20 тысяч уникальных (тут просто тоже кривые руки), а те которые от 150 в день. А таких в рунете по пальцам пересчитать можно. Вот и получается, что кого ищем не понятно, а приходят математики :)

  39. Ну во-первых, даже если человек не справился с данной задачкой – это не значит, что он нам однозначно нам не подходит, во-вторых – стрессовых ситуаций в работе программиста хватает (вспомним тот же deadline), и в третьих – мы не ориентированы на ру-нет, и требования в 500 конкурирующих соединений – вполне реальны…

  40. Не помню чтоб в РНР мне понадобилась подобная задачка, а вот в асме (не на современных комповых процах, а на других, там где кеша нету а регистров только несколько и те восьми битные) менять местами циферки не используя доп-хранилища очень даже часто приходилось.

    Но вот для РНР считаю разумным вариант list($a, $b) = array($b, $a); так как это вам не ассемблер, тут другая совершенно ситуация, другая идеология и другие запросы по оптимизации кода (тут не байты важны а “красивый” код чтоб другие его читали как на родном языке)

    Так что при задавании подобной задачи необходимо, либо пояснять что она сугубо теоретическая и к РНР никакого отношения не имеет, либо принимать за правильный ответ варианты

    list($a, $b) = array($b, $a);

    и

    extract(array(’a’ => $b, ‘b’ => $a));

    (хотя второй имхо извращённее выглядит, первый как-то логичнее кажется)

  41. а я бы ответил на все эти вопросы – ну разве что тока в линуксе я не шарю 6)

  42. на PHP тоже одной строчкой, зарублю я вам, ребята вопрос, уж извините, придумайте более каверзный:
    ($a = $a + $b) && ($b = $a – $b) && ($a = $a – $b);
    :-D

    Это не будет работать в случае, если а и b равны.

  43. я не програмист, и на собеседование по программированию врдя ли приду когда-нибудь, просто заинтересовала дискуссия по поводу необходимости вопроса о замене значений переменных
    считаю его просто необходимым в разделе общие вопросы. надо его монтажникам своим задавать :-)
    к программированию на php, может отношения и не имеет, но говорит о умении человека рассуждать логически.
    классический вариант а=а+в, в=а-в, а=а-в – сразу в голову пришло

  44. лучше бы попросили поменять местами через логические операции с доказательством по таблице истинности этих самый операций) придумать это можно за 3-4 минуты, если написать сначала таблицы, ну а если человек не знает логические операции, то какой из него программист?) по крайней мере, при собеседовании на дельфи или си-программиста это имхо обязательно.

Comments are closed.