Базовое программирование, или Почему джуны не могут пройти к нам собеседование

537edba32e53097a99685eee9d8b4d7d

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

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

Также я сразу напишу, что наш стек — PHP + Vanilla JS, чтобы отличать в комментариях всех, кто дочитал только до этого места, от остальных :))) Да, мы перейдем на React, но еще не прямо сейчас, это небыстрый процесс :)

Структура собеседования

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

Если этот пункт удовлетворен, я посылаю стандартное сообщение с предложением решить тестовое задание. В тестовом задании две задачки, одна на PHP (про расстановку скобок, вы все ее знаете) и одна на Javascript (надо что-то сделать по нажатию нескольких кнопок). В целом задание рассчитано минут на 30 и принимается, пока висит вакансия. Делают тестовое около половины соискателей, процент сделавших правильно постепенно с годами растет, хотя некоторые решения очень подозрительно пахнут чатом GPT. Но в принципе любое правильное решение принимается, и дальше я приглашаю человека на созвон-собеседование.

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

Задачки

Требования к задачам у нас такие:

  • во-первых, человек должен уметь программировать.

  • во-вторых, он должен показать, что имел дело с языками PHP и JS.

  • в-третьих, задачки должны быть рассчитаны не больше, чем на час, а первая — на 5–10 минут.

  • в-четвертых, задачки должны быть уровня «я уже год назад умел это решать» для более-менее нормального кандидата.

Поэтому в качестве первой задачки мы обычно спрашиваем реализацию «руками» какой-нибудь функции из библиотеки работы со строками (чаще всего переворот строки), в качестве второй — реализацию очевидного, но немного нестандартного алгоритма (саму задачу раскрывать не буду, но раньше вместо этой задачи была сортировка пузырьком, алгоритм я объяснял, если это требовалось). И третья задача проверяет умение работать с событиями, находить dom-элементы и менять им css (причем код выполняется прямо в консоли браузера на внешнем сайте).

Почему именно так?

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

  • Умеет ли человек вообще работать с циклами, или умеет перебирать только вверх и желательно с помощью foreach;

  • Умеет ли работать со строками, или ему надо разбить строку на массив;

  • Вообще видел ли синтаксис PHP или видит впервые;

  • Умеет ли отлаживать — если с первого раза где-то допустил косяк;

  • Вообще насколько быстро печатает — это тоже важно.

При этом я достаточно лоялен ко времени и способу написания. Я сам, когда решил сделать эту задачку в формате собеседования, первые пять минут просто сидел и тупил (а потом за 4 минуты написал решение). Понятно, что есть волнение, понятно, что можно ошибаться. Но если человек умеет писать код, он должен мочь это сделать за 10 минут.

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

*Да, при наличии соответствующего уровня мы готовы взять и мидла, и там совсем другая вилка по деньгам. И по решению задач довольно очевидно, есть ли с ним о чем говорить после этих задач. Да и по скорости это происходит намного быстрее, как раз время остается.

Вторая задача проверяет, что человек умеет сформулировать (в голове) известную ему матчасть как пошаговый алгоритм и реализовать его. Я долго думал и решил, что давать задачи на какие-то конкретные знания по PHP, будь то работа с файлами, куками, сессиями и т.д., во-первых, не показательно (человек мог именно с этим не работать), а во-вторых, почти каждую из этих тем можно «приподнять» за неделю, и смысла это спрашивать я не вижу. Напротив, умение по описанию разложить и реализовать довольно простой сформулированный алгоритм — это то, что требуется в каждой задаче в нашей компании. Плюс еще здесь проверяется то, умеет ли человек отлаживать код, если первую задачу он пролетел мгновенно. Соберем требования по второй задаче в список и дополним его:

  • Умеет ли кандидат по описанию алгоритма его реализовать;

  • Умеет ли отлаживать;

  • Умеет ли разделять код на функции. В нашей реальной задаче есть повторяющаяся часть, которая так и просится выделить ее отдельно;

  • Умеет ли в абстракцию (я сразу задаю вопрос, что нужно поменять в коде, если исходная таблица — n x n);

  • Умеет ли излагать свои мысли четко, внятно и компактно. Это, кстати, тоже важно, потому что чаще всего является следствием того, что кандидат и мыслит четко.

Однажды на собеседование пришел кандидат, который сразу сказал, что будет использовать ChatGPT (на собеседовании мы разрешаем гуглить и предупреждаем об этом, но нейросети — нет). Он с восьмой попытки справился с этой задачей, хотя и не смог мне сказать, что было не так в коде с первой попытки и привести контрпримеры, но хотя бы с моей помощью объяснил ему, на каких примерах как должно работать. Но вопрос, а что будет, если таблица будет 5×5, или n x n, он даже не смог понять, не то что объяснить нейросетке.

