Как стать автором
Обновить

Комментарии 364

вполне тривиальные задачи – никакого rocket science... на zend certified engineer МНОГИМ сложнее, хотя и там в принципе только воздух
НЛО прилетело и опубликовало эту надпись здесь
а если я не помню, что делает var_dump – это очень плохо? я к счастью уже не php-программист, но все равно интересно.

оффтопик. а у вас не возникало желания продолжить мастер-классы работы в mac os x? ну там как вы используете OmniFocus, Quicksilver и т.п. Вот лично вы, крайне субъективно. Ваш личный инструментарий. На самом деле не так много информации такого типа, до всего приходится доходить самому. Вы как то писали про GTD в с помощью quicksilver, bbedit и еще чего-то. Было очень интересно, правда.
Программист не должен помнить все функции назубок. Его основное умение - структурирование и "разложение по полочкам". А принцип действия той или иной функции всегда можно узнать из мануалов.
Так мне говорили мои преподаватели
Ну не знаю как насчет таких задачь, я например больше предпочитаю посмотреть код написаный самим програмером, пускай объяснит что да как. :)
т.е. на собеседование вы просите принести часть рабочего проекта, возможно чужого?
да хоть чужого, главное чтобы понимал как "оно" работает
Пробовал и такое. Получается в итоге совместный разбор скрипта - "Ты енто панимаищь?"
Вот объясните как такое можно было написать:
function getMe($string){
$this->var = $string;
}
Получать me, при это передавая строку и присваивая var эту строку?
Какой-то извращенный и не понятый getter?
Или это пример чужого плохого кода?
Это - донельзя упрощённая задача на понимание приватов и наследований.
Лучше бы уж так:
function setMe($value){
$this->me = $value;
}
А то "кобасит" не по-детски.
и тем не менее такой финт с именованием может отвлечь кандидата от основной задачи
уж извините, но похоже что в объявлении метода вы поменяли его имя, а вот при вызове так и остался getMe(). Такое еще больше сбивает ;)
Простите, поменял)
Мне почему-то кажется, что профессиональный программист давным-давно забыл школьные годы и вряд ли ответит на подобного рода вопросы. "Вам шашечки или ехать?" ©
Профессиональные к нам, к сожалению, не ходят=(
Вероятно, Вам надо денег больше предлагать. Профессионалы есть, но они дорого стоят.
если профессиональный программист не имеет понятия о том, как хранятся переменные в пхп и как они приводятся к типам, то грош цена его профессионализму
Во!)
Не имеет понятия, или забыл в момент собеседования?
Я так понимаю что справочником пользоваться в этот момент нельзя?
ну это сравни программисту на сях, который не понимает указателей и "*", "&", ".", "->" выясняет подбором :)
Интернетом наверное тоже, "профессиональный программист" должен знать все наизусть, не пользоваться автокомплитом, и, не дай бог, IDE.
IDE - та ты шо??!!! грязный PHP получится... notepad forever! :)
Не заставляйте меня опять делать это :)
Да вообще надо писать на листочке и распознавать потом в FineReader :-)
есть такая строчка магическая в C, очень хорошо в тестированиях C-программистов можно использовать:
while (*s++ = *t++); Кто с ходу вспомнит, что она делает? =)
а для PHP… даже не знаю
(str|mem|чтотоеще)cpy?)) если правильно помню (на сях ничего не писал уже давно...) ;) с ходу вспомнил =)
Наверное просто строка t присваивается s
Null-terminated строку копирует, я думаю. Вообще, если не угадывать, то в этом примере ещё нужно помнить приоритет операторов, чтобы правильно ответить. За n-лет программирования на плюсах я их так и не запомнил, если нужно приходится в MSDN набирать "operator precedence".
да, верно, копирование строки.
а можете объяснить почему так? :)
s и t — переменные-указатели, скорее всего char? по *s и *t - наверное будут сами значения.
инкрементом ++ мы сдвигаем указатель на +1, что слева, что справа.
= присваивает значение char справа на левую сторону.
но как срабатывает условие, что бы while завершился?
а просто. когда копируется символ с кодом 0, while воспринимает его как false, именно поэтому все комментаторы выше говорили о том, что нулевой символ там быть обязан, иначе не работает.
так а s и t - char-ы? Если нет, тот как понять на глаз, что они строковые?
очень просто, хоть и выглядит некрасиво, я строки так всегда копировал :)
Опасная практика, buffer overflow и всё-такое. Лучше либо использовать что-то типа std::string, либо функции типа strcpy_s или их аналоги.
да, если s больше, чем выделенно под t, то будут проблемы
сокрее наоборот: если t больше, чем выделенно под s, то будут проблемы
t копируется в s
Я тоже когда-то гонял программистов всякими подобными тестами. Потом перестал.

Потому что не хочу чтобы в проектах появлялись хитрые куски кода. Я пришел к выводу, что чтобы проект жил, код должен быть ясный, тупой, и написанный как по рельсам ( нет, я не про Rails )

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

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

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

Еще я бы посоветовал вот что - при собеседовании обязательно обращайте внимания на ощущения от общения с человеком. Вам же с ним работать годы своей жизни, которая не бесконечна.
профессиональный программист тем и отличается от новичка, что он простым кодом решает сложные задачи, а не наоборот :)
вроде эта мысль где-то на хабре уже освещалась
Слышал в формулировке:
Хороший программист пишет гениальные вещи тупым кодом, а не наоборот.
Умно сказанно, считаю.
Все правильно! Сам кода-то не прошел собеседование на котором меня завалили вопросами по нюансам php. И прошел следующее же собеседование, где мне нужно было сделать мини задиние по спецификации, а потом внести в него какие-то изменения "на лету".
мне кажется это самый эффективный метод проверки программиста, сначало делает тестовое задание, потом на лету в офисе пару-тройку более мелких изменений в этом задание.
Согласен на 100% :)
В сущности, проще сказать, что важно умение применять теорию на практике, а не знать все нюансы теории, которые все равно в большинстве случаев не понадобятся.
НЛО прилетело и опубликовало эту надпись здесь
эээ .. 5 ? правильно ?
нет, результат инкримента не lvalue, поэтому выражение не скомпилируется
не интерпритируется
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
не факт. Вполне себе может быть и 5:
int x = 5;
int &t = ++x++;
НЛО прилетело и опубликовало эту надпись здесь
вот честно это бред, сколько программлю не разу таким не пользовался и не буду.
НЛО прилетело и опубликовало эту надпись здесь
В Си эта конструкция скомпилируется но может запустить баллистическую ракету и отформатировать ваш жёсткий диск: два изменения переменной между "sequence point"'ами...
ошибка синтаксическая будет :)
а есть еще такая
$a = 1;
$b = 2;
$c = $a+++$b;
Это пи;№"ц, а не задача =) Хоть бы скобки были $c = $a + (++$b);
или $c = ($a++) + $b

Неужели вы считаете это действительно полезно задачей?
со скобками любой может :)

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

это для эрудитов. реальной пльзы от занния решения тут нет. всего лишь трюк, не более того.

$a += $b;
$b = $a - $b;
$a -= $b;
я имел ввиду универсальный способ - который будет работать для любых скалярных переменных
Тогда прошу прощения :)
Будет интересно увидеть от Вас решение.
list($a, $b) = array($b, $a);
$a=$a^$b;
$b=$a^$b;
$a=$b^$a;
Ну, формально-то новая переменная (массив из b и a) создается, другое дело что имени у неё нет и она является массивом.

