[PHP]: Вопросы на собеседовании #3

Продолжаю цикл статей про вопросы, которые встречались мне на собеседованиях. Поехали:

1. Какова алгоритмическая сложность операции strlen?

Вопрос интересный, чтобы ответить на него надо знать особенности выделения памяти и хранения массивов в PHP. Пытаясь решить задачку в лоб, можно получить ответ O(N), где N — кол-во элементов. Насколько я знаю, strlen возвращает количество байт занятых строкой, поэтому на юникодных кодировках возникают проблемы. Эта цифра хранится в первых четырех байтах памяти выделенной под переменную, поэтому функцию просто берет значение оттуда и возвращает, следовательно вся алгоритмическая сложность сводится к O(1).

2. Приведите пример позднего статического связывания

Если человек знает что это такое, то особо труда сделать не составит. Технология достаточно полезная, но со статикой лучше не борщить. Приведу простенький пример, с использованием слова static:

abstract class DocumentType  
{ 
    public static function create()
    {
        return new static();
    }
}

class Doc extends DocumentType {}

class Ppt extends DocumentType {}

var_dump(Doc::create());  

Выведет:

Doc Object

Показывает, что static в отличие от self относится к тому классу откуда вызывается метод, а не к тому, в котором данный метод содержится.

3. Что такое "магические" методы в PHP?

Вообще в англоязычной литературе эти методы называют interceptors (дословно перехватчики). Всего их 5:

  • __get( $property ) — вызывается при обращение к неопределенному свойству
  • __set( $property, $value ) — вызывается при попытки присвоить значение неопределенному свойству
  • __isset( $property ) — вызывается при попытке проверить существование неопределенного свойства
  • __unset( $property ) — вызывается при попытке освободить память неопределенного свойтсва
  • __call( $method, $args ) — вызывается при попытке вызвать неопределенный метод

Подробнее расписывать не буду, лучше отправлю в мануал. Там указываются еще несколько магических методов: __construct(), __desctruct(), __callStatic(), __sleep(), __wakeup(), __toString(), __clone(), __invoke(). В документации более подробно написано когда тот или иной метод вызывается и используется.

4. Как быстрее всего найти мануал по функции PHP?

С одной стороны ответ или отсутствие такового не позволит узнать силу разработчика. С другой стороны, те, кто используют язык каждый день, когда им надо уточнить какой-то нюанс не будут набирать в google sort или preg_match. Потому что программисты любят использовать всякие крутые плюшки, для ускорения всего, что только можно ускорить. Самый простой и быстрый способ найти документацию по методу это набрать следующее:

http://php.net/<имя_функции>

ex: http://php.net/preg_match

5. Что означает аббревиатура SOLID?

Проще всего информацию о том, что эта аббревиатура значит найти в Wikipedia. Это акроним, собранный из нескольких аббревиатур, которые относятся к объектно-ориентированному дизайну в программировании. Более подробно про каждый из них можно найти на просторах интернета. Достаточно интересный подход, советую всем хотя бы ознакомиться поверхностно.

Прочитать

[PHP]: Вопросы на собеседовании #2

Продолжаю цикл статей (1, 2, 3) , посвященных вопросам на собеседовании. В этот раз постараюсь рассказать про интересные задачки. Итак, поехали:

1. Задача на логику

Ситуация:

Представьте, что есть 3 бочки с шариками: в одной только черные, во второй только белые, в третьей и черные и белые. На каждой из бочек таблички: черные, белые, черно/белые соответственно. Один раз можно достать один шар из любой бочки. Заведомо известно, что все таблички лгут.

Вопрос: Что же надо узнать? :) В какой бочке какие шарики лежат?

Решение: Берем шар из бочки с табличкой "черно/белые", если там черный, то значит в бочке с табличкой "черные" лежат белые, а бочке с табличкой "белые" лежат черно/белые. В противном случае, в бочке оказывается белый шар и значит в бочке с табличкой "белые" лежат черные, а в бочке с табличкой "черные" лежат черно/белые.

2. Какие паттерны проектирования вы знаете

Размер ответа прямо пропорционален опыту работы. Конечно, такое утверждение тоже далеко от правды, но буду полагать, что все работают в компаниях пропагандирующих ООП и хороший стиль кода. Про паттерны проектирования очень хорошо написано в наверное самой известной книге. Стоит обратить внимание на статью в Википедии, гуляя по просторам рунета наткнулся на хороший блог, в котором освещены самые известные паттерны, и что самое приятное — на PHP. Меня в основном спрашивали про фабрику, синглтон и пару раз про observer и decorator.

3. Привести пример интерфейса из реальной жизни

