Найти хорошего программиста — большая проблема. Кто не соответствует квалификации, кто затягивает сроки, кто просто пишет плохой код. Многие банальные вещи пропускаются рекрутерами даже в крупных компаниях. А уж если вы проводите собеседование без разработчика-эксперта в нужной дисциплине, или если у вас маленький стартап, и вы пытаетесь нанять одного из первых подходящих сотрудников, всё становится ещё сложнее. Подобрать достойного и опытного специалиста без широких знаний в индустрии — задача нетривиальная.

Мы в Rubrain.com занимаемся поиском программистов уже пять лет занимаемся поиском программистов, и отобрали в базу более шести тысяч (!) сотрудников уровня middle+. Большинство из них на практике оказались отличными профессионалами. Хотя с некоторыми, конечно, первое впечатление было ошибочным. Но здесь как в отношениях: иногда нужно пожить вместе, чтобы понять, чем именно тебя могут бесить. Даже самый крутой профессионал может попасть в чёрную полосу и стать лентяем.

Но для начала, если вы не хотите обучать разработчика с нуля, нужно смотреть на кандидатов с хотя бы 2-3 годами опыта (лучше, конечно, 5). Чтобы они могли сами создавать новый продукт, брать на себя ответственность, принимать архитектурные решения. В идеале сотрудник, которого вы вызываете на первое собеседование, уже поработал в крупных фирмах, поучаствовал в больших проектах, получил нужно менторство. Если вы нанимаете фрилансера — у него должно быть несколько сайтов в портфолио (достойных или нет — это мы сейчас проверим). Кстати, фрилансеров — горячо рекомендуем, особенно если вы берёте сотрудника на удаленку. Если человек всю жизнь работал на себя, определенное чувство ответственности у него точно есть, и от внезапно нахлынувшего чувства свободы он в запой не уйдет.

Итак, у HR есть резюме программиста. Проекты, над которыми он работал, или кусочки кода. Что теперь?

Оценить качество его работы по коду вы можете, даже не имея навыков программирования. Как это сделать? Существует, как минимум, два способа определить огрехи:

1. С помощью специальных инструментов. Можно прогнать веб-приложения или сайты из портфолио потенциального сотрудника через особые онлайн-сервисы, чтобы получить общую картину его компетенции. Эти сервисы (или утилиты) обнаруживают ошибки, «мусорный» код, излишне сложные комбинации и другие признаки не очень качественного труда разработчика. Они найдут что-то в любом случае — поскольку идеального кода не существует в природе. Другой вопрос, сколько огрехов так удастся обнаружить, и насколько значимыми они будут.

Для PHP хорошо подходит Mess Detector — он как раз находит чересчур сложные методы, потенциальные баги, неиспользованные расширения, не слишком чистый или неоптимальный код и так далее. Также можно применять CodeSniffer, находящий ошибки в синтаксисе или стандартах кодинга. Он подходит не только для PHP, но и для CSS и JavaScript.

Также, отдельно, существуют подобные инструменты для CSS и HTML.

PHP-разработчики
Настройка PHP CodeSniffer

2. Пробежавшись по коду глазами. Даже HR без опыта в разработке вполне может это сделать. Нужно немного подготовиться и изучить стили программирования, но это не так сложно, как кажется. Просто понять, будет ли следующим людям удобно работать с кодом этого разработчика. Правильно ли он расставляет фигурные скобки, обрамляет ли он пробелами бинарных операторов, добавляет ли он комментарии, описывающие информацию о его коде.

Вкратце о том, как всё должно выглядеть, можно почитать тут, а намного подробнее — тут. Если код человека, написанный для коммерческого проекта, не содержит таких элементарных вещей, говорить с ним особенно не о чем: поддерживать проекты, созданные этим разработчиком, станет слишком сложно. Хороший пример того, как определить уровень профессионализма разработчика, приводит компания Edison. Даже по небольшому кусочку кода можно отличить junior от senior и от миддла.

О том, что вы нашли хорошего кандидата, также может говорить:

  • Сосредоточенность на вопросах безопасности. Ваш бэкенд — ваше всё. Отличный разработчик не только решает поставленную перед ним задачу, но и, параллельно, защищает продукт от потенциальных опасностей. Он должен знать об SQL-инъекциях, XSS-атаках, перехвате сессий, CSRF и так далее. Поговорите с ним на эти темы, и всё станет понятно.
  • Применение фреймворков. От них отказываются только совсем «зазвездившиеся», ведь их использование повышает чистоту кода и позволяет закончить задачу намного быстрее.
  • Использование готовых решений. Опять же, в этом нет ничего зазорного, наоборот: это экономит время, а их качественная адаптация под ваш проект может оказаться удачнее, чем написание нового кода. Если вы ищете программиста в команду стартапа, это тем более пригодится.
  • Постоянное обучение. Бэкенд-разработка постоянно развивается. Появляются новые технологии, PHP1 меняется на PHP 7.0. Кандидат, который ещё несколько лет назад был на вершине технологий, теперь может оказаться на свалке истории. Если человек читает профильные сайты, посещает Habr, изучает новые фреймворки — это ему большой бонус. Консервативный веб-разработчик, живущий только технологиями пяти лет назад — не ваш кандидат (даже если вы сейчас работаете на них).

Вопросы, которые стоит задать

Задачки разного уровня сложности, позволяющие быстро отделить зёрна от плевел. Или, по крайней мере, понять, насколько «плывёт» кандидат. Часть из них подходит даже для интервью специалистов уровня middle+. А познаний в языке рекрутеру иметь не обязательно.

    1. Расскажите о внутреннем устройстве массивов в PHP?

Работа с массивами — огромная часть PHP. Поэтому программист для стартапа должен понимать, как они представлены изнутри (в виде хэш-таблиц, как и большинство других структур данных). PHP написан на языке C, где массивы имеют только целочисленные индексы. Чтобы транслировать индексы массивов из PHP в целочисленные индексы массивов C используется хэш-функция. Она преобразует индексы (и строковые, и целочисленные) в целые числа. Значения располагаются в итоговой хеш-таблице.

    1. Какие бывают модели (подходы, парадигмы) разработки кроме ООП?

Наиболее часто встречаются такие модели как аспектно-ориентированная, функциональная и процeдурная.

    1. Что такое паттерны (шаблоны) проектирования?

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

PHP-разработчики

    1. Какие магические методы вы знаете? Что это вообще такое?

Магические методы — методы в PHP, начинающиеся с двойного подчеркивания «__». Всего их тринадцать, в том числе __construct, __destruct, __isset, __set, __unset, __clone, __sleep, __wakeup, __call, __callStatic, __get, __toString, __set_state.

    1. Назовите как минимум пять суперглобальных переменных, названия которых начинаются с $_. Дайте им определение. Расскажите об их связи с переменной $GLOBALS.

Человек, вступающий в вашу команду веб-разработчиков, должен понимать, что в массиве суперглобальной переменной $GLOBALS хранится информация, доступная в глобальной области видимости. В том числе и другие суперглобальные массивы. К примеру, доступ к $_ENV можно путём: $GLOBALS[‘_ENV’];

В плане других суперглобальных переменных кандидат может рассказать о:

  • $_GET — массиве, хранящем пары из ключа и значения, которые отправлялись на сервер методом get.
  • $_POST — массив, хранящий пары, отправленные методом post.
  • $_REQUEST — объединяет пары из $_GET и $_POST.
  • $_SESSION — массив, в котором находятся значения переменных сессии между запусками приложения и переходами по страницам.
  • $_COOKIE — дает доступ к переменных, находящихся на клиенте в файлах кукис.
  • $_ENV — хранит значения, связанные с кофигурацией хоста.
  • $_SERVER — выдает данные веб-сервера, относящиеся к выполнению программы.
  • $_FILES — массив входных данных, которые были получены при отправке файлов методом post.
    1. Какой вариант проверки существования данных в массиве наиболее быстрый? Почему?

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

  • $arr = array();
  • if (empty($arr)) {echo «этот массив пуст»;}
  • if (!count($arr)) {echo «этот массив пуст»;}
  • if (isset($arr[0])) {echo «этот массив пуст»}
  • if (!$arr) {echo «этот массив пуст»;}
  • if (!sizeof($arr)) {echo «этот массив пуст»;}

Можно также устроить проверку через if/else, есть и другие варианты. Но не все PHP-программисты смогут сразу ответить, как всё это работает.

empty() — работает намного быстрее, чем count(), в обоих сценариях, как с пустым, так и с заполненным списком. Причина — когда мы считываем длину строки, используя count (или sizeof), программа должна пройти через все символы, чтобы понять, сколько знаков там есть. Она начинает в начале, и идёт до конца. На это тратится время (пусть даже небольшое). В empty же она останавливается после первого знака, когда понимает, что массив не пустой. Проводится простая проверка: является ли начало строки таким же, как и конец строки. Всё остальное работает так же, как и count. А isset — вообще подходит только для индексных массивов.

    1. Даны две функции. Есть ли между ними разница? Какая?

— function f(a,b) { return a+b }

и

— var f = function(a,b) { return a+b }

Разница существует — она состоит в видимости функции. Первый пример, без var, виден везде в текущей области видимости. Даже до самого определения функции. Второй пример, с var, присваивает функцию переменной, поэтому такая функция видна только после её определения.

Если с квалификацией, с качеством кода и с ответами всё неплохо — можно проводить тестовое задание! Опять же, сделать это может даже сам руководитель небольшой компании или HR. Примеров достаточно в интернете. Желательно, чтобы тестовое (для специалиста любого уровня, даже сеньора) могло быть выполнено за довольно короткий промежуток времени, от 15 минут до четырех часов. Так количество кандидатов, прошедших собеседование до конца, можно будет повысить. И затем выбирать уже по личностным качествам и интересу к работе.

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