А в инсте нам давали такую задачку на СИ и решение какраз было в сложении-вычитании (переменные были целыми...).
В перле: ($a,$b) = ($b,$a);
А в PHP как обычно...
Python, если не изменяет память:
a,b=b,a
Кортежи рулят
НЛО прилетело и опубликовало эту надпись здесь
да из С, там было 5 плюсов. в примере убирал пока не запустится
решение можно узнать только если знаешь как интерпретатор разбирает данное выражение
$c будет равно 3. это все равно что $c = ($a++)+$b;
а если так $c = $a+(++$b); будет 4
копирует строку ... сходу ...
Когда-то я восхитился с++, когда увидел разбор этого примера у Страуструпа.
За такую строку надо очень сильно бить того, кто её написал. Это стандартный пример у Страуструпа, и если помните проблему с RPC у Microsoft, то она была у них именно в этой конструкции. А что если этого нуля не будет или t будет больше чем s... Я бы лучше узнавал у кандидата, где здесь потенциальная ошибка безопасности и как её можно исправить.
Когда я принимал людей я, в качестве одной из тестовых заданий, давал задачу на построение дерева коментариев + генератор N коментариев и отпускал домой. Когда чел приходил, я увеличивал N на 3 порядка и спрашивал почему тормозит =) В процессе общения выяснялось что это за чел

ЗЫЖ Кстати, я бы не решил бы задачу номер 2 (я смог бы только угадать правильный ответ =) За 6 лет ini_set мне ни разу не пригодилась
Ну эта задача на понимание глобальных массивов=)
Скорее решение этой задачи покажет как чел умеет оптимизировать MySQL (а ему нужно сообразить, что рекурсивно эту задачу делать нельзя и исходя из этого соображения он должен придумать правильную структуру таблицы с коментами) + конечно, он должен придумать как это дерево хранить в массиве и как заполнять этот массив =)
имхо хорошая задача.
а пользоваться поиском соискателям даете, или расчитываете что они все помнят?
Что они будут искать?=) Решение плитки?+)
А так - рядом стоит компьютер. Если у человека хватает наглости - он ищет)
Мне кажется, что если чел не помнит какую-то мелочь (синтаксис или название функции), и знает где и как это найти, то можно считать, что он знает матчасть.
+1
да вообще проводить тестирование на листиках это блин полный дебилизм
На листках проводить решения - как раз нормальный подход, но в этом случае нужно смотреть на алгоритмы и/или дизайн, а никак не на тонкости синтаксиса языка...
Нет, часть тестирования стоит проводить на листике.
Но это явно должно быть не тестирование знания синтаксиса языка и названий библиотечных функций.

На мой взгляд стоит давать какую либо простую задачу на составление алгоритма, но опять же не стоит требовать от человека точно знать, что такое qsort и писать его на листке!
Да, задачи с деревьями очень показательные - сразу можно понять с малой вероятностью ошибится - работал ли программист с большими проектами. Деревья есть практически в любом веб-проекте, но только в высоконагруженных возникает необходимость их оптимизировать.

Все задачи кроме второй нормальные, но явно не достаточные для определения компетентности и способности испытуемого. Сам тоже даю тест с подобными заданиями на знание пхп, баз данных, безопасности и внимательности.
И чуваки, конечно же, выдергивали дерево рекурсивно... ;)
Давно интересует, кто нужен авторам данных тестов.
Программисты или интерпретаторы?
Соглашусь с вами. Тут ищутся интерпретаторы.
Не соглашусь, задачи тривиальные и очень часто используемые, sql иньекции, глобальные массивы, ooп (кстати, на этой задаче я засыпался, со 100% гарантией ответ дать не смогу), приведение типов.
Человек который не знает об нъюансах этих вещей творит код содержащий кучи трудноотслеживаемых ошибок. И опять же это вопросы ответы на которые приходят в основном с опытом, когда ты делаешь эти самые ошибки и исправляешь их. Согласитесь мало кто будет хорошо разбираться в безопастности не помучившись всласть с основами, и наоборот, знание безопастности говорит что человек достиг определенного уровня во всей области.
НО. Все эти задачи только на кодинг(ну за исключением ооп). Вам нужны кодеры или профессиональные программисты. Может добавить задачку на проектирование и "отпустить домой"?
А человек знающий в идеале эти нюансы творит много трудноотлаживаемого кода :)
Вопросы тянут на соревнования какие-нибудь, а не выявление знаний. Ну кто же будет программировать без справочника, все же не упомнишь.
А человек знающий в идеале эти нюансы творит много трудноотлаживаемого кода :)


Спорное утверждение. Человек, который этого не знает, неэффективен, т.к. больше занимается чтением, а не программированием. Вам читатель или программист нужен?
Я думаю, нужно давать две задачки ;)
Для полноты картины, что называется. Иначе за таким спецом самому придется все перепроверять и переписывать.
+1 :))) в точку.
Любую задачку из трёх можно легко решить на лету, так сказать. Любой программист - уже немножко интерпретатор.
нужно понимать как работает то, что вы пишите :)
великолепный комментарий :)))
Задача с SQL инъекцией единственная стоящая.
Я сам не тестировал, но я бы попросил реализовать паттерн Singleton, например. Это актуально и не слишком заумно, а register_globals - это уже устарело, как мне кажется.
А вот как отдать 404 заколовок с ходу я и не вспомню - по-моему, это справочная информация.
Это - работа с браузером. header('HTTP/1.1 404 Not Found'); - это залог любого SEO как минимум.

Насчет регистер-глобалз - это показательные условия php для исполнения.
И что, содержание подобных строчек в уме делает человека хорошим программистом?
Что такое HTTP и его код ответа, какой код ответа указывает отсутствие документа и как HTTP-заголовки устанавливаются в PHP веб-программист знать обязан.
Я вот честно не знал как правильно писать эту строчку. Но сейчас ради интереса ввел в гугле "send 404 php" и за полминуты узнал всё что нужно, плюс нашел несколько готовых классов для обработки любых ошибок, что, как мне видится, намного полезнее заученной строчки.
обучаемость - несомненно большой плюс.
но обычно в такой ситуации понимаешь что кандидат не имел опыт работы с этим прежде, либо опыт не значительный. Т.е. подводных камней не знает, и начами баги не отлаживал - это еще только предстоит (сразу после того как найдет всю необходимую информацию).
В такой ситуации понимаешь знает ли он строчку 404 или нет.
а почему вы делаете акцент на "заголовок 404", а к примеру не на "отдать заголовок"? :)

найдутся кандидаты которые не знают не только как отдать заголовок, но и зачем. я не в коем случае не защищаю и не ругаю примеры. нужно просто иметь ввиду для какого уровня специалиста это задание. для новичка проверить знает ли он про заголовки — вполне уместно.
А еще желательно знать, что PHP может быть установлен, как модули или как CGI, а в CGI нельзя устанавливать код ответа — нужно посылать "Status: 404 Not Found", чтобы апач сам с ним разбирался.
И это, к сожалению, знает так мало народу=)
Помню, как сам в первый раз с этим впёрся - еле нашёл решение, но сам нашёл=)
А если я никогда не использовал CGI и не собираюсь, зачем мне это знать?
Никто с CGI не собирается. А потом фигак — а почему я перенес файлы на сервер и у меня перестало работать?
А хороший программист обычно держит в памяти примерный список функций документации, а такие вещи как в примерах, когда страниц 1000 напишешь с нуля, уже сами в памяти оседают.
К АВТОРУ: может деньги мааленькие предлагаете? Меньше чем за 1500E хорошего программера не найдете :)
Нормальные предлагаем=) Нам и не нужен особенно хороший. Скорее кодер нужен - ковыряться в чужих движках.
Для ковыряния в чужих движках нужен куда более грамотный (и потому дорогой) программист, чем для писания кода с нуля. Так что извините...
Нет, вы ошибаетесь=)
Требуется же не глобальная переделка движка, а внесение нескольких дополнительных функций. Ради этого можно не лезть глубоко внутрь.
Менее грамотный прогарммер не сможет нормальный модуль написать, зато напишет обычный здоровый хак, который потом даст о себе знать.
Не факт что оседают. Я например никогда не помню последовательность параметров в функциях, и мне это ни разу не помешало. Для этого есть документация и автокомплишн, а лишние сведения засоряют мозг.
да, я-бы тоже порылся в вики, хотя там отдается вроде в header('404/HTTP 1.1')
По-моему четвёртая задача вообще не решаемая, т.к. в ней ошибка.

