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

Обратите внимание: пост написан в апреле 2009 года. Сейчас у меня вопросы немного другие. Как будет время, обновлю список.

Компания, в которой я работаю, собирается искать хорошего PHP-программера. В связи с этим мне стала задача разработать план проведения собеседования. Решил подготовиться к этому и составить план-список вопросов, по которым будет проходить беседа.

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

Естественно, что вопросов программисту PHP можно задать море. Особенно учитвая, что знать надо связанные области (БД, сети, и иже с ним, ). Смысла задать все вопросы, какие только можно, конечно нету. Задача — определить уровень специалиста, чтобы принять решение: подходит он нам или нет. По-этому выбрал наиболее подходящие на мой взгляд вопросы, по которым я смогу оценить уровень кандидата.

Кроме того, конечно не одиними вопросами можно обойтись. Следует предложить пройти небольшие тесты по практическим моментам. Об этом ниже.

Вопросы

1. PHP и основы программирования
1.1. Почему PHP?
1.2. Что такое ООП, основные принципы ООП.
1.3. Понятие абстракции, наследования, инкапсуляции и полиморфизма.
1.4. Что такое MVC?
1.5. Какие паттерны проектирования вам известны?
1.6. Под какую версию PHP писали? В чем различия между четвертой и пятой версиями?
1.7. Какими сторонними библиотеками пользовались?
1.8. Опыт работы с различными Frameworks/CMS?
1.9. Типы данных в PHP? (string, int, float, object, resource, null, bool, array)
1.10. Назовите по памяти функции для работы с массивами, строками и объектами в PHP (хотя бы по 5 штук).
1.11. Что такое сериализация?
1.12. Чем отличается абстрактный класс от интерфейса?
1.13. В каких случаях лучше использовать статические методы и классы?
1.14. Можно ли создать приватный конструктор? Зачем?
1.15. Как сказывается большое количество объектов в коде на производительность?
1.16. Что такое хэш?
1.17. Что такое область видимости переменной?
1.18. Что такое PDO? Что такое ORM?
1.19. Что такое PEAR?
1.20. Когда лучше использовать _pconnect?
1.21. Обязательно ли писать ?> в конце скрипта?
1.22. Как вы отлаживаете PHP-код?
1.23. Проводили когда-нибудь оптимизацию сайтов?
1.24. Какую IDE используете? Какие использовали ранее?
1.25. Что такое unit-test? Использовали?
2. Tools
2.1. Что такое ? mod_rewrite? nginx?
2.2. Аббревиатуры SVN и CVS о чем-нить говорят? А Git и Mercurial?
2.3. Багтрекинг системы? BugZilla? Mantis? Redmine? JIRA?
2.4 .Моделирование, UML использовали?
2.5. Что такое SSH? Какие есть варианты авторизации при входе по SSH?
3. Data Bases
3.1. Что такое реляционная база данных? Какие есть типы БД?
3.2. Нормализация, денормализация.
3.3. . Join’ы, Union. Подзапросы.
3.4. Процедуры, тригеры.
3.5. Вьюшки.
3.6. InnoDB vs MyISAM.
3.7. Какие бывают индексы в MySQL?
3.8. В чем отличие MySQL от PostgreSQL?
3.9. Что такое SQL-инъекция? Приведите пример.
4. HTML +
4.1. Нарисуйте простенькую форму для отправки файла.
4.2. Что такое CSS? В чем разница между записью #my и .my? Для каких атрибутов можно указать :hover?
4.3. Расшифруй вот такую запись в CSS table#a tbody td.odd {text-decoration:inherit}?
4.4. Что такое стандарты W3C?
5. JavaScript
5.1. Как работает наследование в JS?
5.2. Чем отличается хэш от объекта? (провокационный)
5.3. А хэш от массива?
5.4. Если ли опыт работы с Jquery, ExtJS? Какие фреймворки использовались?
5.5. Что такое Ajax? Есть ли опыт работы с ним?
5.6. Использовали ли FireBug? Drag-on-fly?
5.7. Что такое замыкания и как они работают?
6. Linux
6.1. С *nix знаком? Какие дистрибутивы? Почему?
6.2. Apache, PHP и СУБД устанавливали под *nix? Настраивали? Оптимизировали?
7. Networking
7.1. Что такое уровни модели OSI? Сколько их?
7.2. По какому протоколу осуществляется передача данных в сети ?
7.3. Какие вообще есть сетевые протоколы?
7.4. Расскажите, что происходит, когда в строке браузера набираешь адрес и нажимаешь Enter?
7.5. Что такое WSDL & web-services? Есть опыт работы?
7.6. Что такое SSL? Как работает HTTPS? Какой принцип работы HTTPS? Какие есть варианты авторизации HTTP?
8. Что такое XSLT, XML? Есть ли опыт работы с ними?