Забавный вопрос, по крайней мере меня, он на несколько секунд поставил в тупик. Примеров таких много, поэтому напишу, что сам ответил на него: педали в автомобиле. Тут стоит объяснить почему — во всех машинах есть либо 2 либо 3 педали, и любой водитель знает, что справа газ, посередине тормоз, а слева сцепление. Давишь на газ машина едет, при нажатии тормоза автомобиль останавливается. Это и есть пример интерфейса, описаны методы взаимодействия, а как уж там они реализованы внутри, не наши проблемы.

4. Задача на логику № 2

Ситуация:

Есть дверь и 3 выключателя рядом с ней. Узнать, что происходит внутри можно только открыв её. За дверь находится лампа дневного света. Можно нажимать на кнопки выключателей неограниченное кол-во раз, можно всего 1 раз открыть дверь, зайти внутрь или посмотреть, в общем сделать все, что в голову взбредет.

Вопрос:

Определить какой из выключателей управляет ламой.

Решение:

Задачи такого рода называются out-of-the-box, для их решения требуется немного выйти за рамки описанной ситуации. Сначала, все пытаются просчитать ситуации с включением выключением и открыванием двери, в итоге приходят к невозможности решения стандартными средствами. Решение же лежит на поверхности и происходит из бытового опыта. Сказано, что можно зайти в дверь и делать все, что в голову взбредет. Мне данная задача ставилась несколько по-другому, поэтому надо было самому дойти до такого решения. Троллить человека, который задал вопрос, на тему "а я поставлю датчик и выкину провода в коридор" не стоит. Надо сделать следующее: щелкнуть 1 выключатель, подождать чуть чуть, выключить его, щелкнуть 2ой и открыть дверь. Если лампа горит, то это 2ой выключатель, если лампа не горит, то подойти и потрогать её, если горячая, то это 1ый, если холодная, то 3ий. Все как обычно легко и просто. Тут надо либо знать, либо уметь решать такие задачки.

5. Подмена сервиса

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

Вопрос:

Есть приложение, приложение обращается к внешнему сервису, в приложении нужно внести какие-то правки, как сделать так, чтобы на девелоперской машине приложение не стучалось во внешний сервис?

Перед описанием решения:

Вопрос был задан именно в такой формулировке, поэтому с собеседником у нас возникли некоторые разночтения в понимании контекста. Человек задавал вопрос в контексте паттернов, ответ был без их учета. Я подошел к ответу с технической точки зрения. Мои ответы:

  • Через рефлексию обратиться к вызывающему классу и подменить его
  • Подменить через мок внешний сервис, подсунув ответ
  • Есть модуль runkit, с помощью него на лету подменить поведение объекта
  • Сделать тестовую апи и переключить девелоперскую машину на неё

Все они были примерно правильные, но на поставленный вопрос все же не ответил.

Решение

Воспользоваться паттерном Service Locator, чтобы сделать дополнительный уровень абстракции при общении с внешними сервисами. Примерно тоже самое, что мок, но с точки зрения паттернов. Лучше самим посмотреть и почитать про него.

P.S. На этом завершим сегодняшнюю top-5 вопросов на собеседовании.

Прочитать

[PHP]: Вопросы на собеседовании #1

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

1. Что такое ООП? Назовите его основные принципы.

Вопрос избитый, поэтому просто приведу ссылки на wikipedia, кто не знает прочитает, кто знает может открыть, чтобы освежить память. ООП - Объектно Ориентированное Программирование

При ответе лучше сразу расписать основные парадигмы

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

2. Что нового, полезного появилось в PHP 5.4

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

  • Traits, тут стоит рассказать что это вообще такое, и где можно применить. По вопросу применения -- лучше найти собственный пример, если не пользовались, то можно об этом спокойно сказать, ничего страшного в отсутствии такого опыта я думаю нет
  • Встроенный web сервер, теперь можно не ставить Apache/Nginx/Lighthttpd, просто собираем PHP и уже из коробки доступно решение для web девелопмента без лишних заморочек
  • Упрощенная работа с массивами Очень хорошо и структурировано описаны все эти новшества в докладе на DevConf2012: PHP 5.4 - особенности перехода, если вдруг презентация недоступна по ссылке, выложу её сюда. Советую прочитать и попробовать. Свой опыт, он все же лучше любого чужого, хоть и хорошо описанного.

3. Расскажите какие функции для работы с массивами вы знаете в PHP

Вопрос из серии "не бей лежачего". Если вы работаете с PHP, то думаю с 10ок функций вы сходу назовете. Чтобы освежить память можно сходить ознакомиться с ними вот здесь. Официальная документация, там есть все и даже больше.

В ту же сторону, что и предыдущий. Выясняет адекватность написанного вами в резюме. Это 2 абсолютно разные функции. Arraykeys — возвращает ключи массива, а arraysearch ищет в массиве заданный элемент.

5. Какие типы данных вы знаете в PHP

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

Прочитать