Руководство по вкатыванию в backend-разработку на Java для почти начинающих и сочувствующих

 Публичный пост
5 июля 2021  16836

Дисклеймер:

  • В руководстве рассматривается развитие Java backend-разработчика.
  • Руководство написано исходя из того, что читатель не полный новичок в CS и у него есть базовые знания.
  • Руководство написано во множественном лице, потому что автор надеется на коллективное развитие данного пособия

Предисловие

Привет. Ты начинаешь читать довольно большое (20 страниц (!)), руководство по вкатыванию в серверную разработку на Java.

Я очень долгое время работал простым 1С-программистом, но в конце концов выгорел и решил попробовать себя в чем-то другом. Выбор пал на Java, и после 1.5 лет самостоятельного обучения я получил долгожданный оффер.

На текущий момент это руководство представляет собой компиляцию того, что я читал и проходил, советов более опытных коллег и просто моих ощущений. Я не могу гарантировать, что весь текст на 100% полезный, но надеюсь, что он сможет помочь людям хотя бы составить представление из того, что им понадобится в их нелегкой, но весьма интересной профессии.

Оригинальный текст руководства доступен в моем гитхаб репозитории. Распространяется под свободной лицензией, можете делать с ним, что хотите 😉

И так, погнали.

Почему Java?

Первый вопрос который сразу приходит в голову, когда выбираешь язык. На это есть целый ряд причин:

  1. Огромная база кода. Если ты хочешь что-то сделать, с большой вероятностью для этого уже есть библиотека;
  2. Отличная документация. Подробнейшее описание API языка (Javadoc), дотошно описанная спецификация самого языка (JLS) и спецификация модели памяти (JMM) добавляют уверенности, что если у тебя появился вопрос: «Как это работает?» или «Почему это работает именно так?» — на него получится найти ответ;
  3. Гибкость. Java это не только язык, но и JVM платформа. С использованием этой платформы написаны, например, Kotlin (привет, Android), Scala (привет, ФинТех) и Clojure (привет, эээ, страдание?). Всё это позволяет нам, оседлав Java и потратив некоторое время, дрейфовать в сторону той предметной области, которая наиболее интересна;
  4. Сообщество. Если у вас появился вопрос, на него, скорее всего, ответили ещё в 2010. Если у тебя появилась гениальная идея проекта, на гитхабе, вероятно, уже есть десяток различных реализаций. Новичкам всегда радостно помогут советами прочитать, наконец, Javadoc;
  5. Карьерные возможности. Java повсюду: backend, mobile, desktop (нет, он не умер). Без работы точно не останешься.

Есть и ворох недостатков:

  1. Многословность. Java многословна. То, что сейчас в пайтоне занимает одну строку, в Java займёт 10. Не такой большой минус в современном мире, где есть Intellij и автодополнение, плюс в язык добавляются модные фичи вроде var . К тому же в языках вроде Kotlin или Scala можно писать достаточно компактный код;
  2. Обилие устаревшего кода. Java появилась в 1995 году, и с тех пор было написано много кода. Чертовски много. Всё это нужно поддерживать, развивать и лелеять, так как бизнес очень не любит тратить деньги. Например Java 8 вышла в 2014 году, а согласно опросу JetBrains в 2020 году, её доля составляет 75%! Так что, залетев на работу, с высокой долей вероятности ты будешь писать на старой версии, в которой нет современного сахара, увы;
  3. Ограниченная сфера применения. В современном мире Java по настоящему блистает в качестве backend-языка. Да, ты можешь писать mobile, но там развивается Kotlin. Да, ты можешь писать desktop, но люди выбирают Electron. Локомотив хайпа находится в вебе, поэтому мы садимся именно в него.

Обучение

Если хорошенько поискать, можно найти десятки статей о том, какие книги лучше читать и какие курсы лучше проходить. Заботливые люди рисуют дорожные карты и, казалось бы, просто бери и следуй гайдам. Но проблема в том, что их слишком много! Современный мир backend-разработки требует от тебя разбираться в куче вещей, и простой человек Василий, попробовав во всём этом разобраться, очень скоро почувствует беспомощность, грусть и отчаяние.

Однако, всё не так страшно. Учиться придется действительно очень много, однако мы отобрали только самые лучшие зёрна материалы.

Подготовка к подготовке

Перед обучением тебе понадобится:

  • Установка Java. Бери всегда самую свежую версию. Даже если на работе будешь писать на восьмерке, всегда стоит держать руку на пульсе и быть в курсе всех современных Java фишек.

  • Среда разработки. Используй intellij IDEA Community, скажешь спасибо потом. Из альтернатив есть:

    • Eclipse. Старый, неудобный, но ещё относительно популярный в некоторых местах;
    • VS Code. Это не IDE, но хороший редактор кода, который обвешивают кучей плагинов;
    • NetBeans. Когда-то очень давно была популярна, сейчас используется только теми, кто случайно скачал инсталлятор.
  • Знакомство с Git. Гит — система контроля версий. Если ты когда-нибудь слышал слова "коммиты", "ветки" и "PR" — это оно. Для начала хватит простого гайда, чтобы понимать базовые термины. Потом стоит почитать документацию к своей IDE. IDEA, например, поддерживает работу с гит из коробки.

  • Профиль на GitHub. Гитхаб — это такая социальная сеть для разработчиков. Ставь лайки библиотекам, которые используешь, и изучай тренды. Не стесняйся выкладывать туда все свои мелкие проекты, только не забывай про Readme. Потом будешь рад, когда будешь искать проект, в котором ты делал работающие аспекты или работу с авторизацией.

  • Ведение заметок. Очень важный пункт. Тебе предстоит поглощать огромное количество информации, большую часть которой ты забудешь уже на следующий день. Чтобы помочь своему мозгу, начни вести заметки по методике ZettelKasten, например, в notion.io https://habr.com/ru/post/509756/.

  • Будь в курсе. Java активно развивается. Чтобы не остаться в стороне от важных новостей, ты должен читать эти новости. Начни с подписки на ежемесячную подборку Java Annotated и не стесняйся подписываться на интересных авторов.

Java Core Base

