Трудный вопрос на собеседовании #7

Учитывая пожелания участников, озвученные в комментариях к предыдущей задаче, мы решили не переводить все задачи цикла подряд (учитывая, что впоследствии нам пришлось бы столкнуться с рядом баянов), а оставить концепт и наполнить его качественным содержимым. Если у вас есть собственные наработки по этой теме, пишите.

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

Задача #0 — тест на педикулёз

Написать «Hello, world» на PHP (задается устно, ибо кода не много). При всей кажущейся тривиальности здесь есть где развернуться:
  1. Ставим знак < — это единственная железобетонная часть программы, дальше возможны варианты.
  2. Пишем ?, ?php или % — взависимости от настроек в php.ini и Code Standard, принятому в компании (плюс кандидиту, если слышал и про то, и про другое).
  3. Рассказываем, какие бывает команды вывода и чем отлючаются: например, echo, print и = .
  4. Объясняем, в каких кавычках мы написали «Hello, world» и почему — в одинарных выполняется быстрее, зато в двойных могут быть переменные.
  5. Ставим точку с запятой или нет — в конце скрипта это не обязательно.
  6. Пишем ли закрывающий PHP-тэг? Если дальше нет HTML-кода, то лучше опустить, чтобы потом не заморачиваться с поиском лишних переносов строк, вылетевших в output раньше, чем мы думали.

Ещё быстрой проверкой понимания основ является задание определить значение предиката, который является конституентой единицы (или нуля), т.е. равняется true (false) на любом наборе значений его переменных. Ну например:

<code class="php">$a = 'true';
if( 0 == $a || $a )
{
  echo 'yes';
}
</code>

Задача #1 — на знание синтаксиса

Чем отличается смысл этих строк (либо «Найдите ошибку» ;) ):
<code class="php">$a =& $b;
$a &= $b;
</code>

Задача #2 — на внимательность

Что будет выведено в результате работы скрипта (задают такое кажется в Яндексе):
<code class="php">$a = 10;
echo $a-- - - - - - - - - - - --$a;
</code>

Возможен вариант с плюсиками или с комбинацией плюсов-минусов.

Задачки эти простые, так что ответы можно даже не постить в коментах — больше интересует обсуждение этих задач или альтернативных заданий.

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn



24 коментарі

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.

#2 действительно 18. потому что 10 минусов в итоге дают один плюс, операции выполняются слева направо, поэтому конструкция упрощается к (а + (а — 1) — 1 = 18.

упрощается к 9+9 = 18

Понравилась в тесте картинка «PHP вместо мозгов». Жестко, но справедливо.

http://www.corp.mamba.ru/test/Я — хороший PHP-программист:)

Cсылка в тему — как я провожу собеседование PHP разработчиков: http://anton.shevchuk.name/php/php-interview/

согласен со вторым каментом.ПХП не знаю и знать не хочу

2Щетинин Сергей, что Вы говорите?:) ай-ай-ай, кто бы это мог быть?© спасибо конечно, что поправили, жаль что поздно:) 2Скакунов Александр, конечно позволю, затем и писались ответы, чтобы услышать мнение со стороны. что касатеся операций побитового И, я их использовал за 12 лет раза два или три. всего. это большей частью математика и шифрование., но на мой взгляд этот вопрос на знание операторов лучше вопроса #2. хотя на вкус и цвет все фломастеры разные©:) если говорить о собеседовании, то есть масса различных подходов. и эти вопросы позволяют отсеить совсем нулевых разработчиков, чтобы просто не тратить время даром. так что толк есть, я просто хотел услышать мнение, отличное от моего, относительно вопроса #2:)

Если позволите оценку, то ход рассуждений очень здравый.

#1 $a =& $b — понятия не имею, чистая ПХПшная заморочка, по принципу ===.$a & = $b — побитовое И для переменных, а и b, с записью результата в а.

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

гыгы, в последней строчке скобку забыл (a + (a — 1)) — 1 = 18 разумеется. не возьмут меня в Яндекс:)

2MadMachine, наченем с того, что я не PHP-программист, хотя синтаксис знаю. попробую ответить на очевидные вещи: #0.2 декларация, насколько я помню, может быть вообще любой. посему определяется Code Standard и вносится в php.ini. по-умолчанию АФАИР, как в JSP, но насчет умолчания уже могу путать.#0.3 ничего конкретного сказать не могу. по логике вещей = — оператор записи в стандартный поток вывода, который обрабатывается интепретатором в качестве оператора по-умолчанию. следовательно это вызов write уже существующего output-потока, и должен быть самой быстрой операцией. нет? #0.4 опять-таки чистая догадка — в двойных кавычках инициализируется объект String, в одинарных — единый литерал, значение строки. иначе говоря "" — передается ссылка, ’’ — передается значение.#0.5, #0.6 — понятия не имею.#0.задачка — ответ: будет напечатно yes. потому что 0 == $a — false, но $a == true, а true|| false = true. разумеется в том случае, если в PHP конструкция $a = ’true’ означает инициализацию булевой переменной.#1 $a =& $b — понятия не имею, чистая ПХПшная заморочка, по принципу ===. $a & = $b — побитовое И для переменных, а и b, с записью результата в а.#2 действительно 18. потому что 10 минусов в итоге дают один плюс, операции выполняются слева направо, поэтому конструкция упрощается к (а + (а — 1) — 1 = 18.

