### 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. #### Видео ##### Jakob Jenkov, [Java Concurrency And Multithreading](https://www.youtube.com/playlist?list=PLL8woMHwr36EDxjUoCzboZjedsnhLP1j4) Хорошее дополнение к книге Брайана Гетца по многопоточности. Некоторые темы пересекаются, некоторые темы затрагивают внутреннее устройство языка/JVM вроде модели памяти. Одних этих видео не хватит чтобы полностью разобраться с многопоточностью, но они отлично помогут укрепить или дополнить твоё представление об этой страшной и сложной вещи. #### Паттерны Многие проблемы, которые возникают при разработке приложений появляются из-за ошибок допущенных при проектировании. Умные люди выявили повторяющиеся из проекта в проект решения и закономерности (паттерны) и сделали их классификацию. Почему важно их знать? Паттерны описывают типичные способы решения часто встречающихся проблем при проектировании программ, что позволяет тебе не изобретать велосипед, а твоим коллегам гораздо быстрее понимать, что происходит в коде. Однако помни, что использование популярных паттернов при решении каждой задачи является скорее плохой практикой чем хорошей. Всё хорошо в меру, и с опытом ты поймешь ту тонкую грань, когда паттерны реально сделают архитектуру твоего кода лучше, а когда только навредят. Паттернов много, хороших и разных, но зубрить их не надо. Пробегись по списку, посмотри на те которые тебя заинтересуют. На текущем этапе твоя задача оставить якорь в памяти, что такие вещи существуют. Из ресурсов по паттернам можно выделить: 1. [Refactoring guru](https://refactoring.guru/ru/design-patterns). Модно, молодежно, доступный язык. 2. **Design Patterns: Elements of Reusable Object-Oriented Software (GoF)** — сухой академический оригинал, сможешь осилить — хорошо, не сможешь — используй другие источники. #### Упражнения Подойдут всё те же сайты которые были на прошлом этапе, но уже с более высокой сложностью. Старайся решать задачи с использованием «современных» функциональных фишек Java: Stream API и лямбды. #### Подведение итогов Advanced Core Помнишь те карточки которые ты поленился сделать на прошлом этапе? Самое время добавить новые: 1. [Потоки ввода-вывода в Java](https://github.com/enhorse/java-interview#Потоки-вводавывода-в-java) 2. [Сериализация](https://github.com/enhorse/java-interview#Сериализация) 3. [Многопоточность](https://github.com/enhorse/java-interview#Многопоточность) 4. [Шаблоны проектирования](https://github.com/enhorse/java-interview#Шаблоны-проектирования)