>$query = "SELECT anons,text FROM news WHERE id='".$_GET['x']."'";
>$res = mysql_query($res);

переменная $res не определена ;)
Уже исправил+)
>> я бы попросил реализовать паттерн Singleton

Этот патерн вообще не имеет нормальной реализации для PHP class X extends Singleton{}
$x = X::getInstance();

В PHP 5 с чем-то добавили мега-костыль get_called_class() для того чтобы Singleton::getInstance() получить имя класса экземпляр которого надо создать. Есть люди которые пытались обойти отсутствие этой ф-ции с помощью BackTrace-а %-)

По этому не стал бы я про синглтоны...
К сожалению часть текста съелась:

Этот патерн вообще не имеет нормальной реализации для PHP < = 5.2. Если кто-то владеет секретным кодом, поделитесь - буду очень благодарен.

Под "нормальной" реализацией я понимаю такой варриант:
...
зачем тебе синглетон как класс? сделай его через метод, всегда хватало такого способа
Потому что это в некоторой степени противоречит концепции ООП, т.к. это приводит к дублированию кода.
В итоге мы получим множество одинаковых методов, которые, если их захочется модифицировать, придётся менять все.

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

Пример два: у меня есть множество классов для работы с таблицами БД. Каждый подобный класс наследуется от одного потомка. Поняв, что эти классы создаются слишком часто я мог бы преобразовать их в синглтоны простым наследованием базового класса от класса Singleton, а тут мне придётся делать синглтон из каждого класса. Опять же я не смогу произвести наследование от этих классов, т.к. они после этого перестанут быть синглтонами, если я не перегружу в них метод getInstance().

Я в результате пришел к достаточно некрасивому решению, но который исправляет указанные недостатки. Вместо
new ClassName() я пишу XXX::getInstanceOf('ClassName'), где XXX - глаобальный статический класс который отвечает за создание синглтонов...

Во общем, по этому, я бы не стал просить на собеседовании изобретать синглтоны
Спасибо за ссылку, замечательная статья!
Спасибо!=)
собственно, рекомендую тест для программистов от мамбы (очень хорош):
http://www.corp.mamba.ru/test/index.phtml

а еще можно поискать различные он-лайн сертификации, и если оной у человека нет - дать комп и заставить пройти.
я не минусовал, но ответить все таки решил. Тест от Мамбы не очень хорош. Я работаю в linux, но такие мелочи, как dd dt df и прочее просто не запоминаю. Если мне что-то надо сделать - я нахожу ответ, использую, и почти тут же забываю (это не относится к работе, линукс вопросы и свн подковырки больше на другую специализацию тянут. работать надо, а не выеживаться знанием короткого варианта svn checkout).
Он слишком заумный и шибко много в нём не ахти как нужного, по сути.
Спасибо, потешил эго)
Я как-то давно уже проходил этот тест. Он мне наименование "крутой PHP программист", поставив 378 баллов. Судя по вопросам, там нужен программист на PHP, который в будет в команде (вот зачем нам SVN) работать над каким-то заточенным под Linux проектом =)
я как-то проходил этот тест. Он мне наименование "хороший РНР программист", причем количество баллов не помню, даже близко. Но суть в том, что я о ПХП совсем ничего не знаю :)
Там мало SQL, зато много Линукс консоли
Я ради интереса заставил жену этот тест пройти) Она ничего не смыслит в линуксе и программировании, она отвечала исходя из логики дизайнера:) Немного не дотянула до хорошего программиста, набрав 116 балов
1.Задача номер раз.
$x == '1' да
$x == true да
(bool)$x === true да
$x === true нет
(int)$x === true нет, === есть равно с проверкой типа. а $x - инт
— не считаю вопрос интересным, хотя лично я долгое время оператора === не знал. В сях его нету.
2.Задача номер два
Оторвать руки тому кто писал код. Регистер глобалс\ини сет - ЗЛО.
Вы б еще бы magic_quotes \ sybase врубили и спросили.. а что происходит то?
3.Задача номер три
Опять же зло, но правильное зло.
Что будет в каких версиях php не знаю. Что будет в сях - в крови и спином мозге.
4.Задача номер четыре
http://site.ru/?x=1' AND 1 ? :)
Решение брать $_GET['x'] через addslashes( для текстовых значений ) или intVal лично я считаю не правильным
у меня это бы выглядело бы как
$res = MQp("i","SELECT anons,text FROM news WHERE id=?",$_GET['x']);
Уж сколько лет живет(цветет и пахнет!) mysql_i а люди все торозят.

Вердикт : уважаемый - берите на работу Си программистов. В Сях препаред статемтами пользоваться часто удобнее чем собранными запросами, и чертовски быстрее они работают. И люди привыкают к правильному решению.
думаю что ваша инъекция не сработает. Нужно не AND, а OR
http://site.ru/?".x=1' OR 1;DELETE FROM news;
Некоторые враперы правильно воспримут `;` как разделитель двух команд и будет бяка.
Если табличка называется не так.. ну можно попробовать инжекнуть SHOW TABLES :)
не прокатит, пхп выполняет только один оператор
можно попробовать извратиться вложенными запросами. Вариантов много. Но это уже глубокое знание sql нужно.
насчет номера три - такое, если я ничего не путаю, ввели в php5 - если человек писал с использованием ООП - ответит сразу+)

Всё остальное правильно, кроме AND=)
Както мой препод задался интересной задачей.
class A
{
float value;
}
class B:public A
{
double value;
}
C=new B;
какую переменую вы получите по C->value;
а по (float)C->value ?

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

Или вот еще один хитрый пример
void main()
{
for(int i=0;i<....){ do}
for(int i=0;i<....){ do}
}
в каких компиляторах будет еррор(или тама варинг.. не помню) на второй цикл. Какой и почему :)
C->value даст double, а насчет (float)C->value... будет cast double к value? потому что область видимости float value перекрыта double. Правильно?
А вот тут правильный ответ - как повезет :)
Вы же явно просите флоат.. И у него есть этот флоат.. Ну почему вы хорошему человеку не дать?
Что такое overloaded функции вы знаете?
А вот "кое-кто" гдето в ядре компилятора думал и о overloaded переменных.
В частности MSVS и Borland * будут выдавать разные значения.
Эх помню я магические конструкции lua_bind(boost driven) - там пока фактом работу не проверишь - и не поверишь что работает.

Господа пишите код яснее и четче!
А то люди осmминоги, потому и пробки.(bottlenecks)
знаю-знаю =)
ну мы же о C сейчас? там по идее все неопределенности известны, т.к. есть четкий стандарт, в котором иногда и возникают неопределенности. нужно смотреть что в стандарте. кстати про overloaded переменные, как термин, в первый раз слышу. я думал, что термин скрытие области видимости полностью раскрывает такие случаи.
Си более полный чем пхп чтук. И хитростей в нем больше.
А насчет overloaded переменых - да они нигде не описаны, их вроде нет.
Но иногда они проявляются.
Не спорте - проверте :)
оки доки -) я не программлю на плюсах сейчас, так что мне сейчас не досуг =)
> А вот тут правильный ответ - как повезет :)
Бред... Он выдаст именно то, что сказал wpm1. Хочешь float от A - приведи сначала к типу A. Матчасть учить нужно. ;)
У вас блог клевый, на какой платформе сделан?
Можно на ты. :)
Wordpress там обычный.
Задачи первого типа никада не любил и не понимал, ибо это не пример хорошего программирования, а вот со вторым случаем сталкивался помоему будет именно ошибка на втором цикле, следующая: переменная i уже объявлена, потому что область видимости объявления int i = 0 в первом цикле не ограничивается телом этого цикла, а вот компилятор не вспомню, но вроде GCC
Подобное несоответствие стандартам (то есть когда объявленная в заголовке цикла переменная имеет большее время жизни чем сам цикл) показывает визуал студия 98 года (это которая шестая). GCC же наоборот к этому относится ревностно и ограничивает время жизни переменной только циклом где она объявлена.
К сожалению не тока старый VS но и новый Борланд.
А его, опять же к сожалению, часто используют.
А так.. фигня какая - область видимости не соблюдается.. пфф :)
А напишите решение с sql инъекцией. Именно выполнение инъекции, а не защита от нее.
Мне что-то с ходу в голову не приходит как это сделать.
НЛО прилетело и опубликовало эту надпись здесь
Кажется допетрил :)
А как вы относитесь к тестам на сообразительность? Сам то такие собеседования не проходил, но читал на rsdn что есть такая целая часть в интервью.
Времени, к сожалению, тратится больше=( Но идея хороша - на нескольких собеседованиях я задал тест про плитку золота от микрософта - не решил, правда, никто, но сколько морщин собиралось около лба!
Помоему - это слишком для тестовых заданий, кроме инжекта.
Человек не машина. Есть люди с энциклопедической памятью, вот такие может и вспомнят все мелочи, на практике чаще всеравно разработчик уточняет все по спецификациям.
"Дляч какой версии PHP будет работать" лучше игнорировать. Если в проекте будет использоваться ООП, то логично предположить что >5 версии. Я, например не помню точно в какой версии - что добавлялось в php.
Я думаю обычный человек( не энциклопедическая машина ) ОБЯЗАН это не помнить.
Забывать мусор, оставляя место под главное - это главное :)
А что будет не слишком для тестовых заданий? Не каждый принесёт свой код на просмотр.

В данных конкретных задачах не нужна энциклопедическая память. Среднестатический кодер сталкивается с 80% содержания задач в каждой своей программе.
"Не слишком" будет просто портфолио. И желание человека развиваться и осваивать новое. Я вообще против стандартных резюме.
Человек должен придти, сказать я вам нужен и доказать это во время испытательного срока. Не доказал, уходи. Просто часто бывает что подобные тесты лишают команду хорошего человека, который будет двигать весь процесс работы. Может он не мега Гуру в php, но будет подавать интересные идеи и просто хорошо реализововать то, что надо дочитывая то что необходимо.
Меня всегда интересовало. Организации требуются специалисты и по вашим словам эти специалисты должны прийти и доказать, что они требуются, а потом еще отработать на испытательном сроке (хорошо если без понижения зарплаты). Вы не находите никаких логических противоречий в такой позиции?
Я имел в виду молодых специалистов. Если человек уже хорошо себя зарекомендовал, почему бы не взять его просто на работу?
За красивые глаза?=) Фирма, конечно, неизбежно идёт на риски, но всё-таки лучше уменьшить их уровень-то)

А что будет не слишком для тестовых заданий?

<?='Hello World!'?> =))))
Нет, это тоже слишком, ведь надо знать какая ini-опция отвечает за работу сокращенной нотации <? ?> вместо <?php ?> :)
НЛО прилетело и опубликовало эту надпись здесь
мне кажется хорошо выяснить уровень можно спрашивая, знает ли человек, что такое паттерны, привести пример. потом спросить алгоритмы сортировки, которые знает. спросить про принципы ООП (наследование, полиморфизм, инкапсуляция). а по ответам уже будет видно, какой уровень у человека и стоит ли говорить дальше.
а вообще, возможно, правы те, кто говорят что среди пхпшников много тех, кто программировать совсем не умеет.
Что-то не приходят на собеседование такие программисты :(
чорт, а почему? мало предлагают денек? или задачи скучные?
мало предлагаете, значит
паттерны ладно, но тут речь о другом уровне, но алгоритмы сортировки, извините, это бред. в php мне задача ручной сортировки не встречалась ни разу, благо функций для работы с сортировкой навалом, да и вообще такая задача редко возникает.
то же и по ООП. Вам шашечки или ехать. А если человек не помнит определение полиморфизма, что не мешает ему проектировать сложные системы. На ваш тест хорошо ответит студент отличник без опыта работы но может запросто завалится хороший программист.
гм. соглашусь про сортировку, но про ООП не соглашусь. не знать что такое полиморфизм и программить это значит что в голове каша =) а отвечать можно не определением, а простым примером полиморфизма, если уж определение не помнишь.
Лучше давать пример задачи и просить сделать ее.
согласен, если есть хотя бы сутки-двое - это лучше.
надо хоть раз про методы сортировки прочитать... я тут на ZDE собираюсь сдавать - вдруг спросят :)
гм. читал я их книжку для подготовки. там кажется во вступлении сказано, что они будут спрашивать про алгоритмы сортировки. но поскольку экзамен заточен на пхп, требуется интенсивное знание всяких методов работы с массивами, которые всяко эффективнее написанного программером кода.
что-то удивительно-простое, но позволяющее понять уровень человека?

Один из критериев, позволяющих понять уровень человека - это нормальное знание русского языка :)
чистые аккуратно постриженные волосы - ногти. скромная но опрятная одежда. я не прошел... :)
Приходите к нам)))
В сопряжении со способностью внятно излагать мысли.
Включая целесообразное применение «—» вместо «-». ;)
Я обычно на собеседованиях задавал 3 вопроса

1) напишите регулярное выражение (используя pcre) для удаления из строки всех слешей
2) напишите алгоритм подсчета числа посетителей страницы, а потом начинал издеваться над соискателями, говоря что через 1 IP может ходит целая компания или народ может ходить через dial-up, а куки могут быть отключены
3)
if ($x==1) echo "1";
if ($x==2) echo "2";
if ($x==3) echo "3";
в каком случае на экране я увижу "123"
3) $x = true; ?
Да.
А ответ на вопрос 3 какой?
$x=true
Кстати, 3-я задачка вполне себе аналог 1-й из поста, но более забавная. Сначала можно в ступор впасть. ;)
так задача и получилась из ситуации которую я однажды словил, написав в if вместо "==" =
3 задача понравилась, красивее аналогичной в посте. Регулярки - да кто ж их помнит кроме тех кто по 10 штук в день пишет, редкая это работа регулярки, чуть что сложное я отдельнь их отлаживаю и в мануал лажу. Думаю не я один.
2 - если вы отлично разбираетесь в теме, по моему очень неплохой способ выяснить уровень, только нужно разрешить пользоваться интернетом и не спешить, заодно и умение искать информацию определите.
издеваться не хорошо :) подсчитать количество пользователей невозможно, можно лишь прикинуть группируя хиты по косвенным вещам таким как ip, forwarded_for, cookie, user agent, координаты и размеры окна обозревателя.
в урл сессию передвать.. ну а там уже id держи
так вы подсчитаете количество сессий.
так здесь проверялась способность мыслить, находить нестандартные решения...ну и знание того что хранится в $_SERVER
Все «справочные собеседования» по-моему не дают объективной картины. Если бы мне нужен был человек, я бы спрашивал какие у него есть рабочие проекты в сети, какие нагрузки они выдерживают и какое участие в них он принимал. Согласен что должны быть основные знания у человека, но вряд ли кто пишет такой код:
error_reporting(E_ALL);
ini_set('error_reporting','1');
ini_set('register_globals','on');

var_dump($x);

unset($x);
ini_set('register_globals','off');
И потом в нем пытается разобраться.
Согласен. Я например никогда не пользовался var_dump. Зачем, когда есть xdebug?
"Зачем пользоваться print, если есть echo?" ?
Я бы поставил вопрос так - зачем вообще выводить ошибки в броузер? Есть отладчики, даже gui-шные.
Вот я о том тоже отписывал, эти обычно человек фокусируется не на тонкостях языка, а на конкрентых задачах.
всегда ненавидел тесты на знание тонкостей. Не пробовали давать какое-нибудь простое задание перед собеседованием и смотреть как оно выполнено? В конце концов наличие мозга значительно важнее знания всех тонкостей.
Где же тут тонкости-то?=) Обычная работа)
так а проблема-то в чем? надо больше чем двое? или те двое что проходят тесты - не проходят фейс-контроль? %)))
СБ не проходят=)
Если просят код то принесите что-нибудь вроде этого и думаю вопросов у собеседователя заметно убавится :))