Java Core — это основа понимания языка и представление о его возможностях, работающих «из коробки». Так как это фундамент, подойти к его формированию стоит очень ответственно, чтобы не страдать позже и не пытаться изобрести велосипед. Не стоит пытаться сэкономить время, хитрить или пропускать «неинтересные» куски. Поверь, уверенная база тебе воздастся в будущем, ибо на собеседованиях гоняют в основном по Core.

Курсы

Помни, что ни один из курсов не дает полную базу. Используй их как дополнение к книгам.

Туториалы от Oracle

Oracle является разработчиком языка и предоставляет собственные обучающие материалы, довольно неплохого качества. Ещё и бесплатно. Из минусов: рассматривается java 8, и некоторые темы рассмотрены очень сжато. Но всё равно обязательно загляни, там много интересного.

JavaRush

В странах СНГ и Украине весьма популярен великий и ужасный JavaRush. Интернет пестрит историями успеха, как простой слесарь Григорий стал успешным и теперь зарабатывает 300кк/наносек. Тысячи практических задач! Сотни тысяч пользователей! За какие-то смешные деньги ты сможешь полностью изменить свою жизнь!

Так вот, ни в коем случае на это не ведись. JavaRush очень сильно страдает отрывочной подачей теории, из-за чего люди застревают даже на простых задачках. Задумайся, при написании технической книги она проходит множество стадий вычитки и рецензирования. На JavaRush таким, понятное дело, никто не занимается. Не трать зря время, деньги и нервы, и представь, что такого сайта просто не существует. Даже если ты знаешь человека, который знает человека, который сказал, что там всё круто.

Stepik

Агрегатор курсов от различных авторов, разной степени качества. Из того, что смотрел сам, могу посоветовать Java. Базовый курс.

HyperSkill (JetBrains Academy)

Совместный проект Stepik и JetBrains. Содержит треки (курсы) по разным языкам: Python, Java, Kotlin, JS.

Обучение ведется в разрезе мини-проектов: выбираете проект определенной сложности (от консольных крестиков-ноликов до интеграций со Spotify и веб-приложений), который разбивается на несколько стадий. По каждой стадии дается набор теории, по теории проходятся мелкие задачки. Кто-то скажет, что весьма смахивает на JavaRush, но отличие в качестве материала. Часть берется со Stepik, часть создают сами с модерированием и предварительной бетой.

Тем у них ОЧЕНЬ много, от Java Core до математики и алгоритмов. Core описан очень хорошо, остальные похрамывают.

Материал полностью на «русском английском», так что читать его несложно, но иногда не понятно, что пытался сказать автор. Платный, можно получить три месяца бесплатного триала, потом по $249 в год.

Из минусов, очень задумчивый интерфейс, некоторые проекты крайне скудны на описание некоторые тесты приходится «хакать» из-за непонятной логики проверки. В остальном, идеальный вариант для механического прорешивания простых задачек.

YouTube

Тысячи индусов и сочувствующих готовы прийти на помощь. Заманивают бесплатностью и объемом материалов, но помни про устаревание и что за адекватность материала отвечает только сам автор. Из курсов на русском многие советуют Алишева, не смотрел не могу оценить. Зато абсолютно точно могу рекомендовать бесплатный курс Тагира Валеева, весна 2020. Туть

Тагир широко известный во всем мире джавист, работает в JetBrains, является Java чемпионом (да, это реальное звание). В курсе очень хорошо проходит по кишочкам языка, может тяжеловато заходить, поэтому параллельно шлифуй другими материалами. Но курс постарайся прослушать полностью, оно того стоит.

Udemy

Обрати внимание на курс от Tim Buchalka, вот здесь. Он очень хорошо и подробно разжевывает Java в серии небольших видео, общей длительностью около 80 часов. Даже упражнения после тем есть. Говорит с австралийским акцентом, но есть английские субтитры, так что рекомендую. Эдакий видео Шилдт по подробности материала. На цены в 10к+ рублей не смотри, на Udemy постоянно идут распродажи со скидками в 80-90%. Так что если видишь полный прайс, просто добавь вишлист и подожди пару недель. Скинут до 1.5к рублей, всегда скидывают.

Книги

Лучше всего читать на английском, но можно и переводы. Помни, что переводы зачастую являются устаревшими и ВНЕЗАПНО труднее читаются, из-за того, что одни и те же термины в разных книгах могут переводить по разному.

Герберт Шилдт, Java. Полное руководство и Java. Руководство для начинающих

«Полное руководство» это увесистый том на 1.5к страниц, который с трудом помещается в руках. Бери его если у есть безответная любовь к справочникам или если вы любишь максимально дотошное описание API языка. Если нет, бери «Руководство для начинающих», которое в два раза короче и наслаждайся подробным описанием языка без километровых описаний API. Имей в виду, что в руководстве для начинающих не освещены «продвинутые» темы, так что сверься с содержанием.

Джошуа Блох, Java. Эффективное программирование

Книга которую обязательно стоит прочитать после Хорстманна и Шилдта, и регулярно перечитывать. Блох один из создателей языка, и в своей книге описал best practice: правильное написание equals и hashCode, как правильно готовить generics, почему лямбды это хорошо и многое другое. Написано доступно, читается легко.

(Опционально) Кей Хорстманн, Java. Библиотека профессионала, Том 1. Основы

Хорстманн пишет более сухо и сжато чем Шилдт, некоторые моменты описаны более на «низком» уровне (объяснения как оно устроено внутри). Пестрит вставками сравнениями с С++. Ваш выбор если уже есть/был опыт других языков и нет потребности в разжевывании материала.

(Опционально) Кэти Сьерра и Берт Бейтс, Изучаем Java (Head First Java)

Если ты начал читать Шилдта и всё равно чувствуешь, что ничего не понимаешь, попробуй эту книгу. Написано максимально простым языком, много картинок. После её прочтения в голове должна сложиться простая мозаика, что позволит вернуться к более «взрослым» книгам.

Упражнения

Теория это замечательно, но нужно постоянно писать код. Лучшие места для этого:

  1. Задачки и проекты HyperSkill. Много хороших и разных, но платно;
  2. CodeWars. Ориентируйся на уровень сложности 8-7kyu, можно 6kyu но может оказаться сложно;
  3. CodingBat. Элементарные задачки на уровне первого курса университета;
  4. HackerRank. Выбираешь Java, выбираешь Easy, прорешиваешь.

