Введение
Для новичка мир программирования кажется необъятным и войти в него достаточно сложно. На момент написания данной статьи мой опыт как Java разработчика составляет более трех лет. Часто знакомые интересуются как стать программистом. Что для этого необходимо знать и с чего лучше начинать? Данная статья была написана с целью дать ответы стандартные вопросы. Все написанное в статье основывается на моем личным опыте и отражает мое видение ситуации.
Данная статья первая в цикле про то, как стать junior-разработчиком.
Градации разработчиков
На российском трудовом рынке принято условное деление разработчиков в зависимости от опыта и знаний. Данные категории весьма условны, поскольку требования к стажеру в Яндекс могут быть выше, чем к мидлу в небольшую компанию, занимающуюся разработкой сайтов. Рассмотрим общепринятые требования.
- Intern (Стажер) — знает синтаксис языка и имеет представление о структурах данных, умеет решать простенькие задачки. Часто нанимают для обучения и первые несколько месяцев стажер решает только учебные задачи. Можно сказать, что это похоже на курсы, за которые платят зарплату.
- Junior (Младший разработчик) — знает синтаксис языка, структуры данных, наиболее популярные алгоритмы (часто спрашивают на собеседованиях), имеет представление о базах данных, фреймворке, с которым будет работать, и системе контроля версий. Как правило, джуны выполняют достаточно простые задачи или фиксят баги. В отличие от стажера, очень желательно иметь опыт работы или несколько своих проектов.
- Middle (Разработчик) — требования, как к джуну, но знания по всему перечисленному должны быть достаточно глубокими. Необходимо иметь от года опыта и уметь самостоятельно выполнять задачи, разрабатывать сервисы и задумываться об архитектуре.
- Senior (Старший разработчик)—обширный опыт, глубокие знания в предметной области, понимание, что может пойти не так, и умение предвидеть ошибки, выстроить правильную архитектуру, а также хорошие коммуникативные навыки.
Как было сказано выше, данные градации весьма условны. Во многих компаниях под джунами также понимают стажеров. Рассматривая обучение с нуля, если заниматься хотя бы полчаса в день, достаточно расслаблено, чтобы не пропало желание, то путь до стажера может занять пару недель, до джуна пару месяцев.
Какой язык выбрать?
Выбор языка становится достаточно большой проблемой, особенно когда нет определенности. Рассмотрим несколько факторов, которые могут повлиять на выбор:
- Предполагаемая сфера деятельности.
Фронтенд — графическая оболочка, то, что мы видим в браузере. Тут все просто и по сути только один распостраненный язык — JavaScript.
Бэкенд — выполняется на сервере, зачастую графической оболочки нет, работа происходит “через терминал”, отправили набор данных, получили другой набор. Список языков, используемых в бэкенде, достаточно обширен, но наиболее популярными являются: Java, C#, Python, PHP, Ruby, Go, Rust, JavaScript.
Мобильная разработка — зависит от платформы:
iOS — Swift/Objective C
Android — Java/Kotlin
Возможна кроссплатформенная разработка на JavaScript с такими фреймворками, как ReactNative и NativeScript. - Сложность настройки окружения для запуска первого приложения. Если для обучения JavaScript можно пользоваться блокнотом и запускать код в браузере, то для запуска проекта на питоне придется научиться настраивать виртуальное окружение, решать конфликты с путями и зависимостями, а также освоить навык пользования консолью. Это не плохо, но может забрать пару вечеров, главное в такие моменты не сдаться и не забить.
- Популярность языка.
Чем выше популярность, тем больше комьюнити и выше шанс, что возникшая проблема уже была кем-то решена и, вероятно, достаточно вбить ошибку в строку браузера и решение будет доступно по первой ссылке. Как правило, чем больше комьюнити, тем больше различных инструментов существует для данного языка, и тем выше их качество.
Стоит учитывать, что в различных языках разный порог входа. На мой взгляд, тяжелее всего с нуля попасть в мобильную разработку, java и C#. Походив по собеседованиям по java без опыта работы, я понял, что устроиться будет достаточно сложно и можно месяцами готовиться для успешного прохождения собеседования. Вместо этого я устроился в компанию, где пишут на Java, как PHP разработчик и через несколько месяцев перешел в проект на Java.
Если нет определенности, в какой сфере и на каком языке работать, на мой взгляд, оптимально будет изучить рынок вакансий, понять, по каким языкам больше всего стажировок и вакансий джунов и готовиться именно по ним.
Опять же, на мой взгляд, стоит остановиться на одном из трех языков: JavaScript, Python или PHP. Они достаточно зрелые и имеют достаточно развитую экосистему. У них огромное сообщество, это приводит к тому, что можно легко найти документацию на любую функцию и библиотеку, есть множество тем на форумах с обсуждением ошибок, встречающихся при разработке. Большое количество книг/статей/видеоуроков. Относительно просто настраивается окружение для разработки.
Первый выбранный язык не обязательно станет основным, спустя месяцы разработки придет осознание того, что действительно интересно. Будет понятно, какие есть плюсы и минусы у выбранного языка, и какие языки лишены этих недостатков.
Что необходимо знать?
Для стажера минимумом будет хорошее знание синтаксиса языка и навык решать задачи, в частности и на бумаге. Все описанное ниже будет плюсом для стажера, а для джуна крайне желательно. Источники информации приведены в следующем параграфе, чтобы не перегружать этот.
- Синтаксис языка.
Достаточно посмотреть видеоуроки на ютубе, чтобы в целом понять синтаксис и самостоятельно уметь выполнять простейшие операции. Более глубокие знания лучше получать из книг или в процессе решения задач гуглить неизвестные конструкции. - Типы и структуры данных.
Необходимо понимать, какие есть структуры данных, чем они отличаются, и что будет при их взаимодействии, например, что будет, если сложить число и строку. - ООП.
Ответы на три первых пункта есть в книгах, однако, если хочется ускорить процесс, то они хорошо гуглятся и на эти темы много статей и видео. - Как работает сборщик мусора и компилятор.
Этот вопрос один самых часто задаваемых на собеседованиях. Достаточно прочитать статью о том, как происходит выполнение кода и сборка мусора в выбранном языке. Точных подробностей никто ждать не будет, но представление иметь желательно. - Решение задач.
Гуглится по запросу: задачи с решением //Выбранный язык//. - Базы данных.
Почитать про нормализацию, про проектирование баз данных и индексы. Уметь писать простые запросы с несколькими объединениями. Неплохая статья https://habr.com/ru/post/480838/. - Работа с консолью.
Крайне желательно не пугаться открытия терминала и выполнения операций в нем. - Система контроля версий (Git).
Видеоуроки о работе с гитом.
Официальная документация, более полная и, возможно, кому-то более понятная инструкция по работе с гитом. - Алгоритмы.
Знание алгоритмов применяется на практике достаточно редко, однако, оно позволяет задумываться о производительности написанного кода и расширяет кругозор. На собеседованиях, как правило, вопросы ограничиваются алгоритмами сортировки. Чаще всего просят реализовать пузырьковую сортировку или быструю сортировку. Также важно уметь оценивать временную сложность алгоритмов. - Фреймворки.
Поскольку мало кто пишет проекты с нуля, практически всегда используются различные фреймворки, значительно упрощающие работу. От стажера и джуниора собеседующий не будет ожидать глубокого понимания, однако, желательно попробовать сделать самостоятельный проект. Самым простым способом изучения, на мой взгляд, является разработка проекта по образу и подобию. На ютубе достаточно много видеоуроков, в которых показывается разработка проекта и объясняются тонкости работы.
И очень важно писать код, много кода. Все примеры из книг, статей и видео нужно обязательно писать и запускать самостоятельно. Часто они с ошибками, если пример из статьи не запускается — это нормально. Чаще всего вылезает конкретная ошибка и достаточно ее вбить в строку поиска, также вполне возможно, что в комментариях к видео или статье вопрос по ошибке уже кто-то задавал. Весь свой код желательно загружать в репозитории на гитхабе. Будет отлично, если получится написать свой проект, в котором удастся воплотить применение всего вышеперечисленного.
Откуда брать информацию?
На мой взгляд, для начинающего разработчика самым важным действием является трудоустройство. Устроившись на работу можно понять, какие технологии являются актуальными и что следует учить, ведь многая информация в книгах, статьях и видео уже устарела. Коллеги смогут выступать в роли менторов, которые будут направлять и подсказывать. Многие компании нанимают на работу стажеров для дальнейшего обучения, во вступительном задании порой достаточно решать примитивные задачи на перестановку диагоналей матрицы и написание связных списков.
Раньше обучаться можно было только в университетах и хранилищем знаний выступали люди и книги. В современном мире проблема противоположна, информации слишком много и сложно выделить то, что действительно важно, от того, что встречается раз в полгода.
Если знаний по выбранному языку нет совсем, то проще всего будет начать с видеоуроков. После них будет понятно хотя бы, как можно запустить написанную программу, а иногда это действительно вызывает сложности. Достаточно неплохой канал “Гоша Дударь”, у него есть видео почти по всем популярным языкам, которые называются “с нуля до профи”. Понятно, что посмотрев десяток видео и научившись писать простенькие программы, профи не стать, но понимание синтаксиса и основных операций появится. Примеры лучше писать один под другим, закомментировав старые, не стирая их. Чтобы через пару недель можно было открыть файл и быстро вспомнить, если что-то забудется.
Также мной были найдены два хороших задачника по JavaScript и PHP, к которым можно перейти после понимания основ синтаксиса. Наверняка аналогичные задачники есть и для других языков.
После этого желательной перейти к книгам, поскольку в хорошей книге все последующие пункты будут описаны. По питону достаточно неплохая книга Эрика Мэтиза “Изучаем Python”, по PHP Линна Бейли, Майкла Моррисона “Изучаем PHP и MySQL”, по Java Бэрта Бейтса “Изучаем Java”. Указанные книги легко читаются, материал преподносится неплохо, и примеры достаточно интересные, пусть и несколько устаревшие. По SQL достаточно основательная книга Алана Бьюи “Изучаем SQL”, но читается тяжело, я проходил по 20 страниц в день.
Книги хорошо комбинировать со статьями и видеоуроками, если что-то непонятно, то стоит поискать вне книги. Достаточно важно гуглить все непонятное и пытаться с этим разобраться. Также в книге может не быть одного из пунктов, которые необходимы, тогда придется искать информацию самостоятельно.
Сейчас на русском и английском языке достаточное количество качественных бесплатных уроков, поэтому я не вижу особо смысла оплачивать платные курсы, но все же рассмотрим этот вариант.
Плюсы платных курсов:
- Если они хорошо продуманы, то подача материала будет структурирована, информация будет свежей, и все важные моменты будут затронуты.
- У вас будет ментор, который будет отвечать на глупые вопросы и поможет разобраться со сложным материалом.
- При отсутствии должной мотивации на курсах развиваться проще, поскольку вас “проталкивают вперед”, и вроде деньги заплачены, скорее всего будет жалко не получить результата.
- По окончании курсов, скорее всего, будет проект, который можно предоставить как портфолио.
Минусы платных курсов:
- Главным минусом является длительность курсов. Хорошие курсы идут полгода/год. За это время можно научиться решать задачки, устроиться стажером и получить полгода/год реального рабочего опыта. Если работу совмещать с обучением по книгам, статьям и курсам на ютуб, то за это время можно стать очень крепким джуном. И претендовать на заработную плату по верху рынка. И, опять же, лучше работать стажером и получать пусть и маленькую, но зарплату, чем платить аналогичные деньги за курсы.
- Самым ценным умением программиста является навык работы с информацией (“гугления”), поэтому стоит с самого начала стараться все неизвестные вопросы решать самостоятельно.
- Существует большое количество телеграмм каналов, групп Вконтакте и форумов. В них можно найти ментора, который будет подсказывать, и единомышленников. Часто ребята объединяются и вместе начинают изучать язык, помогают друг другу с непонятными темами.
- Ну а по поводу мотивации, когда я проходил книгу “изучаем Java”, в послесловии автора были такие слова “Если вы освоили весь материал, то после выхода на работу вы сможете легко позволить себе поездку на море”. После прохождения книги и перехода на Java я действительно перешел на другой проект и поехал в отпуск, так что, возможно, это будет мотивировать.
Резюмируя
Не стоит кидаться в омут с головой и днями сидеть за компьютером изучая программирование, за пару недель скорее всего это отобьет желание дальше развиваться.
Стоит заниматься пока интересно, часа/получаса в день вполне достаточно, чтобы за пару недель набрать знаний для трудоустройства на стажера. На джуна при таком расслабленном ритме понадобится пара месяцев, если поднажать, то можно успеть и за месяц.
17 вопросов джуну: что должен знать Junior-разработчик
Что должен знать Junior-разработчик, чтобы получить должность или удержаться на уже «завоёванной» позиции?
Джун — это уже пусть и младший, но специалист. Подразумевается, что он самостоятельно умеет писать код, может справиться с простыми задачами сам, а со средними по сложности задачами — под присмотром ментора.
Кто-то говорит, что требования завышены, и в 2020 году младший программист должен знать то, что знал Middle в нулевых. Кто-то парирует аргументами о росте конкуренции, сложности задач и, соответственно, требований.
Что касается технических требований к джунам, то в последние годы они действительно выросли. Профессия программиста стала доступнее из-за курсов, и рынок переполнился начинающими разработчиками. Поэтому компании начали выставлять определённые требования, чтобы найти из общей массы тех, кто лучше других.
Например, теперь на позицию начинающего front-end разработчика недостаточно просто знать JavaScript, HTML5/CSS3: нужны базовые знания одного из популярных фреймворков (React, Vue, Angular). Кажется, что со временем требования будут расти ещё сильнее.
Мы разобрались, что должен знать Junior-программист в 2020 году, и собрали общие вопросы с собеседований, по которым работодатели определяют, дотягивает кандидат до нужной планки или нет.
Hard skills
Почему вы выбрали этот язык программирования?
Вопрос нехитрый, но джун должен хорошо понимать, где лучше использовать один язык, а где отдать предпочтение другому, какие у выбранного языка сильные и слабые стороны.
Где проходили обучение, участвовали ли в реальных проектах?
- опыт некоммерческих проектов, в основном небольших проектов, реализованных в рамках обучения;
- Pet-проекты, база работ на GitHub (само наличие проектов + качество кода);
- участие в хакатонах и конкурсах (особенно победы);
- посещение профильных мероприятий: митапов, конференций, лекций;
- сертификаты об окончании курсов или изучения технологий и пр.
Назовите принципы ООП
Старо как мир, но всё так же актуально. Держите шпаргалку по принципам ООП: там всё разложено по полочкам. Если вы хорошо разбираетесь в ООП, можете рассказать о своём опыте их применения на практике. Идеально, если вы также расскажете, почему те или иные принципы не стоит применять в некоторых ситуациях.
Какие алгоритмы сортировки вы знаете? Напишите код с использованием быстрой сортировки.
Ох уж эти алгоритмы сортировки — понять бы, где они пригодятся в реальной жизни. А зачем вообще Junior-разработчику это знать? Тут всё просто: понимание принципов и гибкость мышления. Опять же, с помощью небольшого примера вы покажете, что владеете синтаксисом языка и умеете объяснять, что происходит в вашем коде.
Какие технологии вы знаете?
Для работы на реальном проекте мало знать сам язык программирования. Младшему разработчику необходим большой багаж знаний. Если мы рассматриваем разработчика на Java, кроме самого языка, необходимо иметь хотя бы начальные знания о Spring, базах данных, SQL, системах контроля версий. Это не означает глубокое изучение всех аспектов, но представление о работе с этими технологиями быть должно, даже если нет реальной практики. Зачастую разница между Middle- и Junior-разработчиком — это реальный опыт.
Если говорить о знании конкретных технологий, от начинающего разработчика требуется опыт разработки на каком-то классическом языке программирования со строгой типизацией — подойдёт Java, C++, C#. При этом не так важно, на каком языке программирования придётся писать в будущем: синтаксис языка выучить легко, а вот понимание, что «можно» делать, а чего «нельзя» — нет.
Расскажите, с какими IDE вы работали
Достаточно назвать одну, но хорошо в ней разбираться: какие редакции есть, как подключить библиотеку к проекту, чем выбранная среда разработки лучше других, какие плагины вы использовали, etc. Это то, что должен знать Junior-разработчик.
Есть ли опыт работы с базами данных? Сколько нормальных форм вы знаете и чем они отличаются?
Знать, как обращаться к БД, нужно, а вот что касается нормальных форм — это, скорее, плюс, чем необходимость. Будет хорошо, если вы назовёте СУБД, с которыми работали, обозначите их ключевые особенности.
Также к навыкам стоит добавить SQL. Да, на SQL сейчас никто не пишет, но без SQL невозможно понимание логики работы СУБД.
У вас был свой проект? В чём заключалась задача и как вы её решали?
Чтобы стать Junior-разработчиком, нужно знать теорию и применять её на практике. Разумеется, вы как джун уже должны были что-то писать, будь то на курсах или для себя. Перед собеседованием стоит разобрать один из самых сложных проектов, вспомнить, какие проблемы возникали в процессе работы над ним, и как вы их решали.
Какие методологии создания продукта вы знаете? Назовите несколько принципов Agile
Да, вам стоит почитать об Agile. Даже если вы твёрдо уверены, что никогда не столкнётесь с командной разработкой, поверьте — столкнётесь. Это не то, что обязательно знать Junior-разработчику, но будет плюсом, если вы разбираетесь.
Есть ли опыт работы с Git? Какой веб-сервис для хостинга проектов вы используете?
Неважно, GitHub это, GitLab или BitBucket. Интервьюера интересует главное — разбираетесь ли вы в системе контроля версий.
Также вас могут попросить решить несколько несложных задач
Минимальный испытательный набор состоит из трёх тестов.
Во-первых, оценивается логическое мышление соискателя. Для этого человеку дают несколько достаточно простых задач, которые позволяют проверить, может ли кандидат выполнить обобщение или сделать выводы из поступившей информации.
Во-вторых, смотрят, как кандидат усваивает информацию, как работает его внимание и память. Обычно перед разработчиком ставится задача из 5–6 вводных пунктов, после чего идёт обсуждение её решения. Кандидат должен резюмировать задачу, описать своё решение, а затем сделать выводы.
В-третьих, по косвенным признакам, оценивается коммуникабельность кандидата — развитие его речевых навыков и способность работать в команде. Часто от соискателей на Junior-позицию требуется проактивность (её оценят, предложив несколько «поведенческих» задач) и скорость мышления.
Soft skills
Вы командный игрок?
Коммуникативные навыки — одни из важнейших, и даже если вы разработчик-одиночка, акцентируйте внимание на том, что вы с удовольствием приобщитесь к командной работе.
Даже опытные разработчики могут ошибиться с оценкой сроков, но они знают, как с этим быть — сразу сообщают менеджеру, обращаются за помощью к коллегам. Джуниор с неразвитыми soft skills промолчит и будет пытаться решить вопрос самостоятельно, в результате ничего толком не сделает и только потратит время.
В удалённой работе гораздо большую роль начинают играть soft skills. Гибкие навыки — это не только умение общаться с коллегами, но и банальное уважение к коллегам, к примеру, в чатах — когда ты отмечаешь коллегу, дублируешь сообщение, которое могло потеряться, и закрепляешь важные ссылки на самом верху.
IT-сфера изменчива, постоянно появляются новые технологии. Готовы ли вы всё время учиться?
Все понимают, что у младшего разработчика нет большого опыта и, скорее всего, нет глубоких знаний фреймворков. Поэтому на собеседовании больше внимания уделяется его soft skills: насколько разработчик мотивирован, готов ли он обучаться.
Каков ваш уровень английского языка?
Для нас, в EPAM, важным фактором является также уровень английского языка — не ниже Intermediate, поскольку после обучения можно попасть на проект с распределённой командой, с разработчиками из других стран.
Кроме того, аутсорсинговые компании зачастую работают с иностранными заказчиками, организовывают с ними встречи и созвоны. И вообще, читать и писать документацию стоит на английском, да и на Stack Overflow лежит всё, что нужно знать Junior-разработчику. Поэтому перед собеседованием обязательно подтяните английский язык.
Умеете ли вы справляться со стрессом?
Часто младший разработчик сталкивается с трудностями, на которые он тратит много сил и времени из-за отсутствия опыта. Поэтому просто необходимо уметь понижать свой уровень стресса, когда это требуется, иначе обучение затянется.
Если возникла проблема, как вы будете её решать?
Это больше вопрос на самостоятельность, нежели на способы решения.
Хочется поделиться советом: прежде чем идти к более опытным коллегам с вопросом, постарайтесь сами разобраться в проблеме. Во всех командах очень ценится, когда человек подходит не просто с вопросом «А как это сделать?», а уже обладает какой-то информацией, прикинул варианты решения и обращается за советом, как решить проблему правильнее.
Можете ли вы оценить время выполнения задачи?
Да, это то, что должен уметь Junior-разработчик уже с кое-каким опытом, но на стадии обучения вы должны были получить хотя бы базовый навык оценки сроков.
У нас сотрудники работают удалённо. Поэтому важно грамотно распределять время для решения задач, уметь сосредотачиваться, оценивать сроки и соблюдать их.
Что должен знать Junior-разработчик? Отвечают эксперты
Говоря о необходимых навыках, сразу важно прочертить границу между джуном и стажёром, поскольку эти роли достаточно часто путают.
Стажёр — человек, который только учится, часто он не имеет опыта разработки. Со стажёрами мы в компании чаще всего имеем дело на наших стажировках, которые мы в разных форматах организовываем с 2012 года. Как правило, значительная часть их аудитории — это студенты без опыта работы. Конечно, если стажёр хорошо себя показывает, мы можем пригласить его на собеседование, а по итогам собеседования даже взять его в компанию, если есть надежда, что он за пару месяцев выйдет на уровень джуна. Но далеко не все стажёры так быстро дорастают до этого.
Тем временем джун — это уже пусть и младший, но специалист. Подразумевается, что он самостоятельно умеет писать код, может справиться с простыми задачами сам, а со средними по сложности задачами — под присмотром ментора. Соответственно, такой специалист обязан обладать уверенными знаниями как минимум одного языка и фреймворка. Да, его знания, скорее всего, не будут глубокими, но он должен знать основы. Значительная часть сил джуна уходит на освоение нового. Ведь чтобы стать мидлом и выйти на новый уровень оплаты своего труда, джуну придётся освоить несколько фреймворков пусть и поверхностно, глубоко изучить как минимум один фреймворк, возможно, подготовиться и сдать экзамен по сертификации, получить опыт в разных проектах. Соответственно, важнейшими soft skills для джуна (да и для любого ИТ-специалиста вообще) будут навыки самообучения, навыки и опыт решения любых проблем, самодисциплина и мотивация к обучению.
Если рассматривать hard skills, то, наверное, нужно упомянуть такие профессиональные навыки, как умение искать информацию в поисковых системах, знание средств коллективной разработки (Git и другие), знание IDE, языка и фреймворка.
Завышены ли требования к джунам? Уверен, нет. Всё проясняется, если разделить понятия стажёр и джун и рассматривать джунов, как младших специалистов, а не просто тех, кто начал учиться.
Junior-разработчику, как в принципе и любому специалисту в сфере ИТ, важны такие качества, как ответственность, стремление к профессиональному росту, умение управлять рабочим временем и работать в команде. Кроме того, от начинающих разработчиков дополнительно ждут умения быстро осваивать новый материал и вникать в суть задач.
Требования к hard skills будут зависеть от направления. Например, мы уже подробно рассказывали, что работодатели ждут от Junior-Python-разработчика. Для таких специалистов это чаще всего знание языка программирования Python, алгоритмов и структур данных, опыт работы с базами данных и фреймворками.
Современные требования к Junior-разработчикам не кажутся мне завышенными. Во-первых, требования очень отличаются от компании к компании. Нужно также иметь в виду, что в описании вакансий обычно пишут портрет идеального соискателя, на деле же готовы брать кандидатов не со всеми перечисленными навыками. Во-вторых, большинство работодателей понимают, что любого джуниор-специалиста придётся учить, поэтому хотят от кандидатов в первую очередь бойкости и заинтересованности.
В технических навыках обычно требуется наличие какого-то (хотя бы учебного) опыта программирования, знакомство с основными инструментами, умение решать типовые задачи. Для получения даже этих навыков придётся постараться. Разработка имеет относительно высокий порог входа по сравнению с другими ИТ-профессиями, но планка по найму в последние годы, скорее, снижалась, чем наоборот.

По нашему опыту в последние годы требования к Junior-разработчикам у нетоповых компаний снизились. Связано это с кадровым голодом, вызванным, с одной стороны, ростом рынка, с другой, демографическим провалом девяностых–начала 2000-х.
В целом для джуна, планирующего работать в прикладной разработке, требования можно определить следующим образом:
Основные хард-скиллы:
- Знать синтаксис языка, на котором предстоит работать.
- Знать основу стандартной библиотеки языка и представлять её структуру в целом.
- Понимать принципы работы технологической платформы и среды исполнения (например jvm).
Дополнительные хард-скиллы:
- Понимать принципы работы реляционных СУБД, иметь навыки работы с ними.
- Знать основы веб-разработки.
- Понимать, как в целом устроен мир: как работает сетевое взаимодействие, какая инфраструктура существует в интернет- и корпоративных сетях, понимать отличия парадигм программирования, скриптовых языков от компилируемых и т. д.
Практические навыки:
- Уметь решать простые прикладные задачи, т. е. применять знания, перечисленные выше, с пользой.
Софт-скиллы:
- Умение слушать, воспринимать постановку задач и пояснения, не упускать детали, но и не зацикливаться на них.
- Способность и желание обучаться в процессе работы.
- Умение задавать вопросы и в целом формулировать мысли.
- Любознательность и стремление к развитию.
- Ответственность.
Как правило, у всех ребят, приходящих к нам на собеседование, всё в порядке с основными хард-скиллами, учитывая, что они предварительно проверяются простейшим тестовым заданием.
Большинство же отклонений по результатам собеседования происходит по причине отсутствия практических навыков или критичных софт-скиллов, таких, как умение слушать.
Это не самые высокие требования: могу с уверенностью сказать, что 10-15 лет назад требования были значительно серьезней. Отрасль была менее лояльной к новичкам, готовность брать на работу, платить не самую низкую зарплату и учить была у единиц компаний. Сейчас же все, даже самые небольшие софтверные и не только компании, готовы вкладываться в обучение вчерашних студентов, несмотря на все сопутствующие риски. Всё, что нужно джуну сегодня, — общая адекватность и минимальные знания технологий.
Выводы
Мнения насчёт того, завышены требования к джунам или нет, очень разнятся. Но практически все эксперты сходятся в том, что Junior-разработчик должен знать о преимуществах и сферах применения выбранного языка или технологии, уметь работать с Git, знать основные алгоритмы, библиотеки и фреймворки в своей сфере, быть в курсе возможностей хотя бы одной IDE, знать английский не ниже уровня Intermediate и уметь работать в команде.
Как стать джуном, которого берут на работу (frontend-разработка)
Привет, Хабр! Я — начальник отдела разработки небольшой IT-компании, и мы — те самые люди, которые не ищут на работу сеньоров, и мы готовы брать не только мидлов, но даже и джуниоров, и готовы растить их до уровня крепких мидлов. Однако 80% приходящих на вакансию frontend-разработчика соискателей, даже называющих себя мидлами, с опытом работы, по сути оказываются не то что джуниорами — вообще не программистами. Что же на самом деле должен знать джун, чтобы попасть в компанию, подобную нашей? И как к этому прийти, если за плечами нет высшего программистского образования или богатого опыта программирования в школе? Я расскажу об этом и о том, как устроено техническое собеседование в нашей компании.
Базовый уровень программирования
Итак, к нам приходит среднестатистический кандидат, который прошел курсы по JavaScript, сделал там пару проектов. Потом узнал, что во многих местах хотят React, сходил на курсы по нему, тоже сделал пару проектов, выложил их на Github. Приходит к нам, уверенный в себе. И мы его просим написать функцию, которая выбирает из строки все большие буквы, или реализовать «вручную» какой-нибудь метод из array. И половина кандидатов в этом месте выбывают из строя. Кто-то вообще не может это сделать, у кого-то на двухминутную функцию уходит больше получаса. Зачем мы вообще это спрашиваем и почему с этого начинаем?
Дело в том, что когда вы начинаете делать реальные проекты, то такие микрозадачи (просто чуть более сложные или чуть менее стандартные) регулярно начинают возникать:
то нужно покрасить гласные буквы;
то написать правильное окончание у слова с числительным (2 ракетки, но 5 ракеток, и вам нужно в автоматическом режиме подставить окончание);
то вычислить новые положения всех точек змейки после очередного шага; и так далее.
И эти кусочки обычно являются очень маленькими фрагментами той задачи, которую вы решаете. И если сначала на каждый такой кусочек у вас уходит по полчаса, то как только вы овладеваете этим инструментарием, вы начинаете писать это за две минуты, практически не задумываясь. И ваша работа ускоряется в 10 (!) раз.
(Да, бывалые программисты здесь мне скажут, что нужно предусматривать много граничных условий, и речь идет не о 2 минутах, а больше, и вообще если есть библиотека, которая это умеет из коробки, то лучше ее подключить. Но примерный смысл работы библиотеки всегда лучше знать, чтобы мочь сделать вручную то же самое, но слегка модифицированное; а кроме того, человек, который пишет этот кусок кода за полчаса, а не за две минуты, граничные условия не напишет просто никогда).
Почему он этого не знает?
А у среднестатистического соискателя этой части обучения не было. Чаще всего он даже понятия не имеет о том, что она существует. Это во многом связано с тем, что курсы гораздо лучше продаются, когда человек получает на них быстрый результат. Но на таких курсах, даже 5-месячных, не остается времени на собственно базовое программирование — и поэтому в учебном проекте преподаватель предусматривает самые легкие пути с минимумом проблем. А шаг вправо-шаг влево от этого дается студентам с огромным трудом.
И эту часть очень важно где-нибудь добрать. В идеале, для того чтобы понять, подходит ли вам работа программистом, имеет смысл сначала пойти на какие-нибудь курсы чистого программирования (условия, циклы, работа с массивами и строками, запись в хранилище и чтения из хранилища) на плюс-минус любом языке и посвятить этому хотя бы три месяца. Зная, что после этих курсов вы станете программистом, но на работу вас еще никуда не возьмут. И если вы будете чувствовать, что вам нравится то, что вы делаете в рамках этих курсов, — вот тогда уже идите учитесь конкретному языку и его предметной области.
Но можно эту часть выучить и после того, как вы прошли курсы по javascript и React. И у вас сразу станет больше шансов стать айтишником, чем у 95% остальных выпускников курсов. Потому что действительно сложно потратить несколько месяцев, решая какие-то задачки, которые, как кажется, не имеют практического применения, мучая строки, массивы и циклы. Но это только кажется: в реальной работе вы будете иметь с ними дело очень часто.
Матчасть
Но, допустим, перед нами соискатель, который научился базовому программированию. Следующее, что мы просим на собеседовании, — найти на странице все кнопки и покрасить их в какой-нибудь цвет. В этом месте отваливаются еще 30% соискателей. Возможно, с этого стоит начинать разговор — с человеком, который не знает ответа на эту задачу, можно распрощаться за 7 минут, а в предыдущей на это уходит минут 15-20 обычно 🙂 Но как так, спросите вы? Человек сделал 4 проекта, разве он ни разу не делал чего-то подобного за это время?
Ну, во-первых, проекты обычно довольно небольшие. Даже если там много файлов, интересный код хранится от силы в 1-2. И там несколько раз они, конечно, выбирали элементы, но не настолько часто, чтобы это вошло в пальцы и в голову. И проблема вовсе не в том, что эти люди не были усердны, и даже не в том, что задачи на курсах достаточно невелики и упрощены. Проблема еще и в том, что при подготовке кандидаты решают какие-то задачи, ожидая, что на собеседованиях могут спросить примерно про что угодно, от стрелочной функции до каких-нибудь throttle и debounce. Но на самом деле есть несколько классов задач, с которыми frontend-разработчик имеет дело практически каждый день. В нашей рабочей практике (и в фирме, и времен фриланса) этих классов всего три:
работа с DOM-моделью (изменение стилей, атрибутов, html-кода);
работа с событиями (как минимум — обработка кликов по кнопкам, в том числе — сгенерированным в процессе работы);
отправка данных на сервер и обработка ответа (и тут, кстати, тех, кто походил на курсы базового программирования, ждет приятный сюрприз, потому что, например, если поднять сервер на PHP, то окажется, что там ровно и есть базовое программирование +/- работа с базой данных (ну, на уровне, когда надо всего лишь отправить на фронт какой-то ответ для тестирования), вот оно и пригодилось нечаянно).
И вот эти штуки, хотя бы в базовой версии, тоже надо знать очень хорошо, а применяемые команды и их синтаксис — наизусть (благо, их не так уж много). Как выбрать элемент — по тэгу, классу, атрибуту, его значению; как поменять стили, как поменять атрибуты, innerHTML и insertAdjacentHTML. Как обработать событие, что там внутри event (хотя бы target и currentTarget); как быть, когда кликабельные элементы сгенерированы или когда их очень много. Как отправить на сервер данные (fetch или даже хотя бы $.ajax). И, вы не поверите, если вы знаете наизусть синтаксис этих штук и применили их в реальных задачах раз по сто — ваша скорость разработки увеличивается еще в 5-10 (!) раз. То есть разница по скорости разработки между обычным соискателем и соискателем, который знает базовое программирование и базу матчасти языка, может доходить до 100 (. ) раз.
И вот как раз с этого места мы готовы называть его способным джуном и учить его дальше. Потому что дальше, до мидла, там еще очень много всего.
Что должен знать мидл
Собеседование с мидлом начинается, на самом деле, по той же схеме:
сначала задачка на базовое программирование;
потом на выбор элементов и покраску/скрытие/изменение атрибутов;
потом какое-нибудь простое событие и обсуждение стрелочных функций;
потом отправка данных на сервер и разговоры про GET/POST;
и пару слов про git (его, слава богу, хотя бы в базовом варианте умеют использовать даже джуны).
Но уже и тут можно спросить гораздо больше всяких деталей, которые джун пока не знает или еще не запомнил.
А дальше можно разговаривать в очень разных направлениях. Мы задаем много вопросов, но не ждем, что соискатель-мидл ответит на все — крепкий мидл должен знать процентов 70-80, начинающий — 30-40. Обычные вопросы в нашем случае такие:
всякие подробности про промисы;
какие-то другие способы взаимодействия с сервером, кроме ajax (например, websocket);
сборщики (webpack, gulp), разделение кода по компонентам;
event loop, всякие детали событий, кастомные события;
прототипы и полифиллы;
filter, map, reduce;
работа с линтером;
тесты и заглушки;
декораторы, throttle и debounce;
Соответственно, если джун в курсе про что-то из этого, то это плюс и к общему впечатлению, и к пути до уровня мидла. Но знание базы гораздо важнее, и бонусы его не заменят.
Движение от джуниора к мидлу
Тем, кто только стал джуниором, для начала лучше идти в организации, в которых используют vanilla js, может быть, с небольшими усовершенствованиями, и первые год-два проводить именно здесь. Почему я так думаю? Ведь если вам удастся устроиться сразу React-разработчиком, вам, скорее всего, будут платить больше денег!
Дело в том, что если вы работаете с обычным js, вы гораздо лучше понимаете, что и как устроено изнутри (и потом вам будет легче понимать и то, как устроены конструкции в React-е). У вас становится гораздо больше опыта работы с css-свойствами, больше способов сбора данных с кнопочек и форм; вы начинаете гораздо легче читать чужой код, потому что вы видели несколько способов и синтаксисов сделать то, что вы делаете, некоторые из них вы переняли; вы уже пробовали настраивать всякие штуки типа сборщиков и линтеров, потратили на это довольно много времени и знаете кой-какие нюансы. И дальше, когда вы идете уже непосредственно работать с React-ом, то вы все это уже умеете, и в 95% случаях вам не приходится учить еще и это. Потому что возможности мозга ограничены, и при большом объеме того, что нужно понять сразу, вы рискуете не справиться. Точнее, не справляться примерно первые несколько лет работы. И вам будет очень трудно, вы регулярно будете хотеть бросить работу, а ваши коллеги, которые уже имеют этот бэкграунд, будут обгонять вас в росте с космической скоростью.
По сути, работа на обычном js отодвигает вверх ваш потолок роста в ближайшие годы. И ради этого стоит пожертвовать частью зарплаты прямо сейчас. И при этом необходимо следить, что вы не забываете, если этого нет в вашей работе, параллельно изучать все остальное — хотя бы из списка из предыдущего параграфа. Хотя, конечно, лучше иметь ментора, с которым можно переписываться и один-два раза в месяц созваниваться, чтобы обсуждать, что именно вы сейчас учите, зачем оно вам может пригодиться, не пора ли уже на следующий уровень и так далее. И это, опять же, резко поднимает потолок роста, но далеко не все себе могут это позволить 🙂
И если путь «сначала js — потом фреймворки» будет соблюдаться (а когда-то это был естественный путь разработчика), то как раз и будет получаться, что с фреймворками работают мидлы и сеньоры. Проблема в том, что кто-то когда-то это заметил и поставил телегу впереди лошади: решил, что если вы пройдете курсы по React-у, то вы уже мидл. Но это так не работает 🙂
О реальных сроках роста
Существуют ли вообще люди, которые за полгода смогли пройти курсы, хорошо устроиться на работу и потом быстро вырасти? Да, они существуют. Проблема в том, что 90% из них имеют несколько лет бэкграунда самостоятельного кодинга, или школьного/университетского программирования, то есть это совсем не те люди, которые пришли с нуля. У них получится так быстро, а у вас нет 🙂
В реальности требуется около года на то, чтобы спокойно выучить все, что нужно джуну (если вы знаете, что именно учить). Когда я говорю о трех месяцах на базовое программирование, я имею в виду занятия хотя бы через день, а такую интенсивность может выдержать далеко не каждый взрослый человек с работой, семьей и ипотекой, решивший сменить профиль деятельности. Если вы занимаетесь два раза в неделю — закладывайте полгода на базу, месяцев пять на курс по матчасти и месяца два-три на практику и выучивание базовых конструкций матчасти. То есть чуть больше года — реальный срок развития с нуля до джуна.
Путь от джуна до слабого мидла довольно естественно проходится за год, и он уже обычно проходится на работе, без работы здесь никак. До крепкого мидла вы растете еще год-два, и здесь уже важно не только то, что происходит на работе, но и то, ботаете ли вы что-то дополнительно, чтобы иметь более полную картину знаний.
Дальше начинается путь к сеньору, и он занимает еще минимум пару лет. Но про это лучше думать, уже будучи более-менее приличным мидлом.
Как войти в IT
Резюмирую. Путь, по которому стоит войти в IT и стать джуном, которого берут на работу, в первую очередь включает в себя обучение базовому программированию. Если у вас этого еще нет, но уже есть курсы js и/или react — потратьте на это три-шесть месяцев, и процент интервью, которые вы будете проходить, резко возрастет. И к этому добавьте знание и практику матчасти по работе с DOM, событиями и ajax. Откровенно говоря, в этот момент вам должно казаться, что вы можете сделать на сайте примерно всё, что угодно. И это не очень далеко от правды, но. Многих технологий вы еще не знаете, как и многих деталей и нюансов DOM-модели. Еще вам предстоит изучить способы делать многое проще и быстрее; научиться хорошей организации кода; и так далее. И вот этому уже вы будете учиться на работе.
А вас будут учить с удовольствием, потому что, с учетом скорости вашей разработки по сравнению с обычными соискателями, вы будете уже честно отрабатывать решением реальных задач хотя бы часть потраченного на вашу учебу времени ваших старших коллег.
Типичные задачи junior разработчика
Разбираем, как построить карьеру программиста и что именно Вы будете делать на позиции джуна.
Junior разработчик – это новичок с опытом от 6-12 месяцев, который знает базовые конструкции. Он может самостоятельно сделать простую программу, дописать или протестировать код, внести небольшие правки.
В IT-компаниях после этапа планирования задачи распределяются по “рубашке”: самые монотонные таски, не требующие высокой квалификации, отдаются джунам. Задачи посложнее – мидлам. Требующие глубоких знаний (например, построения архитектуры) – сеньору.
В личный кабинет пользователя нужно добавить поле для ввода номера телефона. Это значит, что:
1 базу данных нужно расширить номером телефона, добавить ключи, триггеры, проверить правильность данных
2 для бэкенда (например, на java) нужно добавить поле номера телефона, проверить валидацию с помощью регулярных выражений
3 для фронтенда (на JavaScript) предстоит предусмотреть ввод номера для юзера, вывод ошибки в случае невалидных данных
Джуну могут поручить выполнить как и все три эти задачи, так и некоторые из них.
- написать SQL запрос, который выберет всех юзеров, которые оплатили только картой Visa
- выбрать людей, которые купили страховку
- создать контроллер, чтобы по базе выслать всем пользователям письмо с благодарностью
- написать фильтр выбора страховки по цене / по дате / по поставщику услуг
- разработать валидацию данных
- “причесать” код в соответствие с новым правилом из линтера
- написать автотесты
С этим кругом задач джун может самостоятельно справиться с определенным кругом задач, не отвлекая других разработчиков. Но даже такие простые задачи проходят проверку у наставника, так как джуниор только набивает руку.