Прежде чем найти хорошую работу, Кирилл Охапкин, Java-разработчик из Волгограда, прошёл все круги ада трудоустройства джунов. В своей истории Кирилл делится опытом десятков собеседований и объясняет, почему начинающему программисту надо как можно раньше выходить на рынок труда.
Предыстория
К тридцати годам я перестал видеть перспективы на работе. Тогда, в 2018 году, я был начальником ОТК (отдела технического контроля) в муниципальном учреждении — автобусном парке. Однажды в городе сменилась власть и нам урезали финансирование. Я перешёл в другую компанию, но понял, что мне скучно. В полугосударственных организациях есть потолок роста: интересной и хорошо оплачиваемой должности там обычно ждут лет до пятидесяти.
Поскольку в активе у меня были высшее техническое образование и опыт работы сисадмином, я решил получить новую специальность в IT. Считаю, это сейчас самая перспективная сфера, где ощутим кадровый голод.
Учиться программированию предстояло с нуля, при этом надо было на что-то жить. Я устроился в транспортную компанию системным администратором и записался на курсы Java-разработки в GeekBrains. Почему Java? Потому что этот курс стартовал раньше других! Мне хотелось скорее начать программировать, а на чём — без разницы. Я даже не знал, что Java и JS — разные языки.
Сейчас я доволен выбором, но раньше приходилось о нём жалеть из-за нехватки вакансий в моём регионе. История моего трудоустройства — это целый эпос, который я озаглавил бы так...
Чтобы прийти в Java, надо сначала отвергнуть Java
Работу я начал искать сразу по окончании второй четверти в GeekBrains: открыл HeadHunter, ввёл запрос «Java» и выбрал город Волгоград. Сайт выдал всего 16 вакансий, половина из которых… про JavaScript. «Это фиаско, братан!» — отозвался внутренний голос. Ах да, все вакансии были уровня Middle и Senior, кроме одной — «разработчик ABAP» с зарплатой 15 000 рублей. Мол, переучим с любого языка на суперперспективный, бла-бла-бла.
Я выложил резюме и стал откликаться на всё, вообще на всё — даже на вакансии тимлидов — со словами «возьмите за еду». Через месяц меня пригласили пройти собеседование на позицию «инженер автоматизированного тестирования».
Про английский и людей
На моё резюме откликнулась компания-аутсорсер, которая тестирует игры. Это крупная контора с головным офисом в Праге и филиалами в Москве и Питере. Мне предложили посмотреть вакансию QA-инженера. В требованиях был английский, и я сразу предупредил — не владею. HR ответил, что это не критично и не обязательно. Затем мне прислали тестовое задание, которое я выполнил и показал своему преподавателю Александру Фисунову. Он посоветовал, как упростить и структурировать код — получилось шикарно. В компании посмотрели, сказали: «О, класс! Приходи на интервью». Пришёл, поговорил с тимлидом QA-инженеров и ещё с двумя людьми, ответил на вопросы по Java. «Неплохо! — говорят они. — А что у вас с английским?» — «Частично понимаю, но не говорю». — «Ну ладно».
Дальше было Skype-интервью с руководителем питерского филиала: «В принципе, меня всё устраивает! А как у вас с английским?». Я повторил свой ответ. «Ладно, мы вам позвоним». Затем — ещё одно телефонное интервью с двумя руководителями и тот же финал. Так продолжалось месяц. В итоге HR сообщил, что меня не взяли. «Почему?» — «У тебя плохой английский». Я спокойный человек, но тогда высказал всё, что думал. Ведь я с самого начала предупреждал о своём английском! А в итоге потратил несколько дней жизни на пустые разговоры.
Это был единственный раз, когда иностранный язык стал камнем преткновения при трудоустройстве. Документацию я читаю спокойно: IT-лексику знаю, непонятное смотрю в словарях и Google-переводчике. Для работы в среднестатистической российской компании этого хватает.
В разное время я перепробовал множество учебников и языковых курсов, но пока, увы, не заговорил на английском. Как будет время, возьмусь за него снова. Безусловно, очень круто, когда ты можешь общаться с коллегами из других стран, слушать международные конференции, читать объёмные книги, не дожидаясь перевода.
В регионах не выбирают
Считаю, что в регионах надо браться за любую работу: через полгода-год у тебя будет совсем другое резюме, и ты сможешь найти лучшие варианты. Конечно, если ты в Москве, Питере, Екатеринбурге, Воронеже или Краснодаре, можно привередничать. Но когда у тебя на весь город несколько вакансий — не до жиру. Зато с опытом ты сможешь устроиться в приличную компанию удалённо или переехать в Москву.
Замахнуться на два языка (нет)
Теоретических знаний после курсов мне хватало, чтобы проходить собеседования: интервьюеры сами не всегда представляли, о чём спрашивать, а тестовые задания помогли набить руку. Я понял, что за неделю активных раскопок на StackOverflow можно написать что угодно. Сложнее решать задачи на самих собеседованиях, но и к этому можно подготовиться. А вот когда речь заходит о деньгах и опыте, новичку приходится трудно.
В компаниях, где я проходил собеседования на позиции уровня Middle, мне часто отвечали: «Приходите через годик». Не все говорят так открыто — некоторые начинают срезать тебя издевательскими вопросами: «Как называется такой-то метод в Spring? А сякой-то?». Причём интервьюеры тушуются, когда отвечаешь: «Ребята, вас в гугле забанили? Дайте мне компьютер, и я скажу, как называется метод, а заодно покажу, как его использовать». Ещё могут спросить, как относишься к переработкам. Я честно говорю, что время для меня — самый дорогой ресурс, и дарить его я не собираюсь.
За полгода я прошёл с десяток интервью и получил один оффер от компании, которая предлагала всё те же 15 000 рублей в месяц с возможной прибавкой — не раньше, чем через год. Я, конечно, был готов к скромному заработку в первое время, но на такие деньги мне не прожить физически!
Потом знакомый, который в Европе работает архитектором C#, протолкнул меня на собеседование в хорошую контору. У них собирался увольняться инженер автоматизированного тестирования, и я вышел на стажировку. Работал по часу в день. Стажировка закончилась, и-и-и… инженер не уволился :)
Затем в той же компании мне предложили заняться разработкой на C#. Для начала выдали сложное тестовое задание по SQL, и я от скуки делал его две недели, пока ждал увольнения инженера. В итоге я сам отказался от позиции: решил не браться за новый язык, пока не освою Java, ибо за обучение «уплочено». Параллельно осваивать два языка — это слишком, особенно для новичка. Сейчас-то я понимаю, что надо было не выделываться и согласиться на позицию разработчика С#. Но это лишь начало истории.
Пришёл февраль 2019 года. Директор конторы, куда меня приглашали автотестировщиком, решил мне помочь: обзвонил несколько IT-компаний и сказал, что годный парень ищет работу по Java. На следующий день я пошёл на собеседование в EAE-Consult. Там я ответил на общие вопросы и решил простенькую задачку по SQL. Мне сказали, что подхожу, но есть нюанс... У них не Java, а C# :) Засада! Однако я тогда ещё недостаточно отчаялся и отказал им. До мая собеседований не было вообще. Я продолжал откликаться на всё подряд. Переделал резюме, как советовала специалист GeekBrains по трудоустройству, и стучался в разные IT-конторы.
Тестовое с подвохом
Ещё был очень поучительный опыт с элементарным, на первый взгляд, тестовым заданием, которое оказалось с подвохом. Как-то раз я написал в LinkedIn тимлиду команды, где набирали Java-разработчиков. Он ответил, что джунов они уже набрали, остались вакансии мидлов, но я могу попробовать. Надо было на чистом Java написать консольное приложение, которое предлагало бы пользователю ввести любые числа, а на выходе показывало MIN, MAX и среднее значение. Была ещё хитрая приписка: «Неопытный программист должен понять, как работает твоё приложение, а злой программист не должен его сломать».
Я написал программку за десять минут, покрыл её подробными комментариями и обернул защитным кодом, где проверял типы входных значений и ловил исключения. Казалось, я предусмотрел абсолютно всё. В итоге тимлид «уронил» мою программу одной командой. Как? Он ввёл два максимальных для типа значения, так что произошло переполнение и расчёт выдал «–1». Это было очень поучительно! Кстати, нас на занятиях предупреждали о переполнении типа, но я тогда не придал этому значения. Что тут скажешь? Оставалось только улыбнуться, поблагодарить за опыт и пойти читать «Effective Java».
И вот однажды в выдаче hh.ru я нашёл вакансию «стажёр C#» со вкусной зарплатой и примечанием, что вместо «шарпа» кандидат может знать схожий строго типизированный язык. Я откликнулся с ленцой, даже без сопроводительного письма, и забыл об этом варианте. Но через пару недель прилетело тестовое задание со словами «Cделай, как сможешь, а не сможешь — напиши, где затык». Там было простенькое приложение: API на .NET и мобильная реализация на Xamarin.
Я удивил сам себя — за три дня выполнил задание так хорошо, что получил приглашение на интервью. Оказалось, работы у них пока нет, но они собирают команду для стартапа, который откроется когда-нибудь потом.
«Что ж, похоже, С# — это моя судьба», — подумал я и написал эйчару вышеупомянутой EAE-Consult. Меня опять пригласили на интервью и уже почти взяли на работу, но... Вдруг раздался звонок с незнакомого номера и человек, который представился моим новым начальником, сказал, что отбил меня у «шарпистов», потому что у него появилась вакансия джависта!
Если бы не Java :)
Вы можете сказать, что мне следовало изучить местный рынок и выбрать другой язык программирования. Но дело не совсем в этом. У нас экономически слабый регион с низким уровнем жизни, поэтому, какой язык ни учи, перспективы придётся искать в местах с крупным IT-кластером. Даже если ты освоишь повсеместно востребованный JavaScript, в Волгограде тебе предложат делать сайтики за 20 000 рублей в месяц. К тому же у всех разные склонности и интересы: у меня, например, нет дизайнерских задатков и чувства стиля, с которыми можно расти во фронтенде. Мне больше нравится заниматься серверной частью.
Кому-то важно быстро видеть результат своей работы, а для меня это не критично. Сейчас я работаю над кодом, который не предназначен для выполнения на моей машине. Зачастую приходится два-три дня программировать, прежде чем появится возможность оценить сделанное.
Зато как я люблю отлаживать большой кусок готового кода! Вот есть входные и выходные данные, вроде бы всё написано правильно — но не работает. И тут начинается квест, который даёт хорошую порцию адреналина. Во время дебага бьёшься над ошибкой, постепенно идёшь к пониманию, что было не так, и испытываешь особое удовольствие, когда код начинает работать.
Первая работа и перспективы
Итак, я устроился в EAE-Consult и стал единственным Java-разработчиком компании в Волгограде — коллеги по команде общаются со мной из Москвы. Я сразу оценил хорошо оборудованный офис, приятный коллектив, неплохую для нашего города зарплату.
Рабочий хаос :)
Я начал работать над расширением функций IBM MDM и использовал технологию, которая даже на StackOverflow не представлена. Поначалу пришлось очень тяжело. Во-первых, за повседневными задачами я не видел общей картины. Во-вторых, мне не хватало обратной связи по коду. А мне важно, чтобы мой код внимательно разбирали, критиковали и отправляли на доработку с указанием, что улучшить. Во время учёбы в GeekBrains я часто советовался с преподавателем Александром Фисуновым, и он умел объяснить, что хорошо, а что плохо. Теперь же надо было развиваться без наставника. Кстати, сейчас мне в этом помогает книга «Effective Java» — чтиво очень сложное, но и интересное!
Сейчас я уже полностью адаптировался в компании. С 2020 года перехожу на новый проект с очень современным стеком (микроcервисы, GraphQL). Кстати, мы ищем .NET-разработчиков. Если чувствуете в себе силы, присылайте резюме на почту svetlana.medova@eaeconsult.ru.
Важно ли иметь портфолио?
Моё начальное портфолио составили в основном тестовые задания для собеседований — их я выполнил очень много! В результате подобралась коллекция мини-проектов на любой вкус. Когда мне давали новое тестовое, я мог показать уже готовое решение.
Считаю, портфолио нужно самому программисту, а рекрутерам достаточно знать, что оно есть. Я слежу за статистикой своего репозитория на GitHub и вижу, что работодатели туда не заглядывают, — за исключением случаев, когда я отправлял тимлидам прямые ссылки на конкретные проекты. Если учесть, что я прошёл десятки собеседований, можно сделать вывод: при трудоустройстве на портфолио не смотрят — разве что у вас в запасе будет решение, близкое к тому, что нужно заказчику.
Итоги и советы
Не ждите окончания учёбы! Ходите на собеседования, делайте тестовые и постарайтесь устроиться стажёром — так вы наберёте базовый опыт. Скорее всего, первое время вам будут отказывать. По возвращении домой вы будете искать ответы на вопросы, с которыми не справились. Так и должно быть. Прохождение собеседований — навык, который надо развивать.
Во фронтенде, может быть, чем больше технологий ты освоил — тем ты круче. А в Java, если ты настроен на суровый Enterprise (работу в банках и крупных консалтинговых агентствах), поможет только погружение в коммерческие проекты. У меня поиск работы затянулся, но могу сказать, что всё основное на курсах я изучил в первые две четверти. Хотя дальше тоже были полезные вещи, было важно вместе с их изучением повторять старый материал.
Коммерческая разработка в любом случае отличается от учебных проектов. Пока нет «боевого» опыта, многие вещи можно понять, но не запомнить. С 1990-х годов Java оброс множеством фреймворков и библиотек, поэтому осваивать этот язык надо так: изучаешь Java Core, базовые принципы, алгоритмы, SQL — и идёшь работать.
Ещё очень важно умение читать код. Когда берёшься за новый проект, 50 % времени уходит на то, чтобы разобраться в сделанном до тебя, ещё 40 % — на документирование своего кода и всего 10 % — на программирование. Это только в фильмах про хакеров от быстрого ввода команд происходят чудеса.
Как научиться читать код? В идеале надо взять готовый проект на тысячу классов, где после очередного обновления что-то не работает, — и вникать, как всё устроено и что пошло не так. Было бы круто, если бы этому учили на курсах, но я такого не встретил.
Перед собеседованием полезно загуглить примеры частых вопросов и заданий на собеседованиях по вашему направлению. Многие работодатели сами берут эти вопросы из интернета. Например, меня в трёх разных местах спрашивали, чем интерфейс в Java отличается от абстрактного класса. Тут не обязательно вдаваться в философию — от вас ждут такого ответа: «После Java 8 — ничем не отличается». Технический интервьюер просто хочет убедиться, что вы любознательны и читаете правильные актуальные источники.
Хотите узнать больше о выпускниках Java-факультета GeekBrains? Вот их истории:
Пройти обучение