Что делать если возникли вопросы?

Не знаешь как разбить строку на символы? Не помнишь как прочитать текст из файла? Забыл как быстро можно отсортировать массив? Со всем этим помогут следующие ресурсы:

  1. Javadoc. Подробное описание API языка. Хочешь сделать что-то со строкой? Загляни в Javadoc класса String. Хочешь сделать что-то с массивом? Загляни в javadoc класса Arrays. Javadoc это первое место куда ты должен идти при любом вопросе. Не знаешь с какого класса начать поиск? Просто вбей в поиск что-то вроде Java split word javadoc и с высокой долей вероятности, первые строчки будут вести на нужный класс;
  2. StackOverflow. Самый популярный ресурс для копипаста кода и ответов на твои вопросы. Являются ли строки в Java иммутабельными? Что такое знак джокера? Что такое PECS? На всё это ты сможешь найти ответ благодаря сообществу StackOverflow, вбив в поиск что-то вродеJava pecs stackoverflow
  3. Baeldung. Сборник статей и рецептов на все случаи жизни. Что нового в Java 16? Какими способами можно сортировать List? Чем отличается ArrayList от LinkedList? Скорее всего про это уже есть статьи на baeldung.
  4. Telegram. Если твой поиск не увенчался успехом, и ты готов опустить руки, приходи к живым, русскоговорящим людям и попроси помощи. Тут не решат за тебя твои задачи, но помогут с направлением копания.

Подведение итогов Core

Итак, ты прошел/посмотрел курсы, прочитал базовые книги и даже прорешал кучу упражнений. Чувствуешь себя уверенно и даже расправил плечи? Самое время поиграть в карточки. Есть отличный гитхаб репозиторий в котором есть куча популярных вопросов на собеседованиях. Сейчас тебе стоит обратить внимание на:

  1. ООП
  2. Java Core
  3. Java Collections Framework
  4. Java 8

Не ленись занести вопросы в карточки Anki или распечатать в бумажном виде. Повторяй на регулярной основе, но помни, что твоя задача не заучить их механически, но научиться приходить к ответам логическим путем. Когда придешь на собеседование и будешь трястись от нервов и пить воду шумными глотками, все твои зубрежки вылетят из головы, но понимание материала никуда не денется.

Java Core Advanced

Итак, ты уже уверенно владеешь базовыми средствами языка. Без проблем решаешь базовые задачи, знаешь состав CollectionsFramework, понимаешь отличие HashMap от TreeMap и даже знаешь что есть стримы и есть другие стримы. Самое время нырнуть в Core ещё глубже.

Книги

Рауль Урма, Марио Фуско, Алан Майкрофт. Современный язык Java

Выход Java 8 изменил экосистему Java навсегда. Stream API, default методы, лямбды, без этих вещей невозможно представить современную Java разработку. В этой книге подробно описаны все киллер фичи Java 8. Некоторые моменты, вроде конкурентности могут быть непонятными, но обязательно вернись к ним позже.

Обрати внимание, в русском переводе есть проблема с перепутанными примерами кода в первых главах.

Брайан Гетц. Java Concurrency на практике

Современный web это высокие нагрузки, тысячи клиентов, и терабайты данных. Чтобы твоё приложение могло утилизировать ресурсы сервера по максимуму, ты должен сдать джедаем конкурентного/параллельного программирования. Эта книга must read абсолютно для всех разработчиков. Несмотря на то, что она написана для Java 5, все её советы актуальны и по сей день. Может читаться тяжело, но прочитать ты её обязан.

Адитья Бхаргава. Грокаем алогритмы

По поводу того когда лучше знакомиться с алгоритмами ведутся бесконечные диспуты. Наше мнение — каждый решает сам для себя. Но конкретно эту книгу лучше прочитать пораньше. Она в интересной форме расскажет про базовые термины вроде сложности алгоритмов, познакомит тебя с некоторыми видами сортировок и прочими интересными штуками. Звучит сложно, но поверь, это именно та книга, который может вызвать у тебя любовь к алгоритмам.

(Опционально) Роберт Лафоре. Структуры данных и алгоритмы Java

Многие критикуют данную книгу из-за странного стиля кода и занудной подачи материала, но если вдруг тебе захотелось копнуть алгоритмы чуть поглубже, можешь попробовать.

(Опционально) Николай Палрог. Система модулей Java

Одной из ключевых фишек Java 9, стала новая система модулей, которая позволяет получить абстракцию над привычными пакетами и получить более сильную инкапсуляцию классов. Её весьма неохотно используют (в основном из-за лени и легаси), но уметь готовить модули будет приятным бонусом к твоим навыкам.

(Опционально) Кен Коузен. Современный Java. Рецепты программирования

Практически всё тоже, что в книге Урмы, только как сборник кратких рецептов: как использовать коллекторы, компараторы и потоки. Всё это с небольшими понятными примерами. Книга весьма хороша как краткая выжимка-handbook.

Паттерны

Многие проблемы, которые возникают при разработке приложений появляются из-за ошибок допущенных при проектировании. Умные люди выявили повторяющиеся из проекта в проект решения и закономерности (паттерны) и сделали их классификацию. Почему важно их знать? Паттерны описывают типичные способы решения часто встречающихся проблем при проектировании программ, что позволяет тебе не изобретать велосипед, а твоим коллегам гораздо быстрее понимать, что происходит в коде.

Паттернов много, хороших и разных, но зубрить их не надо. Пробегись по списку, посмотри на те которые тебя заинтересуют. На текущем этапе твоя задача оставить якорь в памяти, что такие вещи существуют.

Из ресурсов по паттернам можно выделить:

  1. Refactoring guru. Модно, молодежно, доступный язык.
  2. Design Patterns: Elements of Reusable Object-Oriented Software (GoF) — сухой академический оригинал, сможешь осилить — хорошо, не сможешь — используй другие источники.

Упражнения

Подойдут всё те же сайты которые были на прошлом этапе, но уже с более высокой сложностью. Старайся решать задачи с использованием «современных» функциональных фишек Java: Stream API и лямбды.

Подведение итогов Advanced Core

