gb-java-devel/seminars/jtc1-01c.tex

365 lines
25 KiB
TeX
Raw Normal View History

2022-12-14 14:43:40 +03:00
\documentclass[../j-spec.tex]{subfiles}
\begin{document}
2022-12-15 10:24:31 +03:00
\sloppy
2022-12-14 14:43:40 +03:00
\section{Семинар: компиляция и интерпретация кода}
\subsection{Инструментарий}
\begin{itemize}
\item \href{https://docs.google.com/presentation/d/1LPMWfXpjkJDOMR4lv7y5Ss6_ABSocZtoc7nVEVs6FQo}{Презентация для преподавателя}, ведущего семинар;
2022-12-14 14:43:40 +03:00
\item \href{https://drive.google.com/file/d/1LWyE8aEy4-1gsognqhXIXwDcoLviVge4/view}{Фон} GeekBrains для проведения семинара в Zoom;
\item \href{https://jupyter.org/install}{Jupyter Notebook} для практики и примеров используется Jupyter notebook (потребуется установить \href{https://www.python.org/downloads/}{Python} и ядро \href{https://github.com/SpencerPark/IJava}{IJava}) и любой терминал операционной системы (bash, zsh, cmd);
\item JDK любая 11 версии и выше;
\item \href{https://docs.docker.com/get-docker}{Docker}, \href{https://www.gnu.org/software/automake/}{make}.
2022-12-14 14:43:40 +03:00
\end{itemize}
\subsection{Цели семинара}
\begin{itemize}
\item Закрепить полученные на лекции знания, касающиеся компиляции, интерпретации кода и создания программной документации;
\item Получить практический навык настройки терминала ОС для компиляции и исполнения кода, установки сторонних библиотек для интерпретации;
\item Попрактиковаться в написании терминальных команд и простых проектов. Лучше понять принцип импортирования кода и сборки проекта.
\end{itemize}
\subsection{План-содержание}
\noindent
\begin{spreadtab}{{longtable}{|p{37mm}|l|l|p{90mm}|}}
\hline
@ Что происходит & @ Время & @ Слайды & @ Описание \\
\hline
\endhead
@ Организационный момент & 5 tag(beg) & @ 1-4 & @ Преподаватель ожидает студентов, поддерживает активность и коммуникацию в чате, озвучиает цели и планы на семинар. Важно упомянуть, что выполнение домашних заданий с лекции является, фактически, подготовкой к семинару \\
\hline
@ Quiz & 5 & @ 3-14 & @ Преподаватель задаёт вопросы викторины, через 30 секунд демонстрирует слайд-подсказку и ожидает ответов (4 вопроса, по минуте на ответ) \\
\hline
@ Рассмотрение ДЗ & 15 & @ 15-18 & @ Преподаватель демонстрирует свой вариант решения домашнего задания с лекции, возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов \\
\hline
@ Вопросы и ответы & 10 & @ 19 & @ Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы \\
\hline
@ Задание 1 & 10 & @ 20-22 & @ Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки. Показать выполненные терминальные команды, результат компиляции. (* отделить исходный код от скомпилированных файлов, ** сложить исходный код в пакет) \\
\hline
@ Перерыв (если нужен) & 5 & @ 26 & @ Преподаватель предлагает студентам перерыв на 5 минут (студенты голосуют) \\
\hline
@ Задание 2 & 10 & @ 23-25 & @ Настроить окружение Jupyter Notebook с ядром Java, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown. (* осуществить форматированный вывод, ** сохранить форматирующую строку в ячейке с переменной) \\
\hline
@ Задание 3 & 15 & @ 27-29 & @ К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать программную документацию. (* создать документацию на каждый пакет по отдельности) \\
\hline
@ Домашнее задание & 5 & @ 39 & @ Объясните домашнее задание, подведите итоги урока \\
\hline
@ Рефлексия & 10 tag(end) & @ 40-42 & @ Преподаватель запрашивает обратную связь \\
\hline
@ Длительность & sum(cell(beg):cell(end)) & & \\
\hline
\end{spreadtab}
\subsection{Подробности}
\subsubsection{Организационный момент}
\begin{itemize}
\item \textbf{Цель этапа:} Позитивно начать урок, создать комфортную среду для обучения.
\item \textbf{Тайминг:} 3-5 минут.
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Презентует название курса (первый раз) и семинара;
\item Рассказывает немного о себе;
\item Запрашивает активность от аудитории в чате;
\item Презентует цели курса и семинара;
\item Презентует краткий план семинара и что студент научится делать.
\end{itemize}
\end{itemize}
\subsubsection{Quiz}
\begin{itemize}
\item \textbf{Цель этапа:} Вовлечение аудитории в обратную связь.
\item \textbf{Тайминг:} 5-7 минут (4 вопроса, по минуте на ответ).
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Преподаватель задаёт вопросы викторины, представленные на слайдах презентации;
\item через 30 секунд демонстрирует слайд-подсказку и ожидает ответов.
\end{itemize}
\item \textbf{Вопросы и ответы:}
\begin{enumerate}
2022-12-15 10:24:31 +03:00
\item Какой механизм используется для непосредственного исполнения скомпилированного кода? (3)
\begin{enumerate}
\item JDK;
\item JRE;
\item JVM.
\end{enumerate}
\item Какая сущность только объединяет классы по смыслу? (1)
\begin{enumerate}
\item Пакеты;
\item Библиотеки;
\item Фреймворки.
\end{enumerate}
2022-12-15 14:36:00 +03:00
\item Основная единица исходного кода программы -- это? (2)
2022-12-15 10:24:31 +03:00
\begin{enumerate}
\item Функция;
\item Класс;
\item Файл.
\end{enumerate}
\item Какой ключ используется для указания папки назначения? (1)
\begin{enumerate}
\item \code{-d};
\item \code{-out};
\item \code{-to}.
\end{enumerate}
2022-12-14 14:43:40 +03:00
\end{enumerate}
\end{itemize}
\subsubsection{Рассмотрение ДЗ}
\begin{itemize}
\item \textbf{Цель этапа:} Пояснить неочевидные моменты в формулировке ДЗ с лекции, синхронизировать прочитанный на лекции материал к началу семинара.
\item \textbf{Тайминг:} 15-20 минут.
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Преподаватель демонстрирует свой вариант решения домашнего задания из лекции;
\item возможно, по предварительному опросу, демонстрирует и разбирает вариант решения одного из студентов.
\end{itemize}
\item \textbf{Домашнее задание из лекции:}
\begin{itemize}
\item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю.
\textbf{Вариант решения}
\begin{figure}[H]
\centering
\includegraphics[width=100mm]{sem-01-struct.png}
\caption{Структура проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код основного класса}]{src/s01-h01-Main.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код считающего класса}]{src/s01-h01-OtherClass.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Код декоратора}]{src/s01-h01-Decorator.java}
\item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам.
\textbf{Вариант решения}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java
java -classpath ./out ru.gb.jcore.sample.Main
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=60mm]{sem-01-hw2-compile.png}
\caption{Результат компиляции}
\end{figure}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команда создания документации}]
javadoc -d docs -sourcepath ./src -cp ./out -subpackages ru
\end{lstlisting}
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-hw2-doc.png}
\caption{Результат создания документации}
\end{figure}
\item Создать Makefile с задачами сборки, очистки и создания документации на весь проект.
\textbf{Вариант решения}\footnote{Обратите внимание, что все отступы сделаны не пробелами, а табуляцией, иначе Makefile не работает}
\lstinputlisting[style=CCodeStyle,caption={Makefile}]{src/s01-h03-Makefile}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-hw03.png}
\caption{Результат выполнения тасков}
\end{figure}
\item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере пользователя, а второй забирать скомпилированные классы и исполнять их.
\textbf{Вариант решения}
2022-12-15 10:24:31 +03:00
Для упрощения был использован docker compose, вместо чистого Docker. Файлы, компилирующие и исполняющие программу представлены в листингах ниже. Оба эти файла запускаются из корня папки проекта командами
\begin{verbatim}
docker compose -f docker-compose-class.yml up
docker compose -f docker-compose-exec.yml up
\end{verbatim}
соответственно.
\lstinputlisting[style=CCodeStyle,caption={docker-compose-class.yml}]{src/s01-h04-docker-compose-class.yml}
\lstinputlisting[style=CCodeStyle,caption={docker-compose-exec.yml}]{src/s01-h04-docker-compose-exec.yml}
2022-12-14 14:43:40 +03:00
\end{itemize}
\end{itemize}
\subsubsection{Вопросы и ответы}
\begin{itemize}
2022-12-15 10:24:31 +03:00
\item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе.
2022-12-14 14:43:40 +03:00
\item \textbf{Тайминг} 5-15 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Преподаватель ожидает вопросов по теме прошедшей лекции, викторины и продемонстрированной работы;
\item Если преподаватель затрудняется с ответом, необходимо мягко предложить студенту ответить на его вопрос на следующем семинаре (и не забыть найти ответ на вопрос студента!);
\item Предложить и показать пути самостоятельного поиска студентом ответа на заданный вопрос;
\item Посоветовать литературу на тему заданного вопроса;
\item Дополнительно указать на то, что все сведения для выполнения домашнего задания, прохождения викторины и работы на семинаре были рассмотрены в методическом материале к этому или предыдущим урокам.
\end{itemize}
\end{itemize}
\subsubsection{Задание 1}
\begin{itemize}
\item \textbf{Ценность этапа} Создание, компиляция и запуск проектов без использования среды разработки.
\item \textbf{Тайминг} 10-20 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (запуск приложений на сервере, в контейнерах, настройка CI/CD в пет-проектах);
\item Выдать задание группам студентов, показать где именно следует искать терминал ОС;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}:
\begin{itemize}
\item Создать, скомпилировать, запустить и продемонстрировать простой проект без использования среды разработки.
\textbf{Вариант решения}
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Простейший проект}]
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
\end{lstlisting}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции}]
javac Main.java
java Main
\end{lstlisting}
\item [$*_1$] отделить исходный код от скомпилированных файлов
\textbf{Вариант решения}
\begin{lstlisting}[style=ASMStyle]
javac -d out Main.java
java -classpath ./out Main
\end{lstlisting}
\item [$*_2$] сложить исходный код в пакет с глубиной иерархии не менее 3.
\textbf{Вариант решения}
Вручную создать соответствующие вложенные папки, переместить в них файл с исходным кодом \code{Main.java} и написать оператор \code{package} первой строкой файла \code{Main.java}.
\begin{lstlisting}[style=ASMStyle]
javac -d out ru/gb/jcore/Main.java
java -classpath ./out ru.gb.jcore.Main
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Задание 2}
\begin{itemize}
\item \textbf{Ценность этапа} Настройка и изучение дополнительного инструментария для создания проектов и описания работы фрагментов кода в виде Jupyter notebook.
\item \textbf{Тайминг} 10-15 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (использование скриптовых возможностей среды разработки, таких как написание простых фрагментов кода без необходимости создавать большой проект в тяжеловесной среде разработки);
\item Пояснить студентам в каком виде выполнять и сдавать задания;
\item Выдать задание группам студентов, показать где и как скачивать необходимый инструментарий, если он ещё не установлен;
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдавать группе задания «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item Настроить окружение Jupyter Notebook с ядром IJava, создать одну ячейку с переменной, а вторую с выводом значения этой переменной стандартным способом. Дополнить ячейки описанием markdown.
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-1.png}
\caption{Вариант решения}
\end{figure}
\item [$*_1$] осуществить форматированный вывод
\begin{lstlisting}[language=Java,style=JCodeStyle,caption={Вариант решения (вторая ячейка)}]
System.out.print("Your number is " + a);
\end{lstlisting}
\item [$*_2$] сохранить форматирующую строку в ячейке с переменной
2022-12-14 14:43:40 +03:00
\begin{figure}[H]
\centering
\includegraphics[width=120mm]{sem-01-t2-2.png}
\caption{Вариант решения}
\end{figure}
\end{itemize}
\end{itemize}
\subsubsection{Задание 3}
\begin{itemize}
\item \textbf{Ценность этапа} Закрепление навыков создания стандартной программной документации.
\item \textbf{Тайминг} 15-20 минут
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам ценность этого опыта (описание пет-проектов для потенциальных соисполнителей, создание базы знаний по проекту на случай длительных пауз в работе)
\item Выдать задание группам студентов
\item Если группа студентов справилась с заданием, а времени осталось более 5 минут, выдать группе задание «со звёздочкой».
\end{itemize}
\item \textbf{Задания}
\begin{itemize}
\item К проекту из задания 1 добавить ещё один класс в соседнем пакете, как это было показано на лекции, и комментарии в стиле Javadoc. Комментарии необходимо добавить как к методам, так и к классам. Сгенерировать общую программную документацию.
\textbf{Вариант решения}
\begin{figure}[H]
\centering
\includegraphics[width=80mm]{sem-01-t3-1.png}
\caption{Иерархия получившегося проекта}
\end{figure}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Основной класс}]{src/s01-t3-Simple.java}
\lstinputlisting[language=Java,style=JCodeStyle,caption={Вспомогательный класс}]{src/s01-t3-Complex.java}
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Команды компиляции и создания документации}]
javac -sourcepath . -d out ru/gb/Simple.java
java -classpath ./out ru.gb.Simple
javadoc -d doc -sourcepath . -cp ./out -subpackages ru
\end{lstlisting}
\item [$*_1$] создать документацию на каждый пакет по отдельности
\begin{lstlisting}[language=bash,style=ASMStyle,caption={Вариант решения}]
javadoc -d doc_gb -sourcepath . -cp ./out ru.gb
javadoc -d doc_bg -sourcepath . -cp ./out ru.bg
\end{lstlisting}
\end{itemize}
\end{itemize}
\subsubsection{Домашнее задание}
\begin{itemize}
\item \textbf{Ценность этапа} Задать задание для самостоятельного выполнения между занятиями.
\item \textbf{Тайминг} 5-10 минут.
\item \textbf{Действия преподавателя}
\begin{itemize}
\item Пояснить студентам в каком виде выполнять и сдавать задания
\item Уточнить кто будет проверять работы (преподаватель или ревьювер)
\item Объяснить к кому обращаться за помощью и где искать подсказки
\item Объяснить где взять проект заготовки для дз
\end{itemize}
\item \textbf{Задания}
\begin{enumerate}
2022-12-15 14:36:00 +03:00
\item [5-25 мин] Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени;
Все варианты решения приведены в тексте семинара выше
\item [10-15 мин] Создать docker-контейнер для формирования полной документации по проекту
2022-12-15 14:36:00 +03:00
\lstinputlisting[style=CCodeStyle,caption={docker-compose-class.yml}]{src/s01-hw2-docker-compose-docs.yml}
2022-12-15 14:36:00 +03:00
2022-12-14 14:43:40 +03:00
\end{enumerate}
\end{itemize}
\subsubsection{Рефлексия и завершение семинара}
\begin{itemize}
\item \textbf{Цель этапа:} Привести урок к логическому завершению, посмотреть что студентам удалось, что было сложно и над чем нужно еще поработать
\item \textbf{Тайминг:} 5-10 минут
\item \textbf{Действия преподавателя:}
\begin{itemize}
\item Запросить обратную связь от студентов.
\item Подчеркните то, чему студенты научились на занятии.
\item Дайте рекомендации по решению заданий, если в этом есть необходимость
\item Дайте краткую обратную связь студентам.
\item Поделитесь ощущением от семинара.
\item Поблагодарите за проделанную работу.
\end{itemize}
\end{itemize}
\end{document}