Наконец, третья задача проверяет базу работы с Javascript. Об этом у меня уже была статья, но в целом каждый программист на чистом JS каждый день имеет дело с тремя действиями: работа с DOM-моделью, событиями и асинхронными запросами. В нашей задачке есть только первые два, но с небольшим подвохом. И по сути главное, что мы проверяем — что человек уже достаточно времени имел дело с Javascript, чтобы эти две операции его не удивляли.

В принципе это все, и этого достаточно, чтобы получить 70–100 тысяч (в зависимости от качества процесса) — для джуна без опыта работы нормально даже в офисе в Москве.

Чего обычно не хватает джунам и как это добрать

Почему даже такое простое собеседование проходит примерно 1 из 30? Проблема состоит в неумении базово программировать. (Забавно при этом, что половина собеседуемых имеет законченный бакалавриат, а то и магистратуру со словом «информатика» или «программирование» в названии специальности). К сожалению, потолок такого сотрудника — это джуниорский уровень, а в нашей компании он не сможет решать даже базовые задачи. Что не означает, что он вообще не может трудоустроиться — я видел ребят с 5–7 лет нерисованного опыта, которые приходили ко мне и не проходили мое собеседование. Но этот опыт обычно состоял в адаптации готовых решений и в двухнедельной работе над задачей, рассчитанной на четыре часа для мидл-программиста.

Я какое-то время пытался сформулировать, что такое базовое умение программировать и как ему сравнительно быстро научиться. И, кажется, у меня получилось. (У меня, чтобы научиться, ушла в свое время пара лет, но мне тогда было 11:) и я думаю, что взрослому человеку это реально поднять за 3–6–9 месяцев, в зависимости от изначальных склонностей и талантов).

Что такое базовое программирование

Базовое программирование — это умение решить любую задачу по обработке данных (речь не идет про ввод/вывод данных куда бы то ни было, только обработка). Ну, в пределах математических знаний человека и не накладывающую ограничение по нагрузке на систему (с очередями разберется, когда будет становиться мидлом). Но, честное слово, когда я в 13 почувствовал, что могу решить ЛЮБУЮ задачу (и притом довольно скудными средствами), это было сравнимо с ощущением «Я властелин мира!» А сейчас, думаю, этому мешает обилие имеющихся функций в разных библиотеках (и распространение ИИ-подсказчиков).

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

  1. присваивание числу/строке/элементу массива;

  2. конкатенация строк/добавление элемента в конец массива;

  3. вычисление длины строки/массива;

  4. получение подстроки/элемента массива;

  5. цикл for (не foreach);

  6. условные операторы if, сравнение чисел, символов, строк;

  7. математические операции +, –, * / (и еще те, которые требуются матчастью данных).

Совершенно все остальные операции выполняются с помощью этих операций. Например, вставка числа в начало или в середину массива. Например, переворот строки :) И как только вы это умеете, вы сразу начинаете видеть это в задачах, быстро реализовывать какие-то «немного специфичные» вещи. А главное, пока вы это будете делать во многих задачах, вы очень хорошо научитесь отлаживать код.

Как этому научиться

Каков же roadmap? Я могу предложить вам вот что:
 1) возьмите в Laravel описание методов классов Str и Collection, реализуйте ВСЕ методы, используя только эти семь операций. У вас там будут еще две-три операции, которые будут встречаться чаще всего в коде, и три-четыре раза их написав через базовые, вы можете дальше ими просто пользоваться тоже как базовыми. Думаю, что 1–1.5 месяца на это будет достаточно.
 2) когда вы с этим справитесь, возьмите описание алгоритмов сортировки, например, здесь. Возьмите десяток и реализуйте их. Не заморачивайтесь их скоростью, запоминать их не требуется. Ваша задача — понять и реализовать написанный готовый алгоритм.

PROFIT! Вы великолепны и можете, немного подтянув нужные языки, идти на собеседование. И я очень надеюсь, что у вас тоже появится ощущение, что вы можете с данными теперь делать примерно всё, что угодно, а это очень окрыляет :) Ну и да, в процессе всегда можно брать помощь наставников/репетиторов/whoever. Не все могут пройти этот путь самостоятельно, это нормально, но и специального таланта для этого тоже не требуется, а вот помощь старшего товарища — зачастую да.

Заключение

К сожалению, главная проблема изучения базового программирования состоит в том, что взрослым людям очень трудно изучать то, что не дает результата прямо сейчас (как, например, изучение непосредственно языков программирования — результаты можно увидеть сразу, а базовое программирование кажется копанием в мелочах). Но, поверьте, я как работодатель был бы гораздо счастливее, если бы хотя бы каждый второй из тех, кто приходит, реально умел вот это «программирование на любом языке». И я точно уверен, что вы обскачете 99% из тех, кто подает резюме сейчас, в 2024 году. Если я убедил хотя бы одного человека этим заняться — значит, статья написана не зря :) Спасибо за внимание!

Habrahabr.ru прочитано 5054 раза