Пишем Java веб-приложение на современном стеке. С нуля до микросервисной архитектуры. Часть 1
Авторизуйтесь
Пишем Java веб-приложение на современном стеке. С нуля до микросервисной архитектуры. Часть 1
На сегодняшний день в мире разработки на Java существует огромное количество библиотек и технологий, в которых новичку очень легко запутаться. В этом руководстве я постараюсь простым языком описать все шаги, возникающие проблемы и пути их решения. Начинать будем с самого простого и постепенно наращивать функциональность.
Spring Boot
Spring Boot — один из самых популярных универсальных фреймворков для построения веб-приложений на Java. Создадим в среде разработки Gradle Project. Для облегчения работы воспользуемся сайтом https://start.spring.io, который поможет сформировать build.gradle.
Для начала нам необходимо выбрать следующие зависимости:
В результате генерации build.gradle должно получиться что-то похожее:
Тот же результат можно получить и в самой IntelliJ Idea: File → New → Project → Spring Initializr.
Опишем самый простой контроллер, чтобы удостовериться, что проект работает:
Результат работы можно проверить в браузере перейдя по адресу http://localhost:8080/hello?name=World или с помощью консольной утилиты curl:
Наш сервис запускается и работает, пора переходить к следующему шагу.
Представим, что нам требуется разработать некий сервис для интернет-магазина по продаже книг. Это будет rest-сервис, который будет позволять добавлять, редактировать, получать описание книги. Хранить данные будем в БД Postgres.
Docker
Для хранения данных нам потребуется база данных. Проще всего запустить инстанс БД с помощью Docker. Docker позволяет запускать приложение в изолированной среде выполнения — контейнере. Поддерживается всеми операционными системами.
Выкачиваем образ БД и запускаем контейнер:
Lombok
Создадим data-класс «книга». Он будет иметь несколько полей, которые должны иметь getters, конструктор и должна быть неизменяемой (immutable). Среда разработки позволяет автоматически генерировать конструктор и методы доступа к полям, но чтобы уменьшить количество однотипного кода, будем использовать Lombok.
После сборки проекта можно посмотреть, как выглядит класс после компиляции. Воспользуемся стандартной утилитой, входящей в состав JDK:
Lombok очень упрощает читаемость подобного рода классов и очень широко используется в современной разработке.
Spring Data JPA
Для работы с БД нам потребуется Spring Data JPA, который мы уже добавили в зависимости проекта. Дальше нам нужно описать классы Entity и Repository. Первый соответствует таблице в БД, второй необходим для загрузки и сохранения записей в эту таблицу.
Класс Repository будет выглядеть совсем просто — достаточно объявить интерфейс и наследоваться от CrudRepository:
Никакой реализации не требуется. Spring всё сделает за нас. В данном случае мы сразу получим функциональность CRUD — create, read, update, delete. Функционал можно наращивать — чуть позже мы это увидим. Мы описали DAO-слой.
Теперь нам нужен некий сервис, который будет иметь примерно следующий интерфейс:
Это так называемый сервисный слой. Реализуем этот интерфейс:
При создании объекта класса Spring опять всё возьмёт на себя — сам создаст объект BookRepository и передаст его в конструктор. Имея объект репозитория мы можем выполнять операции с БД:
MapStruct
Смотря на код может показаться, что класс Book не нужен, и достаточно только BookEntity, но это не так. Book — это класс сервисного слоя, а BookEntity — DAO. В нашем простом случае они действительно повторяют друг друга, но бывают и более сложные случаи, когда сервисный слой оперирует с несколькими таблицами и соответственно DAO-объектами.
Если присмотреться, то и тут мы видим однотипный код, когда мы перекладываем данные из BookEntity в Book и обратно. Чтобы упростить себе жизнь и сделать код более читаемым, воспользуемся библиотекой MapStruct. Это mapper, который за нас будет выполнять перекладывание данных из одного объекта в другой и обратно. Для этого добавим зависимости в build.gradle:
Создадим mapper, для этого необходимо объявить интерфейс, в котором опишем методы для конвертации из BookEntity в Book и обратно:
После сборки проекта, в каталоге build/generated/sources/annotationProcessor появится сгенерированный исходный код mapper, избавив нас от необходимости писать однотипные десятки строк кода:
Воспользуемся мэппером и перепишем DefaultBookService. Для этого нам достаточно добавить добавить final-поле BookMapper, которое Lombok автоматически подставит в аргумент конструктора, а spring сам инстанциирует и передаст параметром в него:
Теперь опишем контроллер, который будет позволять выполнять http-запросы к нашему сервису. Для добавления книги нам потребуется описать класс запроса. Это data transfer object, который относится к своему слою DTO.
Нам также потребуется конвертировать объект AddBookRequest в объект Book. Создадим для этого BookToDtoMapper:
Теперь объявим контроллер, на эндпоинты которого будут приходить запросы на создание и получение книг, добавив зависимости BookService и BookToDtoMapper. При необходимости аналогично объекту AddBookRequest можно описать Response-объект, добавив соответствующий метод в мэппер, который будет конвертировать Book в GetBookResponse. Контроллер будет содержать 3 метода: методом POST мы будем добавлять книгу, методом GET получать список всех книг и книгу по идентификатору, который будем передавать в качестве PathVariable.
Настройка spring.jpa.hibernate.ddl-auto=update указывает hibernate необходимость обновить схему когда это нужно. Так как мы не создавали никаких схем, то приложение сделает это автоматически. В процессе промышленной разработки схемы баз данных постоянно меняются, и часто используются инструменты для версионирования и применения этих изменений, например Liquibase.
Запустим наше приложение и выполним запросы на добавление книг:
Запустим клиент БД и выполним sql-запрос:
Получим список всех книг:
Получим книгу через запрос к api нашего сервиса, указав идентификатор книги:
В документации можно подробнее прочитать об именовании методов. Здесь мы указываем findAll — найти все записи, ByAuthor — параметр обрамляется %. При вызове этого метода (например с аргументом ‘Bloch’) будет сгенерирован следующий запрос:
Далее добавим метод в BookService и DefaultBookService:
А в контроллере немного модифицируем метод получения списка книг таким образом, что при передаче get-параметра author мы искали по автору, а если параметр не передётся, то используется старая логика и выводится список всех книг:
Теперь можно выполнить поиск:
Итак, мы написали веб-сервис и познакомились с очень распространенными библиотеками. В следующей части продолжим улучшать наше приложение, добавив в него авторизацию, а также напишем отдельный микросервис, который будет выписывать токены доступа.
По пунктам: что нужно знать о бэкенде новичку в веб-разработке
Авторизуйтесь
По пунктам: что нужно знать о бэкенде новичку в веб-разработке
Рассказывает Эмит Ирэндол, full-stack разработчик
В этой статье перечислены ключевые аспекты, которые нужно учитывать при создании бэкенда в контексте full-stack веб-разработки. Новичков она познакомит с основами, а более продвинутым программистам может быть полезна в качестве чек-листа.
1. Аутентификация
Большинство приложений стремится обрести новых пользователей, поэтому необходимо разработать механизм, позволяющий пользователям регистрироваться, аутентифицироваться и менять свои учётные данные.
Можно выделить два основных типа аутентификации:
Есть и более продвинутый сценарий — многофакторная аутентификация. Она повышает безопасность приложения, добавляя дополнительные уровни защиты к логину и паролю. Хорошие примеры реализации есть у Google и Amazon.
Прим. перев. А у нас есть разъясняющая статья про двухфакторную аутентификацию и протокол FIDO U2F.
2. Роли, разрешения и контроль доступа
Запутались? Объясню подробнее. Смысл слоя, отвечающего за авторизацию, — это выдача разрешений, поддержание безопасности личной информации, отказ в доступе к конкретным действиям и, где требуется, аннулирование привилегий, чтобы одни пользователи не пробирались в аккаунты других и не смотрели их личные фотографии. Логика разрешений проста:
Пользователь x может сделать действие y с объектом z.
Применим это в конкретной ситуации: Шэрон — редактор и может редактировать посты. Тогда надо определить:
3. CRUD — Create, Read, Update, Delete
13–15 декабря, Онлайн, Беcплатно
Но что такое ресурс? Если вы создаете книжный магазин, то книги — это ресурсы. Если вы создаете группу, она сама и есть ресурс и ее участники тоже ресурсы. А также каждая запись или аккаунт, который они используют. Например, это может быть официальное письмо к правительству, открытка или фильм, который они пытаются купить.
Здесь и появляется модель структуры ваших данных. Вам нужно будет понимать, как решить следующие задачи:
Так выглядит CRUD при работе с фреймворком Ruby on Rail, который предоставляет слой объектно-реляционного сопоставления (Object Relational Mapping — ORM ) :
Также ваши ресурсы редко существуют в изоляции. Чаще всего они связаны какими-то отношениями или ассоциациями с другими ресурсами. Давайте взглянем на сценарий, где вы хотите сохранить информацию о парах, которые есть у студента. Вы можете создать дочерний ресурс в student и сохранить его:
Не правда ли, это выглядит и читается, как обычный английский? Но учиться все равно придется, ведь в реальности задачи очень быстро обрастают трудностями! Поэтому вам нужно научиться работать с базами данных, выбрав для себя подходящую модель: реляционную или NoSQL.
Заметьте, что для задач CRUD вам также нужно будет научиться проверять входящие данные и сверяться с разрешениями, прежде чем вы сделаете что-то с этими данными.
4. REST
Чтобы обеспечить управление ресурсами в вашем приложении (такими, как книги или аккаунты), нужно реализовать программный слой, принимающий запросы и формирующий ответы. Здесь вам доведется поработать с маршрутами (routes) и контроллерами (controllers). Они обеспечивают соблюдение ограничений, накладываемых REST — стилем архитектуры программного обеспечения для распределенных систем.
В типичном приложении на Ruby маршрут выглядит так:
Что в это время происходит в системе:
Запросы могут приходить из многих источников (их называют клиентами). Чаще всего запросы для веб-приложения формируются в форме ввода браузера. Но, если вы пишете бэкенд для мобильного приложения, то клиент — это API приложения, и он посылает запросы GET, POST, PUT, DELETE из приложения.
Вы можете разработать отвечающую на запросы систему, создав API с учетом REST. Такой API называется RESTful, читайте подробнее о нем в подробной статье.
Прим. перев. Также предлагаем ознакомиться с нашим материалом по этой теме.
5. Формы и состояния
Формы — это самый распространенный способ общения пользователей с приложением. В основном через них пользователи и вводят все данные.
Вам надо создать формы для взаимодействия с бэкендом: если пользователь заказывает билет на концерт, то форма должна выглядеть, как сетка мест:
Когда пользователь начинает взаимодействовать с формой, вам надо сделать следующее:
6. API
Чтобы ваше приложение стало по-настоящему популярным, вам надо начать делиться данными с другими приложениями. Например, вы — музыкальная компания, и вы хотите, чтобы стриминговые сервисы типа SoundCloud поставляли ваш контент, а пользователи могли покупать вашу музыку напрямую из их приложения. Здесь и нужен API.
Термин API — аббревиатура от Application Programming Interface (интерфейс программирования приложений) — применяется к инфраструктуре, которая позволяет другим приложениям взаимодействовать с вашим. 
Основные этапы написания API:
7. Уведомления по Email, SMS и Webhooks
Когда пользователь совершает в вашем приложении важное действие, например, подписывается на обновления, создает новый аккаунт или проект, он должен знать, удалось это действие или нет.
Уведомления — это способ сообщить вашему пользователю о статусе выполнения действия и помочь ему организовать рабочий процесс в вашем приложении.
Для разных случаев вы можете использовать разные уведомления:
8. Подписка и тарифные планы
Продумывание тарифов только кажется маловажным, но на деле часто является необходимым. Вам придется научиться создавать многоуровневые тарифные планы и присваивать определенные роли, разрешения и привилегии пользователям, подписавшимся на конкретный план. Также хорошая идея научиться предоставлять динамическое ценообразование, основанное на свойствах, формирующих каждый тарифный план. Например, покупка нового сервера на AWS или DigitalOcean дает пользователям право выбирать память, процессор и т.д.
Полезные советы по проектированию тарифных планов:
9. Взаимодействие с платежным шлюзом
Вам понадобится обрабатывать информацию о кредитных картах с помощью форм, которые обычно выглядят, как интерфейс интернет-магазина.
Во время транзакции нужно:
Вы также можете использовать сторонние сервисы, такие, как Paypal, которые позволяют интегрировать их интерфейс в виде формы (или кнопки) в ваше приложение, и тогда транзакции будут частично управляться этим сервисом.
Не забывайте про счета — людям нужны документы о транзакциях для уплаты налогов и т. д.:
Как работает платежный шлюз:
Если остались вопросы, посмотрите это видео:
10. Загрузка файлов
Очень вероятно, что когда пользователи начнут работать в вашем приложении, они будут хранить в нем свои данные, которые представляют из себя не только информацию в вашей базе, но и картинки, видео и PDF. Так что вам надо будет:
11. Сторонние API, фреймворки и пакеты
Ruby, Elixir, PHP и JavaScript уже имеют тысячи пакетов, которые могут быть настроены и применены к вашему приложению. Их легко встроить с помощью команды в одну строку в терминале:
Если вы не будете включать сторонний код в вашу экосистему, то вам придется разбираться с такими низкоуровневыми проблемами, как создание сессий, хэширование и защита от атак CSRF и тому подобное вместо того, чтобы фокусироваться на высокоуровневых задачах, которые делают ваше приложение уникальным.
Чаще всего фреймворки составлены из отдельных пакетов, которые при желании можно заменять на более подходящие под ваши задачи. Вы можете оценить качество исходного кода пакета по следующим пунктам:
12. Работа с Open Source
Вы столкнетесь с тем, что уже существующие пакеты не выполняют необходимые задачи или делают это некорректно. Тем не менее, всегда есть возможность подстроить под себя их функционал, поэтому учитесь работать с чужим исходным кодом. Полезные советы:
13. Интерфейс для управления
Как только вы выпустите приложение, пользователи захотят управлять им, настраивать и персонализировать его. Чтобы они ничего не сломали, стоит ограничить им доступ, предоставив приятную и простую в использовании панель управления. Создать её не так сложно, как кажется, да и большинство написанных для нее функций вы сможете использовать где-то еще.
Хорошая панель управления должна обладать следующими свойствами:
14. Кэширование
Красивый и удобный фронтенд часто состоит из сложные многоуровневых данных, отображение которых может быть медленным и ресурсозатратным. Без кэширования ваша база данных будет вынуждена многократно выполнять почти одинаковые запросы, что приведет к ее перегрузкам.
Представьте промежуточный слой в стэке вашего приложения, который хранит статические данные и предоставляет их по запросу, не обращаясь к базе данных. Это и есть кэш.
Как работает кэширование в веб-приложениях? Можно выделить следующие типы механизмов:
15. Компоненты
Это больше относится к фронтенду, но так как вы full-stack разработчик, вам нужно разделить ваш код — и шаблоны страниц, и службы бэкенда — на модульные компоненты, если вы не хотите запутаться. В моем любимом проекте фронтенд организован следующим образом:
Приведенный выше код взят из шаблона Twig, который можно легко менять. Кроме того, при выходе из строя одного из компонентов работа всей страницы не нарушается. Например, если ваш код для аутентификации находится в слое управления, будет гораздо лучше убрать его оттуда и сформировать в виде отдельного компонента.
16. Системы управления версиями
Речь, конечно, идет об использовании Git и GitHub. Новичкам использование Git кажется излишним, а его преимущества — неочевидными, поэтому предлагаю подумать о ситуациях, с которыми вы можете столкнуться в процессе написания кода:
Научиться пользоваться GitHub поможет эта статья.
Прим. перев. А чтобы разобраться в основах Git, читайте наше руководство.
17. Командная строка
В интерфейсе, доступном пользователю, есть ограниченное количество кнопок, которых недостаточно для полноценного управления приложением на всех уровнях. Но для этого есть командная строка, которая поможет вам добавлять модули в инфраструктуру вашего приложения, тестировать его и выкладывать на удаленный сервер.
Для освоения командной строки советую эту книгу.
Прим. перев. Знакомство с командной строкой также можно начать с нашей шпаргалки по Bash.
18. Вопросы на Stack Overflow
Если вы не можете разобраться сами, то спросите на Stack Overflow. А чтобы не показаться смешным в глазах опытных пользователей и получить исчерпывающий ответ, задавайте вопросы по инструкции.
Java backend с чего начать
Руководство по вкатыванию в backend-разработку на Java для почти начинающих и сочувствующих.
Первый вопрос который сразу приходит в голову, когда выбираешь язык. На это есть целый ряд причин:
Есть и ворох недостатков:
Если хорошенько поискать, можно найти десятки статей о том, какие книги лучше читать и какие курсы лучше проходить. Заботливые люди рисуют дорожные карты и, казалось бы, просто бери и следуй гайдам. Но проблема в том, что их слишком много! Современный мир backend-разработки требует от тебя разбираться в куче вещей, и простой человек Василий, попробовав во всём этом разобраться, очень скоро почувствует беспомощность, грусть и отчаяние.
Однако, всё не так страшно. Учиться придется действительно очень много, однако мы отобрали только самые лучшие зёрна материалы.
Подготовка к подготовке
Перед обучением тебе понадобится:
Установка Java. Бери всегда самую свежую версию. Даже если на работе будешь писать на восьмерке, всегда стоит держать руку на пульсе и быть в курсе всех современных Java фишек.
Среда разработки. Используй intellij IDEA Community, скажешь спасибо потом. Из альтернатив есть:
Знакомство с Git. Гит — система контроля версий. Если ты когда-нибудь слышал слова «коммиты», «ветки» и «PR» — это оно. Для начала хватит простого гайда, чтобы понимать базовые термины. Потом стоит почитать документацию к своей IDE. IDEA, например, поддерживает работу с гит из коробки.
Профиль на GitHub. Гитхаб — это такая социальная сеть для разработчиков. Ставь лайки библиотекам, которые используешь, и изучай тренды. Не стесняйся выкладывать туда все свои мелкие проекты, только не забывай про Readme. Потом будешь рад, когда будешь искать проект, в котором ты делал работающие аспекты или работу с авторизацией.
Ведение заметок. Очень важный пункт. Тебе предстоит поглощать огромное количество информации, большую часть которой ты забудешь уже на следующий день. Чтобы помочь своему мозгу, начни вести заметки по методике ZettelKasten, например, в notion.io https://habr.com/ru/post/509756/.
Будь в курсе. Java активно развивается. Чтобы не остаться в стороне от важных новостей, ты должен читать эти новости. Начни с подписки на ежемесячную подборку Java Annotated и не стесняйся подписываться на интересных авторов.
Java Core — это основа понимания языка и представление о его возможностях, работающих «из коробки». Так как это фундамент, подойти к его формированию стоит очень ответственно, чтобы не страдать позже и не пытаться изобрести велосипед. Не стоит пытаться сэкономить время, хитрить или пропускать «неинтересные» куски. Поверь, уверенная база тебе воздастся в будущем, ибо на собеседованиях гоняют в основном по Core.
Помни, что ни один из курсов не дает полную базу. Используй их как дополнение к книгам.
Туториалы от Oracle
Oracle является разработчиком языка и предоставляет собственные обучающие материалы, довольно неплохого качества. Ещё и бесплатно. Из минусов: рассматривается java 8, и некоторые темы рассмотрены очень сжато. Но всё равно обязательно загляни, там много интересного.
В странах СНГ и Украине весьма популярен великий и ужасный JavaRush. Интернет пестрит историями успеха, как простой слесарь Григорий стал успешным и теперь зарабатывает 300кк/наносек. Тысячи практических задач! Сотни тысяч пользователей! За какие-то смешные деньги ты сможешь полностью изменить свою жизнь!
Так вот, ни в коем случае на это не ведись. JavaRush очень сильно страдает отрывочной подачей теории, из-за чего люди застревают даже на простых задачках. Задумайся, при написании технической книги она проходит множество стадий вычитки и рецензирования. На JavaRush таким, понятное дело, никто не занимается. Не трать зря время, деньги и нервы, и представь, что такого сайта просто не существует. Даже если ты знаешь человека, который знает человека, который сказал, что там всё круто.
Агрегатор курсов от различных авторов, разной степени качества. Из того, что смотрел сам, могу посоветовать Java. Базовый курс.
HyperSkill (JetBrains Academy)
Совместный проект 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к рублей, всегда скидывают.
Лучше всего читать на английском, но можно и переводы. Помни, что переводы зачастую являются устаревшими и ВНЕЗАПНО труднее читаются, из-за того, что одни и те же термины в разных книгах могут переводить по разному.
Герберт Шилдт, Java. Полное руководство и Java. Руководство для начинающих
«Полное руководство» это увесистый том на 1.5к страниц, который с трудом помещается в руках. Бери его если у тебя есть безответная любовь к справочникам или если ты любишь максимально дотошное описание API языка. Если нет, бери «Руководство для начинающих», которое в два раза короче и наслаждайся подробным описанием языка без километровых описаний API. Имей в виду, что в руководстве для начинающих не освещены некоторые «продвинутые» темы, так что сверься с содержанием обеих книг.
Джошуа Блох, Java. Эффективное программирование
Книга которую обязательно стоит прочитать после Хорстманна или Шилдта, и регулярно перечитывать. Блох один из создателей языка, и в своей книге описал многочисленные best practice: правильное написание equals и hashCode, как правильно готовить generics, почему лямбды это хорошо и многое другое. Написано доступно, читается легко.
(Опционально) Кей Хорстманн, Java. Библиотека профессионала, Том 1. Основы
Хорстманн пишет более сухо и сжато чем Шилдт, некоторые моменты описаны более на «низком» уровне (объяснения как оно устроено внутри). Пестрит вставками сравнениями с С++. Твой выбор если уже есть/был опыт других языков и нет потребности в разжевывании материала. Во втором томе описываются продвинутые темы вроде разбора XML, интернационализации и веб-служб. Глянь содержание и имей в виду, что там есть.
(Опционально) Кэти Сьерра и Берт Бейтс, Изучаем Java (Head First Java)
Если ты начал читать Шилдта и всё равно чувствуешь, что ничего не понимаешь, попробуй эту книгу. Написано максимально простым языком, много картинок. После её прочтения в голове должна сложиться простая мозаика, что позволит вернуться к более «взрослым» книгам.
Теория это замечательно, но нужно постоянно писать код. Лучшие места для этого:
Что делать если возникли вопросы?
Не знаешь как разбить строку на символы? Не помнишь как прочитать текст из файла? Забыл как быстро можно отсортировать массив? Со всем этим помогут следующие ресурсы:
Подведение итогов Core
Итак, ты прошел/посмотрел курсы, прочитал базовые книги и даже прорешал кучу упражнений. Чувствуешь себя уверенно и даже расправил плечи? Самое время поиграть в карточки. Есть отличный гитхаб репозиторий в котором есть куча популярных вопросов на собеседованиях. Сейчас тебе стоит обратить внимание на:
Не ленись занести вопросы в карточки Anki или распечатать в бумажном виде. Повторяй на регулярной основе, но помни, что твоя задача не заучить их механически, но научиться приходить к ответам логическим путем. Когда придешь на собеседование и будешь трястись от нервов и пить воду шумными глотками, все твои зубрежки вылетят из головы, но понимание материала никуда не денется.
Java Core Advanced
Итак, ты уже уверенно владеешь базовыми средствами языка. Без проблем решаешь базовые задачи, знаешь состав Collections Framework, понимаешь отличие HashMap от TreeMap и даже знаешь что есть стримы и есть другие стримы. Самое время нырнуть в Core ещё глубже.
Рауль Урма, Марио Фуско, Алан Майкрофт. Современный язык Java
Выход Java 8 изменил экосистему Java навсегда. Stream API, default методы, лямбды, без этих вещей невозможно представить современную Java разработку. В этой книге подробно описаны все киллер фичи Java 8. Некоторые моменты, вроде конкурентности могут быть непонятными, но обязательно вернись к ним позже.
Обрати внимание, в русском переводе есть проблема с перепутанными примерами кода в первых главах.
Брайан Гетц. Java Concurrency на практике
Современный web это высокие нагрузки, тысячи клиентов, и терабайты данных. Чтобы твоё приложение могло утилизировать ресурсы сервера по максимуму, ты должен стать джедаем конкурентного/параллельного программирования. Эта книга must read абсолютно для всех java разработчиков. Несмотря на то, что она написана для Java 5, все её советы актуальны и по сей день. Может читаться тяжело, но прочитать ты её обязан.
Адитья Бхаргава. Грокаем алогритмы
По поводу того когда лучше знакомиться с алгоритмами ведутся бесконечные диспуты. Наше мнение — каждый решает сам для себя. Но конкретно эту книгу лучше прочитать пораньше. Она в интересной форме расскажет про базовые термины вроде сложности алгоритмов, познакомит тебя с некоторыми видами сортировок и прочими интересными штуками. Звучит сложно, но поверь, это именно та книга, который может вызвать у тебя любовь к алгоритмам.
(Опционально) Роберт Лафоре. Структуры данных и алгоритмы Java
Многие критикуют данную книгу из-за странного стиля кода и занудной подачи материала, но если вдруг тебе захотелось копнуть алгоритмы чуть поглубже, можешь попробовать.
(Опционально) Николай Палрог. Система модулей Java
Одной из ключевых фишек Java 9, стала новая система модулей, которая позволяет получить абстракцию над привычными пакетами и получить более сильную инкапсуляцию классов. Её весьма неохотно используют (в основном из-за лени и легаси), но уметь готовить модули будет приятным бонусом к твоим навыкам и пригодится если вдруг захочешь сдавать официальную сертификацию Oracle.
(Опционально) Кен Коузен. Современный Java. Рецепты программирования
Практически всё тоже, что в книге Урмы, только как сборник кратких рецептов: как использовать коллекторы, компараторы, потоки и прочие «новинки» Java 8. Всё это с небольшими понятными примерами. Книга весьма хороша как краткая выжимка-handbook.
Хорошее дополнение к книге Брайана Гетца по многопоточности. Некоторые темы пересекаются, некоторые темы затрагивают внутренние кишочки вроде модели памяти Java. Одних этих видео не хватит чтобы полностью разобраться с многопоточностью, но отлично помогут укрепить или дополнить твоё представление об этой страшной и сложной вещи.
Многие проблемы, которые возникают при разработке приложений появляются из-за ошибок допущенных при проектировании. Умные люди выявили повторяющиеся из проекта в проект решения и закономерности (паттерны) и сделали их классификацию. Почему важно их знать? Паттерны описывают типичные способы решения часто встречающихся проблем при проектировании программ, что позволяет тебе не изобретать велосипед, а твоим коллегам гораздо быстрее понимать, что происходит в коде. Однако помни, что использование популярных паттернов при решении каждой задачи является скорее плохой практикой чем хорошей. Всё хорошо в меру, и с опытом ты поймешь ту тонкую грань, когда паттерны реально сделают архитектуру твоего кода лучше, а когда только навредят.
Паттернов много, хороших и разных, но зубрить их не надо. Пробегись по списку, посмотри на те которые тебя заинтересуют. На текущем этапе твоя задача оставить якорь в памяти, что такие вещи существуют.
Из ресурсов по паттернам можно выделить:
Подойдут всё те же сайты которые были на прошлом этапе, но уже с более высокой сложностью. Старайся решать задачи с использованием «современных» функциональных фишек Java: Stream API и лямбды.
Подведение итогов Advanced Core
Помнишь те карточки которые ты поленился сделать на прошлом этапе? Самое время добавить новые:
Вступаем во взрослый мир
Если ты добрался до этого пункта, мы мысленно пожимаем тебе руку. Осилить такое количество материала и не сдаться, достойно уважения. Но наше путешествие продолжается. Имей в виду, что если Core ты должен знать назубок, то знание всего ниже перечисленного может варьироваться от базового до нормального. Полностью прокачаться можно, увы, только на реальной работе.
Как ни странно, для того чтобы стать хорошим web разработчиком, необходимо хорошо разбираться в этой самой паутине. И хотя базу обычно дают в университете, убедись, что ты помнишь/знаешь, что такое JSON, чем RESTful API отличается от SOAP, какие бывают HTTP методы и прочие базовые штуки. Дальше по тексту подразумеваем, что ты не впадешь в ступор от слова «endpoint».
Современные приложения редко состоят из парочки классов которые запускаются из среды разработки. Работа с зависимостями твоего проекта, его сборка/упаковка, всё это ответственность систем сборки. Они берут на себя нудную и иногда тяжелую работу, чтобы твой проект на развалился под грузом JAR hell. На момент 2021 года, в Java есть две наиболее популярных системы сборки:
Попробуй оба варианта, останься на том который тебе больше нравится. Явного фаворита среди них нет, Gradle часто ругают за сложность настройки, Maven за медлительность и многословность. На рынке они распределены почти 50/50, так что смотри сам. Мы советуем Maven, так как новичку зачастую проще работать именно с ним. С этого момента все твои проекты должны собираться только с использованием выбранной тобой системой сборки. Они используются в любом реальном проекте, и ты должен уметь такие проекты открывать, дорабатывать и собирать.
Ты можешь быть уверенным в качестве своего кода, но ещё больше уверенности тебе даст покрытие своего кода тестами. Тестирование это отдельная крупная тема для разговора. Их бывает много разных видов, разной степени полезности с использованием разных инструментов. Мы советуем начать с модульного (unit) тестирования. Наиболее популярным фреймворком для unit тестирования является JUnit. Начать своё погружение в этот увлекательный мир ты можешь
Чем крупнее твоё приложение, тем больше возникает необходимость понимать, что за процессы в нем происходят. Отладка возникающих ошибок, сбор статистики и многое другое практически невозможно без наличия логов. С системами логирования в Java всё очень плохо. Их много, у них разный подход к конфигурации, а ещё они могут связываться друг с другом в забавных франкенштейнов. Из наиболее популярного, обрати внимание на:
Современный web мир невозможен без данных, а где данные, там и базы данных. Тебе нужно понимать синтаксис SQL и уметь писать на нем запросы. В этом тебе поможет:
Становится джедаем запросов не надо, но у тебя должно сложиться понимание как ты можешь вертеть данные на своей будущей БД.
После того как ты овладел SQL, самое время подключить к своему приложению настоящую базу данных. Систем управления базой данных великое множество, на начальном этапе обрати внимание на:
Читать многотомные руководства, на начальном пути обучения, по ним не потребуется. Для начала тебе будет достаточно знать как установить СУБД и как заглянуть внутрь табличек.
Звучит слишком хорошо, чтобы быть правдой, не так ли? Так и есть. Правильная готовка ORM это настоящая головная боль и балансирование на острие ножа, но тебе придется к этому прикоснуться.
Он же просто хибер. Самый популярный Java фреймворк, предназначенный для решения ORM задач. Море возможностей, море подводных камней, море страданий. Профессионально его готовить мало кто умеет, но приобщиться надо. Материалов по нему великое множество, но обрати внимание на эти:
Спринг — это самая популярная веб-экосистема в Java. Состоит из целого набора различных фреймворков, разного назначения: работа с БД, облаками, безопасностью, и многое другое. Да, у него есть менее популярные альтернативы, но с высокой долей вероятности, на работе ты столкнешься именно с ним. Так что добро пожаловать в весну.
Как у 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, сопровождаемые примерами кода, и многое, многое другое. Начни своё путешествие отсюда и поверь, очень многие вопросы у тебя не появятся, если ты внимательно ознакомишься с этими материалами.
Широко известный в узком кругу лиц, Евгений Борисов периодически выступает с докладами, в которых разбирает устройство 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 в классическом виде не существует. Но тут тебе может помочь HyperSkill, в котором есть учебные web проекты, в которых ты сможешь помочить ноги, примеры проектов от самого Spring, например знаменитый PetClinic и реализация собственных пет проектов. Давно хотел собственного телеграм бота? Самое время начать его пилить с помощью Spring.
Раньше, когда мир был медленнее, программы выпускались крупными релизами, иногда даже раз в год, которые чаще всего вручную устанавливались на сервер. Исправляющие патчи выпускали быстрее, но тоже не то чтобы очень часто.
В современном мире ситуация значительно изменилась. Наши пользователи не готовы ждать так долго пока вы наконец-то не запилите им такую необходимую для них фичу. Они хотят её здесь и сейчас. Разработчики подстроились под эти желания и изменили подход к своей работе. Если мы что-то делаем регулярно, зачем это делать вручную? Если всё есть код, то мы можем делать с ним, что угодно, отправлять куда угодно. Так появилась методика непрерывной интеграции и непрерывного развертывания.
Разработчик запушил новую фичу? Пора сделать рутинные действия: получить свежие изменения, запустить юнит тесты, собрать приложение под нужные платформы, развернуть тестовое окружение и запустить интеграционные тесты. Все этапы прошли успешно? Значит будем считать, что код стабилен и его можно отправить прямо на продуктив, где пользователи сразу получат такую долгожданную фичу и заметно веселее понесут бизнесу свои деньги. Все эти рутинные действия берет на себя система непрерывной интеграции. От нас требуется только предоставить ей необходимое окружение и предоставить скрипт конвейерной сборки. Всё остальное она берет на себя, активно работая на невидимом фронте, лишь периодически оповещая людей, если что-то пошло не так.
Звучит как идеальный мир, где все счастливы, но, к сожалению, в жизни всё несколько сложнее. Всегда есть перечень «Но» переменной длины, который вносит коррективы. Но сама концепция CI/CD и методология DevOps, к которой она относится, является сейчас крайне популярной и эффективной организацией создания и обновления наших продуктов. Ты найдешь ей применение практически на любом проекте.
Дженкинс один из наиболее популярных серверов непрерывной интеграции. Что его делает таким популярным? Во-первых, он бесплатный и опенсорсный. Во-вторых, он чрезвычайно расширяемый благодаря сотням различных плагинов и библиотек. Не нашел нужную? Всегда можно запилить свою, ведь Jenkins написан на нашей любимой Java. Настройку наших конвейеров можно производить прямо на Groovy, что предоставляет нам практически неограниченные возможности.
Из минусов можно отметить откровенно устаревший интерфейс, и понимание, что если что-то пошло не так, в поддержку не напишешь, придется ковыряться самому. Следствие бесплатности, увы.
Однако сделать свои первые шаги и запустить первые конвейеры довольно легко. Просто следуй официальному гайду и очень скоро твоё приложение научится тестировать и собирать само себя. Ну не чудо ли?
А что если нам нужно переустановить систему? А что если нужно это сделать на другой ОС? Со всем этим нам поможет технология упаковки приложений в контейнеры. Контейнеры позволяют нам инкапуслировать всю среду, которая необходима для работы нашей программы, внутри черного ящика. Это значит, что сама основная машина не будет замусориваться бесконечными библиотеками и доп. софтом, всё это будет аккуратно упаковано и не будет никому мешать. Удалил контейнер и вместе с ним уедет в небытие вся его обвязка. Никаких больше проблем с конфликтом версий у разного ПО. Счастье для всех, даром и никто не уйдет обиженным.
Исторически, у джавистов ещё в бородатые времена были сервлеты и контейнеры сервлетов, которые примерно про это, но не совсем. Однако, у всех остальных такого счастья не было и они придумали свои решения этой проблемы. Из тех, что наиболее на слуху стоит отметить Docker и Kubernetes.
Docker, если по умному, система по автоматизации и управлению нашими контейнерами. Мы ей даем контейнер, а она его запускает, настраивает и подготавливает к работе. Суть самих контейнеров простая как топор: мы описываем, в специальном формате, что нужно для нашего приложения (ОС, библиотеки). Весь минимальный набор необходимый для корректной работы нашего приложения. А потом запекаем это, как слоеный пирог. Собрал ты контейнер, у которого в основе Ubuntu и радуешься жизни, всё работает. А потом захотел стать модным и заменить убунту на alpine, поменял пару строк в своем файле и снова радуешься жизни. Docker хорош там где нужно тестовое окружение, или окружение для разработчика.
Помни, что готовить докер в продуктиве гораздо сложнее, так как сразу возникает куча вопросов, например, по поводу производительности и безопасности. Для твоих учебных проектов это некритично, но в случае чего-то серьезного, лучше положиться на SRE инженера / системного администратора.
По учебным материалам обрати внимание на:
После того как ознакомишься с учебными материалами, попробуй упаковать с помощью докера любое своё приложение и задеплоить, например на Heroku. Гайд по деплою докер образов в хероку, можно найти здесь.
Один контейнер это хорошо, это надежно. Но, что если мы поддались волне хайпа и теперь у нас из всех щелей лезут микросервисы? Что если контейнеров у нас десятки, если не сотни? Как управлять всем этим зоопарком и не сойти с ума? Здесь к нам на помощь придет оркестратор Kubernetes, или просто кубер. По самому термину «оркестратор» можно догадаться, что его задача состоит управлении и контролю за нашим многочисленным зоопарком контейнеров. Он позволяет нам их запускать, заменять на другие, следить за их состоянием, автоматически перезапускать, если кто-то упал и даже автоматически масштабироваться, в зависимости от текущей нагрузки.
К сожалению с большой силой приходит большая головная боль, поэтому обычно с кубером работает специальный человек — SRE инженер. SRE это такой умный человек, который следует философии DevOps, если есть желание, можешь ознакомиться с бесплатной книгой от Google, где описывается их виденье данной профессии.
На начальном этапе тебе достаточно будет знать, что кубер существует, что он классный и его очень трудно готовить без соответствующего опыта.
Java конференции — это такие партийные съезды всех пролетариев джавистов. Много докладов о том, как наши микросервисы бороздят просторы облаков, разбор кишочков популярных фреймворков и многое другое.
Самое ценное в конференциях — это обмен опытом со своими братьями по цеху. Идеальное место, чтобы устраивать срачи с популярными Java персоналиями, узнавать чем сейчас дышат и держать нос по ветру. В 2021 году всё это ушло в онлайн, что несколько сбивает настрой, но по прежнему насыщенно хорошими докладами. Стоит отметить две наиболее популярные в наших краях конференции:
Два брата акробата, первый традиционно проходит в Питере, второй в Москве. Доклады часто пересекаются, но при желании можно спокойно ходить на обе конференции, благо они разнесены по разным сезонам. Видосы с прошлых сезонов стали открывать бесплатно всем желающим, к чему обязательно стоит приобщиться на ютубе.
Если ты смог осилить все перечисленные выше темы, можешь собой гордиться (впрочем, гордиться собой можешь при любом удобном случае). В руководстве мы намеренно не расписывали каждый аспект в мельчайших деталях. Его цель — создать для тебя красную нить, которой ты можешь следовать активно смотря по сторонам. Есть ещё десятки важных и интересных тем, с которыми ты обязательно столкнешься. Выбрав карьеру разработчика, ты обречен учиться до конца своей карьеры, так что постарайся расслабиться и получать от этого удовольствие. У тебя обязательно получится!
Особая признательность всем тем замечательным людям, которые помогали советами, критикой и собственными дополнениями материала. Вы лучшие.
About
Руководство по вкатыванию в backend разработку на Java для почти начинающих и сочувствующих.





