Дисклеймер : меня зовут Никита Евдокимов и моя история — это, скорее, ошибка выжившего , помноженная на удачное стечение обстоятельств. Тем не менее, я хочу поделиться своим опытом, чтобы вы могли повысить свои шансы быстрее найти свою первую работу во фронтенде и избежать моих ошибок.
От команды Практикума: нам не нравятся статьи с кричащими заголовками: мы не даем пустых обещаний и быстрых легких побед. Поэтому вы можете сперва попробовать курсы веб-разработки от Яндекс.Практикума , где первые 20 часов занятий – бесплатные. Так вы успеете понять, нравится ли вам разработка, прежде чем отправиться с нами в большое путешествие по смене своей профессии.
Моя история не сильно отличается от истории других студентов Практикума: я решил изменить свою жизнь и стать фронтенд-разработчиком. Правда, чтобы показать серьёзность своих намерений, я уволился с работы, и посвятил всё свободное время учёбе.
Для этого я заранее подготовил финансовую подушку — отложил деньги на полгода жизни в режиме «умеренно затянутого пояса». Такой срок я выбрал не случайно: большинство работодателей ищут разработчиков со знанием хотя бы одного фреймворка, и по моим расчётам примерно к этому времени должен был закончится курс по React.
Дополнительно, за месяц до «даты Х», я записался в карьерный трек Практикума. Это специальная программа внутри Практикума, которую проводят HR-консультанты — специалисты, подбирающие сотрудников в ИТ-компании. И это был суперполезный опыт!
Подготовка
Я работал вместе с наставницей Юлей Яковлевой — большое ей спасибо за подсказки и поддержку!. В общих чертах программа выглядела так:
- сперва она дала теорию — как ИТ компании отбирают сотрудников, как подготовить резюме и сопроводительное письмо, чтобы заинтересовать рекрутеров.
- затем я подготовил эти документы, она их проверила и дала советы по улучшению.
- после — провела тестовое собеседование, чтобы проверить мои навыки самопрезентации и дать обратную связь.
Я при всём желании не смогу выложить весь объём теории, но с радостью поделюсь принципами, которые помогли мне оформить резюме и сопроводительное письмо.
Несколько советов по оформлению резюме для разработчиков без опыта
→ Резюме не должно быть избыточно длинным, особенно у начинающего разработчика.
В поиске соискателя рекрутеры отсматривают десятки, если не сотни резюме. И они чисто физически не могут вникать в каждую строчку. Значит, текст должен быть лаконичным, по делу, без воды — а ещё лучше, если он подготовлен специально под эту вакансию.
По этой же причине не стоит утяжелять его нерелевантными достижениями. Например, в студенчестве я играл в театре, и наша труппа в 2011 году взяла гран-при на одном региональном конкурсе. Мне-то об этом приятно вспоминать, но для рекрутера эта информация, скорее, бесполезна. Значит, её стоит убрать.
→ Хорошее портфолио может компенсировать отсутствие опыта
В резюме не стоит говорить о том, что у вас нет коммерческого опыта — это понижает шансы попасть на собеседование: лучше покажите свои навыки, опубликовав ссылку на GitHub. В конце концов, про опыт можно рассказать уже во время собеседования, когда у рекрутера уже будет о вас какое-то впечатление.
Несколько советов, как оформить GitHub:
- Сверстайте адаптивно и кросс-браузерно несколько лендингов, чтобы показать навыки вёрстки.
- Найдите публичное API и сделайте на его основе мини-сервис, вроде генератора шуток или библиотеки лучших ужастиков. Так вы покажете, что умеете работать с REST и асинхронными запросами.
- Также не стоит забывать о проектах из Практикума — их стоит оформить для просмотра людьми «извне» (хотя бы сделать красивое Readme).
→ В резюме стоит подробно рассказать о последнем месте работы
Перечислить основные достижения и коротко рассказать, как ваша работа повлияла на компанию. Это если, конечно, вам действительно есть о чём рассказать. Если нет — лучше не надо.
Такой рассказ может помочь, если вы ищете работу в той же сфере, в которой работали раньше: например, бывший бухгалтер будет находкой для сервиса, который разрабатывает инструменты для бухгалтеров. И это точно выделит его среди других новичков.
→ Раздел «О себе» — один из самых важных
Потому что он позволяет показать себя живым человеком, а не просто «функцией для отрисовки интерфейса».
Расскажите о своих хобби и увлечениях: любите играть в консоли? Круто! А во что именно? Читать? Классно! Что сейчас читаете? И так далее.
Для меня это стало открытием, но сейчас рекрутеры больше обращают внимание на soft-skills. Это слово сложно однозначно перевести на русский язык, но в общих чертах оно означает черты личности, характер и убеждения.
Блок «О себе» как раз позволит рекрутеру хотя бы косвенно понять, что вы за человек — и задать дополнительные вопросы уже во время собеседования.
→ Опционально: резюме стоит украсить фотографией
Советую выбрать то, на котором вы одеты, а фон радует глаз. Это самый спорный пункт, но к сожалению дела обстоят так, что встречают по одёжке, нравится нам это или нет.
Пара слов о сопроводительном письме
Оно составляется под каждую вакансию отдельно, его задача — дать чуть больше информации о вас, плюс продемонстрировать, что вы как следует ознакомились с вакансией и знаете, чего хотите.
Как показывает практика, рекрутеры игнорируют отклики на вакансии, которые идут без сопроводительного — поэтому потратьте время, чтобы подготовить хороший текст.
Своё я составил по такой структуре:
- Приветствие.
- Абзац о том, какие технологии из вакансии я знаю.
- Абзац о том, с какими технологиями я пока не работал, плюс отработка возражения — я быстро учусь и смогу в них разобраться самостоятельно.
- Ссылка на проекты и предложение отправить тестовое задание по такому-то каналу связи.
- Прощание.
Небольшой совет — пробуйте разные приветственные фразы и наблюдайте за тем, на какие отвечают чаще всего. Такой вот «A/B-тест на минималках» позволит найти оптимальную подачу.
Например, на мои письма, которые начинались с фразы «Добрый день, я начинающий фронтенд-разработчик, сейчас заканчиваю курсы» отвечали реже, чем на письма без этого уточнения.
Приступаем к поиску
Прежде чем приступить к поиску, я наметил простой план действий — ежедневно уделять не менее двух часов на изучение новых вакансий на «Хэдхантере», отбор подходящих, редактирование резюме и сопроводительного письма, а также разбор откликов.
Я решил не откликаться на все вакансии подряд, в которых есть слово «фронтенд-разработчик» — на мой взгляд, это всё равно как стрелять из пушки по воробьям: лишняя трата времени и для меня, и для рекрутера.
Вместо этого я тщательно отбирал вакансии, чтобы откликаться максимум на 5-6 в день. Это позволило больше времени уделить «кастомизации» резюме и сопроводительного письма, чтобы повысить вероятность ответа.
Мои «критерии отсева» были такими:
- Вакансия подходит под мой фреймворк — React/CRA . Я решил, что для первого места работы стоит откликаться на вакансии, которые помогут углубить знания, приобретённые в Практикуме. Я не против выучить Vue или Angular, но как по мне лучше это сделать позже, когда как следует набью руку в React.
- Требуемый опыт работы — 1-3 года или «без опыта» . Это на самом деле спорный фильтр, поскольку очень часто работодатели заполняют эту графу рандомно: в «без опыта» попадают и вакансии для синьор-позиций. Я пошёл от обратного — исключил из выборки те позиции, для которых я явно не подойду по опыту — 3-6 лет и 6+ лет.
- В вакансии нет явного указания, что нужен миддл или синьор . Понятно, что это абстрактные уровни оценки: навыки разработчика, который считается миддлом в одной компании, могут соответствовать навыкам джуном в другой. Но я для себя решил, что если рекрутер точно определяет, что джун не подойдёт, то я не буду тратить время, чтобы его переубедить.
- Если указана зарплата, то она должна быть «в рынке» . Медианная зарплата джуна-фронтендера — 50 000 рублей. Я решил не откликаться на вакансии, в которых зарплата ниже этой суммы и выше 70 000 рублей.
Искать работу гораздо легче, если воспринимать процесс как игру: любая игра даёт обратную связь, которая позволяет корректировать стратегию и продвигаться дальше по уровню.
Поэтому я решил сделать поиск работы более «фановым» и завёл для себя табличку, разделив этапы поиска работы на 4 «уровня». Соответственно, у меня была простая цель — хотя бы раз достичь четвёртого уровня.
И каждый раз, когда я «срезался», то пытался проанализировать, что именно я сделал не так, и как можно улучшить результат. «Да, у этого парня своеобразные представления о фановости», — наверняка подумаете вы, и я с вами полностью согласен!
Всего за три дня я отправил 16 откликов. Статистика такая:
Это не оригинал таблицы, в оригинальной я добавил ссылки на вакансию, уровень зарплаты и примечания.
Из пяти компаний, которые заинтересовались резюме, три сразу пригласили на собеседование по телефону, а две — отправили тестовые задания. Тестовые мне выполнять не пришлось — их прислали уже после того, как я получил два предложения о работе. По той же причине я отказался и от одного телефонного собеседования.
На всякий случай покажу, что требовалось сделать в тестовых:
Тестовое задание №1
Задача: Реализовать прототип библиотеки для отображения линейных графиков с использованием WEB Canvas.
- Представить свой API для задания массива «графиков». Каждый «график» должен иметь: a. Наименование параметра; b. Массив точек (X,Y).
- Библиотека должна поддерживать следующие функции: a. Отслеживать изменение собственных размеров и обеспечивать автовписывание; b. Отображать оси, с указанием отображаемых на осях параметров; c. Отслеживать положение мыши с отображением всплывающей подсказки по точкам; d. Масштабирование области графиков.
Срок выполнения: 1,5 недели.
Тестовое задание №2:
Задача: Сверстать и запрограммировать страницу интернет-магазина.
Функции:
- Слайдер
- Фильтрация по типам товаров
- Сортировка по убыванию и возрастанию цены
- Добавление товара в корзину
- Открытие и закрытие модального окна с корзиной
- Изменение количества товаров в корзине
- Расчет стоимости товаров в корзине
- Удаление товара из корзины
Требования:
- Адаптивность
- Минимальная кроссбраузерность (последние версии Chrome и Safari)
- Сохранение пропорций изображений при изменении ширины экрана
- Соответствие макету
- Не использовать Bootstrap и jQuery
- Круто, если используете Pug
- Из JS-фреймворков / библиотек можно использовать только Vue.js (при желании)
Срок выполнения: неделя.
Собеседования
В первый же день поисков со мной связалась рекрутер компании, которая занимается переводами документации. Она задала несколько уточняющих вопросов (какие именно — уже не помню, но ничего неординарного не было), и предложила на следующий день (3 ноября) созвониться с руководителем отдела ИТ-разработки.
Спустя несколько часов мне написал представитель стартапа, который разрабатывает новый премиальный дейтинговый сервис. Он поинтересовался, когда мы можем созвониться — а я решил ковать железо пока горячо и предложил прямо сейчас, через Zoom.
Обычно первым делом рекрутеры проводят «скоринговое» интервью, чтобы как раз оценить soft-skills кандидата. И если всё в порядке — с ним проводят уже техническое интервью. Поэтому я немного растерялся, когда включилась камера, и на меня уставились три человека — тот самый представитель (оказалось, что он — один из сооснователей), его партнёр, а по совместительству финансовый директор, и бэкенд-разработчик.
Они рассказали коротко о продукте — точнее о том, что его пока нет, но есть инвестиции, дизайн-макет, бэкенд и горячее желание его разработать, — порасспрашивали меня о том, почему я решил уйти из медиа во фронтенд и тут началась техническая часть.
Я не ожидал, что собеседования начнутся так быстро, поэтому к техническому интервью не готовился — пришлось рассчитывать на остаточные знания. Вот что спрашивали:
— Знаю ли я алгоритмы? Какие именно?
— Как оценивается их сложность?
— Чему будет равна временная сложность алгоритма Х?
— Основные принципы ООП?
— Что такое чистые функции? Что такое замыкание?
— Что происходит, когда мы вводим название сайта в адресной строке?
Я волновался, но меня подбадривала реакция бэкендера на мои ответы — он выглядел не как экзаменатор, а, скорее, как одногруппник, который наблюдает за товарищем на зачёте: радуется удачным ответам и переживает за неудачные.
Ребята мне сразу понравились. Не могу сказать, чем именно — просто почувствовал, что хочу работать вместе с ними и создать этот проект. Они позже сказали, что я тоже произвёл хорошее впечатление — умением рассуждать и «общей адекватностью».
Мы договорились встретиться на следующий день (3 ноября) в офисе и пообщаться лично. И уже после этого принимать решения. В тот же день, на пару часов раньше, у меня было то самое собеседование с переводческой компанией.
Поскольку вопросы на собеседовании в стартапе были не особенно сложными, я почувствовал ложную уверенность в своих силах — что сыграло со мной злую шутку. Если бэкендер из стартапа задавал «общепрограммерские» вопросы, то здесь руководитель ИТ-отдела спрашивал конкретно о специфике JS, и не удовлетворялся «поверхностными» ответами:
— Проверим, знакомы ли вы с ООП. Назовите основные принципы? — Наследование, полиморфизм и инкапсуляция. — Прекрасно, теперь расскажите о том, как реализовать их в JS. — { рассказываю } — Замечу, что вы перепутали полиморфизм и наследование. Но пойдём дальше.
Вот ещё несколько вопросов с того собеседования:
— Что такое Event Loop?
— Как интерпретатор обрабатывает синхронный и асинхронный код?
— Что такое побочные эффекты у функций?
— Что такое промисы? Какими состояниями они обладают?
— Основные HTTP-методы?
— Основные коды состояния в HTTP-ответе?
И многое другое. Большинство атак я отбил, но впереди было финальное сражение — вопросы на знание React.
— Расскажите, что такое props drilling и какие способы решения этой проблемы вам известны. — Я ни разу не сталкивался с этим термином. — Хорошо, а какие вообще проблемы с пропсами существуют? — Когда их приходится прокидывать из родительского компонента вглубь дочерних. — Отлично, вот вы и назвали, что такое props drilling. И как его избежать? — С помощью хука createContext, который создаёт новый контекст, и хука useContext, который позволяет дочернему компоненту подписаться на контекст. — Замечательно. Вижу, что с Context API вы знакомы, а теперь расскажите Наталье [рекрутеру], что такое, собственно, хуки.
Дальше было полегче:
— Из каких библиотек состоит React?
— Какие основные компоненты существуют в библиотеке Router DOM?
— Какие хуки есть в Router DOM?
— Где React рендерит код — на сервере или на клиенте?
— Какие компоненты бывают в React?
И так далее. С этим вопросами я тоже справился. А вот последний прорвал мою линию защиты как нож масло.
— Хорошо. А что же такое JSX? — Синтаксис, который позволяет использовать HTML внутри React. — Тут вы ошибаетесь, конечно — никакой HTML внутри React не используется. Разметка да, но не HTML. Это описание интерфейса — с помощью Babel JSX-код транспилируется в вызовы метода React.createElement, то есть это своего рода синтаксический сахар. В общем, учите матчасть.
На этом собеседовании у меня снова было ощущение, что я сдаю зачёт — правда на этот раз не лояльному преподу, но я благодрен ему за развёрнутые комментарии моих ошибок: это очень крутое чувство, когда ты находишь пробелы в знаниях и можешь тут же их заполнить.
Несмотря на некоторую надменность, он произвёл хорошее впечатление — было видно, что он горит разработкой, разбирается в теме и следит за обновлением инструментов. К моему удивлению, под конец беседы он позвал меня на работу.
Я попросил отсрочку до вечера — и поехал на второе собеседование в стартап и в конце концов выбрал его. Правда, через месяц решил уйти, но это уже другая история.
Финальные советы
→ Если вам отказывают после собеседования или тестового задания — просите обратную связь.
Если причина именно в навыках — это отличная возможность, чтобы их прокачать. Может я мазохист, но мне нравится ошибаться — исправляя ошибку, лучше разбираешься в нюансах, узнаешь больше разных штук.
Чтобы прокачать технические навыки, советую порешать задачки на CodeWars или попроходить тесты на Skillotron .
→ Не расстраивайтесь, если получаете отказы
Отказ не означает, что вы плохой разработчик или человек. Он означает всего лишь то, что вы не подходите на одну отдельно взятую позицию — и для этого может быть тысяча независящих от вас причин.
Я рассуждал так — если я не подхожу компании, значит и она мне не подходит. И отказ означает только то, что я стал на шаг ближе к месту, в котором мне будет классно и круто.
→ Прохождение интервью — это навык
И его тоже можно прокачать. Рекрутеры задают плюс-минус одинаковые вопросы — подготовьте ответы (а лучше истории) заранее. Чтобы пройти техническое собеседование — посмотрите на ютубе записи публичных интервью с фронтендерами: какие вопросы им задают и как они на них отвечают.
→ Не бойтесь откликаться на вакансии
Если они подходят по стеку/навыкам/зарплате, но из описания возникает ощущение, что компании нужен фронтенд-супермен. Компании чаще всего приукрашивают сложность и «идеальность» портрета кандидата.
Не страдайте от «синдрома самозванца» — рискните, вы же всё равно ничего не потеряете. Возьмут — хорошо, не возьмут — см. совет №1.
От команды Практикума: нам не нравятся статьи с кричащими заголовками: мы не даем пустых обещаний и быстрых легких побед. Поэтому вы можете сперва попробовать курсы веб-разработки от Яндекс.Практикума , где первые 20 часов занятий – бесплатные. Так вы успеете понять, нравится ли вам разработка, прежде чем отправиться с нами в большое путешествие по смене своей профессии.*
*да, мы повторили сообщение из начала статьи для тех, кто дочитал. просто поразительно, какой вы любопытный человек! Специально для таких автор статьи даже рассекретил свое резюме .