Довольно часто (постоянно) мне приходиться проводить собеседование людей желающих устроитсья в мой отдел на должность “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 для новичков не подходит), если у кого есть что предложить – пишите в комментариях…
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 вроде довольно компактен…
Лучший способ это тупо в ассемблере
RCR AX,8
таким образом значение из AL перейдёт в AH а из AH в AL
На РНР же в свою очередь перед тем как ждать ответа от человека надо более чётко объяснять что мы экономим память, количество переменных, или сферических коней в вакууме.
Ну, я не был бы так строг. Это типичная головоломка, она вообще не привязана ни к PHP, ни к программированию. Считайте это двумя математическими переменными. Сразу придёт ясность.
Мне кажеться, что любой программист должен легко решать и более сложные задачи. Не знаю, что нужно программировать, чтоб не сталкиваться с трудностями :-D
Тогда надо заранее предупредить что это математическая задача, ибо в разных языках она решается по разному. (где-то с битами, где-то с математикой, где-то с логикой)
Зачем предупреждать? Либо человек решит, либо нет. Либо просто по математически, либо ещё и с учётом языка. Тем больше балов в плюс он получит.
Но, конечно, нельзя делать такого рода задачи обязательными. Но дополнительно, как задачи, могущие принести только положительные очки, пожалуйста.
Я не спорю с вами, просто, интересно докапаться до истины, простите придирки :-)
Про задачку: это же PHP, а не C!
<?php
$a = “aaa”;
$b = “bbb”;
list($b, $a) = array($a, $b);
var_dump($a, $b);
?>
Самое интерестное, что все правильные решения пока через массив (только не говорите что двойной xor объекта нернет тот же объект)
2 solenko
только не говорите, что массив это не третья переменная :)
2 COTOHA:
Ну… Строго говря — нет, т.к. переменная — именованная чать памяти )
А если считать что массив переменная, то задача вообще не разрешима в этой формулировке.
2 solenko
почему нет?
в общем случае (для любых типов переменных) не разрешима, но так и собеседуемый может рот открыть и про это сказать. собственно для того и собеседование
Особенно хорошо, когда собеседуемый скажет, что для целых и дробных типов эта задача решается так-то и так-то, а вот для любого типа она нерешаема. Т.е. разберётся в том, что ему сказали. Такие люди ценятся вдвойне. Так что я думаю нужно оставить её в такой формулировке.
2 COTOHA:
Ставится чито теоретическая задача. Так почему вы не готовы к абсолютно верному теоретическому ответу — “это невозможно”?
Вобщем к чему это я… Если человек вдруг подумает, что переменные могут собержать не простой тип, то он подвиснет всеръез и надолго.
Если ваша цель проверить логику, то можно подобрать намного менее спорный вопрос. Как самый банальный пример — функция на входе которой десятичное число. На выходе нужно получить строку — его двоичное представление. Стандартные функции запрещены.
спасибище за дополнение к собеседовательной заготовке :)
Честно не читал комменты. Но мнение по вопросу – “почему все таки PHP?” считаю неразумным.
Почему идя домой после работы, чуствуя голод, вместо того чтобы прыгнуть в машину и помчаться к дому, ты проходишь мимо своего автомобиля, заруливаешь в парк с баночкой пива и сидя на скамейке улыбаешься весенему солнцу?
Мои гипотетические варианты ответов:
Массовая распространенность => отсутствие проблем с хостингом, наличие большого числа справочной информации => большее число кандидатов в специалисты => меньше риски при передаче проекта.
Интересно, чтобы вы подумали по поводу такого ответа? :)
Суммированием и вычитанием, как показал delitant. Задачка очень понравилась, на решение ушло половина сигареты. :)
Интересно было. Программированием не занимался со времен школьного Pascal. Вот что-то руки зачесались :)
Этот алгоритм более распространен и хоть это не будет функционировать с array, для string и integer хватит. А самое главное, что во всех языках работать будет. Так что я бы не сказал, что это не правильный ответ.
Мой код он съел. Повтор:
$a = 'abc';
$b = '123';
$a = $a^$b;
$b = $b^$a;
$a = $a^$b;
echo $a;
А вот как насчет такого задания:
echo (int) ((0.1 + 0.7) * 10);
что выплевывает PHP?
2Handy:, читаете доку от Zend?
Ваш вопрос сродни разнице между echo и print — вскрывает скорее не понимание языка, а “чистое знание” конкретного случая.
@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’, то каждому не помешало бы знать.
2 Handy & solenko
я не пойму – что, кого-то должно удивлять, что перевод от флоата к интеджеру происходит с потерей точности?
это не конкретный случай и не языковая особенность – это просто самые-самые основы компьютерного представления данных :)
COTOHA, вполне может удивить людей, которые начинали с скриптовых языков. Я бы сам еще недавно честно ответил бы “не знаю”, потому как PHP все таки не компилируемый язык и бог его знает, как он типы приводит.
Handy, по поводу разници между print и echo это был пример глупого вопроса на собеседовании, с которым мне пришлось столкнуться. Кстати, наличие таких вопросов стало еще доводом того, что стоит отказаться от предложения этой фирмы.
По поводу остального — ну а цитировать то зачем, тем более в теме о собеседованиях? Если как ответ мне, то, раз уж я угадал ваш источник информации, то, наверное читал его ;)
Привет всем я не гуру, и можно сказать начинающий php программист. Попал сюда совершенно случайно. Наверное потому что много интересной информации и попал вот на эту статью (отличный сайт!)
Я думаю что при приёме на работу нужно всеже опираться на чутье, ведь если у человека горят глаза и он стремиться познать больше работая в коллективе то в любом случае из него будет толк. Мне 30 лет, возможно и позно начинать заниматься программированием на php, до этого отработал *nix администратором 5 лет. Но надоело, интерес пропал, и я сам лично для себя не знаю почему выбрал именно php. Нравиться и все, когда пишу и вижу как то что я делаю работает я прихожу в восторг как 8-милетний мальчишка. Найти работу php(хотя бы младшим) думаю проблематично с моим-то возрастом. Но я не собираюсь отступать, так как это для меня нечто большее чем просто программирование.
Стремление познать больше вот я думаю самый основной аргумент, который должен на 80% быть главным. Как кто-то сказал умный не тот кто все знает а тот кто может быстро найти необходимый ответ, и думаю это правильно.
Именно так, а в программировании особенно.
@Dmitry
Могу лишь поддержать Вас в Ваших начинаниях, скажу лишь следующее – в моем отделе работает человек который старше всех в отделе лет так на пять (уж точно не помню какого он года рождения, ориентировочно Ваш ровесник), когда мы принимали его на работу – были сомнения – т.к. его непосредственные начальники, да и все коллеги в отделе младше его, да и заний у него было с трудом на Junior’a, но как Вы и говорите – был тот самый огонек в глазах – и вот он работает с нами уже почти год, он уже вырос из Junior’a, и все еще продолжает набирать обороты – так что возраст это не помеха ;)
И это здорово! Чесно говоря такие истории меня вдохновляют.
^) да это темово , ответь плз сам на первый вопрос
@den: если этот вопрос мне – то я уже отвечал на него в комментариях: http://anton.shevchuk.name/php/php-interview/#comment-3883
извини не дочитал :) а мона те задать вопрос как тимлиду :)?
Я не совсем тимлид – я техлид – хотя разница не так велика :)
…задавай
Насчет задачки могу сказать что знаю решение, но решение это я нашел сам в 10-м классе на уроке информатики, меня преподша гоняла.
Про OSI да очень улыбнуло. Незнаю что может показывать это знание, кроме как то, что прогулял ли пару по сетевым протоколам в инсте или нет :) Вы же не С++ сетевого программера берете, а php. в нем максимум что с сетями это Сокеты, в них разобраться и без Оси можно.
На все вопросы бы ответил. Ну а формочку заливки файла нарисовал бы с красивостями и скругленными краями, от руки :)
Интересует а какие вопросы задают Старшим PHP программистам? сложнее
2 wired_mugen
а это очень просто: вам надо прособеседовать кандидата на должность PHP developer. какие вопросы\задания вы будете задавать?
мда, действительно красивое решение :)
Моё решение задачи
“поменяй-ка друг значение переменных A и B местами не используя третью переменную”:
($a=array($a, $b)) && ($b=$a[0]) && ($a=$a[1]);
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 по идее можно двоичные сдвиги использовать, что-то вроде >> оператора, но без мануала не вспомню)
Взяли бы на испытательный срок? :)
@Volch:
Думаю на испытательный взяли бы ;)
Хоть гражданство меняй и на Украину езжай :)
А в Питере что-то или (куда я не иду) под вакансией “Junior PHP Developer” имеют в виду верстальщика под смарти (или еще какой шаблонизатор), или (куда меня не берут) на собеседовании про всякие memcached и singletone вопросы задавать начинают :(
Чтобы поменять местами А и В можно использовать ту же конструкцию $a &= $bю Все просто. Или ошибаюсь?
Исправлю ошибку “$a &= $bю” на “$a &= $b.”
я только собираюсь на собеседование.
по поводу memcached (VolCh), прочитал, а теперь с головы не выходит, так и охота заюзать.
задачка чтоб поменять местами a и b
$a ^= $b;
$b = $a ^ $b;
$a ^= $b;
Сейчас PHP программистов надо спрашивать о технологии XML и соответственно про иерархические модели БД.
не ну я конечно понимаю, что нужны толковые ребята.. и начинающ. прог-еров никто не берет..
но как быть им?? ведь чтоб устроиться на работу – нужен ОР,, а для ОР нужна работа!
или сидеть дома за компом и писать неизвестно что,, или сидеть в офисе и пытаться писать что-то реальнее??
обидно!
кстати из задач на логику.
у меня на собеседовании ваще спросили такое..
типа представьте что вы производите задвижки на окна – вы единственная фирма в городе… сколько нужно произвести задвижек, чтоб установить их на все окна города??
та да :) это что-то типа: почему канализационные люки круглые, а не квадратные.
С раннего детства интересуюсь программированием, начаналось всё с 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";
?>
хотел написать с массивом а уже придумали выше :(
Согласен с s-stude полностью. Куда не посмотри, везде подавай опыт работы, а где его взять-то? Или предлагают з/п порядка 10 кило рублей.
admhome, вот на работе за 10кР и берите. С чего вы взяли, что кто-то должен бырать на себя риски и платить нормальную ЗП разработчику, который неизвестно сможет производить продукт или нет?
Честно говоря – очень примитивное собеседование написано. Уровень мышления кандидата эти вопросы все равно не раскроют.
У меня есть 10 вопросов. Я могу предложить кандидату выбрать и решить 3 из них. Ни один из них не опирается на знание. Все – только на логику. Дебил не сможет ни выбрать, ни решить.
klassicheskoe reshenie dlya/ot matematikov
p.s. pravda pri bolshih chislah budet vse ravno perepolnenie, no ono zhe budet i pri bitovom obmene.