Хотел бы поделиться небольшим сборником практических задач, которые могут встречаться на собеседовании.
На просторах хабра и сети имеется множество сборников вопросов для подготовки к устной части собеседования, а вот сборника практических задач, который было бы удобно использовать для подготовки — не нашлось.
Для старта достаточно клонировать сборник себе и начать описывать реализацию, все оставльное уже есть. Есть готовые входящие данные для задач, есть FB класс, который позволяет уйти от var_dump() или print_r(). Все есть, поставил и сразу можно выполнять задачи — без лишней суеты. Надеюсь, кому-нибудь это окажется нужным.
Как пользоваться?
Для удобства, задачи представилены несколькими интерфейсами папка на Github. Возьмем интерфейс ITestSortInterface (/src/Training) в качестве иллюстрации. Из названия видно, что в нем лежат задачи по сортировке:
<?php
namespace Training;
interface ITestSortInterface
{
/**
* Отсортировать одномерный массив своими силами
*
* На входе array(2,5,3,5,6,7,8,9,25,24,18,26,27,28,29,30,31)
* На выходе отсортированный массив
*/
public function testSort1($array);
/**
* Отсортировать двумерный массив пришедший из БД
*
* На входе array(
* '1'=>array('price'=>10,'count'=>2),
* '2'=>array('price'=>5,'count'=>5),
* '3'=>array('price'=>8,'count'=>5),
* '4'=>array('price'=>12,'count'=>4),
* '5'=>array('price'=>8,'count'=>4),
* )
* На выходе отсортированный массив
* по 'price' DESC и во вторую очередь по 'count' DESC
* array(
* '2'=>array('price'=>5,'count'=>2),
* '5'=>array('price'=>8,'count'=>4),
* '3'=>array('price'=>8,'count'=>5),
* '1'=>array('price'=>10,'count'=>5),
* '4'=>array('price'=>12,'count'=>4),
* )
*
*/
public function testSort2($array);
/**
* Отсортировать числа на диагонали квадратной матрицы
* На входе квадратная матрица
* array(
* array(10,5,3,6),
* array(8,2,11,13),
* array(9,25,30,18),
* array(34,37,38,24)
* )
*
* На выходе должен быть массив
* array(
* array(2,5,3,6),
* array(8,10,11,13),
* array(9,25,24,18),
* array(34,37,38,30)
* )
*
*/
public function testSort3($array);
}
Для начала выполнения заданий необходимо создать класс имплементирующий желаемые интерфейсы. Я назвал свой класс Test:
<?php
// Подгрузка файлов
require_once('loader.php');
use Training\ITestSortInterface;
use Training\Data;
// Класс Test реализует интерфейс ITestSortInterface
class Test implements ITestSortInterface
{
/**
* Отсортировать одномерный массив своими силами
*
* На входе array(2,5,3,5,6,7,8,9,25,24,18,26,27,28,29,30,31)
* На выходе отсортированный массив
*/
public function testSort1($array)
{
// Условие окончания рекурсии
if (!$lenght = count($array)) return $array;
// Обнуляем
$x = $y = array();
// Те, что меньше первого элемента в одну сторону, те что больше в другую.
// А что-бы цыкл не ушел в бесконечность начинаем его с $i = 1
for ($i = 1; $i < $lenght; $i++) {
if ($array[$i] > $array[0]) $x[] = $array[$i];
else $y[] = $array[$i];
}
return array_merge($this->testSort1($y), array($array[0]), $this->testSort1($x));
}
/**
* Отсортировать двумерный массив пришедший из БД
*
* На входе array(
* '1'=>array('price'=>10,'count'=>2),
* '2'=>array('price'=>5,'count'=>5),
* '3'=>array('price'=>8,'count'=>5),
* '4'=>array('price'=>12,'count'=>4),
* '5'=>array('price'=>8,'count'=>4),
* )
* На выходе отсортированный массив
* по 'price' DESC и во вторую очередь по 'count' DESC
* array(
* '2'=>array('price'=>5,'count'=>2),
* '5'=>array('price'=>8,'count'=>4),
* '3'=>array('price'=>8,'count'=>5),
* '1'=>array('price'=>10,'count'=>5),
* '4'=>array('price'=>12,'count'=>4),
* )
*
*/
public function testSort2($array)
{
// TODO: Implement testSort2() method.
}
/**
* Отсортировать числа на диагонали квадратной матрицы
* На входе квадратная матрица
* array(
* array(10,5,3,6),
* array(8,2,11,13),
* array(9,25,30,18),
* array(34,37,38,24)
* )
*
* На выходе должен быть массив
* array(
* array(2,5,3,6),
* array(8,10,11,13),
* array(9,25,24,18),
* array(34,37,38,30)
* )
*
*/
public function testSort3($array)
{
// TODO: Implement testSort3() method.
}
}
$test = new Test();
/**
* Тут подробнее.
* \FireDog\FB::info() - выводит дебаг инфу в консоль сервера
* Data::getData(Data::ARR_SIMPL_INT) - предоставляет готовые данные для заданий
*/
\FireDog\FB::info($test->testSort1(Data::getData(Data::ARR_SIMPL_INT)));
Тут используются два вспомогательных класса \FireDog\FB и Training\Data. ( Позвольте небольшую ремарку: Использование FB или Data не обязательно — это вспомогательные классы для удобства. Однако, консоль браузера представляется мне более удобной альтернативой var_dump() или print_r() )
Первый выводит дебаг инфу в консоль браузера:
Для браузера потребуется установка плагина firephp. Тут плагин для Хрома.
Второй класс Data, хранит готовые данные для заданий. Для задания $test->testSort1() нам нужен массив array(2,5,3,5,6,7,8,9,25,24,18,26,27,28,29,30,31) его то мы и получаем Data::getData(Data::ARR_SIMPL_INT)
Сборник будет пополняться и его можно использовать не только для подготовки к собеседованию, но и просто для тренировки навыков программирования на PHP. Присылайте свои задачи, наиболее интересные будут опубликованы в сборнике.
Сборник на Github
P.S.
Сборник содержит, только простые задачи, которые встречаются в рамках собеседования. По этой причине некоторые задачи содержат формулировки вроде: «Отсортировать одномерный массив своими силами» Да-да, есть функция sort(), но тут важен контекст собеседования. Если Вам ставят задачу сформулированную именно так и вы на собеседовании, то вероятнее всего, такая задача преследует единственную цель, а именно оценить вашу алгоритмическую подготовку. Надеюсь, это понятно.
Комментарии (31)
Elfet
15.09.2015 19:48+3Мдаа. Откуда только берутся такие статьи? Последнее время что-то интересное бывает только в дайджесте, и все…
andrewnester
15.09.2015 20:01+2так еще и задачки так себе
MaxZN
15.09.2015 20:06-5Если у Вас есть идеи какими задачами дополнить сборник — присылайте, буду благодарен.
andrewnester
15.09.2015 21:30+4а если мне не нравится объективно плохой музыкальный исполнитель, что мне ему отвечать на предложение — «есть песни получше — присылайте»?
KvanTTT
16.09.2015 01:04+2Реально на собеседованиях php спрашивают такие «практические» задачи?
Да и не понимаю людей, которые выкладывают такие бессмысленные статьи.MaxZN
16.09.2015 10:29Да, спрашивают.
Например http://hh.ru/employer/986766 — petrosoft или http://hh.ru/employer/594876 — Adoriasoft. В первой Вам предоставят онлайн блокнотик, где предложат решить ряд подобный задачек, во второй придется пройти онлайн тестирование, которое также содержит похожие задачки.
NorthDakota
16.09.2015 01:29-1Отсортировать одномерный массив своими силами
Мы такие задачи в универе решали для паскаля…
Уже представляю набраную команду людей, которые всё делают своими силами, ибо не знают встроеных функций… Жуть…REZ1DENT3
16.09.2015 09:56на собеседовании работодатель должен удостовериться, что ты хотя бы можешь написать сортировку массива ) Так сказать проверка на вменяемость. Зачем ему давать тебе Т/З от важного клиента, если ты не знаешь обыкновенный алгоритм сортировки методом пузырька/Хоара(рекурсивная и не рекурсивная)/бинарная…
А сортировка массива и в паскале есть из коробки.NorthDakota
16.09.2015 11:42Ой всё. За моими плечами не одно собеседование на должность php разработчика. Ни на одном не спросили про сортировку.
Да, были вопросы про построение дерева, и прочие.
А сортировка массива и в паскале есть из коробки.
А я вот возьму, и неповерю вам наслово.
Metus
16.09.2015 09:27А зачем нужны какие-то сторонние плагины вроде firephp?
Неужели так сложно работать с консолью?
И зачем нужен этот один несчастный интерфейс?MaxZN
16.09.2015 09:53И зачем нужен этот один несчастный интерфейс? — Из предыдущей версии статьи это было не ясно, но интерфейс не один. Сорри, добавил примеры и улучшил описание, перечитайте статью.
Неужели так сложно работать с консолью?
А зачем нужны какие-то сторонние плагины вроде firephp? — отвечу на оба вопроса. Это дело вкуса, используйте консоль, если Вам так удобно. Вас никто не принуждает использовать firephp. Однако, консоль браузера представляется мне более удобной альтернативой var_dump() или print_r() в консоли.
К тому же я использую firephp в связке с livereload и gulp. Попробуйте, Вы не пожалеете.
snnwolf
16.09.2015 13:30Поправил новичку один очень простой код (выложил на гисте).
Потом больше часа объяснял как нужно править. Почему-то эту задачку еще 2 технаря решали долго. Не знаю может стресс виноват.MaxZN
16.09.2015 16:20Скорее всего стресс. Мозги лучше работают в спокойной обстановке и тишине, когда ничто не мешает концентрироваться на задаче. Когда мне, на собеседовании, предложили порешать задачки в блокнотике я оказался не готов к этому. Волнение и стресс сделали свое дело и я завалил собеседование.
servekon
16.09.2015 13:41Отсортировать массив лучше не своими силами, а силами самого PHP:
<?php function arr_sort_funct($a, $b) { if ($a == $b) { return 0; } return ($a < $b) ? -1 : 1; } uasort($arr, 'arr_sort_funct'); ?>
MaxZN
16.09.2015 16:08Так короче:
uasort($arr, function($a,$b) { if ($a == $b) return 0; return ($a < $b) ? -1 : 1; });
Но дело не в этом.
Сборник содержит, только простые задачи, которые встречаются в рамках собеседования. По этой причине некоторые задачи содержат формулировки вроде: «Отсортировать одномерный массив своими силами» Да, в php есть много встроеных функций для работы с массивами, но тут важен контекст собеседования. Если Вам ставят задачу сформулированную именно так и вы на собеседовании, то вероятнее всего, такая задача преследует единственную цель, а именно оценить вашу алгоритмическую подготовку. Надеюсь, это понятно.
skobkin
16.09.2015 16:37Можно было бы заодно ещё и проверить умение кандидатов пользоваться Composer, оформив это в виде пакета и потребовав подключать через нормальный автолоадер.
Однако, консоль браузера представляется мне более удобной альтернативой var_dump() или print_r() )
Более удобной, чем XDebug и phpdbg?MaxZN
16.09.2015 17:55-2Да, если лень ставить XDebug и phpdbg чтобы посмотреть пару переменных.
SerafimArts
16.09.2015 19:47phpdbg идёт из коробки. Однако здравствуйте: http://phpdbg.com/
MaxZN
16.09.2015 21:26а в версиях 5.3 и 5.4?
SerafimArts
16.09.2015 21:541) Они deprecated (http://php.net/eol.php)
2) Использовать дебаггер\вывод логов в консоль на продакшене? (локально можно любую версию влепить)MaxZN
17.09.2015 11:051) То, что они deprecated еще не значит, что их никто не использует.
2) Это не совсем применимо к реальности. Видите ли, версии php могут отличаться друг от друга и не обладать обратной совместимостью. Возьмем версии 5.3 и 5.4 http://php.net/manual/en/migration54.incompatible.php
Могу также привести пример из собственной практики:
Полтора года назад, меня пригласили поддерживать устоявшийся проект. Он был написан на версии 5.3, а у меня на тот момент, локально, стояла версия 5.5 Так вот, под 5.5 проект не запустился по причине обратной не совместимости версий php. Тут важно понимать, что «семеро одного не ждут» и то, что у вас проект не ставится под вашу версию php — это только ваша проблема и ничья больше. Я откатил версию до 5.3 и включился в работу.Metus
17.09.2015 12:13Это не «только ваша проблема».
Это как минимум проблема:
* невозможности использовать новые удобные библиотеки (или обновить существующие)
* невозможности обновить php-интерпретатор или расширение, если там обнаружено какое-то некорректное поведение
А это увеличение времени разработки, баги и прочие «радости».
Я согласен с Вами, что семеро одного не ждут, и нет никакого смысла в авральном порядке править проект для работы на новых версиях.
Но опять же. Семеро одного не ждут сработает и в обратную сторону — не будет библиотек или никто не будет править в них ошибки для старых версий.MaxZN
17.09.2015 13:05Полностью разделяю Вашу точку зрения и готов подписаться под каждым Вашим словом. Но что делать, если технический директор не желает обновлять версии, по каким то своим причнам или прочим иным.
Об этом можно долго рассуждать, но мир таков каков есть и то, что мы от него ждем, может идти вразрез с тем, что в итоге от него получаем.
Выше человек задал вопрос и я просто привел реальный пример в качестве иллюстрации — вот и все.
MaxZN
17.09.2015 11:12Но я еще раз повторюсь, Вас никто не принуждает. Если вам удобно работать с XDebug, ну и отлично — каждый работает так как ему удобнее.
zenn
Очень плачевно видеть на хабре записи, которые бы поместились в твит… Привели бы хоть пару примеров что-ли, что-зачем и для чего лежит в этом репозитории…
MaxZN
Да, надо бы добавить примеры, чуть позже добавлю.
Wedmer
Чем быстрее, тем лучше.
MaxZN
Добавил, еще раз прошу прощения, нужно было сразу с примерами. На будущее учту. И спасибо за обратную связь.)
Wedmer
Пора вводить сервис «Хабратвит». Тогда может и полезной активности чуток больше будет.
SerafimArts
По-моему зря заминусили, идея вполне здравая, там бы отлично поместились новости о новых версиях чего-либо, заодно весь блог Vivaldi переехал-бы.