Помнишь те карточки которые ты поленился сделать на прошлом этапе? Самое время добавить новые:

  1. Потоки ввода-вывода в Java
  2. Сериализация
  3. Многопоточность
  4. Шаблоны проектирования

Вступаем во взрослый мир

Если ты добрался до этого пункта, мы мысленно пожимаем тебе руку. Осилить такое количество материала и не сдаться, достойно уважения. Но наше путешествие продолжается. Имей в виду, что если Core ты должен знать назубок, то знание всего ниже перечисленного может варьироваться от базового до нормального. Полностью прокачаться можно, увы, только на реальной работе.

Web подготовка

Как ни странно, для того чтобы стать хорошим web разработчиком, необходимо хорошо разбираться в самой этой самой паутине. И хотя базу обычно дают в университете, убедись, что ты помнишь, что такое JSON, чем RESTful API отличается от SOAP, какие бывают HTTP методы и прочие базовые штуки. Дальше по тексту подразумеваем, что ты не впадешь в ступор от слова "endpoint".

Системы сборки

Современные приложения редко состоят из парочки классов которые запускаются из среды разработки. Работа с зависимостями твоего проекта, его сборка/упаковка, всё это ответственность систем сборки. Они берут на себя нудную и иногда тяжелую работу, чтобы твой проект на развалился под грузом JAR hell. На момент 2021 года, в Java есть две наиболее популярных системы сборки:

  1. Gradle. Модно, молодежно, инкрементальная компиляция, описание билд файла на Groovy или Kotlin DSL. Быстрый старт здесь.
  2. Maven. Почти нестареющая классика. Описание билда файла на XML, есть множество плагинов на любой вкус, расширяющие стандартную функциональность. Быстрый старт здесь.

Попробуй оба варианта, останься на том который тебе больше нравится. С этого момента все твои проекты должны собираться только с использованием выбранной тобой системой сборки. Они используются в любом реальном проекте, и ты должен уметь такие проекты открывать, дорабатывать и собирать.

Тестирование

Ты можешь быть уверенным в качестве своего кода, но ещё больше уверенности тебе даст покрытие своего кода тестами. Тестирование это отдельная крупная тема для разговора. Наиболее популярным фреймворком для тестирования является JUnit. Начать своё погружение в увлекательный мир тестирования ты можешь

Логирование

Чем крупнее твоё приложение, тем больше возникает необходимость понимать, что за процессы в нем происходят. Отладка возникающих ошибок, сбор статистики и многое другое практически невозможно без наличия логов. С системами логирования в Java всё очень плохо. Их много, у них разный подход к конфигурации, а ещё они могут связываться друг с другом в забавных франкенштейнов. Из наиболее популярного, обрати внимание на:

  • Logback
  • Log4j2
  • JBoss logging

Проще всего будет настроить SLF4J Simple по этому мануалу. Сам SLF4J это фасад для движков логирования, вроде тех, что мы перечислили выше, но в нем есть возможность подключить небольшой встроенный движок, который отлично закроет твои начальные потребности. И помни, с этого момента в твоём коде не должно быть ни одного System.out.println только взрослое логирование.

SQL

Современный web мир невозможен без данных, а где данные, там и базы данных. Тебе нужно понимать синтаксис SQL и уметь писать на нем запросы. В этом тебе поможет:

  1. Туториал от W3Schools
  2. Книга Алана Бьюли «Изучаем SQL»
  3. Прорешивание задачек на SQL-EX
  4. Если у тебя есть доступ к HyperSkill, пройди раздел «Databases and SQL» вот тут.

Становится джедаем запросов не надо, но у тебя должно сложиться понимание как ты можешь вертеть данные на своей будущей БД.

Базы данных

После того как ты овладел SQL, самое время подключить к своему приложению настоящую базу данных. Систем управления базой данных великое множество, на начальном этапе обрати внимание на:

  1. PostgreSQL/MySQL — классические реляционные СУБД;
  2. H2 — легковесная in memory СУБД, хорошо подойдет для твоих небольших проектов;
  3. MongoDB — популярная NoSQL СУБД

Читать многотомные руководства, на начальном пути обучения, по ним не потребуется. Для начала тебе будет достаточно знать как установить СУБД и как заглянуть внутрь табличек.

JDBC

Итак, у тебя появилась база данных, теперь ты хочешь трогать её данные прямо из своего уютного кода. Тут на помощь придёт добрый дедушка JDBC. JDBC — это такое относительно низкоуровневое API (довольно старое, но супер надежное), которое предоставляет тебе возможность работать с твоей базой данной прямо из кода. Открываешь соединения, пишешь ручками запросы, отправляешь запрос на исполнение, получаешь выборку с результатами. Получается много кода, куча лапши try-catch, зато весьма производительно и гибко. В современном мире люди обычно пользуются инструментами более высокого уровня, типа Spring Data, но не стоит забывать наши корни. Поэтому ознакомься на досуге с бесплатным руководством Oracle: JDBC Basics

ORM

Если ты ещё не задумывался о философских вопросах, то сейчас самое время. Вот живут у тебя таблицы в базе данных, связанные между собой в забавные клубки и в ус не дуют. И с другой стороны баррикад, ты разработчик с горящими глазами, и ворохом Java классов в твоем проекте. И хочешь ты чтобы написал ты SQL запрос и получил в ответ набор List<MyObject>, а не JDBC выборку, обрабатывая которую руками, приходится создавать объекты и кастовать типы направо и налево, как заправский колдун.

Такие страдания испытал не ты первый, поэтому умные люди собрались и придумали концепцию ORM. Основной смысл ORM в том, чтобы взять на себя тяжелую работу по преобразованию твоих Java типов в типы базы данных и обратно. Ты как разработчик аннотируешь свои классы оставляя подсказки для фреймворка какие типы ты хочешь получить, а потом просто пользуешься обычными методами. Написалsave(ListWithMyObjects), а он сам как по волшебству, превратился в SQL запрос и обновил данные.

Звучит слишком хорошо, чтобы быть правдой, не так ли? Так и есть. Правильная готовка ORM это настоящая головная боль и балансирование на острие ножа, но тебе придется к этому прикоснуться.

Hibernate

