\documentclass[../j-spec.tex]{subfiles} \begin{document} \sloppy \section{Семинар: компиляция и интерпретация кода} \subsection{Инструментарий} \begin{itemize} \item \href{https://docs.google.com/presentation/d/1LPMWfXpjkJDOMR4lv7y5Ss6_ABSocZtoc7nVEVs6FQo}{Презентация для преподавателя}, ведущего семинар; \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}. \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} \item Какой механизм используется для непосредственного исполнения скомпилированного кода? (3) \begin{enumerate} \item JDK; \item JRE; \item JVM. \end{enumerate} \item Какая сущность только объединяет классы по смыслу? (1) \begin{enumerate} \item Пакеты; \item Библиотеки; \item Фреймворки. \end{enumerate} \item Основная единица исходного кода программы -- это? (2) \begin{enumerate} \item Функция; \item Класс; \item Файл. \end{enumerate} \item Какой ключ используется для указания папки назначения? (1) \begin{enumerate} \item \code{-d}; \item \code{-out}; \item \code{-to}. \end{enumerate} \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{Вариант решения} Для упрощения был использован 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} \end{itemize} \end{itemize} \subsubsection{Вопросы и ответы} \begin{itemize} \item \textbf{Ценность этапа} Вовлечение аудитории в обратную связь, пояснение неочевидных моментов в материале лекции и другой проделанной работе. \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$] сохранить форматирующую строку в ячейке с переменной \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} \item [5-25 мин] Решить все задания (в том числе «со звёздочкой»), если они не были решены на семинаре, без ограничений по времени; Все варианты решения приведены в тексте семинара выше \item [10-15 мин] Создать docker-контейнер для формирования полной документации по проекту \lstinputlisting[style=CCodeStyle,caption={docker-compose-class.yml}]{src/s01-hw2-docker-compose-docs.yml} \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}