int a=10000,b,c=2800,d,e,f[2801],g;main(){for(;b-c;)f[b++]=a/5; for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)for(b=c;d+=f[b]*a, f[b]=d%--g,d/=g--,--b;d*=b);}
"аффтар жжет"
Оно вывело кусок числа пи. Как ОНО это сделало?! :)
код не проверял, но чувствую что разложил e^x в ряд и посчитал e^1
действительно - убавится. и претендента с таким кодом не возьмут.
ибо код должен быть читаем и понятен при его просмотре.
За код $query = "SELECT anons,text FROM news WHERE id='".$_GET['x']."'"; нужно отрывать руки.
Как же проверка приходящих данных? Типизация.. Если id строго intовое значение - intval($_GET['x']) :-) причем еще есть вариант, что параметра нет в урл'е. Поэтому нужно проверять еще isset и, по желанию, empty.

А так задачки простые, вполне.
Вы условие задачи внимательно читали? Такой запрос там специально!
Читал. Поэтому и говорю, что если брать программиста и давать ему такие задачи - он не увидит в них ничего плохого, новичок. Натасканный программист прокомментирует, что код ужасен и прикрепит к этому достаточное количество доводов. Давайте задачи посложнее и у самих претендентов на работу будет хорошее впечатление о месте работы.
А, вообще, вопрос надо по другому ставить "Перепишите этот код с учетом всех правил безопасности".
спасибо за формулировку)

Вы не поверите, что люди выдают!

Из последнего -

$_GET['x'] = $_GET['x']+0;

или

if(intval($_GET['x'])){....

=)
Если убрать кавычки, думаю исполнение запроса накроется 1064-м тазом ;)
Но это, все равно, не правильно. Нельзя доверять GPC ;)
Самый замечательный вариант $x = ((isset($_GET['x']) ? intval($_GET['x']) : 0);
Пропустил одну скобку )..
ммм... а что не так? Условиям задачи удовлетворяет.
хех, попытался выпендриться, а в результате сел в лужу
Сел в лужу - это когда НЛО прилетает или комментарий раскрывать приходится.
Я не выпендривался - просто задачи кажутся мне глупыми и я это могу вполне логично обосновать. Они слишком простые для поиска профессионалов.

А насчет минусов - меня система жизни на Хабре забавляет. Верхний минус поставил Вам я и что теперь, вы в луже? :-)
Программеры разного уровня бывают и соответственно тесты разные. Приведенный пример мне кажется для начинающего.
В Молдове такой и 50% не пройдут :(
Вы бы еще Кению или Мозамбик вспомнили :)
Я против теста на собеседовании. На мой взгляд, это не эффективный метод. Во время интервью у человека и так возникает стресс, так еще и нужно вспоминать то, что я всегда смотрю в мане, а помнить просто не считаю необходимым.

Когда мы принимали программиста на работу сперва рассматривалось резюме. Часть желающих отпадала на этом этапе. (рассматривали опыт работы, а не образование)

Если человек проходил по резюме, ему предоставлялось простое практическое задание и срок 1 день.

Задание:
1. Написать простую ленту новостей без админки и комментов. Просто вывод данных из таблички :)
2. Написать систему голосования с пресечением накрутки по IP
3. Написать валидатор формы по озвученным условиям (например, проверка на валидность е-маил и т.п)
4. Написать рандомизатор, который выводит из каталога с картинками рандомную картинку :))

Задания простые, так что оценивалось
1. Оформление кода - как желание работать хорошо
2. Оптимизация при решении тривиальных задач - как умение строить простые алгоритмы без нагромождения

А после оценки уже проводили личное собеседование, скорее психологическое. То есть никаких вопросов по PHP конкретно. А вопросы вроде желания работать, личных качеств, поведения в коллективе и тд
Пара - тройка претендентов и сайт готов.
Одно из самых адекватных заданий. Хотя это можно написать часа за 2-3 более менее разбирающемуся человеку.
Ну я думаю оно так и пишется. Просто время на это выделяется например вечером после работы.
НЛО прилетело и опубликовало эту надпись здесь
Мое мнение давать задачи на дом не самый хороший вариант. Когда человек решает задачу прямо на собеседовании:
1. Можно посмотреть как человек рассуждает
2. Нет соблазна дать задачу, больше чем на 10-15 минут и 20 строк кода
3. Можно оценить скорость выполнения задачи
Ну и чисто субъективно, я бы не стал решать задачу дома. Я пришел на собеседование, потратил время, силы, нервы, а работодатель не сумел хорошо подготовиться к собеседованию, чтобы проверить мои знания, и фактически предлагает мне на него по-работать дома.
Позволю себе не согласиться. Человек придя на собеедование (особенно если мы берем новичка) - нервничает. Т.е. мы или видим % 60-80 от реального кпд которое он покажет при работе или человек пытается показать то, чего он незнает. Т.е существует реальный шанс упустить хорошего но "тихого" специалиста или напротив, взять того кто не "шарит". Давая задания на дом - человек сидит в привычной обстановке, и делает это так, как он это привык. Как следствие - человек решает поставленную тобой задачу любыми доступными ему средствами. =>Мы видим реальное качество человека. Тут уже можно смотреть на качестов оформления кода, на его читабельность и т.д. Плюс на выдор работодателя можно давать не примитив, а если например вам нужна "Супер-звезда" - вопросы с подковыркой.
В случае, если мы ищем новичка на вырост и нам важнее оценить потенциал, чем реальный опыт, которого мало или совсем нет - согласен. Тут не нужно оценивать знания и опыт, их нет. Можно давать задачи в стиле "вывести ленту новостей", где больше кода, чем алгоритма. Задача на дом дополнительная возможность проявить себя для кандидата и дает "предмет разговора" на втором туре.
А если нужна "супер-звезда" - опытный, сообразительный сотрудник, то собеседование в разы интенсивнее, и время на решение "подковыристых" задач уже лимитировано. Тут уже варианты "расслабиться и посмотреть алгоритм в справочнике, по-гуглить" не прокатывают, если человек не готов решить несколько задач (минимум кода, максимум идеи) в течении часа - он не "супер-звезда". И фактор "обиды" для "супер-звезды" уже значительно сильнее.
Например, я проводя собеседование часто прошу написать программу переворота строки (на php). Решить такую задачу дома - элементарно. Но с человеком, который даже идеи решения не может предложить (а таких >80%, и это на позицию опытного разработчика) продолжать собеседование - трата времени.
Под фактором "обиды" я подразумевал "делать работу, которая не оплачена"
Задачи не слишком сложные. Сталкивался с подобной ситуацией при поиске верстальщика. Круг из 10 вопросов в стиле «Зачем нужен тэг такой-то, как он выводится браузерами?» (ну и иногда уточняющая специфика) успешно прошло от силы человека три. Еще от отчаяния ввел «золотые вопросы» чуть более сложного порядка: ответит человек вразумительно — беру, несмотря ни на что. Остальному всё равно научу. Так что вы думаете — даже будучи предупреждены о шансах таких вопросов, люди в ответ на них мямлили совсем что-то уж бессмысленное.