Он же просто хибер. Самый популярный Java фреймворк, предназначенный для решения ORM задач. Море возможностей, море подводных камней, море страданий. Профессионально его готовить мало кто умеет, но приобщиться надо. Материалов по нему великое множество, но обрати внимание на эти:

  • Один из самых известных Hibernate профессионалов, Vlad Mihalcea, ведет уютный сайтик в котором содержатся десятки полезных статей, ответов на вопросы и обзоры подводных камней. Подпишись, читай, приобщайся. Когда у тебя на проекте выстрелит проблема по хиберу, Влад может прийти на помощь;
  • Бауэр, Кинг, Грегори. Java Persistence API и Hibernate. Одновременно является и справочником и руководством. Написана тяжело, читается тяжело, но достаточно объемно покрывает необходимые темы. Читать, возможно, придется в несколько заходов, но лучше осилить;
  • Официальная документация. Написано хорошо, в меру разжевано, сопровождается примерами. Целиком читать необязательно, но периодически заглядывать полезно.

Spring

Спринг — это самая популярная веб-экосистема в Java. Состоит из целого набора различных фреймворков, разного назначения: работа с БД, облаками, безопасностью, и многое другое. Да, у него есть менее популярные альтернативы, но с высокой долей вероятности, на работе ты столкнешься именно с ним. Так что добро пожаловать в весну.

Spring Core

Как у Java есть свой базовый Core, так есть он и у Spring. Стоит хорошенько разбираться в его составе, чтобы когда ты поднимешься на абстракцию выше, в Spring Boot, он не показался тебе загадочной магией.

Книги
Craig Walls. Spring in Action 4

Обрати внимание, именно 4-е издание. Да, мы в курсе, что есть пятое. Да, мы в курсе, что перевод на русский есть только на третье издание. Но в пятом нет подробного описания подкапотных кишочков, и выкинута настройка с помощью XML. Ты можешь подумать, что «Какой XML, аннотации везде?», но твой будущий работодатель запиливший систему в мохнатых годах может не разделять твоё прогрессивное мнение. Так что читай 4-е издание и наслаждайся. Книга стоит того.

Курсы

На Udemy есть хороший инструктор, John Tompson, который шпарит курсы по Spring как автомат. Не стоит обходить его вниманием и загляни сюда. Рассматривается более старая версия Spring (4), но за 6 часов даётся вполне неплохая база по Spring и затрагивается работа со Spring MVC.

Официальная документация

Казалось бы, зачем мы явно включили официальную документацию, если мы с самого начала запомнили, что всегда стоит начинать поиск с неё? Однако, со Spring ситуация несколько иная. Его документация ВОСХИТИТЕЛЬНА. Серьезно, эта документация одна из весомых причин, почему Spring так быстро завоевал популярность. Подробнейшие описания концептов Spring, сопровождаемые примерами кода, и многое, многое другое. Начни своё путешествие отсюда и поверь, очень многие вопросы у тебя не появятся, если ты внимательно ознакомишься с этими материалами.

YouTube

Широко известный в узком кругу лиц, Евгений Борисов периодически выступает с докладами, в которых разбирает устройство Spring по кусочкам. Делает он весьма весело, задорно и понятно. Рекомендуем приобщиться к его докладам:

Несмотря на то, что видео идет 2-4 часа, смотрится как отличный сериал. Крайне рекомендуем к просмотру.

Spring Boot

Spring Boot это абстракция над абстракциями. Разработчики взяли обычный Spring, полезные библиотеки и упаковали всё это в фреймворк более высокого (по абстракции) уровня. Меньше бойлерплейта и головной боли, больше магии и головной боли. По причине большего удобства, Spring Boot вытесняет классический Spring, так что в своих проектах смело используй именно его.

Курсы

Помнишь John Tompson? Даже если нет, самое время навернуть его 60 часовой курс по Spring Boot. В нем также затрагивается работа со Spring MVC, Spring Data и немножко Hibernate. Объясняет доступно, много примеров, простой английский язык. Полностью стоит своих 1.5к рублей.

Spring Data

Spring Data это целый набор различных продуктов, объединенных одной целью: упростить разработчику работу с данными, предоставив ещё более высокий уровень абстракции. Продуктов этих довольно много (с полным перечнем можешь ознакомиться здесь), но на текущем этапе обрати внимание на Spring Data JPA. Если Hibernate это абстракция над JDBC, то Spring Data это по большей части абстракция над ORM фреймворками. Hibernate там включен по умолчанию, но никто не заставляет использовать под капотом именно его.

Что же за удобные абстракции дает нам данный фреймворк? В первую очередь это репозитории. Возможно ты слышал про CRUD. Так вот, Spring позволяет по мановению волшебной палочки добавить к твоим сущностям эти самые CRUD методы. Здорово, правда? Нам не нужно писать каждый раз стандартные методы, копипастить один и тот же код. За нас это всё делает машина, а мы просто пользуемся удобным API.

В остальном это куча других плюшек, о пользе которых, сейчас, ты вряд ли будешь задумываться.

Для начала работы со Spring Data JPA, тебе будет достаточно твоего опыта с Hibernate и чтения вводной документации от самого Spring.

Spring Web MVC

Сама MVC это крайне популярная схема разделения мух от котлет. Модели (данные) отдельно, представление данных отдельно, связующий клей из контроллеров которые обрабатывают действия пользователей и передают их кому надо отдельно. Удобно, меньше шансов сломать всё к чертям при доработках, народу нравится.

Конкретно Spring Web MVC помогает нам в реализации проектов с использованием данной схемы, предоставляя всё то что мы так любим: абстракции, сахар и магию. Ну и например аннотации для разметки контроллеров, удобную настройку реквестов, работу с эндпоинтами и многое другое.

Чтобы узнать его получше, обратись к старой доброй документации.

Spring Security

После того как ты создал своё web приложение, вероятно ты захочешь предоставить к нему доступ для пользователей. А где пользователи там и логины и пароли. А где пароли там и безопасность, личные данные, кросс-авторизации и злобные хакеры. Чтобы не страдать от головной боли, для нас создали фреймворк Spring Security, который дает нам удобный API и абстракции (в который раз), чтобы сделать наше приложение безопасным и надежным. Более подробно можно ознакомиться:

  • Приобщившись к официальной документации;
  • Прочитав отличную книгу «Spring Security in Action».

