Дисклеймер:
- В руководстве рассматривается развитие Java backend-разработчика.
- Руководство написано исходя из того, что читатель не полный новичок в CS и у него есть базовые знания.
- Руководство написано во множественном лице, потому что автор надеется на коллективное развитие данного пособия
Предисловие
Привет. Ты начинаешь читать довольно большое (20 страниц (!)), руководство по вкатыванию в серверную разработку на Java.
Я очень долгое время работал простым 1С-программистом, но в конце концов выгорел и решил попробовать себя в чем-то другом. Выбор пал на Java, и после 1.5 лет самостоятельного обучения я получил долгожданный оффер.
На текущий момент это руководство представляет собой компиляцию того, что я читал и проходил, советов более опытных коллег и просто моих ощущений. Я не могу гарантировать, что весь текст на 100% полезный, но надеюсь, что он сможет помочь людям хотя бы составить представление из того, что им понадобится в их нелегкой, но весьма интересной профессии.
Оригинальный текст руководства доступен в моем гитхаб репозитории. Распространяется под свободной лицензией, можете делать с ним, что хотите 😉
И так, погнали.
Почему Java?
Первый вопрос который сразу приходит в голову, когда выбираешь язык. На это есть целый ряд причин:
- Огромная база кода. Если ты хочешь что-то сделать, с большой вероятностью для этого уже есть библиотека;
- Отличная документация. Подробнейшее описание 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 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)
Если ты начал читать Шилдта и всё равно чувствуешь, что ничего не понимаешь, попробуй эту книгу. Написано максимально простым языком, много картинок. После её прочтения в голове должна сложиться простая мозаика, что позволит вернуться к более «взрослым» книгам.
Упражнения
Теория это замечательно, но нужно постоянно писать код. Лучшие места для этого:
- Задачки и проекты 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? Скорее всего про это уже есть статьи на baeldung.
- Telegram. Если твой поиск не увенчался успехом, и ты готов опустить руки, приходи к живым, русскоговорящим людям и попроси помощи. Тут не решат за тебя твои задачи, но помогут с направлением копания.
Подведение итогов Core
Итак, ты прошел/посмотрел курсы, прочитал базовые книги и даже прорешал кучу упражнений. Чувствуешь себя уверенно и даже расправил плечи? Самое время поиграть в карточки. Есть отличный гитхаб репозиторий в котором есть куча популярных вопросов на собеседованиях. Сейчас тебе стоит обратить внимание на:
Не ленись занести вопросы в карточки 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.
Паттерны
Многие проблемы, которые возникают при разработке приложений появляются из-за ошибок допущенных при проектировании. Умные люди выявили повторяющиеся из проекта в проект решения и закономерности (паттерны) и сделали их классификацию. Почему важно их знать? Паттерны описывают типичные способы решения часто встречающихся проблем при проектировании программ, что позволяет тебе не изобретать велосипед, а твоим коллегам гораздо быстрее понимать, что происходит в коде.
Паттернов много, хороших и разных, но зубрить их не надо. Пробегись по списку, посмотри на те которые тебя заинтересуют. На текущем этапе твоя задача оставить якорь в памяти, что такие вещи существуют.
Из ресурсов по паттернам можно выделить:
- Refactoring guru. Модно, молодежно, доступный язык.
- Design Patterns: Elements of Reusable Object-Oriented Software (GoF) — сухой академический оригинал, сможешь осилить — хорошо, не сможешь — используй другие источники.
Упражнения
Подойдут всё те же сайты которые были на прошлом этапе, но уже с более высокой сложностью. Старайся решать задачи с использованием «современных» функциональных фишек Java: Stream API и лямбды.
Подведение итогов Advanced Core
Помнишь те карточки которые ты поленился сделать на прошлом этапе? Самое время добавить новые:
Вступаем во взрослый мир
Если ты добрался до этого пункта, мы мысленно пожимаем тебе руку. Осилить такое количество материала и не сдаться, достойно уважения. Но наше путешествие продолжается. Имей в виду, что если Core ты должен знать назубок, то знание всего ниже перечисленного может варьироваться от базового до нормального. Полностью прокачаться можно, увы, только на реальной работе.
Web подготовка
Как ни странно, для того чтобы стать хорошим web разработчиком, необходимо хорошо разбираться в самой этой самой паутине. И хотя базу обычно дают в университете, убедись, что ты помнишь, что такое JSON, чем RESTful API отличается от SOAP, какие бывают HTTP методы и прочие базовые штуки. Дальше по тексту подразумеваем, что ты не впадешь в ступор от слова "endpoint".
Системы сборки
Современные приложения редко состоят из парочки классов которые запускаются из среды разработки. Работа с зависимостями твоего проекта, его сборка/упаковка, всё это ответственность систем сборки. Они берут на себя нудную и иногда тяжелую работу, чтобы твой проект на развалился под грузом JAR hell. На момент 2021 года, в Java есть две наиболее популярных системы сборки:
- Gradle. Модно, молодежно, инкрементальная компиляция, описание билд файла на Groovy или Kotlin DSL. Быстрый старт здесь.
- Maven. Почти нестареющая классика. Описание билда файла на XML, есть множество плагинов на любой вкус, расширяющие стандартную функциональность. Быстрый старт здесь.
Попробуй оба варианта, останься на том который тебе больше нравится. С этого момента все твои проекты должны собираться только с использованием выбранной тобой системой сборки. Они используются в любом реальном проекте, и ты должен уметь такие проекты открывать, дорабатывать и собирать.
Тестирование
Ты можешь быть уверенным в качестве своего кода, но ещё больше уверенности тебе даст покрытие своего кода тестами. Тестирование это отдельная крупная тема для разговора. Наиболее популярным фреймворком для тестирования является JUnit. Начать своё погружение в увлекательный мир тестирования ты можешь
Логирование
Чем крупнее твоё приложение, тем больше возникает необходимость понимать, что за процессы в нем происходят. Отладка возникающих ошибок, сбор статистики и многое другое практически невозможно без наличия логов. С системами логирования в Java всё очень плохо. Их много, у них разный подход к конфигурации, а ещё они могут связываться друг с другом в забавных франкенштейнов. Из наиболее популярного, обрати внимание на:
- Logback
- Log4j2
- JBoss logging
Проще всего будет настроить SLF4J Simple по этому мануалу. Сам SLF4J это фасад для движков логирования, вроде тех, что мы перечислили выше, но в нем есть возможность подключить небольшой встроенный движок, который отлично закроет твои начальные потребности. И помни, с этого момента в твоём коде не должно быть ни одного System.out.println
только взрослое логирование.
SQL
Современный web мир невозможен без данных, а где данные, там и базы данных. Тебе нужно понимать синтаксис SQL и уметь писать на нем запросы. В этом тебе поможет:
- Туториал от W3Schools
- Книга Алана Бьюли «Изучаем SQL»
- Прорешивание задачек на SQL-EX
- Если у тебя есть доступ к HyperSkill, пройди раздел «Databases and SQL» вот тут.
Становится джедаем запросов не надо, но у тебя должно сложиться понимание как ты можешь вертеть данные на своей будущей БД.
Базы данных
После того как ты овладел SQL, самое время подключить к своему приложению настоящую базу данных. Систем управления базой данных великое множество, на начальном этапе обрати внимание на:
- PostgreSQL/MySQL — классические реляционные СУБД;
- H2 — легковесная in memory СУБД, хорошо подойдет для твоих небольших проектов;
- 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
Два брата акробата, первый традиционно проходит в Питере, второй в Москве. Доклады часто пересекаются, но при желании можно спокойно ходить на обе конференции, благо они разнесены по разным сезонам. Видосы с прошлых сезонов стали открывать бесплатно всем желающим, к чему обязательно стоит приобщиться на ютубе.
Эпилог
Если ты смог осилить все перечисленные выше темы, можешь собой гордиться (впрочем, гордиться собой можешь при любом удобном случае). В руководстве мы намеренно не расписывали каждый аспект в мельчайших деталях. Его цель — создать для тебя красную нить, которой ты можешь следовать активно смотря по сторонам. Есть ещё десятки важных и интересных тем, с которыми ты обязательно столкнешься. Выбрав карьеру разработчика ты обречен учиться до конца своей карьеры, так что постарайся расслабиться и получать от этого удовольствие. У тебя обязательно получится!
Ох... я, помнится, что-то похожее читал на доу.
Вообще, насколько я могу видеть со своего опыта, самое главное это не выучить, как на спринге сделать что-то. Самое главное, за что готовы платить деньги это за а) умение быстро-быстро разобраться в том, чего же от тебя хотят и б) предложить, как же ты это будешь делать и таки сделать это в разумное время (ну или хотя бы уметь красиво объяснить, почему ты не успел) Это, в общем-то, основное
Насчет техскиллов. Честно говоря, я удивлен, что в списке отсутствует курсера и замечательный курс Седжвика. Более того, у меня сложилось впечатление, что автор за деревьями не разглядел лес (без обид)
В общем, что обычно советую падаванам я:
Вне списка парочка замечаний:
Святой человек, дай Бог тебе здоровья. Я как раз на этом пути и это очень полезно и очень актуально. Очень. Спасибо 🖤
а можно так же, но по Go? ;)
Отличный экскурс, будто прочитал свой путь в джаву, но увидел другие ветки, по которым не пошел
Отличный пост! Думаю поможет мне закрыть пробелы в знаниях)
По Spring могу посоветовать курсы javaops - сам с ними успешно вкатился и прайс не 100к+, как у инфоцыган
Именно в Java я мало что понимаю, сам бэкенды на ноде пишу. Но всё-таки самой популярной in-memory bd скорее является redis.
Мне понравился этот текст👍🏻, даже что-то для себя узнал (например, что Spring in action стоит читать именно 4th ed)
Конечно, это не то, что нужно бежать изучать новичку прямо сейчас для достижения краткосрочной цели (такой как: найти работу). Но хороший обзор того, что нужно будет знать (и где черпать информацию), чтобы нормально себя чувствовать в Java разработке в 2021.
Про Докер:
Сначала я подумал, что речь про compose или swarm. Но нет.
А еще фраза:
читается будто, далее будут представлен две альтернативы одного и того же. Как MySQL и Postgres. Поэтому подумал, что после Docker, там возможно rkt или OCI, а там Kubernetes. Думаю, что стоит это как-то переписать
О, привет, крутой гайд! )
https://www.marcobehler.com
Человек делает потрясающие статьи про джаву, а его гайд по спрингу я советую всем вкатывающимся в спринг:
https://www.marcobehler.com/guides/spring-framework
Крутой гайд! Имеет ли смысл добавлять к стеку Python + Go джаву или это взаимоисключающие явления?
Как же сложно жавистам, столько знать всего надо. Приходите лучше в Scala, изучил пару концепций и все остальное основано на этих концепциях.
Круто!
А для Python такого же замечательного мануала никому часом не попадалось?
Автор, поправь опечатки: