Java Enterprise Online Project =============================== Разработка полнофункционального Spring/JPA Enterprise приложения c авторизацией и правами доступа на основе ролей с использованием наиболее популярных инструментов и технологий Java: Maven, Spring MVC, Security, JPA(Hibernate), REST(Jackson), Bootstrap (css,js), datatables, jQuery + plugins, Java 8 Stream and Time API и хранением в базах данных Postgresql и HSQLDB. ![topjava_structure](https://user-images.githubusercontent.com/13649199/27433714-8294e6fe-575e-11e7-9c41-7f6e16c5ebe5.jpg) Когда вы слышите что-то, вы забываете это. Когда вы видите что-то, вы запоминаете это. Но только когда вы начинаете делать это, вы начинаете понимать это Старинная китайская поговорка ## Описание и план проекта ### Демо разрабатываемого приложения ### [Изменения проекта (Release Notes)](ReleaseNotes.md) ### Требования к участникам, Wiki ### Составление резюме, подготовка к интервью, поиск работы Вводное занятие (обязательно смотреть все видео) =============== ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 1. Осваиваем Java Enterprise. Трудоустройство. Ответы на вопросы. - Слайды презентации - Java Tools and Technologies Landscape Report 2016 - [Java in 2017 Survey](http://www.baeldung.com/java-in-2017) - Из юниоров в разработчики: получаем первую работу #### Spring Pet-Clinic - Spring PetClinic Sample Application - Presentation ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 2. Системы управления версиями. Git. - **Wiki по ведению проекта в Git** - Система управления версиями. VCS/DVSC. - Ресурсы: - Интерактивная Git обучалка - Еще одна интерактивная обучалка, по-русски - Книга Git - Working with remote repositories - Видео по обучению Git - Git Overview - [Основы Git за 20 минут](https://www.youtube.com/watch?v=TMeZGvtQnT8) - [Git - для новичков](https://www.youtube.com/watch?list=PLY4rE9dstrJyTdVJpv7FibSaXB4BHPInb&v=PEKN8NtBDQ0) ## ![video](https://cloud.githubusercontent.com/assets/13649199/13672715/06dbc6ce-e6e7-11e5-81a9-04fbddb9e488.png) 3. Работа с проектом (выполнять инструкции) **ВНИМАНИЕ: выбирайте для проекта простой пусть без пробелов и русских букв, например (Windows) `c:\projects\topjava\`. Иначе впоследствии будут проблемы** > Проект постоянно улучшается, поэтому видео иногда отличается от кода проекта. Изменения указываю после видео: в `UserMeals/UserMealWithExceed` поля изменились на `private` - **Prepare_ to_ HW0.patch (скачать и положить в каталог вашего проекта)** ## Инструкция по шагам (из видео): - Установить ПО (git, JDK8, IntelliJ IDEA, Maven) - Создать аккаунт на GitHub - Сделать Fork **ЭТОГО** проекта (https://github.com/JavaOPs/topjava) - Сделать локальный репозиторий проекта:
git clone https://github.com/[Ваш аккаунт]/topjava.git
- Открыть и настроить проект в IDEA - Выставить кодировку UTF-8 в консоли - Поставить кодировку UTF-8 - Поменять фонт по умолчанию (DejaVu) - По ходу видео сделать Apply Patch... скаченного патча Prepare_ to_ HW0.patch - Закоммитить и запушить изменения (commit + push) - Сделать ветку домашнего задания - Выполнить задание и залить на GitHub (commit + push) - Переключиться в основную ветку проекта master. ## ![hw](https://cloud.githubusercontent.com/assets/13649199/13672719/09593080-e6e7-11e5-81d1-5cb629c438ca.png) Домашнее задание HW0 ``` Реализовать метод UserMealsUtil.getFilteredWithExceeded через циклы (`forEach`): - должны возвращаться только записи между startTime и endTime - поле UserMealWithExceed.exceed должно показывать, превышает ли сумма калорий за весь день параметра метода caloriesPerDay Т.е UserMealWithExceed - это запись одной еды, но поле exceeded будет одинаково для всех записей за этот день. - Проверьте результат выполнения ДЗ (можно проверить логику в http://topjava.herokuapp.com , список еды) - Оцените Time complexity алгоритма. Если она больше O(N), например O(N*N) или N*log(N), сделайте O(N). ``` - Java 8 Date and Time API - Алгоритмы и структуры данных для начинающих: сложность алгоритмов - Time complexity - Временная сложность алгоритма - Вычислительная сложность #### ВНИМАНИЕ: варианты Optional делайте в `UserMealsUtil` в одной ветке в разных методах. Проще делать, проще проверять #### Optional (Java 8 Stream API) ``` Сделать реализацию через Java 8 Stream API. ``` - Видео: Доступно о Java 8 Lambda - Java 8: Lambda выражения - Java 8: Потоки - Pуководство по Java 8 Stream - Java 8 Stream API в картинках и примерах - [7 способов использовать groupingBy в Stream API](https://habrahabr.ru/post/348536) - Лямбда-выражения в Java 8 - A Guide to Java 8 - Шпаргалка Java Stream API - Алексея Владыкин: Элементы функционального программирования в Java - Yakov Fain о новом в Java 8 - stream.map vs forEach - Дополнительно - [Сергей Куксенко — Stream API, часть 1](https://www.youtube.com/watch?v=O8oN4KSZEXE) - [Сергей Куксенко — Stream API, часть 2](https://www.youtube.com/watch?v=i0Jr2l3jrDA) #### Optional 2 (+5 бонусов) ``` Сделать реализацию со сложностью O(N): - циклом за 1 проход по List. Обратите внимание на п.13 замечаний - через Stream API за 1 проход по исходному списку Stream meals - возможно дополнительные проходы по частям списка - нельзя использовать внешние коллекции, не являющиеся частью коллектора или результатами работы stream ``` #### Замечания по использованию Stream API: - Когда встречаешь что-то непривычное, приходится перестраивать мозги. Например, переход с процедурного на ООП программирование дается непросто. Те, кто не знает шаблонов (и не хотят учить) также их встречают плохо. Хорошая новость в том, что если это принять и начать использовать, то начинаешь получать от этого удовольствие. И тут главное не впасть в другую крайность: - [Используйте Stream API проще (или не используйте вообще)](https://habrahabr.ru/post/337350/) - Если вас беспокоить производительность стримов, обязательно прочитайте про оптимизацию - ["Что? Где? Когда?"](http://optimization.guide/intro.html) - [Перформанс: что в имени тебе моём?](https://habrahabr.ru/company/jugru/blog/338732/) - [Performance это праздник](https://habrahabr.ru/post/326242/) При использовании Stream API производительность улучшиться только на больших задачах, где возможно распараллеливание. Еще - просто так запустить и померять скорость JVM нельзя (как минимум дать прогреться и запустить очень большое число раз). Лучше использовать какие-нибудь бенчмарки, например [JMH](http://tutorials.jenkov.com/java-performance/jmh.html), который мы юзаем на другом проекте (Mastejava). ## ![error](https://cloud.githubusercontent.com/assets/13649199/13672935/ef09ec1e-e6e7-11e5-9f79-d1641c05cbe6.png) Замечания к HW0 - 1: Код проекта менять можно! Одна из распространенных ошибок как в тестовых заданиях на собеседовании, так и при работе на проекте, что ничего нельзя менять. Конечно при правках в рабочем проекте обязательно нужно проконсультироваться/проревьюироваться у авторов кода (находится по истории VCS) - 2: Наследовать `UserMealWithExceed` от `UserMeal` я не буду, т.к. это разные сущности: Transfer Object и Entity. Мы будет их проходить на 2м уроке. - 3: Правильная реализация должна быть простой и красивой, можно сделать 2-мя способами: через стримы и через циклы. Сложность должна быть O(N), т.е. без вложенных стримов и циклов. - 4: При реализации через циклы посмотрите в `Map` на методы `getOrDefault` или `merge` - 5: **При реализации через `Stream` заменяйте `forEach` оператором `stream.map(..)`** - 6: Объявляйте переменные непосредственно перед использованием (если возможно - сразу с инициализацией). При объявлении коллекций используйте тип переменной - интерфейс (Map, List, ..) - 7: Если IDEA предлагает оптимизацию (желтым подчеркивает), например заменить лямбду на метод-референс, соглашайтесь (Alt+Enter) - 8: Пользуйтесь форматированием кода в IDEA: `Alt+Ctrl+L` - 9: Перед check-in проверяйте чендж-лист (курсор на файл и Ctrl+D): не оставляйте в коде ничего лишнего (закомментированный код, TODO и пр.). Если файл не меняется (например только пробелы или переводы строк), не надо его чекинить, делайте ему `revert` (Git -> Revert / `Ctrl+Alt+Z`). - 10: `System.out.println` нельзя делать нигде, кроме как в `main`. Позже введем логирование. - 11: Результаты, возвращаемые `UserMealsUtil.getFilteredWithExceeded` мы будем использовать [в нашем приложении](http://topjava.herokuapp.com/) для фильтрации по времени и отображения еды правильным цветом. - 12: Обращайте внимание на комментарии к вашим коммитам в git. Они должны быть короткие и информативные (лучше на english) - 13: Не полагайтесь в решении на то, что список будет подаваться отсортированным. Такого условия нет. ----- ## [Пример 7-го занятия онлайн стажировки, несколько видео открыто](https://github.com/JavaOPs/topjava/blob/master/doc/lesson07.md) ### Полезные ресурсы > ВНИМАНИЕ: > - **ДЗ первого урока будет связано с [созданием небольшого CRUD приложения (в памяти, без DB) на JSP и сервлетах](https://danielniko.wordpress.com/2012/04/17/simple-crud-using-jsp-servlet-and-mysql/)**. Введение будет, но предварительное знакомство не помешает. > - основы JavaSсript необходимы для понимания проекта, начиная с 8-го занятия! Все остальное - опционально. #### HTML, JavaScript, CSS - [Basic HTML and HTML5](https://learn.freecodecamp.org/responsive-web-design/basic-html-and-html5/say-hello-to-html-elements/) - [Справочник по WEB](https://developer.mozilla.org/ru/) - [Видео по WEB технологиям](https://www.youtube.com/user/WebMagistersRu/playlists) - [Изучение JavaScript в одном видео уроке за час](https://www.youtube.com/watch?v=QBWWplFkdzw) - HTML, CSS, JAVASCRIPT, SQL, JQUERY, BOOTSTRAP - Введение в программирование на JavaScript - Стандарты кодирования для HTML, CSS и JavaScript’a - Основы работы с HTML/CSS/JavaScript - JavaScript - Основы - Основы JavaScript - Bootstrap 3 - Основы - jQuery для начинающих #### Java (базовые вещи) - Интуит. Программирование на Java - 1й урок MasterJava: Многопоточность - Основы Java garbage collection - Размер Java объектов - Введение в Java Reflection API - Структуры данных в картинках - Обзор java.util.concurrent.* - Синхронизация потоков - String literal pool - Маленькие хитрости Java - A Guide to Java 8 ### Туториалы, разное - [Что нужно знать о бэкенде новичку в веб-разработке](https://tproger.ru/translations/backend-web-development) - [Туториалы: Spring Framework, Hibernate, Java Core, JDBC](http://proselyte.net/tutorials/) #### Сервлеты - Как создать Servlet? Полное руководство. #### JDBC, SQL - Основы SQL на примере задачи - Уроки по JDBC - Learn SQL - Интуит. Основы SQL - Try SQL - Курс "Введение в базы данных" #### Разное - Вопросы по собеседованию, ресурсы для подготовки - Эффективная работа с кодом в IntelliJ IDEA - Quizful- тесты онлайн - Введение в Linux #### Книги - Джошуа Блох: Java. Эффективное программирование. Второе издание - Гамма, Хелм, Джонсон: Приемы объектно-ориентированного проектирования. Паттерны проектирования - Редмонд Э.: Семь баз данных за семь недель. Введение в современные базы данных и идеологию NoSQL - Brian Goetz: Java Concurrency in Practice - G.L. McDowell: Cracking the Coding Interview