Упражнения

К сожалению набора задачек по Spring в классическом виде не существует. Но тут тебе может помочь HyperSkill, в котором есть учебные web проекты, в которых ты сможешь помочить ноги, примеры проектов от самого Spring, например знаменитый PetClinic и реализация собственных пет проектов. Давно хотел собственного телеграм бота? Самое время начать его пилить с помощью Spring.

Основы CI/CD

Раньше, когда мир был медленнее, программы выпускались крупными релизами, иногда даже раз в год, которые чаще всего вручную устанавливались на сервер. Исправляющие патчи выпускали быстрее, но тоже не то чтобы очень часто.

В современном мире ситуация значительно изменилась. Наши пользователи не готовы ждать так долго пока вы наконец-то не запилите им такую необходимую для них фичу. Они хотят её здесь и сейчас. Разработчики подстроились под эти желания и изменили подход к своей работе. Если мы что-то делаем регулярно, зачем это делать вручную? Если всё есть код, то мы можем делать с ним, что угодно, отправлять куда угодно. Так появилась методика непрерывной интеграции и непрерывного развертывания.

Разработчик запушил новую фичу? Пора сделать рутинные действия: получить свежие изменения, запустить юнит тесты, собрать приложение под нужные платформы, развернуть тестовое окружение и запустить интеграционные тесты. Все этапы прошли успешно? Значит будем считать, что код стабилен и его можно отправить прямо на продуктив, где пользователи сразу получат такую долгожданную фичу и заметно веселее понесут бизнесу свои деньги. Все эти рутинные действия берет на себя система непрерывной интеграции. От нас требуется только предоставить ей необходимое окружение и предоставить скрипт конвейерной сборки. Всё остальное она берет на себя, активно работая на невидимом фронте, лишь периодически оповещая людей, если что-то пошло не так.

Звучит как идеальный мир, где все счастливы, но, к сожалению, в жизни всё несколько сложнее. Всегда есть перечень «Но» переменной длины, который вносит коррективы. Но сама концепция CI/CD и методология DevOps, к которой она относится, является сейчас крайне популярной и эффективной организацией создания и обновления наших продуктов. Ты найдешь ей применение практически на любом проекте.

Jenkins

Дженкинс один из наиболее популярных серверов непрерывной интеграции. Что его делает таким популярным? Во-первых, он бесплатный и опенсорсный. Во-вторых, он чрезвычайно расширяемый благодаря сотням различных плагинов и библиотек. На нашел нужную? Всегда можно запилить свою, ведь Jenkins написан на нашей любимой Java. Настройку наших конвейеров можно производить прямо на Groovy, что предоставляет нам практически неограниченные возможности.

Из минусов можно отметить откровенно устаревший интерфейс, и понимание, что если что-то пошло не так, в поддержку не напишешь, придется ковыряться самому. Следствие бесплатности, увы.

Однако сделать свои первые шаги и запустить первые конвейеры довольно легко. Просто следуй официальному гайду и очень скоро твоё приложение научится тестировать и собирать само себя. Ну не чудо ли?

Контейнеры

В смутные времена, когда возникала торжественная необходимость задеплоить приложение на прод, подготовить рабочее окружение для разработчика или просто прогнать тесты на тестовом стенде, приходилось всё это делать ручками. Ты наверняка сталкивался с этим в повседневной жизни: хочешь установить программу, а ей нужен, например, установленный .NET. А ему тоже что-то нужно. И так мы проходим, иногда весьма длинную, цепочку пока наконец не получаем установленную и возможно даже работающую программу.

А что если нам нужно переустановить систему? А что если нужно это сделать на другой ОС? Со всем этим нам поможет технология упаковки приложений в контейнеры. Контейнеры позволяют нам инкапуслировать всю среду которая необходима для работы нашей программы внутри черного ящика. Это значит, что сама основная машина не будет замусориваться бесконечными библиотеками и доп. софтом, всё это будет аккуратно упаковано и не будет никому мешать. Удалил контейнер и вместе с ним уедет в небытие вся его обвязка. Никаких больше проблем с конфликтом версий у разного ПО. Счастье для всех, даром и никто не уйдет обиженным.

Исторически, у джавистов ещё в бородатые времена были сервлеты и контейнеры сервлетов, которые примерно про это, но не совсем. Однако, у всех остальных такого счастья не было и сейчас есть два наиболее популярных решения.

Docker

Docker, если по умному, система по автоматизации и управлению стадом наших контейнеров. Мы ей даем контейнер, а она его запускает, настраивает и подготавливает к работе. Суть самих контейнеров простая как топор: мы описываем, в специальном формате, что нужно для нашего приложения (ОС, библиотеки). Весь минимальный набор необходимый для корректной работы нашего приложения. А потом запекаем это как слоеный пирог. Собрал ты контейнер, у которого в основе Ubuntu и радуешься жизни, всё работает. А потом захотел стать модным и заменить убунту на alpine, поменял пару строк в своем файле и снова радуешься жизни. Docker хорош там где нужно тестовое окружение, или окружение для разработчика.

Помни, что готовить докер в продуктиве гораздо сложнее, так как сразу возникает куча вопросов, например, по поводу производительности и безопасности. Для твоих учебных проектов это некритично, но в случае чего-то серьезного, лучше положиться на SRE инженера / системного администратора.

По учебным материалам обрати внимание на:

  • Jeff Nickolof. Docker in Action. Серия «in Action» обычно довольно качественная сжатая (но не чересчур), по самым разным темам. Докер не исключение, если хочешь быстро получить базовые знания, данная книга тебе поможет;
  • Официальная документация. Куда уж без документации. Написана хорошо, много полезных примеров и гайдов, не стесняйся туда почаще заглядывать.

После того как ознакомишься с учебными материалами, попробуй упаковать с помощью докера любое своё приложение и задеплоить, например на Heroku. Гайд по деплою докер образов в хероку, можно найти здесь.

Kubernetes

