НЕроадмап для Java разработчика
Я просто опишу как учу своих студентов. Что важно в их обучении, а что нет. Будет полезно тем кто начинает учиться, либо хочет кого-либо научить. Роад мапы устаревают и набор фреймворков/библиотек в этом посте тоже устареет (хорошо, что джависты консервы и это произойдет не так быстро). Попробую сфокусироваться на том, что первостепенно и плюс минус вечно.
Вечен, конечно, же гит. Именно с него начинается добрая половина курсов, но не мой. Предпочитаю не пугать своих маслят до тех пор, пока гит не становится ежедневной необходимостью. На первых парах главная цель - заинтересовать. А изучение гита не то что иллюзии прогресса не даёт, а приводит в замешательство маленький неокрепший ум. Особенно с учетом того, что использовать его в полную силу и извлекать пользу получится хрен пойми когда.
Java Core
Прежде всего я отправляю студентов учиться основам джавы. Использую для этого самый старый, но самый православный курс по джаве на степике. Курс специфичный, в нем не разжевываются детали. Лектор приглашает познакомиться с некоторыми самыми важными концепциями в видео, а потом тоже самое проделывает и в задачах. Принятый везде паттерн “теория + практика по ней” тут послан нахер. Может сложится впечатление, что нихрена не понятно. Все верно, курс дает больше вопросов чем ответов. Мне такой подход к обучению нравится. Он позволяет хорошенько погрузиться в концепции и механизмы языка, набивая шишки. Он работает, учитывая, что я всегда рядом, чтоб помочь в случае жесткого тупняка и подкинуть необходимой практики, если надо. Это позволяет настроить коммуникацию при обучении с самого начала. При самостоятельном использовании курс может показаться сложным и непоследовательным.
Вопросы, чтобы проверить что материал усвоен в нужном объеме собрал вот в этом канале.
Важные топики, которые, помимо прочего, стоит хотя бы базово охватить на этом этапе:
- Важность кодстайла
- Устройство памяти JVM
- Функциональное программирование
- Структуры данных
- Понятие сложности, O(n)
Каждая вторая задача может быть решена сильно по-разному. Стараюсь уделить внимание тому, чтоб донести приоритеты при написании бизнесового кода. Например, читаемость и расширяемость приоритетнее оптимизаций и экономии на спичках. Безусловно это касается не всего подряд, но ненужные оптимизации - это бич тех, кто только ступил на длинную дорогу в ентерпрайз.
Основы Web
Использую первые 3 главы этого курса. Курс откровенно говоря дерьмовый, особенно вторая его половина (4-7 главы), задачки первых трех решаются за пару часов. Но, проведя A/B тесты, я понял, что он эффективен в качестве переходного этапа к следующим темам и позволяет неспеша без сложного магического спринг кода и суеты обсудить такие топики как:
- Сети, интернет, HTTP
- Сборка проекта, maven
- Зачем нужны бд и какие в джаве есть стандарты для работы с ними
Тут стараюсь своих птенчиков долго не задерживать, ибо для них это больше обзорная экскурсия чем челлендж. Если с топикам выше проблем нет, можно смело скипать, что я и делаю для тех у кого есть бэкграунд в теме. Для них только небольшой видос про maven.
GIT[1]
Если обучаемый еще не умеет в git add, git commit, git push - то предлагаю научиться. Вот исчерпывающий 10-минутный видос .Без подробностей. Пусть хоть папку с кодом в github перетаскивает мышкой. Мне важно дальше просто смотреть код не на скринах, а в удобном для себя виде.
SQL
Чтобы не отвлекаться потом, предлагаю потратить несколько дней на пару глав практики с азами SQL на sql-zoo. Подойдет в целом любой другой тренажер. Нужные топики:
- SELECT in SELECT
- SELECT in SELECT
- JOIN
- Агрегатные функции
Никак не проверяю, такая практика позволяет студентам дальше чуть проще работать с бд и не офигевать, когда надо написать что-то сложнее SELECT * FROM Users, а быстро нагуглить нужное решение.
JPA/Hibernate
Тут уже полным ходом начинаю подготовку к проекту. Предлагаю локально установить себе базейку по вкусу, но лучше PostreSQL и решить задачу по реализации двух DAO, один через JDBC, второй через хибер. Никаких сложных манипуляций, create read update delete в двух разных исполнениях с конфигами прямо в коде. Это еще один переходной этап перед тем как все это отдать на откуп SpringData, которая слишком много делает сама, лишая понимания происходящего. Вопросики для проверки опять же есть в канале.
Spring
Тяжело описать как изучить спринг, я до сих пор постоянно экспериментирую. Не буду делиться тут своим набором задач, потому что они все еще в состоянии tbd. Так или иначе за основу взят курс Алишева. Объективно полезных там 23 первых урока. Есть еще новый курс со спринг бутом, но он платный. Отсылая к Алишеву, чтоб мудростью напитываться при решении, я пробую практику разбивать вот на такие топики:
- IoC DI, управление бинами, создание и внедрение
- Spring + Hibernate, настройки хибера в рамках спринг (не бут) приложения
- Spring MVC, работа с Thymeleaf для отображение данных из базы в html
- REST, переделка предыдущего приложения, чтоб фронт и бэк весело перекидывались джейсонами, минимальное JS fetch api/jquery кому как по вкусу
Дальше предлагаю какой-нибудь бизнес кейс, а лучше несколько, чтобы CRUD стал хоть сколько-нибудь полезным. Примеры:
- Постинг на двач информации пользователей при регистрации (нам даже админ двача писал и просил перестать, потому что тред висел на главной от такой активности)
- Сортировка пользователей по удаленности от Москвы (с использованием dadata чтобы превратить адрес в геоточку)
- Email рассылка поздравлений с днем рождения
- Подтягивание аватарок из любых соц сетей
Как вы могли догадаться - в основе каждой задачи лежит сетевая интеграция. Протоколы тут не принципиальны, но чаще всего это, конечно, просто http. Такие задачи даю до тех пор, пока студент не будет решать их уверенно и освоит базовый паттерн: “Почитать доку, согласовать решение, написать код, хорошо самостоятельно протестировать”. Ну либо пока его проект не превратится в лютого франкенштейна.
Дальше предлагаю это приложение завернуть в контейнер и развернуть на сервере. Никакой специальной ссылки у меня нет. Документация докера, либо гайдики на ютубе в помощь. Принципиально тут больше освоение подключения по ssh и победа над страхом перед линуксом.
Unit тесты
Одна практическая задача, которую мне еще предстоит допилить, потому что пока результаты так себе. Ребятам приходится тесты на командном проекте раскуривать, чтобы в полной мере понять че и зачем происходит.
Задача, исправить падающие тесты и дописать недостающие
Бонус: Параметризированные тесты, чтобы решение стало еще и красивым.
GIT[2]
Перед переходом к командному проекту исчерпывающий курс по гиту и бранчингу, который подрезал в епаме 5 лет назад. Теперь уже можно публиковать, что они мне сделают, они в другом городе. Держите.
Командный проект
Нет смысла описывать конкретно мой проект. Любой бэкенде на джаве сойдет. В рамках проекта стараюсь, чтобы каждый студент:
- Реализовал какую-нибудь фичу от и до и выкатил её.
- Пофиксил баг.
- Решил мерж конфликт.
- Поковырялся с CI/CD, хотя бы минимально его поправил, чтобы понимать что это и с чем едят.
- Поковырялся с CI/CD, хотя бы минимально его поправил, чтобы понимать что это и с чем едят.
- Внес изменения в инфраструктуру, тут пригодится ssh и linux. Это может быть настройка сертов, логирования, перенос бд с одного сервера на другой, мониторинг, etc.
- Решил одну задачу с максимально нечетким тз. Считаю необходимым для того, чтоб научиться коммуникации с командой (мной в качестве менеджера, как минимум).
- Решил одну задачу с максимально нечетким тз. Считаю необходимым для того, чтоб научиться коммуникации с командой (мной в качестве менеджера, как минимум).
- Написал сложный SQL запрос. У меня обычно такие связаны с аналитикой.
- Провел хорошее код ревью. Приходится специально долго не смотреть на код и ждать, пока ребята друг с другом помесят свой говнокод в пул реквесте, а потом получат нормальное ревью и начнут повторять за сенсеем.
- Поучаствовал в разработке фичи тиммейта, выполнив подзадачу.
- Поучаствовал в разработке фичи тиммейта, выполнив подзадачу.
Задавайте вопросы, я с радостью пополню этот роадмап дополнительными ссылками и материалами, если вдруг что забыл.
java
mentor
https://stepik.org/course/91497/syllabus
3 - чисто на повторение, можно не проходить
4 (кроме 4.3)
5
6 (кроме 6.4, 6.5, там задания не оч, просто теория)