да, и еще — вопрос #0 гениален

Ну вот, сразу бы так, а то «говнокод-говнокод»;) Вопрос #0 узнал от Кирилла Климакова (EPAM).

да, и еще — вопрос #0 гениален. рекомендую все адаптировать для языков, на которые приходиться собеседовать кандидатов, и использовать как первичный грубый фильтр.

2Vadim Voituk, приоритет операций — да, вещь полезная. на практике заменяется скобками практически всегда. причем даже код-генираторами. у меня IDEA подсвечивает, где нужно лишние скобки убрать. иногда я с ней не соглашаюсь. опять-таки, приоритет операций можно (и как правило должно) знать на высоком уровне. иначе говоря, ++ имеет бОльший вес, чем * и так далее. понимание, а тем более быстрое понимание той отфонарщины, которую я привел выше — хорошо., но не обязательно. это с одной стороны. с другой стороны, человек способный написать hashCode = 31 * result + intField >> 2. и понимающий, что получится в результате, однозначно не станет писать мою отфонарщину — он уже минимум один раз написал сто раз фразу «я никогда больше не буду писать wright-only говнокода». прошу прощения за тавтологию. итого ценность быстрого понимания такого рода кода стремится к нулю. разумеется, если мы не говорим о программировании на Perl. там ИМХО бОльшая часть кода wright-only., но то язык такой или мне примеры попадались плохие.:)

а вот мне очень даже интересно просто почитать ответы, варианты решений... просветите пжалста:)

Anton Naumov: +1 насчет отрывание рук за такой кодНо вот для проверки понимания приоритета операций и умения не теряться в таком г#вне — задачка может быть полезной.Ато потом будешь потом за таким кандидатом вылавливать баги, связанные с приоритетом и постфиксно-префиксной нотацией.

Яндекс это конечно хорошо, Sun еще лучше, но вопрос #2 — мертворожденное порождение апологетов знания языка. за такой код в продакшине я лично обещаю посадить автора за конфлюенс, выделить ему отдельную страницу и заставить 100 раз написать фразу «я никогда больше не буду писать wright-only говнокода». при написании виновный не имеет права использовать копи-паст.если говорить более серьезно, то действительно вопрос #2 проверяет знание языка. вопрос только нужно ли кому-нибудь такое знание? мой личный ответ — нет, не нужно., но задачи ++а—b++c—d++s >> k << z встречаются довольно часто. и единственный вопрос, который беспокоит меня до сих пор, так это зачем?

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

clear && php -r ’printf ( “%sn”, base64_decode ( “cHJpbnRmICJcMDEwPD9waHAgcHJpbnQoJyVzJyAuIGNocigweEEpKTs/PiIgY29kZV9PSyB8IHBocCAtYQ==” )); ’

соответственно для второго:

clear && php -r ’printf ( “%sn”, base64_decode ( “cHJpbnRmICJcMDEwPD9waHAgaGVhZGVyKCdDb25uZWN0aW9uOiBjbG9zZScpO3ByaW50KCclcycgLiBjaHIoMHhBKSk7Pz4iIGNvZGVfRkFJTCB8IHBocCAtYQ==” )); ’

ну и конечно подразумевается что PHP собран с поддержкой cli...

1. Ставим знак < — это единственная железобетонная часть программы, дальше возможны варианты

на самом деле возможны варианты и до «железобетонной части» программы: о)...Например, плохой редактор не покажет что до «железобетонной части» есть «нечто» в 2-х случаях ниже: 1 — проблем нет (ну почти нет, обычно такое проходит незаметно):

# printf "10" code_OK | php -a

2 — а вот здесь будут проблемы:

# printf "10" code_FAIL | php -a

(листинги подразумевают что PHP собран с поддержкой cli)

$a & = $b; -, а так, адрес переменной в C++ не взять, наверное, и в PHP тоже

Всё проще, ответ из другой области. В РНР это работает, в С++, наверное, тоже.

$a & = $b; -, а так, адрес переменной в C++ не взять, наверное, и в PHP тоже

Имхо. Мне кажется что задачки нужно приводить платформо-, языко-, технолого — независимые. Ибо не все тут на пшп програмят.

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

Підписатись на коментарі