Как отработает код?

1)
<?php
/* Что будет выведено на экран? */
$a = ‘true’;
if( 0 == $a || $a )
{
echo ‘yes’;
}

2)
<?php
/* Что будет выведено на экран? */
$a = 10;
echo $a— — — — — — — — — — — —$a;

3)

<?php
class A {private function __construct(){throw new Exception(»);} public function A(){return array(‘a’,’b’,’c’);} public static function I(){return new A();}}
/*
Как вывести на экран именно то ‘b’, которое определено в массиве выше, используя одну команду (одну строку кода)?
*/

4)
<?php

/*
Какая строчка выведется при исполнении скрипта?
Почему исполняется или не исполняется каждое из условий?
*/
$x = 1;
if ($x == ‘1’) {
echo ‘a’;
}
if ($x == true) {
echo ‘b’;
}
if((bool)$x === true){
echo ‘e’;
}
if ($x === true) {
echo ‘c’;
}
if((int)$x === true){
echo ‘d’;
}

5)
<?php
/*
Что выведет скрипт? (запускается непосредственно)
*/
error_reporting(E_ALL);
ini_set(‘display_errors’,’0′);

print $x[0];
dddxxxx();

6)
<?php
/*
Для какой версии PHP будет работать этот скрипт?
Что выведет этот скрипт?
*/
class Test{

private $var;

function setMe($value){
$this->var = $value;
}
}

class More extends Test{
public $var;
}

$oTest = new Test;
$oMore = new More;

echo $oTest->setMe(‘foo’);

echo $oMore->setMe(‘foo’);

echo $oMore->var;

echo $oTest->var;

Тест на corp.mamba.ru

http://www.corp.mamba.ru/test/promo.phtml

Ссылки

А вот и те ссылки, которые помогли мне в составлении списка.

http://habrahabr.ru/blogs/php/21681/

http://habrahabr.ru/blogs/webdev/19964/

