\subsubsection{Что нужно скачать, откуда (как выбрать вендора, выбор версии)}
Для разработки понадобится среда разработки (IDE) и инструментарий разработчика (JDK). JDK выпускается несколькими поставщиками, большинство из них бесплатны и полнофункциональны, то есть поддерживают весь функционал языка и платформы.
В последнее время, с развитием контейнеризации приложений, часто устанавливают инструментарий в Docker-контейнер и ведут разработку прямо в контейнере, это позволяет не захламлять компьютер разработчика разными версиями инструментария и быстро разворачивать свои приложения в CI или на целевом сервере.
\begin{frm}
В общем случае, для разработки на любом языке программирования нужны так называемые SDK (Software Development Kit, англ. - инструментарий разработчика приложений или инструментарий для разработки приложений). Частный случай такого SDK - инструментарий разработчика на языке Java - Java Development Kit.
\end{frm}
На курсе будет использоваться BellSoft Liberica JDK 11, но возможно использовать и других производителей, например, самую распространённую Oracle JDK. Производителя следует выбирать из требований по лицензированию, так, например, Oracle JDK можно использовать бесплатно только в личных целях, за коммерческую разработку с использованием этого инструментария придётся заплатить.
Также возможно использовать и другие версии, но не старше 1.8. Это обосновано тем, что основные разработки на данный момент только начинают обновлять инструментарий до более новых версий (часто 11 или 13) или вовсе переходят на другие JVM-языки, такие как Scala, Groovy или Kotlin.
Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava.
\subsubsection{Из чего всё состоит (JDK, JRE, JVM и их друзья)}
TL;DR:
\begin{itemize}
\item JDK = JRE + инструменты разработчика;
\item JRE = JVM + библиотеки классов;
\item JVM = Native API + механизм исполнения + управление памятью.
\end{itemize}
Как именно всё работает? Если коротко, то слой за слоем накладывая абстракции. Программы на любом языке программирования исполняются на компьютере, то есть, так или иначе, задействуют процессор, оперативную память и прочие аппаратурные компоненты. Эти аппаратурные компоненты предоставляют для доступа к себе низкоуровневые интерфейсы, которые задействует операционная система, предоставляя в свою очередь интерфейс чуть проще программам, взаимодействующим с ней. Этот интерфейс взаимодействия сОС мы для простоты будем называть Native API.
СОС взаимодействует JVM, то есть, используя Native API, нам становится всё равно, какая именно ОС установлена на компьютере, главное уметь выполняться на JVM. Это открывает простор для создания целой группы языков, они носят общее бытовое название JVM-языки, к ним относят Scala, Groovy, Kotlin и другие. Внутри JVM осуществляется управление памятью, существует механизм исполнения программ, специальный JIT\footnote{JIT, just-in-time - англ. в\'{о}время, прямо сейчас}-компилятор.
% далее тут надо подробнее расписать ЖВМ
На пользовательском уровне важно не только исполнять программы, но чтобы эти программы умели как-то взаимодействовать с другими программами и другими аспектами внешнего мира, поэтому JVM интегрирована в JRE - Java Runtime Environment. JRE - это набор из классов и интерфейсов, осуществляющих взаимодействия с
В таблице \hrf{table:jdk-contents}, приведена примерная структура и состав JDK, а также указаны основные и наиболее часто используемые компоненты.
\begin{table}
\centering
\begin{adjustbox}{angle=90}
\begin{tabular}{|l|ll|llllllll|}
\cline{1-1}\cline{4-11}
\multirow{15}{*}{\rotatebox[origin=c]{270}{Java Development Kit }}&&&\multicolumn{8}{l|}{Language}\\\cline{4-11}
&&&\multicolumn{1}{l|}{}&\multicolumn{1}{l|}{JConsole}&\multicolumn{1}{p{25mm}|}{JavaVisualVM}&\multicolumn{1}{l|}{JMC}&\multicolumn{1}{l|}{JFR}&\multicolumn{1}{l|}{Java DB}&\multicolumn{1}{l|}{Int'l}& JVM TI \\\cline{5-11}
&\multicolumn{1}{l|}{}&&\multicolumn{1}{l|}{\multirow{3}{25mm}{Java lang and util base libs}}&\multicolumn{1}{l|}{JAR}&\multicolumn{1}{l|}{Lang and util}&\multicolumn{2}{l|}{Ref Objects}&\multicolumn{2}{l|}{Preference API}& Reflection \\\cline{5-11}
Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?
\chapter{Java Development Kit}
\section{Исключения}
Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации
\section{Интерфейсы}
Понятие и принцип работы, implements; Наследование и множественное наследование интерфейсов; Значения по-умолчанию
Понятие, Принцип (реальная и псевдопараллельность); Runnable, Thread (Свойства, Особенности создания); Deadlock, Состояние гонки, Object (Ожидание/уведомление); Синхронизация (Синхронизация по монитору, Частичная, по классу)
\section{Графический интерфейс пользователя}
GUI (Swing): Окна и свойства окон, \textbf{Многопоточность} и абстргирование асинхронных вызовов; менеджеры размещений и проведение параллелей с веб-фреймворками, разделение на фронт-энд и бэк-энд; JPanel и рисование, Обработка действий пользователя
\section{Введение в архитектуры приложений на Java}
клиент-серверы, веб-приложения, сервлеты, толстые и тонкие клиенты, выделение бизнес-логики и хранения, создание общих пространств и модульность проекта