Один контейнер это хорошо, это надежно. Но, что если мы поддались волне хайпа и теперь у нас из всех щелей лезут микросервисы? Что если контейнеров у нас десятки, если не сотни? Как управлять всем этим зоопарком и не сойти с ума? Здесь к нам на помощь придет оркестратор Kubernetes, или просто кубер. По самому термину «оркестратор» можно догадаться, что его задача состоит управлении и контролю за нашим многочисленным зоопарком контейнеров. Он позволяет нам их запускать, заменять на другие, следить за их состоянием, автоматически перезапускать, если кто-то упал и даже автоматически масштабироваться, в зависимости от текущей нагрузки.

К сожалению с большой силой приходит большая головная боль, поэтому обычно с кубером работает специальный человек — SRE инженер. SRE это такой умный человек, который следует философии DevOps, если есть желание, можешь ознакомиться с бесплатной книгой от Google, где описывается их виденье данной профессии.

На начальном этапе тебе достаточно будет знать, что кубер существует, что он классный и его очень трудно готовить без соответствующего опыта.

Конференции

Java конференции — это такие партийные съезды всех пролетариев джавистов. Много докладов о том, как наши микросервисы бороздят просторы облаков, разбор кишочков популярных фреймворков и многое другое.

Самое ценное в конференциях это обмен опытом со своими братьями по цеху. Идеальное место чтобы устраивать срачи с популярными Java персоналиями, узнавать чем сейчас дышат и держать нос по ветру. В 2021 году всё это ушло в онлайн, что несколько сбивает настрой, но по прежнему насыщенно хорошими докладами. Стоит отметить две наиболее популярные в наших краях конференции:

  • Joker;
  • JPoint

Два брата акробата, первый традиционно проходит в Питере, второй в Москве. Доклады часто пересекаются, но при желании можно спокойно ходить на обе конференции, благо они разнесены по разным сезонам. Видосы с прошлых сезонов стали открывать бесплатно всем желающим, к чему обязательно стоит приобщиться на ютубе.

Эпилог

Если ты смог осилить все перечисленные выше темы, можешь собой гордиться (впрочем, гордиться собой можешь при любом удобном случае). В руководстве мы намеренно не расписывали каждый аспект в мельчайших деталях. Его цель — создать для тебя красную нить, которой ты можешь следовать активно смотря по сторонам. Есть ещё десятки важных и интересных тем, с которыми ты обязательно столкнешься. Выбрав карьеру разработчика ты обречен учиться до конца своей карьеры, так что постарайся расслабиться и получать от этого удовольствие. У тебя обязательно получится!

Связанные посты
47 комментариев 👇
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Ох... я, помнится, что-то похожее читал на доу.

Вообще, насколько я могу видеть со своего опыта, самое главное это не выучить, как на спринге сделать что-то. Самое главное, за что готовы платить деньги это за а) умение быстро-быстро разобраться в том, чего же от тебя хотят и б) предложить, как же ты это будешь делать и таки сделать это в разумное время (ну или хотя бы уметь красиво объяснить, почему ты не успел) Это, в общем-то, основное

Насчет техскиллов. Честно говоря, я удивлен, что в списке отсутствует курсера и замечательный курс Седжвика. Более того, у меня сложилось впечатление, что автор за деревьями не разглядел лес (без обид)

В общем, что обычно советую падаванам я:

  1. Самый Главный Скилл, без которого в айти делать ну совершенно нечего это English. И нет, уровня London is a capital of Great Britain тут недостаточно. Вы должны уметь читать доки и писать письма с уточняющими вопросами. Совсем хорошо, если сможете позвонить и спросить. Но вполне достаточно, если сможете прочесть книгу из тех, что тут в изобилии посоветовали не лазя в словарь каждые пять минут.
  2. Тут написано, что рассчитан гайд не на полного новичка в CS. Прекрасно. Тогда берем в руки что-то в стиле Head First Java и идем на курсеру. Да, в тот самый курс Седжвика Algorithms Part 1 и Part 2. Во-первых освежим зания CS. Во-вторых курс полностью на джаве - по окончанию уже будем сносно ориентироваться в языке.
  3. Тут есть целая секция про SQL. Хм, а говорят, что не про новичков речь... Ок, нестареющая классика 1,2,3,4 Вообще можно просто пофильтровать там все, что от Стенфорда и про базы данных. SQL запросы писать научитесь. Как и проектировать структуру таблиц.
  4. Сети. Как правильно заметил автор, java это в основном про серверы. Которые принимают сетевые подключения. Штош... учим как это все устроено. К сожалению, курс не подскажу - с курсеры выпилили отличный курс University of Washington который так и назывался (computer networks) Если кто подскажет замену буду благодарен
  5. Теперь мы имеем представление, как в браузер попадает содержимое. А как же Java? А очень просто - книга Head first Servlets and Jsp. Да, она старая. Но, внезапно, внутри спринга все те же самые сервлеты. Вот и смотрим, что же там в основе и как к джаве, на которой в п.2 мы весело и задорно писали R-B деревья и обходили графы, прикрутить обработку http-запросов из п.4
  6. Паттерны. Это не про программирование в стиле "нафигачить код" Это про то, как его нафигачить так, чтобы потом не краснеть и не материться при переделках (ну хотя бы не слишком сильно). Для продолжения стоит освоить как минимум шаблон синглтон, команда и дто. И представлять, что есть MVC. По книгам порекомендую Head First Design Patterns.
  7. Теперь зачем была вся эта заумь. Берем и пишем что-нибудь простое, например блог. Да, безо всяких спрингов. Заведем сервлет, который будет принимать команды типа "показать список постов", "показать пост" или "запостить что-то". Накидаем UI на jsp (я в курсе, что так уже не делают, но для учебного проекта сойдет. Желающие могут сразу прикрутить реакт, но мы тут вроде как про бэкенд). Пишем разделение по слоям (контроллер-сервис-дао). Прикручиваем базу через jdbc (придется пострадать, увы).
  8. Почему-то совершенно пропустили такую тему как тестирование. И очень зря. Идем читать про JUnit и про то, что же вообще такое юнит-тесты. Покрываем тестами нашу нетленку из п.7 Да, скорее всего в процессе придется ее переделать. Это нормально.
  9. Вот где-то тут и можно обратить внимание на спринг. Автор поста надавал кучу полезностей и вот просто можно по ним и идти. После того, как начнете читать и разбираться с изумлением увидите, что где-то все это уже было. И что вы в п.7 изобрели велосипед. Но зато уже намного лучше представляете, почему у него крутятся колеса. Сделайте 1001й блог на спринге.