Болезнь отрасли. Народ просто валит в надежде «нахаляву», не ворочая мешков, срубить большого бабла. Ценных кадров так просто не приманишь, да и цену сами себе они знают и денег тоже хотят очень немало — чуть продешевишь, и до свидания, даже на собеседование не придет.
Да, простите
можно делать отличные сайты не зная об ===
и наоборот.
весьма спорное заявление
не зная основ синтаксиса - вообще сложно делать хоть что-то ;)
Неоднократно подтверждено практикой (особенно вторая часть :) )
Я знал что значит "===" с самого начала изучения PHP но за несколько лет, мне это ни разу не пригодилось... Хотя это уже другой вопрос)
в html, css и даже в javascript оператора === нет.
А с помощью них можно сделать отличный сайт :)
вы пробовали читать топик?
разговор, вообще-то, о пхп...
иии? Нельзя делать хорошие сайты без пхп?
позволю вам напомнить, что разговариваем мы о знании оператора применительно в пхп
http://www.devguru.com/Technologies/ecmaScript/quickref/comparison_operators.html
черт. с js перегнул палку. но ничего - без js тоже можно хороший сайт сделать.
с одной стороны, это очень простые тесты, и если вы ищете php-кодеров - ваш косяк тогда в том, что тратите время на собеседоание людей, которые не в состоянии на эти вопросы ответить.
с другой стороны, если вам нужны не кодеры а девелоперы - ничего шибко мудреного в синтаксисе php нет, и такими вопросами можно отпугнуть хороших программистов, специализирующихся, скажем, на perl или python (притом что изучение php для них займет от силы месяц). тут я бы только вопрос №4 оставил
ИМХО. Тестировать нужно как работает у человека мозг, а не как он знает конкретный язык. Если у человека есть мозг, то он разберется с любым языком и протоколом. А если мозга нет, то даже знание как отдать заголовок 404 - не поможет. Советую давать задания на теорию алгоритмов - решение конкретной задачи, возможно с условием - наименьший расход памяти или наилучшее быстродействие.

ps. Это конечно, если вам нужен именно программист, а не скриптописатель-кулхацкер.
Теперь я поддерживаю Вас. Гораздо большую ценность представляет человек, который может придумать реализуемую логику, а не тот, кто потом по расписанному до пункта ТЗ будет писать код.
Поэтому есть понятие "программист", а есть понятие "кодер") Вспомнить тех же индусов)
Про "кодеров" нужно знать только один факт: их на фирме не нужно. Ни одного. Лучше заплатите вдвое больше но возьмите программиста и дайте ему месяц на то чтобы выучить язык.
Если не нанимать уборщиц, то полы будут мыть менеджеры по работе с клиентами?
Ну если у вас бизнес заключается в мытье полов... возможно.
Вы, наверное, не представляете себе что такое на самом деле большие нагрузки;)
Кодеры, конечно, не нужны, если фирма занимается просто изготовлением сайтов - не больше трёх в месяц, к примеру.
Я считаю, на вакансию php-программиста должен приниматься человек, который реально в жизни изучал и работал только с php и достиг в нем реального уровня. Тогда с самого начала он понял как должен выглядеть php код, что бы быть читаемым, как правильно формировать и оптимизировать SQL-запросы и как правильно фильтровать данные, что бы не только нельзя было сделать SQL-инъекцию, но и защититься от XSS. Что бы такой человек знал что многоуровневый if () работает медленнее switch (). А самое главное, что бы он не считал, что если он писал программы на C, то какой-то там PHP это сущий пустяк, который можно освоить за пару вечеров. Ибо из-за таких и реализуются SQL-инъекции и XSS атаки.
Еще мне кажется, что нужно давать небольшое, но разносторонне тестовое задание, а потом смотреть код и давать оценку данному программисту.
И какое же задание давать?+)
надо придумывать такое задание, что бы можно было оценить знание программиста, в каждой области языка: в стиле написания, знание SQL, знание в сфере безопасности веб-приложений, умение находить оптимальное решение задачи и тд.
Мы в свое время искали программиста, я дал ему такое задание:

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

Вот тут и рекурсии и sql и верстка. Я задание на дом давал. А потом по коду сразу все видно. Не прошел у нас никто такой тест пока я там работал :)
А что, SQL инъекции и XSS атаки возможны только в PHP?
PHP - это такой специальный язык где из каждого оператора норовит выскочить XSS или SQL-injection.

Просто по большому счёту не годится PHP для написания серъёзных задач - но если у вас уже куча кода на PHP, то что вам остаётся делать ?
Скорее - "если в мире уже куча кода и программистов именно на PHP - то что остается делать?" :)
НЛО прилетело и опубликовало эту надпись здесь
Я когда-то давно устраивался программистом на php, не имея никакого опыта в нем, только c++. И ничего, разобрался через пару недель. Проработал там года 3. Правда то был 4-й php.
нет. SQL инъекции от лени и не знания, а никак не от знания C.
а если надо баг в php исправить? или модуль написать?
Довольно забавный тест. Я не новичок в РНР, но сходу есть моменты на которые я бы не ответил, т.к. они просто на автомате пишутся и я уже не думаю, что могло быть по другому... Мне кажется, что реально лучше просить показать код или выполнить тестовое задание, т.к. этим ты минимум сможешь решить ряд вопросов:
1. Скорость написания
2. Качество кода (стилистика + алгоритмизация)
3. ... ну и наверное получить ответы на выше преведённые задачи :)
А может, тестовое задание формулировать: «напишите код, который сделает...», а не так?
И пишут пусть на бумажке прямо при вас, можно будет многое о кандидате понять.
я написал на PHP не мало кода и реализовал не один проект, но если вы скажете мне написать код на бумажке я могу просто не вспомнить как правильно пишется некоторые специфичные функции. Объяснение этому простое - я использую среду разработки Zend Studio, которая за меня знает все функции языка:)
Человек должен сначала все обдумать и взвесить, а потом писать код. А когда вы скажите пиши код и будете стоять над душой, врятле получится адекватная оценка
Тут не в том дело.
Вы формулируете задачу и следите за ходом мысли конкурсанта. За рассуждениями.
То есть даже и код может быть не правильным, главное-то всё равно пресловутый «программистский склад ума» :)
да, с этим я не спорю. Склад ума играет важную роль, но плюс к уму должны прилагаться отличные знания языка + плюс умение оптимально использовать эти знания и большой опыт разработки именно на данном языке программирования.
Задачек мало. Я считаю должно быть минимум 10. И хотя бы одна с рекурсией.
Я программирую на php с 2002 года, практически каждый день решаю те или иные задачи. Но меня бы вы на работу не приняли — я не смог решить ни одной задачи. Имею в виду, что не смог решить, имея в руках лист бумаги и ручку, как на экзамене по математике в институте. Скорее всего, автору будет интересен мой случай, и ему решать — брать на работу такого "кодера" или нет. Я могу запросто решить все эти задачи, сидя перед моим компьютером в спокойном состоянии, без стресса. Когда рядом есть документация по php, несколько моих любимых книг. Разумеется, я назубок знаю, что нельзя писать код типа $query = "SELECT anons,text FROM news WHERE id='".$_GET['x']."'"; Но самостоятельно написать инъекцию на листе бумаги я не смогу. Задачу номер три я вообще не понял, даже с документацией. Спасибо автору за пищу для размышлений.
Значит плохо решаешь... Извини, но это действительно очень легкие задачи для более-менее нормального программиста на PHP. Первая задача - как сравниваются значения разных типов, вторая - как работают некоторые настройки PHP, 3-я - тест на ООП, 4-я - вообще, ИМХО, на логику - как получить все значения из таблицы? - сделать условие WHERE равным true. обычная логика: * | true == true. Значит запихиваем в $x "1' OR '1".
Я бы даже сказал, что они все на логику=)
Первые три задачи - из разряда "как не нужно делать". Решение у них простое: найти человека, который такое положил в VCS и уволить. Всё. Что выдаёт PHP в этом случае - дело 10е: такого кода в проекте просто быть не должно.

1. Не нужно сравнивать значения разных типов в грамотно написанной программе. Просто не нужно.
2. Не нужно использовать register_globals('on'). Просто не нужно.
3. Не нужно устраивать коллизии имён и потом с ними разбираться - нужно их устранять.

Четвёртая задачка - единственная разумная...
1. Нужно. Даже в C++ бывает сравнивается float и double и даже float и int. В PHP так тем более - есть функции которые возвращают int в общем случае и false в особом случае. С каким типом результат сравнивать нужно? :) Причем это стандартные функции PHP. Галимый ячзы, вообще. :) Python лучше.
2. Бред :) PHP программисть должен знать, что это такое и как оно работает. Хотя бы для того, чтобы этого избегать. ;)
3. Это где написано? :) Я-то в принципе согласен. Но такого ни в каких книгах по ООП написано не будет.
1. Наличие чего-то в стандартной библиотеке вовсе не значит что это что-то нужно использовать. Вон в стандартной библиотеке C есть getwd(3) - это же не значит что её нужно использовать ?
2. Давайте теперь ещё потребуем от программиста на C++ умения управлять памятью в конструкторе (a-la CFront 1.0). По безопасности и полезности в реальной работе - это сравнимые умения.
3. Если у человека не всё в порядка со зравым смыслом - то ему никакая книга про ООП не поможет...

Умение работать с взрывоопасными конструкциями и умение их избегать - разные умения. На практике - полезнее второе. Конечно если у вас код не испещрён подобным ужасом - но в этом случае вас никакие, даже самые гениальные программисты не спасут...
1. Это к тому, что использовать приходится. А раз приходиться - нужно знать, как.
2. А причем тут вообще..? Язык создан. Программист должен знать его таким какой он есть.
3. Как ни странно, но такие случаи (коллизии имен переменных) вполне встречаются. Особенно в том случае, который был приведен раньше. Про private переменную наследник вообще ничего не знает - её для него нет. Так что в новом классе я вполне могу использовать переменную с таким же именем.

А что, разве для того, чтобы избегать, не нужно иметь представление об этой конструкции? Она же вполне может быть взрывоопасна, а я могу об этом не знать.
Чтобы пройти правильной дорогой, необязательно знать все неправильные.
Впрочем готов признать что половина от первого вопроса (про 'c' и 'd') таки нужны для любого PHP-программиста... В безтиповых языках без аналога === иногда бывает тяжко...
"безтиповых"
Очень некорректный термин. Есть типы, есть. :) Типизация нестрогая просто.
задачки решаются, если не думать о самом коде, прямо в процессе чтения статьи. увидел код, спросил себя - и ответ готов.
Ну это хотя бы честно =)
Вот хорошая цитата из Джоэля
"Вот вам, смеха ради, отвратительный вопрос для интервью: «В чем разница между varchar и varchar2 в Oracle 8i?» Задавать такой вопрос совершенно бессмысленно: между людьми, знающими эту бесполезную мелочь, и людьми, действительно нужными нашей компании, нет ни малейшей корреляции. Кого волнует, в чем эта разница? Ответ ищется в Интернете за 15 секунд!"
Не совсем понятно, кто, собственно, нужен: бот-писатель скриптов или человек, способный создавать серьёзные проекты. Глядя на задачи, думается, что предмет поиска - бот.
Хорошее адекватное задание на знание языка. Вот есть только одна проблема - знание языка не дает права называться программистом. Необходимо уметь грамонтно составить алгоритм, написать код, решать возникающие проблемы, разбираться в паттернах, чтобы не изобретать велосипед.

P.S.: А задачи эти решаются за 3 с полвиной минуты, из которых полторы уходят на то, чтобы въехать "а че же от нас хотят?" :)
Со всем кроме первого предложения согласен. :)
Вообще, ИМХО, собеседование должно состоять из двух частей - устной и письменной. В письменной должны быть разнообразные задачи по алгоритмам и проектированию (если такое понадобиться в работе). Причем отвечать на них нужно именно на том языке, на который тебя на работу берут. Убиваем двух зайцев - оцениваем качество алгоритмов и владение (более-менее) языком. В устной части - обычная беседа про ООП, паттерны, обсуждение самого языка.

Только после такого собеседования можно (совсем чуть-чуть) судить об уровне программиста.
Вот как всегда — написал правду и получил минус. Надо было сказать, что круто, парень! Тест легкий, делай сложнее, это даже первоклассник решит. Бейте, други, за правду не обидно
Не боись, ты не один такой :) Это демократия в действии. Мой текущий результат -4 за то же, за что и +18 другому коллеге. Пойду его плюсану до кучи :)
Задачи для новичков. Совсем для новичков я бы сказал.
4я задача имеет право на существование, но опять же:
1. уже давно существует PDO
2. помоему лучше спросить, что в коде неправильно, почему и чем это грозит..

Любой нормальный разработчик решит их в 3 часа ночи, разбуженный после недельной пьянки..
И вообще решение задач такого класса способно ответить только на один вопрос: человек вообще хоть что-нибудь знает или нет?
Нормальный разработчик, разбуженный в 3 ночи после недельной пьянки ради каких-то задачек, даст в морду и пойдёт дальше спать :)))
'register_globals' — ужас какой!!! Я бы вторую задачку не решил, хотя программирован на PHP около полу года.

Вообще, вопрос в том, кого вы ищете, программиста или кодировальщика. Второй вопрос точно для кодировальщика энциклопедиста.

Посдений вопрос действительно хороший. Особенно интересно поговорить про PDO и про то как же там указание типов при биндинге параметров работает и можно ли ему доверять :)

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

Мне кстати очень нравится вопрос: скажите, а что Вам нравится и не нравится в языке (решении и т.п.), которым Вы пользуетесь.
После этого ответа очень многое понятно и про знания и про уровень человека.
Есть идея для собеседующего:
Во избежание большого числа народа, который нифига не умеет, ввести каптчу до собеседования. Суть идеи элементарна. Ставим на дверь кодовый замок, и рядом бумажку: несложный код на php, который что-то должен вывести (естесственно, с несложными заморочками по синтаксису). Если у человека голова на плечах есть, то он введет код правильно и попадет на второй этап собеседования, если нет - вы не будете тратить время на такого программиста и выяснение его навыков синтаксиса и прочей элементарщины. Кстати, это сложит мнение о вашей компании у людей, как о компании, которая любит нетривиальные задачи, а работа требует изобретательности и интересна.
Тут как посмотреть. Можно прорваться на второй этап собеседования при помощи простого лома. Я бы такого сразу же взял :)
Вах, зачэм лом? Всего-то ноутбук с собой взять. ;)
>Кстати, это сложит мнение о вашей компании у людей, как о компании, которая любит нетривиальные задачи, а работа требует изобретательности и интересна.

А у смекалистых парней-любителей злых шуток, желание написать такую инъекцию к этой капче, чтобы дверь заглохла и отрезала выход всем внутри. :)
Фигня это все, по этой теме как-то Алексей Рыбак прожег очень жоско (никак не могу найти, может кто помнит?)
Ну, это где про горы...
Я, со своим пятилетныим опытом программирования на пхп и текущей должностью "ведущий разработчик веб систем и сайтов", допустил-таки одну ошибочку в ваших тестах...
Позвольте поинтересоваться - какую?+)
Поддерживаю мнение тех кто говорит о допустимости манов. Из десяти задач на собеседовании таких должно быть не больше трех, имхо.
По теме - я давал такое задание: написать функцию print_row(n), которая например для n=15 выведет следующий ряд (вместе с цифрами) -
1
2*
3+
4*
5
6+*
7
8*
9+
10*
11
12+*
13
14+
15*

