Нехитрый вопрос на собеседовании или как не попадают в стартапы
Всем привет, меня зовут Алексей Колупаев, и мне посчастливилось познакомиться с людьми, которые изменили мою профессиональную жизнь: я делаю новый стартап. Именно от меня будет зависеть вся техническая часть нового народного финансового портала. И, на данном этапе, это означает, что мне нужно собрать убийственную команду и так построить процесс, чтобы добиться суперэффективности. Есть мнение, что собрать классную команду очень нелегко. Мне довелось поработать в интересных местах, со многими интересными людьми и провести, наверное, около сотни собеседований, в основном, PHP-программистов. Пользуясь случаем, хочу поблагодарить всех, кто приходил ко мне на собеседования — вы многому меня научили. И я хочу поделиться со всеми одной из своих самых любимых задачек для собеседования.
Придумал ее, разумеется, не я, а прочитал, кажется, у Джоела Спольски. Слышал, что ее дают на собеседовании в Microsoft. В коротком варианте она звучит так: «как повернуть строку задом наперед?». Подозреваю, что в Microsoft не ожидают ее решения на PHP, а вероятно, на С или С++. Прелесть задачи состоит в том, что она мало говорит о языке и много — о программисте. В моем варианте она звучит так:
<?php $a = 'abcdefgh'; // Напишите здесь недостающий код, чтобы результатом работы скрипта была строка $a, повернутая наоборот echo $a; ?>
То есть, этот скрипт должен выдавать
hgfedcba
Вот в этом месте предлагаю всем читателям, владеющим PHP, решить эту несложную задачку. А я поделюсь с вами тем спектром решений, которые я получал во время проведения собеседований.
Нет, правда, попробуйте.
Итак, буду оглашать и комментировать варианты ответа в порядке моего личного, субъективного, наверняка в чем-то ошибочного понимания правильности решения.
5. Номер пять в моем хит-параде занимает ответ «я не знаю, и не буду это писать». Иногда с вариантом «что за дурацкая задача, в жизни такого не бывает». Слив, как говорится, засчитывается сразу.
4. Номер четыре занимает вариант «В PHP вроде должна быть такая функция...». Что ж, справедливости ради, должен сказать, что в PHP действительно есть такая функция. Названия ее, конечно же, никто не помнит. Это нормально. Но неужели вы думаете, что я задавал эту задачку, чтобы услышать такой ответ? Следом за таким ответом предлагаю реализовать эту функцию самостоятельно. То есть, как отмазка не канает, надо писать.
3. Место номер три уходит семейству решений под девизом «ну, как-то через массивы». Код при этом, разумеется, выглядит по-разному, и до победного конца (работающего и выполняющего задачу скрипта) добираются не все адепты массивных решений. Функции explode() и, соответственно, implode() приходят в голову далеко не всем, а уж что пытаются делать между ними — прямо стыдно рассказывать. Даже сортировку. Решение с массивами формально годится, задача должна быть в первую очередь решена, а потом уже можно и заняться оптимизацией, и поговорить о производительности, и так далее. Нюанс в том, что решить задачу через массивы не так уж легко, потому что массивы тут не нужны. Есть у меня подозрение, что такое решение говорит о том, что человек недостаточно работал с примитивными типами данных, а был в детстве ранен в мозг простотой и легкостью динамических массивов в PHP. Но человека, более-менее писавшего, например, на С, таким не обмануть. Так что в целом — подходу незачот.
2. Следующее решение — минимально адекватное для того, чтобы я рассматривал человека всерьез:
$b = '';
for ($i = strlen($a)-1; $i>=0; $i--)
$b .= $a[$i];
$a = $b;
Возможны, понятно, некоторые вариации.
Такое решение встречается в большинстве случаев, не всегда с первого раза, правда. В этом решении есть нескольно важных мест:
strlen()
вынесен из тела цикла и выполняется один раз (есть ли понимание того, что это зло?)- минус один от длины строки (сколько шишек об это уже набито?)
- как там с ноликом — больше или больше-равно? (те же, в принципе, шишки)
1. Джедайские техники. Чемпионов видно по джедайским техникам решения задач, хочется верить, что такие люди хотя бы листали Кнута. Мне известно только две, на собеседовании я встретил их буквально один или два раза. Первая, которую я таки встречал (Вадим, привет) заключается в том, чтобы использовать цикл вдвое меньшей длины и менять местами соответствующие символы:
$b = '';
$l = strlen($a)-1;
for ($i = 0; $i < $l/2; $i++) {
$b = $a[$i];
$a[$i] = $a[$l-$i];
$a[$l-$i] = $b;
}
Вторая джедайская хитрость состоит в том, чтобы поменять местами символы в строке без использования третьей переменной. Очень сильно удивлен, что многие не знают, как это сделать даже для чисел. А тут — символы. А так хотелось бы, что-то кто-то написал что-то вроде$a[$i] = $a[$l-$i]^$a[$i];
$a[$l-$i] = $a[$l-$i]^$a[$i];
$a[$i] = $a[$l-$i]^$a[$i];
Задачка, конечно, «плюшевая». Я сам могу придумать десяток причин, по которым она плоха — не отражает знание PHP, не соответствует реальной жизни, что вообще она показывает, бла, бла, бла. Как, например, понять, догадался человек о таком решении или просто читал о нем где-то еще? Неважно. Уверяю вас — пользуясь этой задачкой (и, конечно, еще многими другими) я еще ни разу серьезно не ошибся с кандидатом. Ведь формальное знание PHP в кандидате — поверьте, далеко не главное. Значительно важнее — отношение к своему занятию, стремление к развитию, способность играть в команде, видение мира, если угодно. Мне гораздо интереснее, как человек решает задачу, чем ее фактическое решение. Грань между этими вещами довольно тонка, но мне кажется — она есть, и понять, что за ней, не так уж просто.
А всем, кто дочитал до этого драматического места, я напоминаю, что наш проект ищет людей, которые обладают талантами PHP-программистов, которые в начале этой статьи все-таки решили эту задачку и ответ находится в первой или второй группе решений. Таким программистам мы хотим рассказать о прелестях работы в стартапе, о чудесах, на которые способна маленькая но мощная команда, вооруженная разносторонними знаниями, оснащенная лучшими средствами производства гениальных проектов и мотивированная нашими, украинскими, реальными рыночными целями. Если вы хороши, действительно хороши в PHP, и это не единственный ваш язык программирования, если у вас есть свое мнение относительно модели MVC и пара серьезных проектов за спиной, если вам не все равно как происходит развитие проекта, и вы болеете душой за agile, scrum и xp, если вы еще недостаточно закостенели и готовы броситься с головой в проект, где надо будет реально показать то лучшее, на что вы способны — то у нас есть к вам предложение мечты. Но задачка на собеседовании будет другая :)
Алексей Колупаев,
[email protected]
149 коментарів
Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.