Дисклеймер:
- В руководстве рассматривается развитие Java backend-разработчика.
- Руководство написано исходя из того, что читатель не полный новичок в CS и у него есть базовые знания.
- Руководство намеренно написано в неформальном стиле, в формате монолога. Все предлагаемые изменения должны соответствовать данному стилю.
- Целью руководства не является составление полного списка всех возможных курсов, книг или обучающих материалов. Состав должен представлять собой краткий, но не кратчайший список из максимально полезных обучающих материалов, советов и рекомендаций.
- Использование изображений в руководстве разрешено только в крайних случаях. Оставьте картинки профильным статьям.
- Руководство по вкатыванию в backend-разработку на Java для почти начинающих и сочувствующих.
- Почему Java?
- Обучение
- Подготовка к подготовке
- Java Core Base
- Java Core Advanced
- Книги
- Рауль Урма, Марио Фуско, Алан Майкрофт. Современный язык Java
- Брайан Гетц. Java Concurrency на практике
- Адитья Бхаргава. Грокаем алогритмы
- (Опционально) Роберт Лафоре. Структуры данных и алгоритмы Java
- (Опционально) Николай Палрог. Система модулей Java
- (Опционально) Кен Коузен. Современный Java. Рецепты программирования
- Видео
- Паттерны
- Упражнения
- Подведение итогов Advanced Core
- Книги
- Вступаем во взрослый мир
- Spring
- Основы CI/CD
- Контейнеры
- Конференции
- Эпилог
- Благодарности
Первый вопрос который сразу приходит в голову, когда выбираешь язык. На это есть целый ряд причин:
- Огромная база кода. Если ты хочешь что-то сделать, с большой вероятностью для этого уже есть библиотека;
- Отличная документация. Подробнейшее описание API языка (Javadoc), дотошно описанная спецификация самого языка (JLS) и спецификация модели памяти (JMM) добавляют уверенности, что если у тебя появился вопрос: «Как это работает?» или «Почему это работает именно так?» — на него получится найти ответ;
- Гибкость. Java это не только язык, но и JVM платформа. С использованием этой платформы написаны, например, Kotlin (привет, Android), Scala (привет, ФинТех) и Clojure (привет, эээ, страдание?). Всё это позволяет нам, оседлав Java и потратив некоторое время, дрейфовать в сторону той предметной области, которая наиболее интересна;
- Сообщество. Если у тебя появился вопрос, на него, скорее всего, ответили ещё в 2010. Если у тебя появилась гениальная идея проекта, на гитхабе, вероятно, уже есть десяток различных реализаций. Новичкам всегда радостно помогут советами прочитать, наконец, Javadoc;
- Карьерные возможности. Java повсюду: backend, mobile, desktop (нет, он не умер). Без работы точно не останешься.
Есть и ворох недостатков:
- Многословность. Java многословна. То, что сейчас в пайтоне занимает одну строку, в Java займёт 10. Не такой большой минус в современном мире, где есть Intellij и автодополнение, плюс в язык добавляются модные фичи вроде
var
. К тому же в языках вроде Kotlin или Scala можно писать достаточно компактный код; - Обилие устаревшего кода. Java появилась в 1995 году, и с тех пор было написано много кода. Чертовски много. Всё это нужно поддерживать, развивать и лелеять, так как бизнес очень не любит тратить деньги. Например Java 8 вышла в 2014 году, а согласно опросу JetBrains в 2020 году, её доля составляет 75%! Так что, залетев на работу, с высокой долей вероятности ты будешь писать на старой версии, в которой нет современного сахара, увы;
- Ограниченная сфера применения. В современном мире 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 — это основа понимания языка и представление о его возможностях, работающих «из коробки». Так как это фундамент, подойти к его формированию стоит очень ответственно, чтобы не страдать позже и не пытаться изобрести велосипед. Не стоит пытаться сэкономить время, хитрить или пропускать «неинтересные» куски. Поверь, уверенная база тебе воздастся в будущем, ибо на собеседованиях гоняют в основном по Core.
Помни, что ни один из курсов не дает полную базу. Используй их как дополнение к книгам.
Oracle является разработчиком языка и предоставляет собственные обучающие материалы, довольно неплохого качества. Ещё и бесплатно. Из минусов: рассматривается java 8, и некоторые темы рассмотрены очень сжато. Но всё равно обязательно загляни, там много интересного.
В странах СНГ и Украине весьма популярен великий и ужасный JavaRush. Интернет пестрит историями успеха, как простой слесарь Григорий стал успешным и теперь зарабатывает 300кк/наносек. Тысячи практических задач! Сотни тысяч пользователей! За какие-то смешные деньги ты сможешь полностью изменить свою жизнь!
Так вот, ни в коем случае на это не ведись. JavaRush очень сильно страдает отрывочной подачей теории, из-за чего люди застревают даже на простых задачках. Задумайся, при написании технической книги она проходит множество стадий вычитки и рецензирования. На JavaRush таким, понятное дело, никто не занимается. Не трать зря время, деньги и нервы, и представь, что такого сайта просто не существует. Даже если ты знаешь человека, который знает человека, который сказал, что там всё круто.
Агрегатор курсов от различных авторов, разной степени качества. Из того, что смотрел сам, могу посоветовать Java. Базовый курс.
Совместный проект Stepik и JetBrains. Содержит треки (курсы) по разным языкам: Python, Java, Kotlin, JS.
Обучение ведется в разрезе мини-проектов: выбираете проект определенной сложности (от консольных крестиков-ноликов до интеграций со Spotify и веб-приложений), который разбивается на несколько стадий. По каждой стадии дается набор теории, по теории проходятся мелкие задачки. Кто-то скажет, что весьма смахивает на JavaRush, но отличие в качестве материала. Часть берется со Stepik, часть создают сами с модерированием и предварительной бетой.
Тем у них ОЧЕНЬ много, от Java Core до математики и алгоритмов. Core описан очень хорошо, остальные похрамывают.
Материал полностью на «русском английском», так что читать его несложно, но иногда непонятно, что пытался сказать автор. Платный, с триальным доступом.
Из минусов, очень задумчивый интерфейс, некоторые проекты крайне скудны на описание, некоторые тесты приходится «хакать» из-за непонятной логики проверки. В остальном идеальный вариант для механического прорешивания простых задачек.
Тысячи индусов и сочувствующих готовы прийти на помощь. Заманивают бесплатностью и объемом материалов, но помни про устаревание и что за адекватность материала отвечает только сам автор. Из курсов на русском многие советуют Алишева, не смотрел не могу оценить. Зато абсолютно точно могу рекомендовать бесплатный курс Тагира Валеева, весна 2020. Туть
Тагир широко известный во всем мире джавист, работает в JetBrains, является Java чемпионом (да, это реальное звание). В курсе очень хорошо проходит по кишочкам языка, может тяжеловато заходить, поэтому параллельно шлифуй другими материалами. Но курс постарайся прослушать полностью, оно того стоит.
Обрати внимание на курс от Tim Buchalka, вот здесь. Он очень хорошо и подробно разжевывает Java в серии небольших видео, общей длительностью около 80 часов. Даже упражнения после тем есть. Говорит с австралийским акцентом, но есть английские субтитры, так что рекомендую. Эдакий видео Шилдт по подробности материала. На цены в 10к+ рублей не смотри, на Udemy постоянно идут распродажи со скидками в 80-90%. Так что если видишь полный прайс, просто добавь курс в вишлист и подожди пару недель. Скинут до 1.5к рублей, всегда скидывают.
Лучше всего читать на английском, но можно и переводы. Помни, что переводы зачастую являются устаревшими и ВНЕЗАПНО труднее читаются, из-за того, что одни и те же термины в разных книгах могут переводить по разному.
«Полное руководство» это увесистый том на 1.5к страниц, который с трудом помещается в руках. Бери его если у тебя есть безответная любовь к справочникам или если ты любишь максимально дотошное описание API языка. Если нет, бери «Руководство для начинающих», которое в два раза короче и наслаждайся подробным описанием языка без километровых описаний API. Имей в виду, что в руководстве для начинающих не освещены некоторые «продвинутые» темы, так что сверься с содержанием обеих книг.
Книга которую обязательно стоит прочитать после Хорстманна или Шилдта, и регулярно перечитывать. Блох один из создателей языка, и в своей книге описал многочисленные best practice: правильное написание equals и hashCode, как правильно готовить generics, почему лямбды это хорошо и многое другое. Написано доступно, читается легко.
Хорстманн пишет более сухо и сжато чем Шилдт, некоторые моменты описаны более на «низком» уровне (объяснения как оно устроено внутри). Пестрит вставками сравнениями с С++. Твой выбор если уже есть/был опыт других языков и нет потребности в разжевывании материала. Во втором томе описываются продвинутые темы вроде разбора XML, интернационализации и веб-служб. Глянь содержание и имей в виду, что там есть.
Если ты начал читать Шилдта и всё равно чувствуешь, что ничего не понимаешь, попробуй эту книгу. Написано максимально простым языком, много картинок. После её прочтения в голове должна сложиться простая мозаика, что позволит вернуться к более «взрослым» книгам.
Теория это замечательно, но нужно постоянно писать код. Лучшие места для этого:
- Задачки и проекты HyperSkill. Много хороших и разных, но платно;
- CodeWars. Ориентируйся на уровень сложности 8-7kyu, можно 6kyu но может оказаться сложно;
- CodingBat. Элементарные задачки на уровне первого курса университета;
- HackerRank. Выбираешь Java, выбираешь Easy, прорешиваешь.
Не знаешь как разбить строку на символы? Не помнишь как прочитать текст из файла? Забыл как быстро можно отсортировать массив? Со всем этим помогут следующие ресурсы:
- Javadoc. Подробное описание API языка. Хочешь сделать что-то со строкой? Загляни в Javadoc класса String. Хочешь сделать что-то с массивом? Загляни в javadoc класса Arrays. Javadoc это первое место куда ты должен идти при любом вопросе. Не знаешь с какого класса начать поиск? Просто вбей в поиск что-то вроде
Java split word javadoc
и с высокой долей вероятности, первые строчки будут вести на нужный класс; - StackOverflow. Самый популярный ресурс для копипаста кода и ответов на твои вопросы. Являются ли строки в Java иммутабельными? Что такое знак джокера? Что такое PECS? На всё это ты сможешь найти ответ благодаря сообществу StackOverflow, вбив в поиск что-то вроде
Java pecs stackoverflow
- Baeldung. Сборник статей и рецептов на все случаи жизни. Что нового в Java 16? Какими способами можно сортировать List? Чем отличается ArrayList от LinkedList? Как применять Jackson? Скорее всего про это уже есть статьи на baeldung.
- Telegram. Если твой поиск не увенчался успехом, и ты готов опустить руки, приходи к живым, русскоговорящим людям и попроси помощи. Тут не решат за тебя твои задачи, но помогут с направлением копания.
Итак, ты прошел/посмотрел курсы, прочитал базовые книги и даже прорешал кучу упражнений. Чувствуешь себя уверенно и даже расправил плечи? Самое время поиграть в карточки. Есть отличный гитхаб репозиторий в котором есть куча популярных вопросов на собеседованиях. Сейчас тебе стоит обратить внимание на:
Не ленись занести вопросы в карточки Anki или распечатать в бумажном виде. Повторяй на регулярной основе, но помни, что твоя задача не заучить их механически, но научиться приходить к ответам логическим путем. Когда придешь на собеседование и будешь трястись от нервов и пить воду шумными глотками, все твои зубрежки вылетят из головы, но понимание материала никуда не денется.
Итак, ты уже уверенно владеешь базовыми средствами языка. Без проблем решаешь базовые задачи, знаешь состав Collections Framework, понимаешь отличие HashMap от TreeMap и даже знаешь что есть стримы и есть другие стримы. Самое время нырнуть в Core ещё глубже.
Выход Java 8 изменил экосистему Java навсегда. Stream API, default методы, лямбды, без этих вещей невозможно представить современную Java разработку. В этой книге подробно описаны все киллер фичи Java 8. Некоторые моменты, вроде конкурентности могут быть непонятными, но обязательно вернись к ним позже.
Обрати внимание, в русском переводе есть проблема с перепутанными примерами кода в первых главах.
Современный web это высокие нагрузки, тысячи клиентов, и терабайты данных. Чтобы твоё приложение могло утилизировать ресурсы сервера по максимуму, ты должен стать джедаем конкурентного/параллельного программирования. Эта книга must read абсолютно для всех java разработчиков. Несмотря на то, что она написана для Java 5, все её советы актуальны и по сей день. Может читаться тяжело, но прочитать ты её обязан.
По поводу того когда лучше знакомиться с алгоритмами ведутся бесконечные диспуты. Наше мнение — каждый решает сам для себя. Но конкретно эту книгу лучше прочитать пораньше. Она в интересной форме расскажет про базовые термины вроде сложности алгоритмов, познакомит тебя с некоторыми видами сортировок и прочими интересными штуками. Звучит сложно, но поверь, это именно та книга, который может вызвать у тебя любовь к алгоритмам.
Многие критикуют данную книгу из-за странного стиля кода и занудной подачи материала, но если вдруг тебе захотелось копнуть алгоритмы чуть поглубже, можешь попробовать.
Одной из ключевых фишек Java 9, стала новая система модулей, которая позволяет получить абстракцию над привычными пакетами и получить более сильную инкапсуляцию классов. Её весьма неохотно используют (в основном из-за лени и легаси), но уметь готовить модули будет приятным бонусом к твоим навыкам и пригодится если вдруг захочешь сдавать официальную сертификацию Oracle.
Практически всё тоже, что в книге Урмы, только как сборник кратких рецептов: как использовать коллекторы, компараторы, потоки и прочие «новинки» Java 8. Всё это с небольшими понятными примерами. Книга весьма хороша как краткая выжимка-handbook.
Jakob Jenkov, Java Concurrency And Multithreading
Хорошее дополнение к книге Брайана Гетца по многопоточности. Некоторые темы пересекаются, некоторые темы затрагивают внутренние кишочки вроде модели памяти Java. Одних этих видео не хватит чтобы полностью разобраться с многопоточностью, но отлично помогут укрепить или дополнить твоё представление об этой страшной и сложной вещи.
Многие проблемы, которые возникают при разработке приложений появляются из-за ошибок допущенных при проектировании. Умные люди выявили повторяющиеся из проекта в проект решения и закономерности (паттерны) и сделали их классификацию. Почему важно их знать? Паттерны описывают типичные способы решения часто встречающихся проблем при проектировании программ, что позволяет тебе не изобретать велосипед, а твоим коллегам гораздо быстрее понимать, что происходит в коде. Однако помни, что использование популярных паттернов при решении каждой задачи является скорее плохой практикой чем хорошей. Всё хорошо в меру, и с опытом ты поймешь ту тонкую грань, когда паттерны реально сделают архитектуру твоего кода лучше, а когда только навредят.
Паттернов много, хороших и разных, но зубрить их не надо. Пробегись по списку, посмотри на те которые тебя заинтересуют. На текущем этапе твоя задача оставить якорь в памяти, что такие вещи существуют.
Из ресурсов по паттернам можно выделить:
- Refactoring guru. Модно, молодежно, доступный язык.
- Design Patterns: Elements of Reusable Object-Oriented Software (GoF) — сухой академический оригинал, сможешь осилить — хорошо, не сможешь — используй другие источники.
Подойдут всё те же сайты которые были на прошлом этапе, но уже с более высокой сложностью. Старайся решать задачи с использованием «современных» функциональных фишек Java: Stream API и лямбды.
Помнишь те карточки которые ты поленился сделать на прошлом этапе? Самое время добавить новые:
Если ты добрался до этого пункта, мы мысленно пожимаем тебе руку. Осилить такое количество материала и не сдаться, достойно уважения. Но наше путешествие продолжается. Имей в виду, что если Core ты должен знать назубок, то знание всего ниже перечисленного может варьироваться от базового до нормального. Полностью прокачаться можно, увы, только на реальной работе.
Как ни странно, для того чтобы стать хорошим web разработчиком, необходимо хорошо разбираться в этой самой паутине. И хотя базу обычно дают в университете, убедись, что ты помнишь/знаешь, что такое JSON, чем RESTful API отличается от SOAP, какие бывают HTTP методы и прочие базовые штуки. Дальше по тексту подразумеваем, что ты не впадешь в ступор от слова "endpoint".
Современные приложения редко состоят из парочки классов которые запускаются из среды разработки. Работа с зависимостями твоего проекта, его сборка/упаковка, всё это ответственность систем сборки. Они берут на себя нудную и иногда тяжелую работу, чтобы твой проект на развалился под грузом JAR hell. На момент 2021 года, в Java есть две наиболее популярных системы сборки:
- Gradle. Модно, молодежно, инкрементальная компиляция, описание билд файла на Groovy или Kotlin DSL. Быстрый старт здесь.
- Maven. Почти нестареющая классика. Описание билда файла на XML, есть множество плагинов на любой вкус, расширяющие стандартную функциональность. Быстрый старт здесь.
Попробуй оба варианта, останься на том который тебе больше нравится. Явного фаворита среди них нет, Gradle часто ругают за сложность настройки, Maven за медлительность и многословность. На рынке они распределены почти 50/50, так что смотри сам. Мы советуем Maven, так как новичку зачастую проще работать именно с ним. С этого момента все твои проекты должны собираться только с использованием выбранной тобой системой сборки. Они используются в любом реальном проекте, и ты должен уметь такие проекты открывать, дорабатывать и собирать.
Ты можешь быть уверенным в качестве своего кода, но ещё больше уверенности тебе даст покрытие своего кода тестами. Тестирование это отдельная крупная тема для разговора. Их бывает много разных видов, разной степени полезности с использованием разных инструментов. Мы советуем начать с модульного (unit) тестирования. Наиболее популярным фреймворком для unit тестирования является JUnit. Начать своё погружение в этот увлекательный мир ты можешь
Чем крупнее твоё приложение, тем больше возникает необходимость понимать, что за процессы в нем происходят. Отладка возникающих ошибок, сбор статистики и многое другое практически невозможно без наличия логов. С системами логирования в Java всё очень плохо. Их много, у них разный подход к конфигурации, а ещё они могут связываться друг с другом в забавных франкенштейнов. Из наиболее популярного, обрати внимание на:
- Logback;
- Log4j2;
- JBoss logging.
Проще всего будет настроить SLF4J Simple по этому мануалу. Сам SLF4J это фасад для движков логирования, вроде тех, что мы перечислили выше, но в нем есть возможность подключить небольшой встроенный движок, который отлично закроет твои начальные потребности. И помни, с этого момента в твоём коде не должно быть ни одного System.out.println
, только взрослое логирование.
Современный web мир невозможен без данных, а где данные, там и базы данных. Тебе нужно понимать синтаксис SQL и уметь писать на нем запросы. В этом тебе поможет:
- Туториал от W3Schools;
- Книга Алана Бьюли «Изучаем SQL»;
- Прорешивание задачек на SQL-EX;
- Если у тебя есть доступ к HyperSkill, пройди раздел «Databases and SQL» вот тут;
- Интерактивный тренажер по SQL на Stepik, ориентированный на практические задачи с минимальной подачей теории.
Становится джедаем запросов не надо, но у тебя должно сложиться понимание как ты можешь вертеть данные на своей будущей БД.
После того как ты овладел SQL, самое время подключить к своему приложению настоящую базу данных. Систем управления базой данных великое множество, на начальном этапе обрати внимание на:
- PostgreSQL/MySQL — классические реляционные СУБД;
- H2 — легковесная in memory СУБД, хорошо подойдет для твоих небольших проектов;
- MongoDB — популярная NoSQL СУБД
Читать многотомные руководства, на начальном пути обучения, по ним не потребуется. Для начала тебе будет достаточно знать как установить СУБД и как заглянуть внутрь табличек.
Итак, у тебя появилась база данных, теперь ты хочешь трогать её данные прямо из своего уютного кода. Тут на помощь придёт добрый дедушка JDBC. JDBC — это такое относительно низкоуровневое API (довольно старое, но супер надежное), которое предоставляет тебе возможность работать с твоей базой данной прямо из кода. Открываешь соединения, пишешь ручками запросы, отправляешь запрос на исполнение, получаешь выборку с результатами. Получается много кода, куча лапши try-catch
, зато весьма производительно и гибко. В современном мире люди обычно пользуются инструментами более высокого уровня, типа Spring Data, но не стоит забывать наши корни. Поэтому ознакомься на досуге с бесплатным руководством Oracle: JDBC Basics
Если ты ещё не задумывался о философских вопросах, то сейчас самое время. Вот живут у тебя таблицы в базе данных, связанные между собой в забавные клубки и в ус не дуют. И с другой стороны баррикад, ты разработчик с горящими глазами, и ворохом Java классов в твоем проекте. И хочешь ты чтобы написал ты SQL запрос и получил в ответ набор List<MyObject>
, а не JDBC выборку, обрабатывая которую руками, приходится создавать объекты и кастовать типы направо и налево, как заправский колдун.
Такие страдания испытал не ты первый, поэтому умные люди собрались и придумали концепцию ORM. Основной смысл ORM в том, чтобы взять на себя тяжелую работу по преобразованию твоих Java типов в типы базы данных и обратно. Ты как разработчик аннотируешь свои классы оставляя подсказки для фреймворка какие типы ты хочешь получить, а потом просто пользуешься обычными методами. Написалsave(ListWithMyObjects)
, а он сам как по волшебству, превратился в SQL запрос и обновил данные.
Звучит слишком хорошо, чтобы быть правдой, не так ли? Так и есть. Правильная готовка ORM это настоящая головная боль и балансирование на острие ножа, но тебе придется к этому прикоснуться.
Он же просто хибер. Самый популярный Java фреймворк, предназначенный для решения ORM задач. Море возможностей, море подводных камней, море страданий. Профессионально его готовить мало кто умеет, но приобщиться надо. Материалов по нему великое множество, но обрати внимание на эти:
- Один из самых известных Hibernate профессионалов, Vlad Mihalcea, ведет уютный сайтик в котором содержатся десятки полезных статей, ответов на вопросы и обзоры подводных камней. Подпишись, читай, приобщайся. Когда у тебя на проекте выстрелит проблема по хиберу, Влад может прийти на помощь;
- Бауэр, Кинг, Грегори. Java Persistence API и Hibernate. Одновременно является и справочником и руководством. Написана тяжело, читается тяжело, но достаточно объемно покрывает необходимые темы. Читать, возможно, придется в несколько заходов, но лучше осилить;
- Официальная документация. Написано хорошо, в меру разжевано, сопровождается примерами. Целиком читать необязательно, но периодически заглядывать полезно.
Спринг — это самая популярная веб-экосистема в Java. Состоит из целого набора различных фреймворков, разного назначения: работа с БД, облаками, безопасностью, и многое другое. Да, у него есть менее популярные альтернативы, но с высокой долей вероятности, на работе ты столкнешься именно с ним. Так что добро пожаловать в весну.
Как у Java есть свой базовый Core, так есть он и у Spring. Стоит хорошенько разбираться в его составе, чтобы когда ты поднимешься на абстракцию выше, в Spring Boot, он не показался тебе загадочной магией.
Обрати внимание, именно 4-е издание. Да, мы в курсе, что есть пятое. Да, мы в курсе, что перевод на русский есть только на третье издание. Но в пятом нет подробного описания подкапотных кишочков, и выкинута настройка с помощью XML. Ты можешь подумать, что «Какой XML, аннотации везде?», но твой будущий работодатель запиливший систему в мохнатых годах может не разделять твоё прогрессивное мнение. Так что читай 4-е издание и наслаждайся. Книга стоит того.
На Udemy есть хороший инструктор, John Tompson, который шпарит курсы по Spring как автомат. Не стоит обходить его вниманием и загляни сюда. Рассматривается более старая версия Spring (4), но за 6 часов даётся вполне неплохая база по Spring и затрагивается работа со Spring MVC.
Казалось бы, зачем мы явно включили официальную документацию, если мы с самого начала запомнили, что всегда стоит начинать поиск с неё? Однако, со Spring ситуация несколько иная. Его документация ВОСХИТИТЕЛЬНА. Серьезно, эта документация одна из весомых причин, почему Spring так быстро завоевал популярность. Подробнейшие описания концептов Spring, сопровождаемые примерами кода, и многое, многое другое. Начни своё путешествие отсюда и поверь, очень многие вопросы у тебя не появятся, если ты внимательно ознакомишься с этими материалами.
Широко известный в узком кругу лиц, Евгений Борисов периодически выступает с докладами, в которых разбирает устройство Spring по кусочкам. Делает он весьма весело, задорно и понятно. Рекомендуем приобщиться к его докладам:
Несмотря на то, что видео идет 2-4 часа, смотрится как отличный сериал. Крайне рекомендуем к просмотру.
Spring Boot это абстракция над абстракциями. Разработчики взяли обычный Spring, полезные библиотеки и упаковали всё это в фреймворк более высокого (по абстракции) уровня. Меньше бойлерплейта и головной боли, больше магии и головной боли. По причине бОльшего удобства и увеличенной скорости разработки, Spring Boot вытесняет классический Spring, так что в своих проектах смело используй именно его.
Помнишь John Tompson? Даже если нет, самое время навернуть его 60 часовой курс по Spring Boot. В нем также затрагивается работа со Spring MVC, Spring Data и немножко Hibernate. Объясняет доступно, много примеров, простой английский язык. Полностью стоит своих 1.5к рублей.
Spring Data это целый набор различных продуктов, объединенных одной целью: упростить разработчику работу с данными, предоставив ещё более высокий уровень абстракции. Продуктов этих довольно много (с полным перечнем можешь ознакомиться здесь), но на текущем этапе обрати внимание на Spring Data JPA. Если Hibernate это абстракция над JDBC, то Spring Data это по большей части абстракция над ORM фреймворками. Hibernate там включен по умолчанию, но никто не заставляет использовать под капотом именно его.
Что же за удобные абстракции дает нам данный фреймворк? В первую очередь это репозитории. Возможно ты слышал про CRUD. Так вот, Spring позволяет по мановению волшебной палочки добавить к твоим сущностям эти самые CRUD методы. Здорово, правда? Нам не нужно писать каждый раз стандартные методы, копипастить один и тот же код. За нас это всё делает машина, а мы просто пользуемся удобным API.
В остальном это куча других плюшек, о пользе которых, сейчас, ты вряд ли будешь задумываться.
Для начала работы со Spring Data JPA, тебе будет достаточно твоего опыта с Hibernate и чтения вводной документации от самого Spring.
Сама MVC это крайне популярная схема разделения мух от котлет. Модели (данные) отдельно, представление данных отдельно, связующий клей из контроллеров которые обрабатывают действия пользователей и передают их кому надо отдельно. Удобно, меньше шансов сломать всё к чертям при доработках, народу нравится.
Конкретно Spring Web MVC помогает нам в реализации проектов с использованием данной схемы, предоставляя всё то что мы так любим: абстракции, сахар и магию. Ну и например аннотации для разметки контроллеров, удобную настройку реквестов, работу с эндпоинтами и многое другое.
Чтобы узнать его получше, обратись к старой доброй документации.
После того как ты создал своё web приложение, вероятно ты захочешь предоставить к нему доступ для пользователей. А где пользователи там и логины и пароли. А где пароли там и безопасность, личные данные, кросс-авторизации и злобные хакеры. Чтобы не страдать от головной боли, для нас создали фреймворк Spring Security, который дает нам удобный API и абстракции (в который раз), чтобы сделать наше приложение безопасным и надежным. Более подробно можно ознакомиться:
- Приобщившись к официальной документации;
- Прочитав отличную книгу «Spring Security in Action».
К сожалению набора задачек по Spring в классическом виде не существует. Но тут тебе может помочь HyperSkill, в котором есть учебные web проекты, в которых ты сможешь помочить ноги, примеры проектов от самого Spring, например знаменитый PetClinic и реализация собственных пет проектов. Давно хотел собственного телеграм бота? Самое время начать его пилить с помощью Spring.
Раньше, когда мир был медленнее, программы выпускались крупными релизами, иногда даже раз в год, которые чаще всего вручную устанавливались на сервер. Исправляющие патчи выпускали быстрее, но тоже не то чтобы очень часто.
В современном мире ситуация значительно изменилась. Наши пользователи не готовы ждать так долго пока вы наконец-то не запилите им такую необходимую для них фичу. Они хотят её здесь и сейчас. Разработчики подстроились под эти желания и изменили подход к своей работе. Если мы что-то делаем регулярно, зачем это делать вручную? Если всё есть код, то мы можем делать с ним, что угодно, отправлять куда угодно. Так появилась методика непрерывной интеграции и непрерывного развертывания.
Разработчик запушил новую фичу? Пора сделать рутинные действия: получить свежие изменения, запустить юнит тесты, собрать приложение под нужные платформы, развернуть тестовое окружение и запустить интеграционные тесты. Все этапы прошли успешно? Значит будем считать, что код стабилен и его можно отправить прямо на продуктив, где пользователи сразу получат такую долгожданную фичу и заметно веселее понесут бизнесу свои деньги. Все эти рутинные действия берет на себя система непрерывной интеграции. От нас требуется только предоставить ей необходимое окружение и предоставить скрипт конвейерной сборки. Всё остальное она берет на себя, активно работая на невидимом фронте, лишь периодически оповещая людей, если что-то пошло не так.
Звучит как идеальный мир, где все счастливы, но, к сожалению, в жизни всё несколько сложнее. Всегда есть перечень «Но» переменной длины, который вносит коррективы. Но сама концепция CI/CD и методология DevOps, к которой она относится, является сейчас крайне популярной и эффективной организацией создания и обновления наших продуктов. Ты найдешь ей применение практически на любом проекте.
Дженкинс один из наиболее популярных серверов непрерывной интеграции. Что его делает таким популярным? Во-первых, он бесплатный и опенсорсный. Во-вторых, он чрезвычайно расширяемый благодаря сотням различных плагинов и библиотек. Не нашел нужную? Всегда можно запилить свою, ведь Jenkins написан на нашей любимой Java. Настройку наших конвейеров можно производить прямо на Groovy, что предоставляет нам практически неограниченные возможности.
Из минусов можно отметить откровенно устаревший интерфейс, и понимание, что если что-то пошло не так, в поддержку не напишешь, придется ковыряться самому. Следствие бесплатности, увы.
Однако сделать свои первые шаги и запустить первые конвейеры довольно легко. Просто следуй официальному гайду и очень скоро твоё приложение научится тестировать и собирать само себя. Ну не чудо ли?
В смутные времена, когда возникала торжественная необходимость задеплоить приложение на прод, подготовить рабочее окружение для разработчика или просто прогнать тесты на тестовом стенде, приходилось всё это делать ручками. Ты наверняка сталкивался с этим в повседневной жизни: хочешь установить программу, а ей нужен, например, установленный .NET. А ему тоже что-то нужно. И так мы проходим, иногда весьма длинную, цепочку пока наконец не получаем установленную и возможно даже работающую программу.
А что если нам нужно переустановить систему? А что если нужно это сделать на другой ОС? Со всем этим нам поможет технология упаковки приложений в контейнеры. Контейнеры позволяют нам инкапуслировать всю среду, которая необходима для работы нашей программы, внутри черного ящика. Это значит, что сама основная машина не будет замусориваться бесконечными библиотеками и доп. софтом, всё это будет аккуратно упаковано и не будет никому мешать. Удалил контейнер и вместе с ним уедет в небытие вся его обвязка. Никаких больше проблем с конфликтом версий у разного ПО. Счастье для всех, даром и никто не уйдет обиженным.
Исторически, у джавистов ещё в бородатые времена были сервлеты и контейнеры сервлетов, которые примерно про это, но не совсем. Однако, у всех остальных такого счастья не было и они придумали свои решения этой проблемы. Из тех, что наиболее на слуху стоит отметить Docker и Kubernetes.
Docker, если по умному, система по автоматизации и управлению нашими контейнерами. Мы ей даем контейнер, а она его запускает, настраивает и подготавливает к работе. Суть самих контейнеров простая как топор: мы описываем, в специальном формате, что нужно для нашего приложения (ОС, библиотеки). Весь минимальный набор необходимый для корректной работы нашего приложения. А потом запекаем это, как слоеный пирог. Собрал ты контейнер, у которого в основе Ubuntu и радуешься жизни, всё работает. А потом захотел стать модным и заменить убунту на alpine, поменял пару строк в своем файле и снова радуешься жизни. Docker хорош там где нужно тестовое окружение, или окружение для разработчика.
Помни, что готовить докер в продуктиве гораздо сложнее, так как сразу возникает куча вопросов, например, по поводу производительности и безопасности. Для твоих учебных проектов это некритично, но в случае чего-то серьезного, лучше положиться на SRE инженера / системного администратора.
По учебным материалам обрати внимание на:
- Jeff Nickolof. Docker in Action. Серия «in Action» обычно довольно качественная сжатая (но не чересчур), по самым разным темам. Докер не исключение, если хочешь быстро получить базовые знания, данная книга тебе поможет;
- Официальная документация. Куда уж без документации. Написана хорошо, много полезных примеров и гайдов, не стесняйся туда почаще заглядывать.
После того как ознакомишься с учебными материалами, попробуй упаковать с помощью докера любое своё приложение и задеплоить, например на Heroku. Гайд по деплою докер образов в хероку, можно найти здесь.
Один контейнер это хорошо, это надежно. Но, что если мы поддались волне хайпа и теперь у нас из всех щелей лезут микросервисы? Что если контейнеров у нас десятки, если не сотни? Как управлять всем этим зоопарком и не сойти с ума? Здесь к нам на помощь придет оркестратор Kubernetes, или просто кубер. По самому термину «оркестратор» можно догадаться, что его задача состоит в управлении и контроле за нашим многочисленным зоопарком контейнеров. Он позволяет нам их запускать, заменять на другие, следить за их состоянием, автоматически перезапускать, если кто-то упал и даже автоматически масштабироваться, в зависимости от текущей нагрузки.
К сожалению с большой силой приходит большая головная боль, поэтому обычно с кубером работает специальный человек — SRE инженер. SRE это такой умный человек, который следует философии DevOps, если есть желание, можешь ознакомиться с бесплатной книгой от Google, где описывается их виденье данной профессии.
На начальном этапе тебе достаточно будет знать, что кубер существует, что он классный и его очень трудно готовить без соответствующего опыта.
Java конференции — это такие партийные съезды всех пролетариев джавистов. Много докладов о том, как наши микросервисы бороздят просторы облаков, разбор кишочков популярных фреймворков и многое другое.
Самое ценное в конференциях — это обмен опытом со своими братьями по цеху. Идеальное место, чтобы устраивать срачи с популярными Java персоналиями, узнавать чем сейчас дышат и держать нос по ветру. В 2021 году всё это ушло в онлайн, что несколько сбивает настрой, но по прежнему насыщенно хорошими докладами. Стоит отметить две наиболее популярные в наших краях конференции:
- Joker;
- JPoint
Два брата акробата, первый традиционно проходит в Питере, второй в Москве. Доклады часто пересекаются, но при желании можно спокойно ходить на обе конференции, благо они разнесены по разным сезонам. Видосы с прошлых сезонов стали открывать бесплатно всем желающим, к чему обязательно стоит приобщиться на ютубе.
Если ты смог осилить все перечисленные выше темы, можешь собой гордиться (впрочем, гордиться собой можешь при любом удобном случае). В руководстве мы намеренно не расписывали каждый аспект в мельчайших деталях. Его цель — создать для тебя красную нить, которой ты можешь следовать активно смотря по сторонам. Есть ещё десятки важных и интересных тем, с которыми ты обязательно столкнешься. Выбрав карьеру разработчика, ты обречен учиться до конца своей карьеры, так что постарайся расслабиться и получать от этого удовольствие. У тебя обязательно получится!
Особая признательность всем тем замечательным людям, которые помогали советами, критикой и собственными дополнениями материала. Вы лучшие.