Я – начальник отдела разработки небольшой государственной компании, и в последнее время мне снова пришлось провести несколько десятков созвонов-собеседований, с которых мне удалось отобрать только одного человека. О том, почему выпускники скиллбоксов присылают резюме пачками, но выхлоп от обучения собственных юристов компании оказывается выше, чем от собеседований по вакансии – эта статья.
Важно при этом отметить, что я считаю себя достаточно адекватным собеседующим. Я практически не задаю лично-специфичных вопросов (моя часть – техническое собеседование, и мы с него начинаем); отвечаю всем кандидатам, чтобы сразу было понятно, рассматриваем мы их или нет; стараюсь построить собеседование так, чтобы на него не уходило больше полутора часов; не спрашиваю про красно-черные деревья и знание алгоритмов; и вообще имею достаточно четкие критерии для оценки собеседуемых, которые и попытаюсь для вас обосновать.
Также я сразу напишу, что наш стек – 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 почувствовал, что могу решить ЛЮБУЮ задачу (и притом довольно скудными средствами), это было сравнимо с ощущением «Я властелин мира!» А сейчас, думаю, этому мешает обилие имеющихся функций в разных библиотеках (и распространение ИИ-подсказчиков).
В реальности есть всего семь видов операций, на базе которых в большинстве высокоуровневых языков программирования можно обрабатывать данные (строки и массивы). Везде одинаково, то есть минимально изучив синтаксис, то же самое можно написать на другом языке. Вот полный список:
присваивание числу/строке/элементу массива;
конкатенация строк/добавление элемента в конец массива;
вычисление длины строки/массива;
получение подстроки/элемента массива;
цикл for (не foreach);
условные операторы if, сравнение чисел, символов, строк;
математические операции +, –, * / (и еще те, которые требуются матчастью данных).
Совершенно все остальные операции выполняются с помощью этих операций. Например, вставка числа в начало или в середину массива. Например, переворот строки :) И как только вы это умеете, вы сразу начинаете видеть это в задачах, быстро реализовывать какие-то «немного специфичные» вещи. А главное, пока вы это будете делать во многих задачах, вы очень хорошо научитесь отлаживать код.
Как этому научиться
Каков же roadmap? Я могу предложить вам вот что:
1) возьмите в Laravel описание методов классов Str и Collection, реализуйте ВСЕ методы, используя только эти семь операций. У вас там будут еще две-три операции, которые будут встречаться чаще всего в коде, и три-четыре раза их написав через базовые, вы можете дальше ими просто пользоваться тоже как базовыми. Думаю, что 1-1.5 месяца на это будет достаточно.
2) когда вы с этим справитесь, возьмите описание алгоритмов сортировки, например, здесь. Возьмите десяток и реализуйте их. Не заморачивайтесь их скоростью, запоминать их не требуется. Ваша задача – понять и реализовать написанный готовый алгоритм.
PROFIT! Вы великолепны и можете, немного подтянув нужные языки, идти на собеседование. И я очень надеюсь, что у вас тоже появится ощущение, что вы можете с данными теперь делать примерно всё, что угодно, а это очень окрыляет :) Ну и да, в процессе всегда можно брать помощь наставников/репетиторов/whoever. Не все могут пройти этот путь самостоятельно, это нормально, но и специального таланта для этого тоже не требуется, а вот помощь старшего товарища – зачастую да.
Заключение
К сожалению, главная проблема изучения базового программирования состоит в том, что взрослым людям очень трудно изучать то, что не дает результата прямо сейчас (как, например, изучение непосредственно языков программирования – результаты можно увидеть сразу, а базовое программирование кажется копанием в мелочах). Но, поверьте, я как работодатель был бы гораздо счастливее, если бы хотя бы каждый второй из тех, кто приходит, реально умел вот это «программирование на любом языке». И я точно уверен, что вы обскачете 99% из тех, кто подает резюме сейчас, в 2024 году. Если я убедил хотя бы одного человека этим заняться – значит, статья написана не зря :) Спасибо за внимание!
ednersky
А зачем? Если весь мир (наконец-то!) допетрил, что реактивность - тупиковый шаг в развитии, то зачем вам переходить на эту ветку, когда она вот-вот помрёт?
htmx - ваш выбор :)
integralik Автор
А можете, пожалуйста, чуть подробнее пояснить, где весь мир это понял и почему? :) Мне кажется. под React можно найти гораздо больше специалистов, чем под htmx, но я посмотрю-поразбираюсь, спасибо за рекомендацию :)
ednersky
ну сперва эти (хочется написать нехорошее слово, но не буду) люди стали строить параллельное браузерному DOM-дерево.
и почему-то им претило писать
update_dom(data)
а вместо этого они любой ценой воевали за синтаксис:data_dom = data
.Сейчас на горизонте вдруг как грибы стали появляться фреймворки "domless", плюс различные решения "рендеринга на сервере" и htmx как квинтессенция того и другого.
Если поищу, я смогу найти много подтверждений своим словам, но мне пока не до того (нахожусь далековато от компа). В общем как-то так.
MountainGoat
Грибы на горизонте - это не всегда что-то хорошее.
Скрытый текст
ednersky
де-факто человечество отказывается от экспансии в космос, а потому такие грибы, как у вас под спойлером, не являются чем-то плохим
rboots
Под React правда легко найти специалистов, но этот плюс не покрывает архитектурных недостатков React. Основной на мой взгляд - что визуальное представление никак не интегрировано со стейтом (моделью). Можно прикрутить стейт-менеджер со стороны и бесконечно мучаться в месте их соединения. Попробуйте поработать с большими формами в React или с вложенными компонентами с большим числом параметров. У вас будет кода столько же или больше чем на ваниле, при производительности даже близко не похожей на хорошо оптимизированную ванильную. Причина в том, что реакт, как и многие фреймворки, создавали бекендеры, которые фронтенд не понимают и решали не те проблемы. Главная ресурсозатратная проблема фронтенда - это подружить модель с представлением, чтобы при обновлении данных обновлялся ui. Это прекасно решено в VueJs, Angular и даже в древнем Knockout. jQuery взлетел потому, что научился это делать удобно и в императивном стиле, вышеописанные фреймворки научились в деклоративном, а реакт не нуачился никак. По сути он предоставляет обёртку на DOM с кастомным синтаксисом, которая вообще-то не особа нужна.
Самый большой плюс реакт, из за чего он взлетел - jsx. Это действительно классная инновация, которая позволяет писать интерактивную вёрстку более лаконично. Но чтобы использовать jsx вам не обязательно тащить React. JSX поддерживается в VueJS, Preact и можно использовать отдельно с Babel или TypeScript.
Хотите использовать фреймворк - возьмите VueJS, он удобный и стабильный. Реакт оставьте преподавателям курсов
ednersky
Vue решает проблемы рендеринга больших объёмов данных и "зависания" браузера после нажатия одной кнопки пользователем?
- нет (можно, да, но тупящих сайтов на vue ровно столько сколько тупящих на реакте)
Vue что-то может помочь по поводу кнопок "назад" и "вперёд?
- снова нет
Vue предоставляет компонент редактора, совместимого с операционной системой?
- опять нет
Vue позволяет сделать адаптивную вёрстку?
- судя по тому КАК сделано 99% сайтов в интернет - снова нет
итого, Vue - просто инкарнация React.
типа "не пользуйтесь React в пользу Vue и будет вам счастье"
Перефраз знаменитого анекдота про армян:
(c)
Cerberuser
...либо программисты, либо их заказчики не хотят делать адаптивную вёрстку.
ednersky
Конечно не хотят!
Фреймворк не позволяет им это делать ПРОСТО
Фреймворк сопротивляется тому, чтобы они это делали
Других объяснений нет
Cerberuser
Заказчику, который пишет требования "как должен выглядеть сайт", фреймворк никак мешать не может в принципе, заказчик с ним не работает.
ednersky
Вот!
И наблюдая, что между адаптивностью и двумя вариантами вёрстки "с нуля" (читай двойной работой) большинство разработчиков выбирает двойную работу, делаем вывод: фреймворки, что они используют, не поощряют, не предназначены, в них избыточно сложно итп к тому, чтобы один компонент работал и на мобиле и на десктопе.
отсюда, например, разный поиск на мобиле и на десктопе во многих сайтах, отсутстсвующая функциональность на мобиле и так далее.
Итого: разработчики фронтов предпочитают генерировать два фреймворка в минуту (помните эту притчу: ежеминутно в мире кончают суицидом четыре человека, рождается 10, умирает пять, появляется два новых фреймворка JS...), но решать или даже думать о проблемах пользователей они не в состоянии.
Дело в том, что заказчик об этом им требования не написал.
М-да
Cerberuser
Или большинство заказчиков выбирает запрашивать у них двойную работу.
ednersky
нет. большинство заказчиков никогда не стало бы оплачивать двойную работу, если бы понимало, что этого можно избежать.
здесь обычный развод "лоха на рынке".
приходите к врачу, вам выписывают анализ, который в общем-то не нужен, но за который вы заплатите деньги.
можно сказать "большинство больных предпочитают сдавать этот анализ"? Можно.
так и тут.
большинство заказчиков "выбирает"
Cerberuser
Ну то есть, не стали бы рисовать два разных варианта, "потому что им так нравится".
markmariner
Положим, сайты и вправду не всегда хорошо адаптивны. Но почему именно Vue этому мешает? Я использую Vue и не вижу, чтобы он каким-то вообще образом помогал или мешал созданию адаптивной вёрстки.
ednersky
Наверное, потому, что он не предлагает way как это делать правильно?
вот Vue дистанцируется от hashref'ов и значительная часть сайтов с hashref'ами работает криво
вот Vue дистанцируется от сохранения контекста просмотра и значительная часть сайтов на vue не переживает нажатий refresh и back
вот Vue дистанцируется от системных компонент и значительная часть его компонент криво интегрированы с OS
вот Vue не даёт инструментов к адаптивности и никто не делает адаптивных сайтов
перефразируя
"Боже мой, да всем нас...ть на эти проблемы, нам важно как DOM будет перестраиваться!".
markmariner
Первые три проблемы не связаны с адаптивностью, а четвертый звучит как "молоток не предлагает никаких инструментов по сортировке гвоздей", ну Vue и не собирался давать инструментов к адаптивности, она работает на CSS.
Поймите меня правильно, у меня тоже есть представление о том, что способ разработки веб-страниц с помощью браузерных React-like библиотек сомнительный, но я никак не могу понять, при чём тут адаптивность.
ednersky
мне пофиг.
я говорю о том, что вот у нас есть
агитаторы за молотки
и результат: все отказались от микроскопов и теперь пользуются только молотками
когда говоришь о проблемах, говорят "молотки ни при чём!"
однако они "при чём". Именно из-за перехода на молотки выполнен отказ от микроскопов.
Именно из-за отказа от микроскопов мы вынуждены бить бактериям по головам молотками, в надежде попасть именно туда, куда хотим.
idd451289
А вы смешной)
Задача vue как фреймворка это: обеспечить реактивность и синхронизацию стейта и компонента, убрать прямое взаимодействие с dom-ом, разбить страницу на более мелкие части(компоненты)
То, какими инструментами разработчик пользуется для стилизации(css, scss, и т.д.) не его проблема, как и не проблема реакта, ангуляра, и ещё 200 фреймворков. А вот вопрос почему css и его потомки не удобны можно задать в другом месте
ednersky
"Мы пуговицы пришивали, к пуговицам вопросы есть? Нет? Ну и ладно!"
(ц) Аркадий Райкин, 1978 год