Собеседование по PHP: 15 комментариев

  1. Грустные, у нас в Минске практически нет на рынке высококвалифицированных программистов. А если касаться вопросов, то все они оказались вполне уместными и понятными.

  2. >Грустные, у нас в Минске практически нет на рынке высококвалифицированных программистов.
    В том смысле, что ни кто так и не смог ответить должным образом на все вопросы? А на чем чаще всего спотыкались и были ли вообще неадекватные (помню сам раз видел, как человек устраивался на верстальщика прямо заявив, что ни чего по верстке не знает)?

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

  3. На мысли по дереву времени нет. Кратко. На рынке PHP-разработок у нас пости нт полноценных профыссиональных программеров. Потому что PHP не учат в вузах, и потому что это самый легкий язык. Все, кто имеет хорошй уровень, разобраны. Причем, многие работают тим-лидами и менеджерами.

    Те, кто тусуется на рынке, в осном самоучки, которые кроме PHP+MySQL+HTML+JS ничего не знают. Это практики, они умеют делать сайты, решабт поставленные таски. Но они не знают теории, не умеют проектировать сложные системы. Короче, это не программисты, а PHP-кодеры.

    Вообще не адекватных не было. Спотыкались чаще всего на тех вопросах, которые включают теорию программирования, которые касаются не только и не столько PHP.

  4. Специально зарегистрировался в Вашем блоге, ибо показать на некий бред в собеседованиях, вопросы не буду комментировать, но вот про тесты скажу:
    1. Что за программист, кто пишет подобные вещи:
    $a = ‘true’;
    if( 0 == $a || $a )
    {
    echo ‘yes’;
    }
    таких в шею гнать, имхо, и бить рожу тестирующему.
    2. Ковычки выполняющего блока всегда писать с новый строки и все сроки с табуляцией, это стиль нового уренгоя:
    function() {
    echo
    echo
    }
    3. убрать из кода всевозможный Булеан, использовать только 1 или 0 (в базе данных ID начинается с 1)

    П.С. Видимо Автор пишет лишь только на одном языке, люди, практикующие программирование на трех языках поймут о чем я.

  5. Mr.Andy, вы знаете, я не стал удалять ваш комментарий лишь потому, что вы потратили усилия на его написание и зарегистрировались ради этого. Немного бредовые придирки, и такие же замечания, особенно это касается пункта 3. Если вы не поняли, зачем эти извращенные комбинации предлагаются интервьюируемым, то жаль.

    Что касается вопросов, то хочу сказать, что ими я до сих пор успешно пользуюсь. Конечно, часть их изменились, часть ушла, что-то добавилось. И, конечно, собеседование — это диалог, а не допрос. Но этот список вопросов очень помогает этот диалог построить. Просто использовать его надо уметь.

  6. Здравствуйте Валерий. Не могли бы вы пояснить в чем фишка последнего примера кода? Какой $var попадает в дочерний класс, который private или public или оба?

    Судя по тому что echo $oMore->var; корректно отрабатывает — казалось бы что дочерний класс содержит public $var

    Но $oMore->setMe(‘foo’); Отрабатывает только если в родителе заменить private на protected.

    Вообщем какая-то путаница возникает. Не могу понять что к чему. Тестил на PHP 5.3

  7. А обучать не пробовали программистов? Даже если бы студенты в вузах учили php (кстати учат), откуда у них практика возьмется писать приложения сложные по всем канонам современного программирования? Сначала они конечно кодеры — пробуют себя под разные задачи, потом когда у них уже не вызывает трудности быстро найти и разобрать в нужной документации, быстро решить какую то задачу, накапливается какое то портфолио, вот только тогда они начинают смотреть в сторону паттернов проектирования и пытаются искать интересные задачи. Но до этого их нужно направлять, помогать и стимулировать писать хороший код, и они сами прийдут к необходимости развиваться. А если ко всем относиться как к быдлу — конечно бесхозные быдлокодеры, которым вовремя не рассказали о последствиях в какой то момент проходят точку невозврата. Как говорил один очень умный человек — нет безнадежных студентов — есть студенты с нераскрывшимся потеницалом.

  8. nutscracker, интересный комментарий. Спасибо. Не совсем понял, отчего возникла фраза про отношение, как к быдлу. Кодер != быдло :)

    Просто надо различать эти уровни. У меня есть стойкое убеждение, что программисты, как и специалисты других областей, должны делиться на техников и инженеров. Техники работают по шаблону и делают вещи, не требующие серьезного проектирования и системного подхода. Типичный пример — сайты-визитки и другие сайты на CMS.

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

    Про обучение. Ну во-первых, с чего мы должны кого-то учить? Мне казалась, что для этого существуют специальные организации. Почему вы считаете, что людей нужно учить и при этом платить им за это? Другое дело — практика. Вы больше писали именно про практику. За границей существует такое понятие, как стажировка. Это как раз нужно для студентов, чтобы набраться опыта. Но человек, который идет на стажировку, должен быть уже готов к работе (а не к обучению). Он должен быть уже обучен. Он должен знать ответы на все теоретические вопросы из тех, что опубликованы выше. Он должен отвечать на них лучше, чем человек с опытом, потому что знания свежи.

    Вот если это условие выполняется, можно брать человека на стажировку и нагонять опыт. А у нас большинство действительно ждет, что их начнут учить. Нулевые в теории, минимальная практика, а амбиции бьют ключом. Большинство не могут объяснить, как работает HTTP. Про HTTPS я вообще молчу. Это люди, которые разрабатывают веб-приложения. Это, уважаемый nutscracker, не опыт. Это знания. И если этих знаний нет, нечего называть себя программистом.

    К нам в компанию приходили люди и уходили со значительно выросшим уровнем. Так было, так будет. Но чтобы уровень повысить, он уже должен быть не нулевым.

  9. Добрый день!


    <?php
    class A {private function __construct(){throw new Exception(»);} public function A(){return array(‘a’,’b’,’c’);} public static function I(){return new A();}}
    /*
    Как вывести на экран именно то ‘b’, которое определено в массиве выше, используя одну команду (одну строку кода)?
    */

    а это реализуемо? подскажите, пожалуйста, каким образом.

  10. или же

    class B extends A
    {
    private function __construct() {}

    public static function I(){
    return new B();
    }
    }

    echo B::I()->A()[1];

  11. Годный список, еще бы ответов на вопросы. На днях серфил по сайтам и наткнулся на вот такой список, как раз в тему, с вопросами и мини задачами unetway.com/blog/spisok-voprosov-i-zadac-pri-sobesedovanii-php-programmista/

Добавить комментарий