\immediate\write18{texcount -sum -1 program-draft.tex > /tmp/wordcount.tex}
\documentclass[12pt, a4paper]{article}
\usepackage[english,russian]{babel}	% локализация и переносы
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{titlesec}
\usepackage{tikz}
\usepackage{indentfirst}
\usepackage{datetime2}
\usepackage{geometry}
\usepackage{enumitem}
\usepackage{multicol}
\usepackage{float}
\usepackage{fontawesome}
\usepackage{longtable}
\usepackage{tikz}
\usepackage{hyperref}
\usetikzlibrary{mindmap,trees}

\titlelabel{\thetitle. \quad}
\babelfont{rm}{IBM Plex Sans}
\babelfont{tt}{PT Mono}
\graphicspath{{./pics/}}

\newcommand{\wordcount}{\input{/tmp/wordcount.tex}}
\newcommand{\code}[1]{\small{\texttt{\detokenize{#1}}}\normalsize}
\renewcommand\labelitemi{\textemdash}
\newenvironment{frm}
  { \begin{center} \begin{tabular}{|p{0.9\textwidth}|} \hline\\ }
  { \\\\\hline \end{tabular} \end{center} }

\fancypagestyle{plain}{
  \setlength{\headheight}{33pt}
  \fancyhf{}
  \lhead{\includegraphics[height=5mm]{logo.png}}
  \rhead{И.И. Овчинников \\ \href{https://t.me/ivanigorevichfeed}{Telegram: ivanigorevichfeed}}
  \chead{\thepage}
  \cfoot{\faRocket}
  \rfoot{Всего слов: \wordcount}
}

\geometry{
  left=2cm,
  right=1cm,
  top=2cm,
  bottom=2cm
}

\title{ТЗ на "Специализацию Java"}
\author{Иван Игоревич Овчинников}
\date{\today{} (\DTMcurrenttime)}

\setlist{nolistsep}
\setlist[itemize]{leftmargin=10mm}
\setlist[enumerate]{leftmargin=10mm}

\begin{document}
\maketitle
\tableofcontents
\newpage

\begin{tikzpicture}
  \path[mindmap,concept color=magenta!70!,text=black]
    node[concept] {Java}
    [clockwise from=90]
    child[concept color=green!20!] {
      node[concept] {Проект}
      [clockwise from=150]
      child { node[concept] {Окру\-жение}
        [clockwise from=180]
        child[concept color=gray!20!] { node[concept] {CLI} }
        child[concept color=green!40!] { node[concept] {JDK} }
        child[concept color=green!40!] { node[concept] {JRE} }
        child[concept color=green!40!] { node[concept] {JVM} }
      }
      child[concept color=green!20!] { node[concept] {Структура проекта} }
      child[concept color=green!20!] { node[concept] {Управ\-ление проектом}
        [clockwise from=90]
        child[concept color=green!40!] { node[concept] {Jar файлы} }
        child[concept color=orange!20!] { node[concept] {Gradle/ Maven} }
        child[concept color=red!20!] { node[concept] {Bazel} }
      }
    }
    child[concept color=green!20!] { node[concept] {Core}
    [clockwise from=0]
    child[concept color=green!20!] { node[concept] {Object}
      [clockwise from=90]
      child[concept color=blue!20!] { node[concept] {Базовые функции языка} }
      child[concept color=green!40!] { node[concept] {Данные} }
      child[concept color=green!40!] { node[concept] {Функции} } 
      child[concept color=blue!20!] { node[concept] {ООП} }
      child[concept color=orange!20!] { node[concept] {Интер\-фейсы} } 
      child[concept color=orange!20!] { node[concept] {Исключе\-ния} } 
      child[concept color=orange!20!] { node[concept] {Много\-поточ\-ность} } 
      child[concept color=orange!20!] { node[concept] {Generics} } 
    }}
    child[concept color=orange!20!] { node[concept] {Develop\-ment Kit}
    [clockwise from=300]
    child[concept color=orange!20!] { node[concept] {}
      [clockwise from=45]
      child[concept color=gray!20!] { node[concept] {GUI (Swing/ JavaFX)} } 
      child[concept color=green!40!] { node[concept] {Коллекции} } 
      child[concept color=gray!20!] { node[concept] {Потоки ввода-вывода} } 
      child[concept color=orange!20!] { node[concept] {JDBC} } 
      child[concept color=gray!20!] { node[concept] {Сериали\-зация} } 
      child[concept color=red!20!] { node[concept] {StreamAPI} } 
      child[concept color=red!20!] { node[concept] {Reflec\-tionAPI} } 
      child[concept color=red!20!] { node[concept] {Много\-поточ\-ность} }
      child[concept color=red!20!] { node[concept] {Сетевое программи\-рование } }
    }}
    child[concept color=orange!20!] { node[concept] {Spring framework}
    [clockwise from=210]
    child[concept color=orange!20!] { node[concept] {}
      [clockwise from=330]
      child[concept color=gray!20!] { node[concept] {Java EE} } 
      child[concept color=orange!20!] { node[concept] {Spring Context} } 
      child[concept color=gray!20!] { node[concept] {Thymeleaf} } 
      child[concept color=orange!20!] { node[concept] {Основы Hibernate} } 
      child[concept color=red!20!] { node[concept] {Spring Data} } 
      child[concept color=red!20!] { node[concept] {Spring Security} } 
      child[concept color=orange!20!] { node[concept] {Spring REST} } 
      child[concept color=red!20!] { node[concept] {Spring Boot} } 
    }};

\begin{scope}[yshift=-12cm,every node/.style={align=left,text=black}]
\matrix[row sep=0pt,column sep=1mm, align=left, nodes={align=left, anchor=west}] {
    \fill [gray!20!] (0,.25ex) circle (1ex); & \node{Для формирования бэкграунда};\\
    \fill [green!40!] (0,.25ex) circle (1ex); & \node{Обязательно нужно знать};\\
    \fill [blue!20!] (0,.25ex) circle (1ex); & \node{Известно с предыдущих курсов };\\
    \fill [orange!20!] (0,.25ex) circle (1ex); & \node{Для претендентов на позицию Junior};\\
    \fill [red!20!] (0,.25ex) circle (1ex); & \node{Это знание будет «плюсом»};\\
    };
\end{scope}
\end{tikzpicture}

\newpage
\section{Java Core}
\subsection{Краткое резюме курса}
\begin{itemize}
    \item \textbf{Название курса}: Java Core
    \item \textbf{Требуемая подготовка студентов}: Базовые знания о процессе программирования, понимание механизмов компиляции и интерпретации кода, работа с переменными, условиями, циклами, понимание принципов ООП. Базовые навыки самостоятельной интерпретации кода «в голове», построения, визуализации и реализции простейших алгоритмов.
    \item \textbf{Краткое описание курса}: Данный курс демонстрирует механизмы работы знакомых студенту концепций на примере языка Java. В рамках курса будут рассмотрено устройство языка Java и сопутствующих технологических решений, платформы для создания и запуска приложений на JVM-языках (Groovy, Kotlin, Scala, и др). Будут рассмотрены некоторые базовые пакеты ввода-вывода, позволяющие манипулировать данными за пределами программы. 
    \item \textbf{Цели курса}: В результате прохождения курса у студента появится знание принципов работы платформы Java, понимание того, как язык выражает принципы программирования, его объектную природу. Научится писать базовые терминальные приложения и утилиты, решать задачи (в том числе алгоритмические, не требующие сложных программных решений) с использованием языка Java и с учётом его особенностей. 
\end{itemize}

\begin{tikzpicture}
  \path[mindmap,concept color=magenta!70!,text=black]
    node[concept] {Java}
    [clockwise from=90]
    child[concept color=green!20!] {
      node[concept] {Проект}
      [clockwise from=150]
      child { node[concept] {Окру\-жение}
        [clockwise from=180]
        child[concept color=gray!20!] { node[concept] {CLI} }
        child[concept color=green!40!] { node[concept] {JDK} }
        child[concept color=green!40!] { node[concept] {JRE} }
        child[concept color=green!40!] { node[concept] {JVM} }
      }
      child[concept color=green!20!] { node[concept] {Структура проекта} }
    }
    child[concept color=green!20!] { node[concept] {Core}
      [clockwise from=135]
      child[concept color=blue!20!] { node[concept] {Базовые функции языка} }
      child[concept color=green!40!] { node[concept] {Данные} }
      child[concept color=green!40!] { node[concept] {Функции} } 
      child[concept color=blue!20!] { node[concept] {ООП} }
      child[concept color=orange!20!] { node[concept] {Исключе\-ния} } 
    }
    child[concept color=orange!20!] { node[concept] {Develop\-ment Kit}
      [clockwise from=300]
      child[concept color=gray!20!] { node[concept] {Потоки ввода-вывода} } 
    };
\end{tikzpicture}
    

\subsection{План по лекциям и семинарам}
\begin{longtable}{|p{11mm}|p{35mm}|p{100mm}|} 
 \hline
 Блок курса & Название & Содержание
 \\ \hline
 \endhead
 Л & Платформа: история и окружение & Краткая история (причины возникновения); JDK, JRE, JVM, выбор версии; CLI: сборка, множественные источники, пакеты, запуск; структура проекта: пакеты, классы, метод main, комментарии, документирование;\\
 С & Компиляция и интерпретация кода & Ручная компиляция проекта в нескольких классах и нескольких пакетах; настройка Jupyter Notebook with IJava Kernel; Формирование веб-страницы из стандартного javadoc к своим хеловорлдам\\
 Л & Специализация: данные и функции & Базовые функции языка: математические операторы, условия, циклы, бинарные операторы; Данные: типы, преобразование типов, константы и переменные (примитивные, ссылочные), бинарное представление, массивы (ссылочная природа массивов, индексация, манипуляция данными); Функции: параметры, возвращаемые значения, перегрузка функций;\\
 С & Функции, манипулирующие данными & Задания, использующие ссылочные свойства массивов, перегрузку функций. Добавить бинарные арифметики, двоичные представления чисел\\
 Л & Специализация: ООП & Инкапсуляция: Классы и объекты (static, private/public, final, интерфейс взаимодействия с объектом); Наследование: extends, Object (глобальное наследование), protected, преобразование типов, final; Полиморфизм: override, abstract, final;\\
 С & Классы и объекты & Использование свойств статичности сущностей. Сложные случаи несоблюдения инкапсуляции, Демонстрация порядка работы конструкторов при наследовании, сложные случаи полиморфизма.\\
     Л & ООП и исключения & внутренние классы, вложенные классы; перечисления (создание, конструкторы перечислений, объекты перечислений, дополнительные свойства); Механизм и понятие, введение в \textbf{многопоточность}, throw; Наследование и полиморфизм в исключениях; Способы обработки исключений (try/catch, throws, finally); try-with-resources, штатные и нештатные ситуации \\
    С & Обработка исключений & Создание, выбрасывание и обработка исключений, обработка исключений в стиле «до захвата ресурса», проброс исключений\\
Л & Специализация: Тонкости работы & Файловая система и представление данных; Пакеты \code{java.io}, \code{java.nio}, \code{String}, \code{StringBuilder}, string pool, ?JSON/XML?\\
 С & Внешний мир & Создание, отправка и принятие данных в общепринятых форматах. Сохранение и загрузка состояния программы между запусками, работа с большими текстами (поиск, замена, генерация)\\
 \hline
\end{longtable}

\subsection{Пример 2-3 заданий на семинары}
\begin{itemize}
\item [C-1] Скомпилировать проект из трёх классов, находящихся в двух пакетах, а также создать для этого проекта стандартную веб-страницу с документацией;
\item [C-2] Создать загружаемый артефакт с функцией суммирования двух чисел и загрузить его в локальный кэш артефактов;
\item [C-3] Написать как можно больше вариантов функции инвертирования массива единиц и нулей за 15 минут (без ветвлений любого рода);
\item [C-3] Сравнить без условий две даты, представленные в виде трёх чисел гггг-мм-дд;
\end{itemize}
\subsection{Часть сценария одной из лекций}
\textit{(несмотря на наличие базовых знаний об ООП, глубоко убеждён, что базовое вступление всё равно нужно, поэтому...)}
Добрый вечер, вот мы с вами и покончили со вступлениями, добравшись до самого интересного. Объектно ориентированное программирование. 

Главное, что нам нужно сегодня сделать - это получить понимание. А для этого нам нужно, в первую очередь, расслабиться и не пытаться судорожно запомнить все умные слова которые мы слышим сразу, слова запомнятся сами собой, когда придёт понимание. На деле за аббревиатурой ООП не стоит ничего страшного. Все новички часто пугаются, мол, ООП то, ООП сё, я же призываю вас не думать о сложностях.

Как вы, вероятнее всего, уже слышали и знаете, основа всего языка Java это классы. На классах построен весь язык Java. Все программы, которые мы писали до этого - это тоже классы. Не очень полезные, и особо ничего не делающие, но всё же классы. Самое важное, что надо знать о классах - это то, что классы определяют новый тип данных для нашей программы. 

\textbf{нарисовать котика}

Скорее всего, все видят на этой картинке котика? Понятно, что мой художественный талант оставляет желать лучшего, но всё же, это скорее котик, чем, скажем, дом или дерево. Что это значит? То, что у нас в голове есть некоторый шаблон, по которому мы определяем, является-ли объект котиком. Класс это как бы чертёж. Когда мы увидим настоящего котика - мы сразу поймём это, будь он рыжий чёрный или цветной, и какой-бы породы он ни был - мы понимаем, что это кот.

В данной ситуации, кот - это класс. Для объявления класса в Java внезапно используется ключевое слово \code{class} и далее пишется название класса с большой буквы. В общем случае, когда мы пишем большую программу, в которой используем большое количество классов - они все раскидываются по отдельным файлам, и не должны создавать из кода малочитаемую простыню символов. \textbf{Важно, что название публичного класса в файле должно полностью совпадать с названием самого файла, здесь же стоит напомнить о том, что Java - это регистрозависимый язык, то есть заглавные буквы с точки зрения компилятора отличаются от строчных}. Классы обычно представляют модели объектов из реального мира: машина, книга, котик; или некоторые программные абстракции: строка текста, поток ввода, соединение с сервером.

Создадим наш первый класс, котика. У котика, как минимум, должно быть имя, окрас и возраст. Раньше мы работали с уже определёнными типами данных, такими, как инты, байты, стринги и массивы. Теперь у нас есть свой собственный тип данных - кот. Он, как и массив, является ссылочным, но может хранить в себе вот такие разнородные данные, а также содержать методы, но об этом чуточку позже. Как и в случае с массивами, объекты классов надо создавать. Иногда они также называются экземплярами, котик номер один, котик номер два и так далее. Много котиков всё ещё остаются котиками, но каждый из них - отдельный экземпляр. Экземпляр класса - это и есть объект из той самой аббревиатуры “ООП”. Создание экземпляра класса в общем виде выглядит так

\code{Cat c1 = new Cat();}

После выполнения этой инструкции, c1 станет экземпляром класса Cat. Ничего не напоминает? Да именно так мы создавали массивы. Только теперь мы создали не набор однотипных переменных, а набор тех переменных, которые посчитали нужными. Удобно, не правда-ли? По описанному нами шаблону мы теперь можем создать любое количество объектов, экземпляров этого класса, и все они будут независимы друг от друга, если мы явно не укажем обратное. Как мы помним, в нашем классе были три переменных, значит и в нашем объекте они тоже есть. На первый взгляд, может показаться, что мы в правой части этого выражения только лишний раз продублировали название класса, но это не так. На самом дела - это вызов конструктора, но о конструкторах мы также поговорим немного позже, пока разберёмся с тем, что находится внутри экземпляра класса кота.

В переменных хранится так называемое состояние объекта. В методах-же описывается поведение объекта, то есть те вещи, которые он, объект, умеет делать. Наверняка вы помните, как на более ранних уроках вы мучительно не понимали, зачем нам писать отдельные функции и методы, если можно просто взять и написать всю нашу программу строчками подряд? Вот оно - то самое место, где они, функции и методы, очень нужны и важны. Для описания поведения наших классов. Фактически, этим мы и занимались всё время - описывали поведение нашего основного класса. Все экземпляры всех классов имеют свои адреса в памяти и занимают там отдельные области, а идентификатор хранит ссылку на адрес в памяти, где всё это находится.

Рисовать очередной арт-хаус.

С полями разобрались, поговорим о методах. Все мы знаем, что котики умеют мяукать и смешно прыгать. В целях демонстрации мы в описании этих действий просто делать разные выводы в консоль, хотя мы и можем научить нашего котика выбирать минимальное значение из массива, но это было бы, как минимум, неожиданно. Итак опишем метод, например, подать голос и прыгать, а прыгать наш котик будет только если он моложе, скажем, пяти лет. Теперь когда мы хотим позвать нашего котика, он нам скажет, «мяу, я *имя котика*», а если мы решили что котику надо прыгать, он решит, прилично-ли это - прыгать в его возрасте.

Конструкторы классов нужны для нескольких вещей, например, для того, чтобы наш класс сразу что-то сделал при создании. Например,

\code{public Cat () { System.out.println("hello, class"); }}. Шучу, это бесполезно.

Например, чтобы мы могли не создать пустой экземпляр и наполнять его, а чтобы сразу задать ему базовые параметры окраса и имени. Или возраста и окраса, если сделать перегрузку конструктора. Все помнят про перегрузку методов? Тут ситуация точно такая же, в зависимости от типов передаваемых параметров, компилятор выберет нужный конструктор.

Обратите внимание, что мы описываем конструкторы и вызываем именно их в правой части выражения, создающего новые экземпляры котиков. Но, что за конструктор мы видели в самом начале, когда ни о каких конструкторах ещё совсем ничего не знали? Это называется, конструктором по-умолчанию, его создаёт компилятор, если не увидит в описании класса никаких конструкторов. То есть, рассуждения компилятора можно представить себе примерно следующим образом:
\begin{itemize}
\item так, этот программист ничего не знает о конструкторах и о том что у языка полностью объектно-ориентированная природа, добавлю для него пустой конструктор, пусть не думает о моём внутреннем устройстве;
\item о, программист написал какой-то конструктор, значит он знает о том, что это такое и зачем нужно, не буду ему помогать, ему виднее.
\end{itemize}
Из чего мы можем сделать простой вывод: как только мы добавили любой конструктор в наш класс, конструктор по-умолчанию создаваться не будет, а значит, если он нам нужен, придётся его добавить вручную. Зачем может понадобиться конструктор по-умолчанию, поговорим далее.

\newpage
\section{Java Development Kit}
\subsection{Краткое резюме курса}
\begin{itemize}
    \item \textbf{Название курса}: Java Development Kit
    \item \textbf{Требуемая подготовка студентов}: Базовые знания о работе языка и окружения Java. Умение собирать, запускать и документировать свои простейшие проекты. 
    \item \textbf{Краткое описание курса}: Данный курс знакомит слушателя с основными отличительными чертами языка программирования Java и предоставляемой для разработки приложений экосистемой (java development kit). В курсе будут рассмотрены возможности языка для написания графических приложений, особенности фреймворка коллекций и базовые вопросы многопоточности.
    \item \textbf{Цели курса}: В результате прохождения курса студент получит знания о предоставляемом инструментарии, научится ориентироваться в исходном коде этого инструментария и модифицировать под свои нужды существующие механизмы языка. Также студент получит базовые навыки работы с простыми базами данных средствами языка.
\end{itemize}

\begin{tikzpicture}
  \path[mindmap,concept color=magenta!70!,text=black]
    node[concept] {Java}
    [clockwise from=0]
    child[concept color=green!20!] { node[concept] {Core}
      [clockwise from=0]
      child[concept color=orange!20!] { node[concept] {Интер\-фейсы} } 
      child[concept color=orange!20!] { node[concept] {Много\-поточ\-ность} } 
      child[concept color=orange!20!] { node[concept] {Generics} } 
    }
    child[concept color=orange!20!] { node[concept] {Develop\-ment Kit}
      [clockwise from=-30]
      child[concept color=gray!20!] { node[concept] {GUI (Swing/ JavaFX)} } 
      child[concept color=green!40!] { node[concept] {Коллекции} } 
    }
        child[concept color=green!20!] { node[concept] {Управ\-ление проектом}
        [clockwise from=-30]
        child[concept color=green!40!] { node[concept] {Jar файлы} }
        child[concept color=orange!20!] { node[concept] {Gradle/ Maven} }
        child[concept color=red!20!] { node[concept] {Bazel} }
      }
;
\end{tikzpicture}

\subsection{План по лекциям и семинарам}
\begin{longtable}{|p{11mm}|p{35mm}|p{100mm}|} 
 \hline
 Блок курса & Название & Содержание
 \\ \hline
 \endhead
    Л & Интерфейсы & Понятие и принцип работы, implements; Наследование и множественное наследование интерфейсов; Значения по-умолчанию\\
    С & & \\
    Л & Обобщённое программирование & \\
    С & & \\
    Л & Коллекции & List, Set; Хэш-код, интерфейс Comparable; Map, Object (Использование методов, Переопределение методов); Итераторы, \textbf{Многопоточные} коллекции \\
    С & Структурирование данных & \\
    Л & Многопоточность & Понятие, Принцип (реальная и псевдопараллельность); Runnable, Thread (Свойства, Особенности создания); Deadlock, Состояние гонки, Object (Ожидание/уведомление); Синхронизация (Синхронизация по монитору, Частичная, по классу) \\
    С & Паралеллизм и асинхронность & \\
    Л & Графический интерфейс пользователя & GUI (Swing): Окна и свойства окон, \textbf{Многопоточность} и абстргирование асинхронных вызовов; менеджеры размещений и проведение параллелей с веб-фреймворками, разделение на фронт-энд и бэк-энд; JPanel и рисование, Обработка действий пользователя \\
    С & Простейшие интерфейсы пользователя & Кнопки, канва для рисования, смена кадров, движение, работа с параллельностью (закрепление материала по многопоточности) \\
 Л & Управление проектом: сборщики проектов & Управление проектом: Jar-файлы; Gradle/Maven: зависимости, выгрузка артефакта, публичные репозитории, свойства проекта, приватные репозитории (хостинг);
Bazel\\
 С & Сборка проекта & Maven сборка, Gradle сборка, компиляция jar-файла. Настройка хранения кэша сборщиков, настройка дополнительных репозиториев и аплоуда артефактов.\\
 \hline
\end{longtable}

\subsection{Пример 2-3 заданий на семинары}

\subsection{Часть сценария одной из лекций} 

\newpage
\section{Java Junior}
\subsection{Краткое резюме курса}
\begin{itemize}
    \item \textbf{Название курса}: Java Junior
    \item \textbf{Требуемая подготовка студентов}:
    \item \textbf{Краткое описание курса}: Студент, называющий себя Junior Java программистом должен отлично ориентироваться в ядре языка, знать, или, хотя бы, понимать, вспомогательный инструментарий из состава фреймфорка языка. Также данный уровень предполагает понимание устройства сетевых приложений на языке и уверенное знание, что именно следует изучать дальше. Данный курс знакомит студента с некоторыми часто применяемыми инструментами программирования на языке Java и низкоуровневого сетевого взаимодействия.
    \item \textbf{Цели курса}:
\end{itemize}

\begin{tikzpicture}
  \path[mindmap,concept color=magenta!70!,text=black]
    node[concept] {Java}
    [clockwise from=30]
    child[concept color=green!20!] { node[concept] {Core}
    [clockwise from=0]
      child[concept color=orange!20!] { node[concept] {Много\-поточ\-ность} } 
    }
    child[concept color=orange!20!] { node[concept] {Development Kit}
    [clockwise from=300]
    child[concept color=orange!20!] { node[concept] {}
      [clockwise from=45]
      child[concept color=orange!20!] { node[concept] {JDBC} } 
      child[concept color=gray!20!] { node[concept] {Сериали\-зация} } 
      child[concept color=red!20!] { node[concept] {StreamAPI} } 
      child[concept color=red!20!] { node[concept] {Reflec\-tionAPI} } 
      child[concept color=red!20!] { node[concept] {Много\-поточ\-ность} }
      child[concept color=red!20!] { node[concept] {Сетевое программи\-рование } }
    }}
    child[concept color=orange!20!] { node[concept] {Spring framework}
      [clockwise from=210]
      child[concept color=gray!20!] { node[concept] {Java EE} } 
    };
\end{tikzpicture}
    
\subsection{План по лекциям и семинарам}
\begin{longtable}{|p{11mm}|p{35mm}|p{100mm}|} 
 \hline
 Блок курса & Название & Содержание
 \\ \hline
 \endhead
    Л & JDBC & \\
    С & & \\
    Л & Сетевое программирование & Socket, ServerSocket, Многопоточность, абстрагирование сетевого взаимодействия, интерфейсы \\
    С & Применение языка программирования & \\
    Л & Введение в архитектуры приложений на Java & клиент-серверы, веб-приложения, сервлеты, толстые и тонкие клиенты, выделение бизнес-логики и хранения, создание общих пространств и модульность проекта\\    
    С & Написание сетевого приложения & \\
    Л & Сериализация, StreamAPI, ReflectionAPI & \\
    С & & \\
    Л & Введение в Java EE & \\
    С & & \\
    Л & Введение в Spring framework & \\
    С & & \\
 \hline
\end{longtable}


\subsection{Пример 2-3 заданий на семинары}

\subsection{Часть сценария одной из лекций} 

\newpage
\section{Java Junior+}
\subsection{Краткое резюме курса}
\begin{itemize}
    \item \textbf{Название курса}: Java Junior plus
    \item \textbf{Требуемая подготовка студентов}:
    \item \textbf{Краткое описание курса}: Курс направлен на изучение основных механизмов и инстументов, входящих во фреймворк Spring. Spring – один из самых популярных фреймворков для разработки веб-приложений на языке Java, почти полностью вытеснивший из этого сегмента JavaEE. Язык Java всё чаще и чаще ассоциируют только с написанием веб-приложений, поэтому зная основные принципы работы фреймворка будет огромным плюсом для любого программиста на языке Java.
    \item \textbf{Цели курса}:
\end{itemize}

\begin{tikzpicture}
  \path[mindmap,concept color=magenta!70!,text=black]
    node[concept] {Java}
    [clockwise from=0]
    child[concept color=orange!20!] { node[concept] {Spring framework}
    [clockwise from=0]
    child[concept color=orange!20!] { node[concept] {}
      [clockwise from=90]
      child[concept color=orange!20!] { node[concept] {Spring Context} } 
      child[concept color=gray!20!] { node[concept] {Thymeleaf} } 
      child[concept color=orange!20!] { node[concept] {Основы Hibernate} } 
      child[concept color=red!20!] { node[concept] {Spring Data} } 
      child[concept color=red!20!] { node[concept] {Spring Security} } 
      child[concept color=orange!20!] { node[concept] {Spring REST} } 
      child[concept color=red!20!] { node[concept] {Spring Boot} } 
    }};
\end{tikzpicture}
\subsection{План по лекциям и семинарам}
\begin{longtable}{|p{11mm}|p{35mm}|p{100mm}|} 
 \hline
 Блок курса & Название & Содержание
 \\ \hline
 \endhead
    Л & & \\
    С & & \\
    Л & & \\
    С & & \\
    Л & & \\
    С & & \\
    Л & & \\
    С & & \\
    Л & & \\
    С & & \\
    Л & & \\
    С & & \\
 \hline
\end{longtable}


\subsection{Пример 2-3 заданий на семинары}

\subsection{Часть сценария одной из лекций} 

\end{document}

