Оффтоп Dmitry Salnikov
604

Как нанять php программиста в 2018 не потеряв лишнего времени

Так сложилось, что я не часто менял работу и не имел большого опыта прохождения собеседований. Зато у меня был большой опыт проведения технических интервью (здесь и далее синоним собеседования). Статья не претендует на открытие чего-то нового. В феврале с некоторым шумом закрылся стартап, где я работал в качестве тимлида. Я искал работу до середины мая. За это время я прособеседовался в десятках компаний. Это был великолепный экскурс на обратную сторону диалога соискателя и работодателя. Я был удивлен до какой степени банальные вещи пропускаются hr-ами даже в крупных агентствах.

В закладки

Далее рассказ как правильно с точки зрения программиста организовать собеседование.

Базовой ситуацией стоит считать, что у hr есть резюме программиста.
Работодателю необходимо составить и опубликовать (или отправить соискателю) текстовое описание вакансии. Бесполезно сразу звонить и голосом описывать вакансию.

Повторюсь, в этом нет ничего нового. Но пару раз в телефонном звонке сразу после названия фирмы меня звали на собеседование и просили сообщить доступное время.
Из наименования вакансии “старший/ведущий php-разработчик” можно догадаться только о том, что предстоит разрабатывать на php. А если по телефону пытаться рассказывать больше, то ничего из этого не запомниться. Единственное когда стоит сперва звонить - если соискатель сам об этом явно просит. Например выставив желаемый способ связи на известном сайте.

Итак что указывать в вакансии?

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

  • название
  • текстовое описание фирмы и ее деятельности - тут у hr не возникает обычно проблем
  • текстовое описание основного вида деятельности и задачи отдела/должности будущего работника
  • обязательный технический стек - что должен знать соискатель
  • сопутствующий технический стек - с чем еще предстоит работать соискателю
  • условия труда - если вас их постоянно спрашивают, значит можно дополнить
  • тестовое задание

Почему название важно?

Что вы первое прочли в этой статье? Так или иначе, скорее всего дойдя до этого места название вы уже видели. Но я расскажу почему название важно для разработчика.

Во первых подавляющему числу соискателей все равно написано в вакансии “php-разработчик”, “php-developer”, или даже “PHP-инженер-программист”. Не загромождайте название синонимами. Добавьте что-то важное для вас. Или что-то важное для соискателя. Самый простой способ дать более точное название вакансии, это уточнить с чем придется работать (часть обязательного стека). Например укажите базу данных или фреймворк: “php+mysql developer”, “php (symfony) developer”. Среди моих знакомых много тех, кто ориентируется на основную используемую базу данных и фреймворк.

И особенно много тех кто избегает использования всем известного отечественного “фреймворка”

Что делать-то предстоит?

Складывается ощущение, что hr надеются скрыть проблемы будущей должности и не пишут эту часть. В результате основные задачи выясняются уже на очном собеседовании. На что здесь обращает внимание программист. В основном тут ожидаются следующие фразы “code review”, “легаси код” (обычно даже так: “умение разбираться в чужом коде”), “трекер задач”, “управление командой”, “планирование сроков и ресурсов”.

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

Если проблемы продукта это как раз задача разработчика, то командное взаимодействие уже не такой однозначный вопрос. Здесь стоит обозначить все те аспекты с которыми придется работать в любом случае. Например:

  • Работа с фрилансерами и/или фирмой подрядчиком - мне достаточно часто встречались такого рода вакансии. Обычно есть уже некая собранная удаленная команда, над которой ставится штатный сотрудник.
  • Ограничение службы безопасности. Может в офисе работодателя действует особый пропускной режим, а на машинах стоит только windows и все сотрудники лишены административных прав.

Используемый стек технологий

Есть старый анекдот “Если бы водителей нанимали как программистов”. Современные реалии все же несколько приятнее. В большинстве вакансий есть разделение требований на 2 списка (обязательный и дополнительный). Проблема в том что заголовок дополнительного списка “Будет плюсом знание:” мало информативен. У соискателя возникает ряд вопросов:

  • Если я что-то знаю из этого списка меня с большей вероятностью возьмут или больше зарплату дадут?
  • Это используемый стек? Или планируемый? Или наоборот это стек предыдущего решения, которое нужно переписать?
  • А не технологический ли зоопарк тут?

Обозначайте применимость дополнительного списка.

Пишите только реально используемые версии софта (включая минорную). “PHP 7.1” - гораздо более информативная запись нежели “PHP 5-7”.

Тестовое задание, тест в браузере, или просто вопросы по телефону.

Аккуратно отсеивание не квалифицированных кадры с помощью дистанционной проверки знаний - возможно самый эффективный способ экономии времени на очных собеседованиях.

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

