Статья о том, как шаг за шагом при дефиците свободного времени обучиться и устроиться на работу сразу Middle Java разработчиком перескочив через Junior ступеньку, основанная на личном опыте, и о том, как мне это помогло, когда сразу после трудоустройства пришлось тянуть проект практически в solo. Статья родилась как некий ответ на вопросы, которые мне часто задавали люди, находящиеся в таком же положении, как и был когда-то я, когда времени на обучение почти нет и хочется войти в IT кем-то выше, чем Junior разработчик. Если кратко, то всё сводится к разнице в знаниях, опыте в Java и фреймворках, способности эффективно решать задачи и самостоятельно и принимать небольшие проектные решения. Для проведения более чёткой границы по hard skill’ам существуют матрицы компетенции, содержащие порядка сотни пунктов, которые чётко разграничивают что должны уметь Junior, Middle и Senior разработчики. К примеру, по одной такой матрице Junior должен как минимум знать monitor, wait/notify/notifyAll/sleep, synchronized, volatile, Thread, Future, Callable, основные Thread-safe коллекции, в то время как Middle должен к этому всему ещё знать ReentantLock, ReentantReadWriteLock, Standard Executors (Single-Thread, Fixed, Pooled), Scheduled Executor, Atomic (Integer, Boolean, etc), Concurrent collections, BlockingQueues. В школе учился в физмат классе. Всегда, мечтал стать программистом, но не верил в свои силы, поступил на ТехМаш и окончил универ с отличием став инженером в области машиностроения. Устроился CAE (Computer-aided engineering) инженером в российский филиал международной немецкой фирмы. Но в свои 30 лет понял, что хочу осуществить давнюю мечту и так начался мой путь в IT. В 2017-2018 на рынке труда был переизбыток джунов, и некоторые эксперты заявляли, что на одну Junior вакансию может приходиться аж до 700 откликов! Естественно, это не повсеместно и один джун откликается ещё на несколько десятков вакансий. Но всё равно, конкурс был большой. Это впоследствии подтверждали те из коллег, кто трудоустраивался на свою первую работу в эти годы. В это же время был ощутимый дефицит Middle специалистов и стали появляться курсы, которые утверждали, что сразу стать Мидлом реально. Я подумал, что за этим маркетинговым ходом всё же есть что-то рациональное и поэтому решил, что нужно попытаться сразу поднять планку компетенции выше уровня Junior, считая, что даже если по скиллам не буду соответствовать Middle, те знания, которые приобрету, чтобы его достичь всё равно будут весомым преимуществом среди других соискателей, что позволит легче пройти собеседование и трудоустроиться. 1. Учебники. Я так называю книги, которые содержат теорию, примеры, всё объясняется очень доступно, подробно и по ним удобно заниматься. Ярким примером такового я считаю «Изучаем Java» Кэти Сьерра, Берт Бэйтс. Она же Java Head First. 2. Пособия. Так я называю те книги, которые содержат много дельной информации, описание, примеры, но в отличие от учебников по ним крайне сложно заниматься и лучше их рассматривать больше, как вспомогательные учебные материалы. К таковым отношу Java SE 9 Базовый курс и Java SE 9 Вводный курс Кея Хорстманна. В конце статьи я прилагаю перечень литературы, по которой учился сам и рекомендую другим. 3. Видеолекции. На просторах Youtube и других платформ есть куча циклов видеолекций, которые в максимально удобоваримом формате позволяют въехать в курс дела и местами даже более доступны для понимания, чем учебники и пособия. Хотел бы выделить канал Алишева @alishevN, Школу ITProger @itproger и Уроки Java @husivm 4. Тренажёры. Это курсы, в которых проверка задачи происходит в автоматическом режиме, нацеленные, в основном, на практику, где теория хоть и есть, но по сути является вторичной: 4.1 JavaRush – наверное, самый популярный ресурс среди прочих подобных, на котором недавно также появился свой полноценный курс. 4.2. Stepik – очень хорошие мини-курсы с тренажёрами и мини-лекциями по Java. Особенно хороши курсы по SQL, помогающие быстрее набить руку в написании запросов.  4.3. LeetCode – ваш помощник по решению алгоритмических задач. 5. Полноценные курсы. Образовательные платформы предлагают обучение «профессии» Java разработчика от 6 до 15 месяцев. Многие из них как раз и заявляют, что сделают из соискателя сразу мидла. Самое главное отличие от тренажеров: проверка домашних работ учителем, которому если что можно задать вопрос.До трудоустройства я проходил таких два: 5.1. SkillBox, «Java-разработчик (архив)». Так получилось, что я попал в тот момент, когда курс задеприкейтили. Дело в том, что выпускной работой, над которой приходилось корпеть в течение всего курса, было создание клиента Телеграма – Javagram, для написания которого нужно было изучать Swing что было практически бесполезно для бэкэндера в 2020-м. В определённый момент времени Javagram стало пилить крайне сложно, API телеги менялось, курс отправили в архив и создали новый, который куда лучше, но я уже в него не попал, а в старом завяз, так и не пройдя до конца. От тех, кто проходил уже новый курс слышал, что он крайне неплох, но я, увы, это не могу оценить. 5.2 JavaOnlineProjects, «Topjava». В него я попал автоматически после тестового задания на 36-м уровне в JavaRush. На мой взгляд, самое лучшее по соотношению цена/качество что есть на рынке. По окончанию курса в моём портфолио было 2 проекта на самом востребованном стеке Spring’а. Его я рекомендовал и рекомендую всем, но с одной оговоркой. Мне, как и большинству ребят, кто его проходил, он показался довольно сложным, что на самом деле отчасти хорошо, потому как когда что-то даётся с трудом, усвоение материала идёт лучше.Тем ни менее, без должной подготовки многие сливаются и идут на повтор, либо вообще не доходят до конца. Лучшим способом этого избежать – это пройти JavaRush до конца, изучив все материалы и разделы, взять ещё несколько курсов из JavaOPs, либо аналогичные от другой платформы. 6. Статьи на Хабре. Особенно полезны и интересны статьи образовательных компаний и преподавателей курсов. В некоторых таких статьях вынесены почти полностью лекции, которые преподаются на курсах платформы. Хотя очень часто люди и не относящиеся к каким-то образовательным компаниям пишут крайне хорошие статьи для новичков. Например, вот эта. В 2018-м я начал изучать Java по учебникам: выполнял каждое упражнение, писал каждый код, что встречал. Видеолекции обычно включал фоном при возможности. В 2019-м продолжал учиться, стал кодить на тренажёрах, купил подписку на JavaRush. В 2020-м учебники сменились пособиями, созрел и взял курс в SkillBox. В 2021-м комбинировал разные практики в обучении и проходил стажировку в JavaOPS и доводил свою компетенцию до уровня Middle. У меня был дефицит времени, поэтому на обучение у меня уходило приблизительно 1-2 часа в день на всех этапах, кроме стажировки. Её совмещать с работой я не мог, поэтому пришлось уволиться, зато на стажировку и параллельное обучение у меня уходило по 5-6 и более часов в день. Если брать только период активности, то при вышеупомянутых 1-2 часах занятий в день у меня ушло на всё про всё где-то 3 года. При должном наличии времени занимаясь по 2-4 часа в день, данный путь можно спокойно осилить за 1,5 года. Бытует мнение, что современное собеседование это не про работу, а больше похоже на викторину. Такое отношение очень полезно, чтобы сэкономить себе нервы и если мы говорим о таких конторах как Яндекс, то это почти так и есть, но есть и много других, в которых собеседование проводят люди, которые заинтересованы получить себе в команду не победителя викторины, а человека, с которым им было бы комфортно работать и который бы справлялся со своими задачами самостоятельно – именно таким человеком я и старался стать. В резюме я не накручивал опыт, но стажировку указывал как первый опыт работы, что считаю правильным, естественно не скрывая при этом, что опыт не был коммерческим. Старался быть кратким и не лить воды, придерживаясь мнения, что резюме должно умещаться на одной странице. Обычно это было стандартное CRUD Spring Boot приложение с некой БД. В этом не видел ничего сложного и страшного и если был заинтересован в вакансии, то всегда выполнял его. С тем уровнем практики, который у меня сложился при таком обучении на выполнение задания обычно уходит 1-3 дня. Самый распространённый способ проверки знаний интервьюера в форме вопрос-ответ.Когда не бежишь галопом по Европам, а все знания укладываются долго и структурированно, то и подготовка к ней занимает всего несколько дней. Есть ресурсы для подготовки вроде https://github.com/enhorse/java-interview Но самое главное – это не столько ресурсы, сколько уверенное знание и понимание всех основных и ключевых моментов в Java и фреймворках и создание своего собственного мини-конспекта для подготовки.  Обычно задачка на несколько строк кода, предусматривающая знание работы JVM. Что будет выведено, упадёт ли приложение с ошибкой и тд… Обычная вещь на интервью в Яндекс, но данную практику стали перенимать и другие работодатели. Так что рекомендую к этому подготовиться. Лучший ресурс для этого – LeetCode. Для этого рекомендую учебник по SQL и тренажёры. Плюс ещё есть «шпаргалки», где вся информация о запросах очень коротко и популярно описана. Такие часто бывают и их главная цель понять, как будет действовать интервьюируемый, как он будет пытаться решить аналогичную уже на работе. Из 10 собеседований, пройдённых за пару недель, я получил оффер по половине почти сразу и ещё один прилетел в течение месяца. Если не считать первые два блина комом, то самое минимальное как меня оценивали – это Junior+ (подчеркнув, что это только лишь из-за отсутствия коммерческого опыта), на всех остальных меня оценили как мидла! Я выбрал дочернюю фирму крупной российской корпорации, в одну из команд которой искали замену ушедшему одному из трёх Джава разработчиков. Когда я спрашивал потом, почему из всех претендентов выбрали именно меня, сказали, что из множества претендентов «я был на голову выше остальных». Взяли меня именно Middle Java разработчиком. Мне обещали (более того, это даже прописали в трудовом договоре) возможности роста, бесплатное обучение, выполнение работы «с минимальной помощью ментора» и кучу других фишек. Поэтому зарплатные ожидания я занизил, что было моей ошибкой, и лишь потом узнал, что мог просить в 1,7 раза больше! (верхний порог моей вилки). Онбординг был классный, но, когда я вышел после него, оказалось, что вслед за разработчиком, на место которого я устраивался, уволились и остальные два Джависта. Оказывается, ещё год назад в команде было всего 5 разрабов, но не находя общий язык с начальством, все они ушли один за другим. Я остался единственным разработчиком в команде с владельцем продукта и ещё двумя аналитиками. А через пару месяцев должен был быть релиз первой версии ещё сырого продукта, который пилили уже больше года. Мои коллеги мидлы из других компаний и подразделений, с которыми я познакомился во время онбординга были в шоке. Друзья и знакомые рекомендовали сразу писать заявление и уходить. Но я не уволился, чтобы не подводить тех, кто остался в команде и доказать, в первую очередь себе, что стал мидлом не только по оценке на собеседовании и графе текущей должности. И я сдюжил, хоть и было нелегко. Уже через несколько месяцев нам дали зелёный свет, и я уже был по другую сторону собеседования, чтобы набрать себе в помощь ещё двух ребят. Спустя два года после трудоустройства был сделан новый функционал, сдано ещё несколько релизов, проект был допилен, отшлифован и теперь я уже мог спокойно его покинуть. Перед увольнением высказал пожелание, чтобы вместо меня выделили ставку и наконец‑то взяли Сеньора в команду, на что владелец продукта крайне удивился: «А ты разве не Сеньор?». Это мне придало сил и уверенности и им я как раз и собираюсь в ближайшее время стать, но для этого надо учиться, учиться и ещё раз учиться. О том, что не ушёл в трудную минуту, не жалею, это был очень хороший опыт. Тех, кто это сделал до меня тоже не виню. Потому что действительно на себе ощутил ту ситуацию, в которой они отчасти были: проблемы с повышением грейда и ЗП (помимо корректировок по инфляции) То нет ставки, то кормят завтраками, то вот уже договорились, но меняется руководитель, потом руководитель руководителя, то всех переводят из одной структуры в другую и, в связи с этим все значатся в новой должности и невозможно никак повысить, потому что в системе это можно делать не ранее чем через полгода после того, как вступил в новую должность. Та же самая проблема была с обучением, которое я так и не мог получить и приходилось брать курсы уже за свои деньги. Вот так я решил изначально стать Middle Java разработчиком, закончил курс, автор которого не безосновательно утверждал, что готовит именно Middle разработчиков, после был оценён как Middle на собеседовании, официально им трудоустроился, что было прописано в личном профиле, и в этой роли, по сути, в проекте и оказался, когда как единственный разработчик решал задачи самостоятельно и принимал небольшие проектные решения. Задавался вопросом, а быть может надо было пытаться пройти стажировку и трудоустроиться Junior разработчиком раньше, а через пару лет опыта как раз бы и пришёл к Middle разработчику? — Возможно. Знаю коллегу, который завершил ту же самую стажировку что и я и устроился в ту же фирму, что и я, но вот уже прошло почти 2 года, а он всё ещё Junior Java разработчик.Так что не всё так однозначно. Нет никаких непреодолимых препятствий для того, чтобы стать разработчиком!: Дефицит времени не делает цель недостижимой, он просто отодвигает её во времени. «Нет времени» зачастую просто отговорка. Я знаю людей, у которых по 2-е, 3-е детей, из которых есть совсем маленькие карапузы, требующие много времени и внимания. Но даже это их не останавливало, и они всё равно находили время для того, чтобы учиться. Возраст тоже не является барьером. У меня в потоке на курсе было двое студентов, которых взяли на их первую работу джунами в 46 и 47 лет, и я уверен, что это не предел! Расположение тоже не помеха, сейчас есть удалённые вакансии и даже переезжать никуда не нужно, что тоже на самом деле при большом желании не является преградой. Не хочу быть неправильно понятым. Непреодолимых препятствий хоть и нет, но получается, увы, не у всех. Помимо желания стать разработчиком нужно обладать ещё упорством, целеустремлённостью, способностями и мотивацией. Не говоря уже о том, что то, чем человек занимается должно как минимум нравиться. Отчасти из‑за этого до конца курсов доходят не все. Недавно подсчитал, из 13 моих друзей и знакомых, которые мне говорили, что хотят стать разработчиками, только половина начала обучение, а до трудоустройства дошёл пока только один. 1. Первоначально понять, а действительно ли хочется быть разработчиком, ведь в IT есть не только программисты. 2. Если да, то определиться с областью, в которой хочется вести разработку. (front, back, gamedev, …) 3. Не покупать сразу курсы за OverДохрена денег, а приобрести учебник «для начинающих», «для чайников», «за 24 часа» и просто попробуйте. Если понравилось – Ваше. Есть сомнения – Нет. 4. Ознакомиться, какие есть RoadMap’ы, понять, какой должен быть путь обучения, взять уже имеющуюся, либо откорректировать и сделать свою. 5. Использовать любую возможность писать код по учебнику и в тренажёрах, учить теорию: установить на смартфон JavaRush, Stepik, Sololearn, фоном включать лекции, когда есть возможность, с собой носить учебник или хотя бы Карманный справочник, брать его в поездки. 6. Выучить основы Git’а, зарегаться на ГитХабе и начать уже писать код и выкладывать его. 7. Выбрать курсы с умом. В хорошем курсе помимо лекций и достаточных учебных материалов должна быть проверка домашних заданий, возможность задать вопрос и самое главное, в его лекциях и выпускной работе должен быть востребованный стек технологий, который легко гуглится среди вакансий на hh.ru и Хабр Карьере. 8. Если оценивают как мидла – проси ЗП как у мидла! 9. При подготовке к собеседованию лучше самому вести конспект из наиболее сложных вопросов и тех, которые вызывали затруднение на предыдущих интервью. 10. Зачастую соискатели в резюме и на собеседованиях пытаются создать такой образ, которому и близко не соответствуют: приписывают несуществующий опыт, навыки и знания. Я всегда считал куда лучшей практикой и в резюме, и на собеседовании пытаться максимально быть честным и, если ещё с чем-то не сталкивался и не знаешь, честно признаваться в этом и стремиться всегда соответствовать тому образу, который заявлял, иначе это может сыграть против тебя. Рынок постоянно меняется. Бум курсов и автоматизации многих процессов разработки постепенно сводит на нет дефицит людей с навыками уровня Junior. И на этом фоне, на мой взгляд, люди с навыками уровня Middle, даже если у них нет как такового опыта работы, будут в разы более востребованы. Java 9 (8) для чайников | Барри Берд - Книга именно для тех, кто вообще ничего не знает о программировании. Всё очень хорошо и доходчиво объясняется и разжёвывается. Изучаем Java | Кэти Сьерра, Берт Бэйтс. Она же Java Head First. – Это, пожалуй, лучший учебник, который не даст скучать: Пазлы, ребусы, задания и всё для наилучшего понимания и усвоения материала. Java для всех (Программирование на Java для начинающих) | Алексей Васильев – Не так всё разжёвывается, как в предыдущем, но оригинал книги автор писал на русском, что ликвидирует возможные косяки перевода. Плюс немного больше материала. Java за 24 часа | Кейденхед Роджерс – Прекрасный учебник. Несмотря на хайповое название действительно содержит кучу приличных и интересных вещей. Java SE 9 (8) Базовый курс | Кей Хорстманн – Книги содержат все моменты теории Java и хорошо и лаконично её описывают. Ничего лишнего. Java SE 9(8) Вводный курс | Кей Хорстманн – Книги содержат все моменты теории Java которые появились именно начиная с 8-й версии. Java Concurrency на практике | Брайан Гетц – Однозначно лучшее пособие по многопоточности в Java. SQL для чайников | Аллен Тейлор – Из той же серии, что и Java 9 (8) для чайников. Доступно крайне простым языком. Spring Boot 2.0 | Фелипе Гутьеррес – На мой взгляд, это лучшая книга по Spring Boot с примерами для быстрого старта. Spring 6 (5) для профессионалов | Юлия Козмина и другие – полное, хоть и не исчерпывающее, руководство по Спрингу. Единственное, в виду некачественного перевода, без слёз её читать на русском нельзя. Лучше пользоваться оригиналом. Паттерны объектно-ориентированного проектирования | Банда четырёх. – Самая базовая и известная книга про шаблоны проектирования. Java 8 Карманный справочник | Роберт и Патрисиа Лиугуори – очень полезная вещь, но не как справочник, а как краткий конспект для подготовки к собеседованию. Java. Эффективное программирование | Джошуа Блох – это вообще классика, которая должна быть в библиотеке любого Java разработчика.  Разработчик