ЭТАП 1. Обучение
К JavaRush пришёл осознанно: адекватный помесячный прайс, четкая структура материала, много практики и наличие собственного коммьюнити. С первым пунктом всё понятно, а учить язык без структуры довольно сложно, и такое обучение наверняка обеспечит человека серьёзными пробелами в Java Core. Опыт собеседований и ТЗ показывает, что спрашивать по "кору" могут всё: от побитового сдвига и приведения дженериков до IO и сериализации. Практика — мастхэв; я до сих пор половину вещей могу понять и запомнить, только если написал их сам. Ну и коммьюнити: решил задачу — похвастайся в комментариях; не решил — добро пожаловать в вопросы, но готовое решение тебе, скорее всего, никто не даст. А к пользовательским статьям на свободные темы я возвращался и уже после окончания курса, там много годноты для старта (особенно первый опыт с фреймворками на пошаговых примерах + вопросы к собеседованиям). В целом за полученную базу я этому проекту благодарен, но не стал бы опираться только на JavaRush — тот же Шилдт лучше всего заходит "внахлёст" на изучаемую тему, и зачастую раскрывает некоторые моменты. Про задания, которые иногда идут вперёд теории и заставляют гуглить — тут уже много в отзывах говорили. Для меня это скорее плюс, чем минус — и не факт, что сейчас ситуация обстоит так же, как в момент моей учёбы. Сразу совет тем, кто, как и я, заходит в Java "с чистого листа": на каком-то этапе вам может стать скучно или тяжело:Всем с нуля тяжело, до конца курса доходит, дай бог, 5% человек. Ваша задача — попасть в их число.
У меня интерес проявился через месяц-два, когда задания стали посложнее и поинтереснее. Перетерпите.
- Главное — еженедельный прогресс. После двух недель отдыха возвращаться уже сложно, а писать каждый день несколько месяцев подряд не каждый сможет. Дайте себе норму в часах на неделю — например, 15. Вы можете кодить по 1.5 часа каждый будний день и еще 3-4 часа на обоих выходных, или можете отдохнуть пару вечеров, но "выходная норма" увеличится. Таким образом, график получится гибким, но регулярным. Конечно, потом можно будет мерить работу задачами и проектами, но на уровне синтаксиса и ядра — сойдут и часы.
ЭТАП 2. Cамообразование
Итак, на стажировку я не попал: оставил всего пару дней на ТЗ до конца набора в группу и не успел разобраться с требованиями — слишком много незнакомых слов навалилось. Т.к. ещё три месяца ждать уже не хотелось, решил дальше сам. Благо, по всем популярным фреймворкам есть гайды и видеоуроки. Следующие несколько месяцев разбирался со Spring MVC, Spring Boot + Data, Spring Security, Hibernate, jUnit, Maven, Git, РСУБД, осваивал SQL и старался собирать всё это в единое целое. Через полгода у меня были проекты, на которые сейчас страшно взглянуть, но я получил практический опыт использования "взрослых" фреймворков и гитхаб, который можно было показывать по запросу потенциального работодателя. Советы:Чем раньше узнаете про .gitignore — тем лучше. ;)
Многие гайды включают в себя сразу несколько фреймворков; пользуйтесь этим и добавляйте своё. Написали интернет-магазин на Maven + Spring Boot + Data — добавьте авторизацию, юнит тесты и логирование.
Для web-проектов можно брать из сети бесплатные frontend-шаблоны — с ними приятнее работать, они лучше выглядят скриншотами в README на гите. Заодно сможете вспомнить HTML и CSS — наверняка захочется поправить стили и вёрстку.
Чего мне не хватило (потом обжёгся на интервью)
Алгоритмы. Чтобы избежать моих ошибок, сразу рекомендую короткую книжку на русском "Грокаем алгоритмы". Что такое сложность алгоритмов, из чего она складывается, почему недостаточно quicksort, введение в теорию графов — всё там и максимально понятным языком.
Коллекции "под капотом". Не помню, было ли это на JavaRush, но полезно узнать, как работает HashMap.get() или почему HashSet не гарантирует сохранение порядка элементов. Опять же — какие коллекции потокобезопасны и почему.
SQL. Нужен, как минимум, до JOIN'ов — какие есть, как работают, способность написать SELECT на две таблицы на бумаге на лету. Рекомендую www.sql-ex.ru: за день-два выведет вас на нужный уровень.
Spring Core: а какие есть аннотации, а что такое контекст, а как создаются бины, а какой Bean Scope потокобезопасен, а как решить взаимный инжект — всё вопросы с собеседований. Как вернуть страницу, как вернуть JSON и т.д. Я сейчас читаю "Spring 5 для профессионалов" на русском, но вообще рекомендуют "Spring in Action".
ЭТАП 3. Поиск работы
Собственно, за первые пару-тройку месяцев после выполнения домашних проектов я отправил около 30 откликов на всевозможные Junior\Trainee вакансии (через HH, LinkedIn, кадровые агенства), с околонулевыми результатами. Ориентировался только на вакансии без опыта, честно указывал знакомый мне стек и писал про свою высокую обучаемость в сопроводительных письмах. Итог — два звонка (один из которых сразу закончился на моём pre-intermediate английском), ТЗ прислали ещё две компании, "встреча" была одна, и то я там в одиночестве решал на листочке задачи на алгоритмы, после чего HR просто унесла бумаги и "мы вам позвоним". Пробовал попасть на пару стажировок (неоплачиваемых и условно-оплачиваемых): ТЗ сделал, но не прошёл дальше финального собеса; зато теперь могу сказать, что стажёров точно набирают T-Systems, ЦФТ, Andersen и EPAM (по ним смешанные отзывы, решайте сами). Как по мне — неплохой способ войти в сферу, если есть возможность несколько месяцев посидеть без дохода и не умереть=) В общем, после такого опыта я несколько приуныл, и всю историю с поисками поставил на паузу почти на полгода — продолжил работать по прошлому профилю, писал какие-то приложения просто ради фана, но даже на гит особо не выкладывал. Пока не встретился с одним знакомым, которому между делом и рассказал о неудачах с вакансиями: он на тот момент уже работал миддл-разработчиком, но начинал так же — с самостоятельного обучения. Знакомый дал мне пару рекомендаций, которыми пользовался сам и которые очень сильно помогли мне с поиском работы в дальнейшем. Следовать им или нет — решать вам, т.к. они, в каком-то плане, не совсем честные. Итак, дальше цитаты:любым способом обеспечь себе в резюме 6+ месяцев коммерческого опыта: стажировки, выпускные проекты, фриланс, удалёнка — всё, что угодно. Это сильно поможет на этапе первичного отсева резюме HR-ом;
убери из резюме слово Junior и ожидаемую зарплату; оставь просто Java Developer, а по деньгам обсуждай индивидуально с каждой компанией;
старайся, чтобы HR называла "вилку" предлагаемой ЗП раньше, чем ты назовешь свои ожидания. Если компания предлагает 80-120к, а ты ищешь от 40к, часть подборщиков будет относиться к тебе пренебрежительно;
откликайся на всё вакансии, подходящие тебе по стеку, даже если там требуется коммерческий опыт 1-3 года.
Укажите в резюме весь стек языков, технологий и фреймворков, с которымы вы работали.
Зарегистрируйтесь на LinkedIn — там правда много HR-ов разных компаний. Тщательно заполните профиль — по сути, это тоже ваше резюме. Для развития сети контактов добавляйте релевантных вашему профилю LION'ов, они принимают запросы от всех пользователей.
Попробуйте себя в бесплатных тестах по Java — их часто дают на бумаге перед собеседованием на Junior. Лучше подготовится заранее.
Всегда спрашивают по коллекциям: какие есть, чем отличаются, когда лучше использовать.
Всегда по абстрактным классам и интерфейсам — могут ли у них быть методы, поля, а какие, можно ли наследовать и т.д.
Почти всегда по многопоточности — что использовали в работе, ключевые слова, методы, знакомы ли с util.concurrent.
Часто по работе с памятью — куча, стек, а будут ли равны эти строки, а эти объекты, почему.
Иногда по алгоритмам — какие знаете, какая сложность, почему, сможете ли написать алгоритм сейчас.
Иногда по паттернам — какие знаете, какие используете, напишите синглтон или фабрику.
Иногда по SQL — виды JOIN'ов, что такое транзакция, как провести её на JDBC, напишите короткий запрос.
-
страница бизнес-контактов Salesforce-профиля с редактированием и добавлением новых записей;
-
симуляция лифта в многоэтажном здании на Spring State Machine с управлением через консоль;
-
Android-приложение на LibGDX библиотеке с посимвольным выводом текста при нажатии кнопки;
-
REST имитация каршэринга, с добавлением клиентов по HTTP-запросу и возвращением JSON;
-
задача на сортировку неориентированного графа через свободную ячейку;
-
поиск равнобедренных треугольников по координатам из файла;
-
рефакторинг готового кода с использованием Stream API;
-
UI-калькулятор с поддержкой тернарных выражений;
-
гонка потоков с записью результатов в файл.
Старайтесь не только выполнить задание, но и обеспечить соответствие кода принципам ООП.
Проверяйте ваш код на эффективность — мне как-то отказали, потому что я, в числе прочего, использовал PrintStream вместо BufferedWriter.
Планируйте время выполнения с запасом на 50% — лучше раньше начать и закончить, чем в восемь утра дедлайна делать git push.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