Так или иначе задание должно выполняться за достаточно короткий промежуток времени (от 15 минут до 4х часов). Если вы до очного собеседования берете на себя обязательства по проверке решения задания, вы формируете ожидание у соискателя, что он получит результат проверки. Сказать “нет, не правильно” уже будет недостаточно.

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

Звонки и почта как способ избежать собеседования.

Еще выступая на стороне работодателя, я обратил внимание, что все больше соискателей предлагают первую встречу провести в видео чате. А в начале своих поисков работы я не сразу догадался до такого же приема. Переломным моментом стал визит на очное собеседование в известное технологическое представительство одного банка на вакансию “web-разработчик”. Где по просьбе собеседующих я рассказал немного о себе, а после услышал вопрос: “А как у вас с js?”

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

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

  • На сколько пунктов по тесту Джоэла оценивает себя команда? https://habr.com/company/jugru/blog/159689/
  • Какой текущий/планируемый состав команды разработки (технические специалисты)?
  • Команда расширяется или ищется замена ушедшему сотруднику? (Что случилось с занимавшим эту должность сотрудником? / В связи с чем расширение штата?)
  • Используется ли база данных? Пишутся ли миграции? Кто и как проверяет миграции базы данных перед релизом?
  • Как настроен ci/cd? Если никак, готовы и потратить месяц на настройку?
  • Кто и как ставит задачи?
  • На какой машине придется работать?
  • Есть ли что-то еще о чем я не спросил, но мне стоит это знать?

К этим и прочим вопросам нужно быть готовым еще при первом звонке/письме.

Ожидаемо что вопросы есть и к соискателю. Стоит задавать вопросы так чтобы соискатель мог наиболее коротко и однозначно на них ответить. На самом деле первый диалог с соискателем HR должен воспринимать как способ проверить ценность будущей встречи. У вас никогда не было ситуации что собеседование перестает иметь смысл уже после 2-4 вопросов? Записывайте вопросы которые привели к досрочному окончанию встречи. Ниже приведу краткий перечень таких вопросов, накопленных личным опытом.

  • (Кратко озвучиваются основные положения вакансии) все верно?
  • Почему уходите с предыдущего места работы?
  • Как скоро вы готовы выйти к нам в случае получения предложения?
  • При выходе на работу потребуется паспорт, трудовая … (перечень необходимых документов). С этим проблем не возникнет?
  • Готовы ли вы выполнить небольшое тестовое задание на очном собеседовании?

Если HR может оценить правильность ответов на технические вопросы это замечательно и этим нужно пользоваться. Такие вопросы должны подразумевать краткие ответы. Да и сами вопросы должны легко восприниматься на слух. Опять же спрашивайте максимально близкие темы к востребованной ежедневной работе специалиста. Ниже приведу пример некоторых таких вопросов:

  • *nix/cli: Как посмотреть последние несколько строк текстового файла (лога)? А как следить за его наполнением?
  • *nix/cli: Вы написали php скрипт для запуска в консоли. Как посмотреть существует ли процесс?
  • *nix/cli: Есть папка с изображениями как узнать ее размер?
  • php: Какой вариант проверки существования данных в массиве наиболее быстрый? Почему?
  • php: Используете ли вы declare(strict_types=1)? Почему?
  • sql: Спрашивайте общие вопросы не зависящие от конкретной реализации базы данных, если речь идет о наборе не специалиста узкого профиля.
  • sql: Есть таблица с комментариями. У коментариев есть оценка (целое положительное число).Как выбрать топ 10 комментариев? Как выбрать все комментарии с максимальной оценкой?
  • sql: Какие индексы существуют?
  • sql: Какие виды блокировок существуют?
  • sql: Что такое ACID? Какие уровни изоляции существуют?

На самом деле диалог о технических навыках соискателя стоит записывать. Т.к. ответ может оказаться правильным, но сложным для HR, сверяющего ответы с подготовленным “листочком”. И не забудьте, что о записи разговора нужно предупредить.

Очное собеседование

Итак, пора назначить встречу с соискателем. Будьте последовательны. Предупредите кандидата о длительности встречи, о предполагаемом составе, о тестовых задачах. Спросите о удобном времени для собеседования. В идеале у вас уже должен быть размечен весь доступный временной интервал - все участники собеседования в офисе + свободная переговорка.

Не стоит удивляться, что сейчас кандидаты зачастую могут приехать только с 19 часов. Иногда поступают предложение провести собеседование в выходные. В таких случаях можно предположить, что соискатель работает и однозначно не уверен в том, что хочет перейти именно к этому работодателю. Видимо предыдущие письма и звонки не были достаточно убедительными. Собеседование в нерабочее время уже не новинка. Но обеим сторонам нужно быть уверенными, что оно не закончится через 4 минуты фразой “вы нам не подходите”.