уж очень она мне почему-то понравилась :)
function print_row($n){
for($i=1;$i<=$n;$i++){
echo $i;
if(!($i%2)) echo '*';
if(!($i%3)) echo '+';
echo "\n";
}
}
если 14+ и 15* просто опечатка.
угу, опечатка :) извиняюсь.
А код, конечно, тот, который хотелось бы видеть от всех и с первого раза.
Алгоритм, конечно, правильный. Но с точки зрения кода...
По-моему ничего хорошего в функции делающей много echo нет. Лучше писать (и требовать писать) нечто возвращающее строки, а не выводяшее их. С таким тестом вы возьмете на работу "спагетти-стайл" пэхапэшника. Ну или даете понять, что вы занимаетесь спагетти-кодингом.
В том то и дело, что меня не интересует конкретно знание php. Я взываю к логике и наблюдательности :) Считаю, что человека с мозгами и желанием можно за месяц подтянуть до того уровня, когда он будет способен делать нужные вещи и от него появиться реальная польза для команды :)
Поэтому и давал возможность писать не обязательно на php, а на любом другом языке.
НЛО прилетело и опубликовало эту надпись здесь
точнее сказать определять кратность числа 2-м и 3-м.
1.upto(15){|i| puts %(#{i}#{'+' if (i%3).zero?}#{'*' if (i%2).zero?}) }
:) я предлагал соискателям написать функцию на любом доступном языке, но этот похоже мне неизвестен )
если память не изменила, то это ruby
PS: Вы проводите тестирования? ;)
ruby... красиво ) Но я бы отдал предпочтение варианту ув. twi .
Про тестирование - общаюсь с теми, кого приглашаем к себе в команду (стартапчик ;) )
у Вас есть стартапчик? ;)
а что Вас так удивляет? ;)
нет, ничего личного, просто спортивный интерес
ну если спортивный, то просто есть дело, на которое убиваешь все свое время, которое нравиться, в которое веришь и которое уже приносит немного прибыли. Эх. Если бы можно было не спать ))). Хотя это я уже переборщил )
Да тут просто код без функции. Я когда запостил только вспомнил, что функция нужна :). с функцией было бы def print_row(n) код end
print$_.($_%3?"":"+").($_%2?"":"*")."\n"for 1..15
function print_row($n){ for($i=1;$i<=$n;$i++) echo $i.(($i%2)?'':'*').(($i%3)?'':'+')."\n"; }
иногда мне кажется, что основной целью создания ruby было создать язык с максимально отличным от php синтаксисом (:
да можно еще чуток короче
function print_row($n){ for($i=1;$i<=$n;$i++) echo $i.($i%2?'':'*').($i%3?'':'+')."\n"; }
перловых дел мастеру респект. :)
Мне кажется, тест должен выявлять всестороннее развитие человека. Простейшие вопросы (один-два), на знание основ php, потом вопрос на знание особенностей (например, вопрос на глобал/статик и небольшой подводный камень со ссылками в этой области), потом ООП - вопросы на понимание принципров - инкапсуляция, наследование, полиморфизм -понимание на уровне "зачем это нужно и когда", а не "что это такое".
Вопрос на чтение небольшого фрагмента чужого кода, возможно, найти ошибку в нем, либо переделать кусок так, как должен выглядеть идеальный код (назвать нормально переменные, добавить комментарии, раскрыть цикл, может быть что-то еще).
Вопросы понимания процесса разработки ПО, чем отличается проектирование и конструирование. Общее понимание принципов хорошего программирования (см. Совершенный код).
Умение писать код, спосоный работать в highload.
SQL, вообще и применительно к паре-другой БД (например мускул и постгре).
Администрирование, апач, нджинкс, мемкешд, тонкая настройка под разные задачи. Понимание принципов работы.
HTML. Умение верстать хотя бы легкие вещи. Понимание стандартов. Знание возможностей разных браузеров, и, что еще важнее, их недостатков.
Умение находить информацию по проблеме, читать документацию. Гуглить эффективно :)
JavaScript, AJAX. Знание особенностей построения пользовательских интерфейсов, основ юзабилити.
Прочитал, вспомнился анекдот.
===================

Если бы при приеме на работу к водителям относились так же, как к
программистам:
—
Вакансия: водитель.
Требования: профессиональные навыки управлении легковыми и грузовыми
автомобилями, троллейбусами, трамваями, поездами метрополитена и
фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном
ходу, боевыми машинами пехоты и современными легкими/средними танками,
находящимися на вооружении стран СНГ и НАТО. Навыки раллийского и
экстремального вождения - обязательны, опыт управления болидами F1 -
приветствуется. Знания и опыт ремонта поршневых и роторных двигателей,
автоматических и ручных трансмиссий, систем зажигания, бортовых
компьютеров, антиблокировочных систем, навигационных систем (GPS) и
автомобильных аудиосистем ведущих производителей - обязательны. Опыт
проведения кузовных и окрасочных работ приветствуется. Претенденты
должны иметь сертификаты Mercedes, BMW, General Motors, а также справки
об участии в крупных международных ралли не более чем двухлетней
давности. Зарплата 1500-2500 руб., определяется по результатам
собеседования.

ЗЫ: А кто-нибудь может сказать, почему то, что положительно воспринимают коллеги, часто минусуют на хабре (например посты в блоги и комментарии)? Или тут так принято :)
Все комменты не читала, так что если что простите.
Задачки просмотрела... Мое личное мнение - в них нет смысла при проверке кандидата на собеседовании.
Был опыт принятия на работу парочки людей. В том числе и программера. Дальше высакжу мои личные соображения по этому поводу.
1. Вы должны определиться какого уровня вам нужен кандидат.
2. Определиться что именно Вам нужно, чтобы он знал - регулярки, ООП на высоком уровне, паттерны проектирования, может базовые знания Юникс-подобных систем и т.п. Уже по этому списку далее составляете по несколько вопросиков общего характера - может какие-то определения (причем я предпочитаю метод "объясни своими словами", т.е. видно же когда человек понимает что он говорит, даже если не совсем правильно - может он волнуется, а может он скорее практик, чем теоретик).
3. Почему я считаю, что в Ваших задачах нет смысла? Да потому что они мелочные. Вы должны проверить не текущие знания кандидата, а его способность к обучению.
Здесь нужно узнать умеет ли он пользоваться манами, документацией, как он вообще узнает ответы на свои вопросы (спрашивает у кого-то или ищет сначала ответ на вопрос сам, второе предпочтительнее). Конечно, здесь в большей степени можно полагаться на правдивость кандидата =)
Можно дать ему какую-то общую задачу и спросить каким путем он будет ее решать. Если Вас интересуют паттерны, можете спросить какие паттерны он бы использовал.
4. Составьте пару реальных, но несложных задач. Но не за листик его посадите, а за комп. Заодно и посмотрите как он ищет ответы на вопросы. Пусть пользуется Гуглом, справкой - чем хочет. Так вы только увидите его способность найти ответ. А Вам нужно именно это, а не то, насколько он досконально помнит каждый пункт теории.

Я, если честно, на эти ваши задачки 100% ответа и не дам, хотя программлю на пхп уже года 3. Почему? Да потому что я такими вопросами никогда не задавалась. Если мне нужно будет, я этот вопрос найду за минуту - потому что знаю где искать.
Ведь главная суть учебы состоит в том, чтоб научиться учиться =)

Буду рада в общем-то услышать возражения на мой пост. Может чему умному научусь.
Будет не возражение, а дополнение. Задачки 1-3 у любого нормального программиста на любом нормальном языке вызовут отвращение и желание такой код выбросить, а написавшего его программиста уволить. Задачка 4 - единственная сколько-нибудь разумная, да и то - придирки. Возможно у программистов на PHP особый склад ума и им доставляет удовольствие писать и читать грязный код, но работать в контору где такое попадает в VCS, а не то что на боевые сервера я бы просто не пошёл.
Сразу возникает вопрос, а что вы понимаете под "идеальными условиями сервера?"
И еще, на сколько я знаю не корректно менять register_globals во время работы скрипта, переменные уже будут объявлены (или не объявлены) и директива ничего не даст.

То же про третий вопрос - по PHP4

Зачем кандидату знать как писать неправильно? На старых ЯП (пхп4 с января, вроде, не поддерживается официально).
Первая и последняя задачи - вполне подходят.
Вы ищете гуру с большим стажем? Или обучаемых сотрудников?
Посмотрел на комментарии. Похоже народ про ООП задачку не решил или решил не верно:
>Для какой версии PHP будет работать этот скрипт?
Правильный ответ: Ни для какой, в любой версии работать не будет
>Что выведет этот скрипт?
Правильный ответ: Ошибку.

Вы такой ответ ожидаете, что ли?
НЛО прилетело и опубликовало эту надпись здесь
Возможно, вам будет интересно узнать, что всё, что должно выводиться до выброса Fatal Error все-таки выводится. А после - не выводится.

Возможно, вы перечитаете вопрос ещё раз и вникнете в его суть.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь