Java – это огромная экосистема, в которой легко потеряться. Это подробный гайд по фреймворкам с подборкой книг и лайфхаков.
Почему Java?
Java – технология с долгой историей. Вокруг нее постоянно растут стеки инструментов. Потом они становятся монструозными, и на смену им приходят новые. Против Java ведется политическая война со стороны других корпораций. Этот язык программирования никогда не будет модным. Он не выглядит сексуально с его бойлерплейт-кодом и слухами о плохой производительности.
☕ Подтянуть свои знания по Java вы можете на нашем телеграм-канале «Библиотека Java для собеса»
При этом экосистема Java является стандартом де-факто для корпоративной разработки. Платформа уверенно занимает нишу в мобильных технологиях и Web. Реализованы шикарные инструменты для big data, такие как Hadoop и Spark. Все это взято у конкурентов без боя: бизнес требует от инструментов разработки прозрачности и надежности. Поэтому Java с её безопасностью кода, хорошим подходом к многопоточности и низкому порогу вхождения для свежих разработчиков, дает бизнесу то, что ему нужно.
Для новичков Java привлекательна простым и понятным синтаксисом, плавной кривой обучения. Назойливые проблемы со всякими низкоуровневыми штуками вроде менеджмента памяти и кроссплатформенности JVM берет на себя. Поэтому учиться легко, а после всегда можно найти хорошее рабочее место.
Быстрый старт
Для начала нужно установить JDK и любую IDE. Из версий сейчас самая популярная 8-я. Из IDE можно начать с IntelliJ IDEA.
Есть две классических Java книги, которые рекомендуются сообществом к изучению. Это «Effective Java» Джошуа Блоха и «Философия Java» Брюса Эккеля. Но чтение толстых книг в начале обучения фундаментальным основам языка – не самый эффективный и быстрый путь влиться. Лучше взять за основу что-нибудь проще. Например, «Head First Java», её чтение не утомляет.
Так почему "Идея"?
Разработчик IntelliJ IDEA создал отличный плагин EduTools, который встраивается прямо в IDE. Он содержит в себе упражнения, позволяющие быстро изучить основы языка в интерактивном режиме. Этого инструмента, в сочетании с литературой, вполне достаточно для построения базы.
Если есть хороший технический бэкграунд в другом объектно-ориентированном языке программирования, то можно срезать углы. Потому что существует класс книг, написанных специально для таких «новичков». Например, «Java for C/C++ Developers» от Michael C. Daconta. В таких книгах обычно перечисляются ключевые отличия одной технологии от другой. Это экономит время на обучение, фокусируя только на нужных деталях.
Обучение через тестирование
Область, которую предстоит изучить, огромна. Нет границ, которые позволят уверенно сказать «всё, теперь я знаю Java». Ни прочитанные книги, ни написанные программы, ни пройденные курсы, ни освоенные технологии.
С момента, когда мы начинаем обучаться, обучение становится стилем жизни. Нужно в свободное время читать по Java всё, что попадается под руку, любые непонятные вещи должны браться на заметку и включаться в учебный план. Вышеназванные фундаментальные книги также служат этой цели и цели общего структурирования своего плана. Можно обратить внимание на качественные подборки материалов по Java и поискать там пищу для размышлений.
Заведите метрики для отслеживания прогресса. Для этого нужно проходить тесты достаточно часто, благо сейчас их много в Интернете. Мы проходим Java тест, смотрим на результат, ищем пробелы в знаниях, выписываем, гуглим, восполняем. Это хорошая стратегия, она эффективнее последовательного изучения книги за книгой. Хороший маркер – это когда вы написали какой-то код, а спустя время поняли, что он плох. Хорошим финалом при этом будет прохождение OSJP – самой авторитетной сертификации от Oracle.
🧩☕ Интересные задачи по Java для практики можно найти на нашем телеграм-канале «Библиотека задач по Java»
Что еще?
Стек Java для web-приложений многогранен, и нужно на базовом уровне овладеть и смежными технологиями.
Для начала стоит представлять типовую архитектуру того, что делает web-разработчик. Всё, что видит перед собой пользователь в браузере – это клиент или frontend-часть приложения. Данные и команды, инициированные действиями пользователя, отправляются на сервер по протоколу HTTP в соответствии с определенными договоренностями об их формате и значении. Эти договоренности формируют web API приложения и реализуются надстройками над HTTP вроде RESTful или, реже, GraphQL. Данные обычно упаковываются в JSON или XML, хотя есть место и кастомным реализациям.
Серверная часть приложения, backend, принимает данные, десериализует их во внутреннее представление, осуществляет авторизацию и аутентификацию пользователя, валидацию пришедшей информации, реализует какую-то бизнес-логику, сохраняет часть информации в БД и формирует необходимый ответ для клиента. Само приложение для взаимодействия с клиентом может поднимать встроенный web-сервер или само встраиваться в сторонний web-сервер.
Это значит, что нам необходимо иметь ясное представление о:
- СУБД и SQL, реляционном и нереляционном хранении данных. Для этого рекомендуется книга «Head First SQL» + ознакомление со статьями по NoSQL для общей эрудиции. Погонять запросики помогут удобные online-сервисы.
- Протоколе HTTP и передаче данных. Фундаментальная вещь – это «Компьютерные сети» Эндрю Таненбаума и первые общие главы любой книги по PHP от Дмитрия Котерова. Несмотря на другой язык программирования, автор дает очень хорошее общее понимание взаимодействия клиента и сервера.
- JSON и XML. Достаточно просто статей из Википедии для общего понимания этих форматов.
- Javascript и HTML. Базовые знания нужны, потому что часто backend генерирует странички, выдаваемые в браузер, например, по технологии JSP. Достаточно посмотреть путь javascript-разработчика и выбрать то, что приглянулось. Хотя можно взять за основу что-то вроде Vaadin, который на выходе сгенерирует Javascript-код и подтянет нужные стили по Java-коду.
Pet project
При изучении Java очень важно соблюдать баланс между теорией и практикой, причем реализация учебных программ из упражнений относится к теории. Плохо сидеть в учебниках и смотреть лекции на Youtube без написания реального (условно) приложения. Также плохо бросаться в код и городить костыли; если будет сделано рабочее приложение, но не будут приобретены знания – это тоже впустую потраченное время.
Хороший подход – придумать идею web-сервиса и постепенно реализовывать его, шаг за шагом, по мере приобретения новых знаний. Это может быть ToDo List или каталог просмотренных фильмов, дневник или маленький движок форума, игрушечные CMS или CRM. Это нормально, если код придется часто переписывать, порой с нуля: это говорит о прогрессе.
Очень важно сделать все «велосипедом», с минимумом дополнительных библиотек и уж точно без фреймворков. Самописный web-сервер на основе сокетов, маршаллер XML/JSON, собственные контейнеры. Не обойдется без изучения рефлексии и базовых паттернов (лучшая книга по шаблонам разработки - GoF). Код на выходе получится ужасным, но основное тут – получить набор проблем, которые очень красиво решаются фреймворками.
Со списком этих проблем и задач дальнейшее изучение экосистемы Java пройдет просто молниеносно. Поэтому мучения по написанию сотен строк кода, которые заменяются парой строк при подключении фреймворка, окупятся сторицей.
Java EE и Spring
Java Enterprise Edition и фреймворк Spring постоянно идут рука об руку в обучении. Важно понимать их различия и сходства. Формально говоря, Java EE (Jakarta EE) – это спецификация, описывающая архитектуру серверной части приложения. Отчасти, Java стала столь популярной технологией благодаря смещению акцента разработки на бизнес-логику. Если вы приходите к заказчику, предприятию, то его не интересуют технические детали. Зато его интересует, каким образом новый продукт улучшит его жизнь и принесет финансовую прибыль.
Набор спецификаций согласует все части приложения и гарантирует их взаимную работу. Так вводится парадигма предметно-ориентированного проектирования. Все хорошо понятные бизнесу предметные области выделяются и перекладываются в чистый Java-код. Затем пишется интеграция между ними, декларируется сквозной путь данных в процессе обмена. В итоге получается пакет кода, описывающего бизнес-логику ПО. А реализация всех технических деталей ложится на сервер приложений. Этот класс ПО называется middleware, его примерами являются WebSphere, Weblogic, WildFly. Такой контейнер, по сути, одна большая зависимость, которая и «поставляет» функционал в соответствии с написанной логикой.
Spring же – просто фреймворк. Java EE – это не самая удачная попытка стандартизации, ставшая тяжеловесной, а Spring изначально появился как легкая и понятная альтернатива. Впрочем, и Spring разросся со временем и появился фреймворк над фреймворком – Spring Boot.
В процессе обучения лучшая стратегия – ознакомиться и с той, и с другой платформой. Для изучения Java EE отлично подходят книги «Head First Servlets and JSP» и «Программирование web-приложений на языке Java» Буди Курняван. Для Spring – «Spring в действии» Крейга Уоллса. Так как Spring включает в себя очень много всего, сфокусироваться для начала следует на модулях Core, MVC и Web-MVC и Security.
Какой стек выбрать?
Когда придет понимание, что Spring Beans похожи на EJB, Spring Service Locator – на JNDI, Spring Security – на JAAS, Spring Data – на JPA и т. д., это станет важнейшим майлстоуном в обучении. Вторым будет ознакомление с хорошими реализациями, постижение best practices. В случае Spring можно воспользоваться кодогенератором JHipster – сгенерированный этим инструментом код имеет хорошую структуру и задействует множество популярных технологий. Кстати, в дальнейшем этот сервис можно будет использовать для быстрого прототипирования.
В дальнейшем можно сфокусироваться на одной из платформ, а за развитием второй просто следить в фоновом режиме, углубляя эрудицию. Порой придется выбирать какую-то технологию, исходя из того, что более подходит к задаче. Например, на Java EE с её JSF и PrimeFaces легче сделать масштабируемое приложение с генерируемым сервером клиентом. А на Spring легко делаются модные микросервисы. Но это все условно – порой эффективнее разрабатывать на хорошо знакомом фреймворке, а не на том, который лучше приспособлен.
Что дальше?
Помимо основных фреймворков, в Java куча всего полезного. Например, Jasper для построения отчетов в реальном времени. Или JOOQ для создания запросов к базам данных. Нужно уметь тестировать свой код при помощи JUnit или Mockito. Полезно использовать Sonar для валидации стиля кода. Если предполагается большой объем данных, то почти наверняка придется столкнуться с Hadoop. А Gradle и Maven помогут систематизированно управлять жизненным циклом своего ПО.
В этом многообразии легко потеряться. Поэтому важнее не изучать эти инструменты, а изучать информацию о них. Где они применяются, в чем ключевые особенности. И использовать их только тогда, когда без них не обойтись. Потому что вряд ли придется писать сложный код на Gradle. А большую часть Maven-инструкций можно просто скопировать со StackOverflow. Нет нужды читать книги толщиной с руку по этим технологиям, тратя лишнее время.
Помимо Spring и Java EE, есть также Spark и Play, Struts и Grails. Их нужно обязательно попробовать. Хотя бы для того, чтобы понять, что есть жизнь и без Spring с его DI. Развитие эрудиции по всему многообразию инструментов и фокус на одном из инструментов – лучшая стратегия в обучении.
Комментарии