Так или иначе после согласования даты и времени по телефону обязательно пришлите приглашение на встречу по почте (с указанием адреса и схемы проезда).

Кто должен присутствовать на встрече

Сейчас уже ни для кого не секрет, что очное собеседование делится на 2-3 части по составу собеседующих (hr, технический специалист, руководитель). Действительно такое разделение во времени помогает использовать ресурсы оптимально. Этот подход взят на вооружение почти везде и никого не смущает. Но есть различное понимание как эти части должны быть отделены. И зачастую предполагается несколько очных собеседований. В моем понимании, это плохая практика. Работодатель таким образом заставляет соискателя потратить время на 4-6 поездок. В случае крупных городов это легко может в сумме превысить время рабочего дня.

Ёмко, а не быстро.

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

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

Материал опубликован пользователем. Нажмите кнопку «Написать», чтобы поделиться мнением или рассказать о своём проекте.

Написать
{ "author_name": "Dmitry Salnikov", "author_type": "self", "tags": [], "comments": 11, "likes": 4, "favorites": 1, "is_advertisement": false, "subsite_label": "flood", "id": 44063, "is_wide": false }
00
дни
00
часы
00
мин
00
сек
(function(){ var banner = document.querySelector('.teaserSberbank'); var isAdsDisabled = document.querySelector('noad'); if (!isAdsDisabled){ var countdownTimer = null; var timerItem = document.querySelectorAll('[data-sber-timer]'); var seconds = parseInt('15388' + '59599') - now(); function now(){ return Math.round(new Date().getTime()/1000.0); } function timer() { var days = Math.floor(seconds / 24 / 60 / 60); var hoursLeft = Math.floor((seconds) - (days * 86400)); var hours = Math.floor(hoursLeft / 3600); var minutesLeft = Math.floor((hoursLeft) - (hours * 3600)); var minutes = Math.floor(minutesLeft / 60); var remainingSeconds = seconds % 60; if (days < 10) days = '0' + days; if (hours < 10) hours = '0' + hours; if (minutes < 10) minutes = '0' + minutes; if (remainingSeconds < 10) remainingSeconds = '0' + remainingSeconds; if (seconds <= 0) { clearInterval(countdownTimer); } else { timerItem[0].textContent = days; timerItem[1].textContent = hours; timerItem[2].textContent = minutes; timerItem[3].textContent = remainingSeconds; seconds -= 1; } } timer(); countdownTimer = setInterval(timer, 1000); } else { banner.style.display = 'none'; } })();
{ "id": 44063, "author_id": 195283, "diff_limit": 1000, "urls": {"diff":"\/comments\/44063\/get","add":"\/comments\/44063\/add","edit":"\/comments\/edit","remove":"\/admin\/comments\/remove","pin":"\/admin\/comments\/pin","get4edit":"\/comments\/get4edit","complain":"\/comments\/complain","load_more":"\/comments\/loading\/44063"}, "attach_limit": 2, "max_comment_text_length": 5000, "subsite_id": 199791 }

11 комментариев 11 комм.

Популярные

По порядку

Написать комментарий...
7

2k18???
Чего уж мелочиться: 018.M03

Ответить
2

Не-а :) MMXVIII

Ответить
1

Таки 5778!

Ответить
0

Убедили.

Ответить
0

Первое правило - не писать в вакансии 2к18, иначе придут только php-хипстеры.

А серьезно, зачем у PHP программиста спрашивать вопросы по *nix/cli ?
Все что там есть гуглится за 5 минут при желании.

Ответить
1

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

Ответить
0

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

Ответить
0

php программист и непредусматривает работы с базами? есть такие вакансии?

Ответить
0

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

Ответить
0

Как настроен ci/cd? Если никак, готовы и потратить месяц на настройку?

Если собеседуемый скажет мне про месяц на настройку CI, нахрен мне такой работник нужен, месяц банальный CI настраивать

Ответить
0

Тоже ответ, дающий представление о будущей занятости. Повторюсь, это пример вопросов.

Ответить
0

Прямой эфир

[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "ezfk" } } }, { "id": 6, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "p1": "bscsh", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "bugf", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223676-0", "render_to": "inpage_VI-223676-0-1104503429", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=bugf&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudx", "p2": "ftjf" } } }, { "id": 16, "label": "Кнопка в шапке мобайл", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byzqf", "p2": "ftwx" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "bugf", "p2": "fzvc" } } }, { "id": 19, "label": "Тизер на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "p1": "cbltd", "p2": "gazs" } } } ]
Компания отказалась от email
в пользу общения при помощи мемов
Подписаться на push-уведомления