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. Dilbert правильно подметил, лучший вариант поменять две переменные местами без использования третей – это битовые операции. Уж не знаю, какой синтаксис в PHP для битовых операций, но в Си это было бы так:

    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

    Ошибаются те, кто предлагает “на время занять память – это же не переменная!”. С таким же успехом можно было бы предложить конструкцию:

    int * pC = new int;
    *pC = a;
    a = b;
    b = *pC;
    delete pC;

    А вообще интересно. По своему небогатому опыту, скажу, что просто дежрать в голове, скажем, функции библиотеки std, системку и MFC почти не реально. Забываются даже принципы. Мне кажеться, что главное – это опыт, просто позволяющий разбираться как в новом, так и забытом материале. Всё не упомнишь. Хотя PHP вроде довольно компактен…

  2. Лучший способ это тупо в ассемблере
    RCR AX,8
    таким образом значение из AL перейдёт в AH а из AH в AL

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

  3. Vladson:
    надо более чётко объяснять что мы экономим память, количество переменных, или сферических коней в вакууме.

    Ну, я не был бы так строг. Это типичная головоломка, она вообще не привязана ни к PHP, ни к программированию. Считайте это двумя математическими переменными. Сразу придёт ясность.
    Мне кажеться, что любой программист должен легко решать и более сложные задачи. Не знаю, что нужно программировать, чтоб не сталкиваться с трудностями :-D

  4. Считайте это двумя математическими переменными.

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

  5. Vladson:
    Тогда надо заранее предупредить что это математическая задача, ибо в разных языках она решается по разному. (где-то с битами, где-то с математикой, где-то с логикой)

    Зачем предупреждать? Либо человек решит, либо нет. Либо просто по математически, либо ещё и с учётом языка. Тем больше балов в плюс он получит.
    Но, конечно, нельзя делать такого рода задачи обязательными. Но дополнительно, как задачи, могущие принести только положительные очки, пожалуйста.
    Я не спорю с вами, просто, интересно докапаться до истины, простите придирки :-)

  6. Про задачку: это же PHP, а не C!

    <?php

    $a = “aaa”;
    $b = “bbb”;

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

    var_dump($a, $b);

    ?>

  7. Самое интерестное, что все правильные решения пока через массив (только не говорите что двойной xor объекта нернет тот же объект)

  8. 2 solenko
    только не говорите, что массив это не третья переменная :)

  9. 2 COTOHA:
    Ну… Строго говря — нет, т.к. переменная — именованная чать памяти )

    А если считать что массив переменная, то задача вообще не разрешима в этой формулировке.

  10. 2 solenko
    почему нет?

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

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

  12. 2 COTOHA:
    Ставится чито теоретическая задача. Так почему вы не готовы к абсолютно верному теоретическому ответу — “это невозможно”?
    Вобщем к чему это я… Если человек вдруг подумает, что переменные могут собержать не простой тип, то он подвиснет всеръез и надолго.

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

  13. спасибище за дополнение к собеседовательной заготовке :)

  14. Честно не читал комменты. Но мнение по вопросу – “почему все таки PHP?” считаю неразумным.
    Почему идя домой после работы, чуствуя голод, вместо того чтобы прыгнуть в машину и помчаться к дому, ты проходишь мимо своего автомобиля, заруливаешь в парк с баночкой пива и сидя на скамейке улыбаешься весенему солнцу?

  15. Мои гипотетические варианты ответов:

    Почему PHP?

    Массовая распространенность => отсутствие проблем с хостингом, наличие большого числа справочной информации => большее число кандидатов в специалисты => меньше риски при передаче проекта.

    Интересно, чтобы вы подумали по поводу такого ответа? :)

    …не используя третью переменную.

    Суммированием и вычитанием, как показал delitant. Задачка очень понравилась, на решение ушло половина сигареты. :)

    Интересно было. Программированием не занимался со времен школьного Pascal. Вот что-то руки зачесались :)

  16. Этот алгоритм более распространен и хоть это не будет функционировать с array, для string и integer хватит. А самое главное, что во всех языках работать будет. Так что я бы не сказал, что это не правильный ответ.

  17. Мой код он съел. Повтор:


    $a = 'abc';
    $b = '123';

    $a = $a^$b;
    $b = $b^$a;
    $a = $a^$b;

    echo $a;

    А вот как насчет такого задания:


    echo (int) ((0.1 + 0.7) * 10);

    что выплевывает PHP?

  18. 2Handy:, читаете доку от Zend?
    Ваш вопрос сродни разнице между echo и print — вскрывает скорее не понимание языка, а “чистое знание” конкретного случая.

  19. @solenko:
    Конечно читаю и всем советую. Тут дело вовсе не в echo и print. С print тот же самый результат будет. Оригинальний текст:

    You would expect that the expression ((0.1 + 0.7) * 10) would evaluate to 8 (and,
    in fact, if you print it out without the integer conversion, it does). However, the statement
    above outputs 7 instead. This happens because the result of this simple arithmetic
    expression is stored internally as 7.999999 instead of 8; when the value is converted
    to int, PHP simply truncates away the fractional part, resulting in a rather
    significant error (12.5%, to be exact).
    The lesson that you need to take home from all this is simple: know the limitations
    of your numeric data types, and plan around them. Whenever the precision of your
    calculation is a relevant factor to the proper functioning of your application, you
    should consider using a the arbitrary precision functions provided by the BCMath
    extension (you can search for it in your copy of the PHP manual) instead of PHP’s
    built-in data types.

    На страничке 10, chapter ‘PHP Basics’, книга ‘ZEND PHP 5 Certification STUDY GUIDE’. Тоесть раз ‘Basics’, то каждому не помешало бы знать.

  20. 2 Handy & solenko
    я не пойму – что, кого-то должно удивлять, что перевод от флоата к интеджеру происходит с потерей точности?

    это не конкретный случай и не языковая особенность – это просто самые-самые основы компьютерного представления данных :)

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

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

    По поводу остального — ну а цитировать то зачем, тем более в теме о собеседованиях? Если как ответ мне, то, раз уж я угадал ваш источник информации, то, наверное читал его ;)

  22. Привет всем я не гуру, и можно сказать начинающий php программист. Попал сюда совершенно случайно. Наверное потому что много интересной информации и попал вот на эту статью (отличный сайт!)
    Я думаю что при приёме на работу нужно всеже опираться на чутье, ведь если у человека горят глаза и он стремиться познать больше работая в коллективе то в любом случае из него будет толк. Мне 30 лет, возможно и позно начинать заниматься программированием на php, до этого отработал *nix администратором 5 лет. Но надоело, интерес пропал, и я сам лично для себя не знаю почему выбрал именно php. Нравиться и все, когда пишу и вижу как то что я делаю работает я прихожу в восторг как 8-милетний мальчишка. Найти работу php(хотя бы младшим) думаю проблематично с моим-то возрастом. Но я не собираюсь отступать, так как это для меня нечто большее чем просто программирование.

    Стремление познать больше вот я думаю самый основной аргумент, который должен на 80% быть главным. Как кто-то сказал умный не тот кто все знает а тот кто может быстро найти необходимый ответ, и думаю это правильно.

  23. умный не тот кто все знает а тот кто может быстро найти необходимый ответ

    Именно так, а в программировании особенно.

  24. @Dmitry
    Могу лишь поддержать Вас в Ваших начинаниях, скажу лишь следующее – в моем отделе работает человек который старше всех в отделе лет так на пять (уж точно не помню какого он года рождения, ориентировочно Ваш ровесник), когда мы принимали его на работу – были сомнения – т.к. его непосредственные начальники, да и все коллеги в отделе младше его, да и заний у него было с трудом на Junior’a, но как Вы и говорите – был тот самый огонек в глазах – и вот он работает с нами уже почти год, он уже вырос из Junior’a, и все еще продолжает набирать обороты – так что возраст это не помеха ;)

  25. И это здорово! Чесно говоря такие истории меня вдохновляют.

  26. ^) да это темово , ответь плз сам на первый вопрос

  27. извини не дочитал :) а мона те задать вопрос как тимлиду :)?

  28. Я не совсем тимлид – я техлид – хотя разница не так велика :)
    …задавай

  29. Насчет задачки могу сказать что знаю решение, но решение это я нашел сам в 10-м классе на уроке информатики, меня преподша гоняла.

    Про OSI да очень улыбнуло. Незнаю что может показывать это знание, кроме как то, что прогулял ли пару по сетевым протоколам в инсте или нет :) Вы же не С++ сетевого программера берете, а php. в нем максимум что с сетями это Сокеты, в них разобраться и без Оси можно.

    На все вопросы бы ответил. Ну а формочку заливки файла нарисовал бы с красивостями и скругленными краями, от руки :)

    Интересует а какие вопросы задают Старшим PHP программистам? сложнее

  30. 2 wired_mugen

    Интересует а какие вопросы задают Старшим PHP программистам? сложнее

    а это очень просто: вам надо прособеседовать кандидата на должность PHP developer. какие вопросы\задания вы будете задавать?

  31. Моё решение задачи
    “поменяй-ка друг значение переменных A и B местами не используя третью переменную”:
    ($a=array($a, $b)) && ($b=$a[0]) && ($a=$a[1]);

  32. PHP потому что когда занялся веб-разработкой с удивлением узнал, что хостеры не позволяют, как правило, на своих серверах компилировать Си программы, альтернативы были PHP и Perl, глянул исходники пары гостевух на том и другом, выбрал PHP из-за схожести с Си по синтаксису и, как следствие, вероятному сокращению времени на освоение.

    По ООП сложно сформулировать, давно теорию читал, по практике отвечу: Инкапсуляция – это когда переменные в объекте, а доступ к ним через методы. Полиморфизм – в Си помню что можно было описывать разные методы, с одинаковым именем для параметров инт и флоат, например, а вот в php вроде нормального полиморфизма нет. Наследование – копирование свойств и методов базовых классов(ей), с возможностью их переопределения и расширения. Абстракция – создание свойств, методов, классов, которые обязательно должны переопределяться наследниками до непосредственного использования.

    Под 3, 4, 5. Основное различие между 4 и 5 – более полноценная поддержка ООП (в частности защита свойств и методов), лучшая (или введенная) поддержка современных стандартов типа XML, XSLT, DOM, потоки вот понравились :)

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

    Небольшой опыт с CakePHP, CodeIgneter, WP, Drupal, CMSSimple, MODx.

    int, float (double), boolean, array, object, resource – по памяти бы назвал, посмотрел забыл про string :) и что NULL отдельный класс

    count(), strlen(), для остального автодополнение и мануалы :)

    сериализация – представление данных (переменных, массивов, объектов) для их передачи (хранения)

    Апач – крупная организация, известная прежде всего своим OpenSource веб-сервером, модреврайт – модуль к нему для изменения запросов

    Системы контроля версий вроде обе, на практике никогда не использовал

    Багтрекинг – система фиксации информации об ошибках (действительных или мнимых) и контроля их исправления, багзила – одна из таких систем (видел на разных сайтах), вторая, видимо, тоже. Никогда не использовал.

    Реляционная БД – БД основанная на табличном представлении данных и связях между ними, бывают еще другие, двоичные деревья вроде есть, наверняка еще какие-то, но не встречался, как начал с dBase II еще в школе, так только с реляционными работал.

    Нормализация – по большому счету устранение избыточности данных (в реляционных БД), денормализация – обратный процесс (как правило для увеличения скорости). Их там форм есть штук 6, но чем какая отличается не помню, как и с ООП.

    “многие-ко-многим” что вроде (псевдокод) authors (id, name), books(id, title), link (author_id, book_id)

    вложенный каталог: примитивный goods(id, parent_id, name), но обрабатывать средствами SQL сложно, есть еще что-то вроде goods(id, name, ltr, rtr) – приходилось разбираться и работать, но подробностей не помню гуглить у вас, надеюсь можно? :)

    , ходить на сайты w3.org и php.net надеюсь тоже можно?

    По CSS не профи верстальщик, наизуcть только один хак помню *html body, стили для id=”my” и class=”my” соответсвенно.

    Надеюсь в невообразимом хаков нет :)

    Стандарты на языки, используемые в вебе, такие как HTML, xHTML (и их “подверсии” Strict и Transitional), CSS, XML, XSLT, ХPath и т.д.

    Знаком, уже больше чем полгода на Ubuntu сижу (посмотрел на висту, плюнул и стер XP), Gentoo без гугла не соберу, свое ядро тоже не пересоберу, простые пакеты могут собрать (прочитав readme :) ), LAMP под (*)Ubuntu (и, скорее всего, Debian) подниму без гугла, но за безопасность и производительность не ручаюсь, не админ, дома сижу с закрытыми входящими не мною инициированными.

    Апач, пхп и мускул сетапил под виндой из сетапов и зипов, под никсами из деб пакетов

    Теоретическая (на практике обычно все уровни не реализуют) модель сетевой инфраструктуры от физ канала до приложений, уровней вроде бы 7, пример: физканал (“витая пара”, RJ-45)->Ethernet->IP->TCP->HTTP-Приложение, один (а может и два, может Приложение в модель и не входит) где-то пропустил, скорее всего на участке физканал->Ethernet->IP

    По протоколу Интернета :) обычно сокращают до IP

    В общих чертах на платформе IBM PC (про другие не скажу точно) начинается все с того , что замыкаются контакты на клавиатуре (как правило матрица “горизонтальных” и “вертикальных” шин), она формирует сигнал контроллеру клавиатуры, тот генерирует прерывание для процессора, процессор вызывает подпрограмму обработки прерываний ОС а заканчивается тем, что отображается (если браузер не голосовой конечно, а визуальный) результат запроса. самое интересное для PHP-программиста – это то, что браузер посылает HTTP запрос (чаще всего типа GET) по установленному соединению (TCP-сокеты, как правило), сервер его получает, обрабатывает (возможно вызывая PHP или другие серверные программы, а может просто из оперативки ответ берет, много факторов влияет) и посылает ответ (обычно с HTTP кодом 200 OK) и документом на языке разметки, например HTML или XML.

    Английский – всегда было “5”, хелпы читаю, общаться худо-бедно текстом и со словарем могу (работал немного на иностранцев на GAF’e)

    Числовые переменные (если не учитывать переполнение и прочие нюансы) повспоминав бы пару минут поменял бы. В двоичный код минут 10 бы выводил, вспоминая свою победу на областной олимпиаде для школьников по информатике (там правда MSX BASIC был, в PHP по идее можно двоичные сдвиги использовать, что-то вроде >> оператора, но без мануала не вспомню)

    Взяли бы на испытательный срок? :)

  33. Хоть гражданство меняй и на Украину езжай :)

    А в Питере что-то или (куда я не иду) под вакансией “Junior PHP Developer” имеют в виду верстальщика под смарти (или еще какой шаблонизатор), или (куда меня не берут) на собеседовании про всякие memcached и singletone вопросы задавать начинают :(

  34. Чтобы поменять местами А и В можно использовать ту же конструкцию $a &= $bю Все просто. Или ошибаюсь?

  35. Исправлю ошибку “$a &= $bю” на “$a &= $b.”
    я только собираюсь на собеседование.

  36. по поводу memcached (VolCh), прочитал, а теперь с головы не выходит, так и охота заюзать.

  37. задачка чтоб поменять местами a и b
    $a ^= $b;
    $b = $a ^ $b;
    $a ^= $b;

  38. Сейчас PHP программистов надо спрашивать о технологии XML и соответственно про иерархические модели БД.

  39. не ну я конечно понимаю, что нужны толковые ребята.. и начинающ. прог-еров никто не берет..
    но как быть им?? ведь чтоб устроиться на работу – нужен ОР,, а для ОР нужна работа!
    или сидеть дома за компом и писать неизвестно что,, или сидеть в офисе и пытаться писать что-то реальнее??

    обидно!

    кстати из задач на логику.
    у меня на собеседовании ваще спросили такое..
    типа представьте что вы производите задвижки на окна – вы единственная фирма в городе… сколько нужно произвести задвижек, чтоб установить их на все окна города??

  40. та да :) это что-то типа: почему канализационные люки круглые, а не квадратные.

  41. С раннего детства интересуюсь программированием, начаналось всё с BASIC (с компьютеров типа ZX-Spectrum, если кто такое помнит/знает). Сейчас мечтаю стать программистом php и именно по этой специальности и работать. К сожалению инст окончил по совсем другой специальности (о чём думал когда поступал – сам не знаю… балда! Наверно о военной кафедре и больше ни о чём).
    PHP изучаю по книгам (а вместе с ним и MySQL, и HTML и JavaScript). К сожалению знаю далеко не всё. Знания не систематизированы, хотя стрелюсь и продолжаю читать и книги и форумы и т.д.
    Anton Shevchuk (а также другие работодатели, кто это прочтёт), Вы бы могли взять на работу программистом самоучку? Если он действительно очень интересуется php и ему написание программ и изучение нового в php и вообще новых приёмов в программировании очень интересно и он мечтает когда-нибудь стать настоящим профессионалом, однако по специальности он – конструктор, да ещё и не с блестящим дипломом..?

    П.С. Задачка действительно интересная, как-то никогда не задумывался как поменять значения переменных, не используя дополнительных. На её решение ушло минуты полторы-две, решил также, как здесь уже писали:

    ";
    $a = $a + $b;
    $b = $a - $b;
    $a = $a - $b;
    echo "a=$a b=$b";
    ?>

    И ещё через минутку придумал решение, если переменные будут строкового типа:

    ";
    $a .= $b;
    $b = str_replace($b, "", $a);
    $a = str_replace($b, "", $a);
    echo "a=$a b=$b";
    ?>

  42. хотел написать с массивом а уже придумали выше :(

  43. Согласен с s-stude полностью. Куда не посмотри, везде подавай опыт работы, а где его взять-то? Или предлагают з/п порядка 10 кило рублей.

  44. admhome, вот на работе за 10кР и берите. С чего вы взяли, что кто-то должен бырать на себя риски и платить нормальную ЗП разработчику, который неизвестно сможет производить продукт или нет?

  45. Честно говоря – очень примитивное собеседование написано. Уровень мышления кандидата эти вопросы все равно не раскроют.
    У меня есть 10 вопросов. Я могу предложить кандидату выбрать и решить 3 из них. Ни один из них не опирается на знание. Все – только на логику. Дебил не сможет ни выбрать, ни решить.

  46. klassicheskoe reshenie dlya/ot matematikov

    $a=$a+$b;
    $b=$a-$b;
    $a=$a-$b;
    

    p.s. pravda pri bolshih chislah budet vse ravno perepolnenie, no ono zhe budet i pri bitovom obmene.

Comments are closed.