Вне списка парочка замечаний:

  • многопоточность. На мой взгляд это просто какой-то карго-культ. А факт в том, что вы ОЧЕНЬ вряд-ли с этим непосредственно столкнетесь. Парадоксально, потому что оно ну просто везде, но пока работает, то и незаметно. Вот что бы я не советовал, так это с самого начала трахать мозг книгой Гетца. Для введения в курс дела я бы рекомендовал курс Ивана Головача Multicore programming in Java (вроде бы можно найти на ютубе). Я в курсе, что автор кидала и курс не доделан, но и того, что есть будет достаточно в 90% случаев. Вот если захочется углубиться вот тогда переходите к Гетцу.
  • насчет ORM. у меня к хибернейту резко отрицательное отношение, потому как от него гемора в 90% случаев больше, чем пользы. Jooq, спринг-jdbc, запросы ручками это наше все. Но все же я бы начинал с книжки Фаулера "Шаблоны корпоративных приложений". Там первая половина книги это как раз про то, зачем, собственно, нужен хибернейт. Потом уже будет легче разбираться с ним самим.
  • докер и прочее. Это уже не про новичков в бэкенде. Это отдельная вселенная и отдельные специальности. Оно вообще достойно отдельной статьи (статей)
  Развернуть 1 комментарий

Святой человек, дай Бог тебе здоровья. Я как раз на этом пути и это очень полезно и очень актуально. Очень. Спасибо 🖤

  Развернуть 1 комментарий

@kaktotak, Пожалуйста) Рад, что мой опыт оказался полезным

  Развернуть 1 комментарий
Сергей Макарчук Бренд менеджер (продажи;) ) 5 июля 2021

а можно так же, но по Go? ;)

  Развернуть 1 комментарий
  Развернуть 1 комментарий

Отличный экскурс, будто прочитал свой путь в джаву, но увидел другие ветки, по которым не пошел

  Развернуть 1 комментарий

Отличный пост! Думаю поможет мне закрыть пробелы в знаниях)

По Spring могу посоветовать курсы javaops - сам с ними успешно вкатился и прайс не 100к+, как у инфоцыган

  Развернуть 1 комментарий
Аватар Programistich Programistich 7 июля 2021 Команда Клуба

@whiskels, По Спрингу могу ещё накинуть для начала

И уже после

  Развернуть 1 комментарий

@Programistich, я себя отношу к фанатам Жени Борисова и его методики преподносить материал. Каждый раз видео по 4+ часа смотрятся на одном дыхании

  Развернуть 1 комментарий

@Programistich, Спасибо, совсем из головы вылетела серия видосов потрошителя и построителя. Обязательно добавлю

  Развернуть 1 комментарий

@Programistich, Борисов - хороший источник, когда говорит о нутрях спринга. Спринг-потрошитель - действительно годный доклад, который я часто рекомендую. Но когда он начинает говорить о паттернах и кододизайне, я просто слушать его не могу - либо бред, либо унылая душнина, лучше б не начинал... Его Спринг-построитель, или тот относительно недавний доклад по спринг-паттернам были совсем не очень

  Развернуть 1 комментарий

H2 — наиболее популярная in memory СУБД

Именно в Java я мало что понимаю, сам бэкенды на ноде пишу. Но всё-таки самой популярной in-memory bd скорее является redis.

  Развернуть 1 комментарий

@golergka, Поправил, спасибо!

  Развернуть 1 комментарий

@golergka, redis замечательно умеет сохранять данные на диске.
Также H2 - это самая известная встраиваемая БД для java проектов.

  Развернуть 1 комментарий

@ps_at, уметь-то умеет, я сам этим пользовался. Но знаменит он имеет как in-memory.

  Развернуть 1 комментарий

Мне понравился этот текст👍🏻, даже что-то для себя узнал (например, что Spring in action стоит читать именно 4th ed)

Конечно, это не то, что нужно бежать изучать новичку прямо сейчас для достижения краткосрочной цели (такой как: найти работу). Но хороший обзор того, что нужно будет знать (и где черпать информацию), чтобы нормально себя чувствовать в Java разработке в 2021.


Про Докер:

система по автоматизации и управлению стадом наших контейнеров

Сначала я подумал, что речь про compose или swarm. Но нет.

А еще фраза:

сейчас есть два наиболее популярных решения.

читается будто, далее будут представлен две альтернативы одного и того же. Как MySQL и Postgres. Поэтому подумал, что после Docker, там возможно rkt или OCI, а там Kubernetes. Думаю, что стоит это как-то переписать

  Развернуть 1 комментарий

@KirillGavrilov, Согласен. Зафиксировал замечания в ишузе, поправлю.

  Развернуть 1 комментарий

О, привет, крутой гайд! )

  Развернуть 1 комментарий

@kuntashov, Мир действительно тесен, спасибо) Я старался в том числе ради коллег 1сников, которые не знают с чего можно начать свое знакомство с внешним миром. Понятно, что есть языки легче и актуальнее, но с другой стороны, больше контрибьюторов для bsl ls)

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

https://www.marcobehler.com

Человек делает потрясающие статьи про джаву, а его гайд по спрингу я советую всем вкатывающимся в спринг:
https://www.marcobehler.com/guides/spring-framework

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Крутой гайд! Имеет ли смысл добавлять к стеку Python + Go джаву или это взаимоисключающие явления?

  Развернуть 1 комментарий

@SyntaxWarrior, я думаю джава тут явно лишняя)

  Развернуть 1 комментарий

Как же сложно жавистам, столько знать всего надо. Приходите лучше в Scala, изучил пару концепций и все остальное основано на этих концепциях.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Круто!

  Развернуть 1 комментарий
Ivan Aleksashin Инженер HVAC и немного бекендер 12 июля 2021

А для Python такого же замечательного мануала никому часом не попадалось?

  Развернуть 1 комментарий
  Развернуть 1 комментарий

@kuntashov, круто, спасибо!

  Развернуть 1 комментарий

Автор, поправь опечатки:

  1. "Бери его если у есть безответная любовь"!
  2. "Становится джедаем запросов не надо" -ться/-тся
  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб