GrabDuck

Игра в стартап на семинарах по Java

:


Иллюстрация HttpSession в момент работы с куками
Эта статья обязана своим появлением новому требованию к курсу «Углублённое программирование на Java», который я веду в Технопарке Mail.Ru в МГТУ им. Баумана. Это требование было сформулировано в начале лета и звучало примерно так: «Ещё больше практики!».

Так как курс изначально был задуман как практический, и всё в нём, как мне казалось, нацелено на практическую работу, то в первый момент я был в замешательстве. Ещё больше практики можно было добиться только двумя путями.

Первый — привести всех студентов к нам на проект Skyforge и посадить писать сервер. Всерьёз я такой вариант, конечно, не рассматривал, но новой директиве он точно соответствовал. Не знаю, с каким выражением на меня посмотрели бы менеджеры проекта, приди я к ним с подобным предложением, но пофантазировать было увлекательно. К счастью, у меня был запасной вариант.

Я решил изменить курс так, чтобы он, кроме знаний по написанию сервера на Java, содержал ещё элементы игры в стартап по разработке игр. Практикоорентированность этого дополнения мне кажется очевидной, приближённость к «боевым» условиям — тоже. О начале этого эксперимента я и хочу вам рассказать.
Перед тем как перейти непосредственно к описанию изменений в учебной программе и первых результатов, я хотел бы ещё раз сказать несколько слов о курсе и Технопарке.

«Углублённое программирование на Java» — это курс второго семестра Технопарка. К прохождению курса допускаются студенты, успешно завершившие первый (из четырёх) семестров программы. В рамках программы мы изучаем архитектуру сервера браузерной игры, написанной на Java. Большинство студентов до этого курса платформу Java не изучали и опыта написания приложений на ней не имеют.

Курс нацелен на написание масштабируемого модульного приложения. Модули сервера включают в себя работу с файловой системой, базой данных, веб сервером (на Jetty) и игровую механику. Всё это живёт в нескольких потоках и обменивается сообщениями. Все лекционные материалы подобраны так, чтобы служить фундаментом для практической работы. Мы не используем JavaEE и в учебных целях самостоятельно работаем с потоками и JDBC. Чтобы знать, как оно устроено внутри, а не просто собрать программу из уже готовых модулей. Единственное исключение — это Jetty, чтобы не начинать знакомство с Java с написания своего веб сервера. Подробнее о том, каким был курсе весной этого года, я писал в своей предыдущей статье.

Являясь по своей сути академическим, курс «Углублённое программирование на Java» мог вообще не содержать материалов по разработке фронтенда. Но без этого его ценность, как и заинтересованность в нём студентов, была бы значительно ниже. Писать сервер без возможности обратиться к нему клиентом — занятие, схожее с разработкой сферического коня в вакууме. Поэтому первые 2-3 занятия мы посвящаем настройке инструментов и разработке заготовки для фронтенда.

Полноценную работу над фронтендом игры можно начать, только если ты уже знаешь, какую игру ты будешь писать. В идеале для неё нужны не только программисты, но также художники и дизайнеры. Снабдить студентов всем необходимым для полноценного фронтенда я не могу. Эта часть проекта в большей степени остаётся на их усмотрение.

Итак, вернёмся к девизу «Ещё больше практики!». Чтобы уйти от академичности в сторону большей практической ценности, я решил:

  1. усилить фронтендную часть,
  2. использовать больше инструментов для управления проектом,
  3. разрешить студентам самим объединяться в группы,
  4. эмулировать промежуточные контрольные «приёмки работы инвестором».

Теперь подробнее о каждом пункте.
Два предыдущих семестра я начинал с очень упрощённой фронтендной части. Для её сдачи было достаточно скачать библиотеку Jetty, подключить к проекту и написать наследника от AbstractHandler (как в базовом примере от авторов библиотеки). И отдавать в браузер страницу с формой, содержащей созданный сервером id сессии пользователя, и javascript-ом, который постит раз в секунду эту форму на сервер. Таким образом, мы эмулировали общение между сервером и клиентом.

С точки зрения разработки сервера, этого было достаточно. Студенты сами могли от этого оттолкнуться и расширить возможности системы, используя сервлеты, http-сессии, шаблонизатор и ajax. Некоторые с этим справились, некоторые нет. Богатство фронтенда я на экзамене не оценивал, всё держалось только на энтузиазме.

Для достижения новых целей этого было явно недостаточно. Поэтому мы решили, что для всех будет обязательным использование сервелетов, HttpSession и механизма «отдачи» статики. Кроме того, мы решили использовать библиотеку для формирования страниц. К счастью для нас, в этом же семестре у студентов появился курс фронтендной разработки и для всех, кто изучает «сервер на Java», уже не проблема написать асинхронные запросы от браузера к серверу.

В результате на первом контрольном занятии почти у всех студентов был сервер, подцепленный к localhost:8080, который возвращал при первом обращении index.html с картинкой, предложением заполнить логин и пароль (пока без базы, все логины захардкодили: о). В случае успешного логина осуществлялся переход на страницу, которая регулярно и асинхронно запрашивала свою область с выводом серверного времени, приветствием залогиненного пользователя, его userId и sessionId.

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

Теперь подробнее об инструментах. В качестве IDE в этом семестре мы выбрали IntelliJIDEA Community Edition. Для управления сборкой и внешними зависимостями — maven. Этим мы достигли сразу две цели — облегчили процесс скачивания и подключения библиотек и дали студентам возможность освоить популярные инструменты.

Новую среду разработки студенты освоили быстро, «скорость» интернета в МГТУ оказалась достаточной, чтобы maven мог выкачать нужные библиотеки за минуты.

Но, как мне кажется, самым значительным и успешным нововведением стало использование github.com для хостинга исходных кодов проектов. До этого мы пробовали поднимать свой git, потом свой svn, но получалось не очень удобно и требовало много ручной настройки. В этот раз мы решили не изобретать велосипеды, а использовать готовый.

Работа над практическим заданием в рамках курса идёт в группах по 3-4 человека. Каждая группа завела себе открытый репо на github. Кроме того, я реанимировал свой старый аккаунт и выложил на нём примеры для занятий и презентации. Теперь студенты могут смотреть мои материалы, а я могу следить за изменением их кодов. И опять же, от этого решения сразу две выгоды: удобство разработки и изучение популярных инструментов.

Конечно, когда я предложил всё держать в открытых репо, мне сказали: «…ведь все увидят наш код!!!!111». Да, увидят. И, как мне кажется, это замечательно. Более того, если вы напишете код, который кто-то станет смотреть и разбираться в нём, то это ваша победа. А тот, кто сможет разобраться в чужом примере и на его основе написать свой — герой, достойный отличной оценки.


Мои и студенческие репо

Одной из задач Технопарка является подготовка студентов к работе в коллективе. Очень редко новый сотрудник приходит в команду, в которой уже есть его друзья и знакомые. Чтобы эмулировать присоединение к коллективу, мы в предыдущих семестрах объединяли студентов в группы сами.
В этот раз мы решили сделать по-другому, и первое занятие курса я начал с предложения: «Представьте, что вам пришла в голову гениальная идея создать свой стартап. И вы решили с друзьями начать писать браузерные игры». В результате на первом же занятии 32 студента объединились в 9 групп.


Пример командной работы

Пока рано говорить о пользе этого нововведения, ведь мы исключили тренировку навыка согласования работы с незнакомыми людьми. Но точно выиграли в энтузиазме.

По правилам Технопарка знания контролируются не только на экзамене в конце семестра, но и на нескольких промежуточных экзаменах. Один из них мы уже провели. Чтобы получить максимальный балл, нужно было закачать на мой ноутбук, подключённый к проектору, свой код из github, собрать проект, показать всем, как он работает, и рассказать о коде.

Идея демонстрации работы приложения на «железе заказчика» оказалась очень плодотворной. Два проекта из подготовленных к сдаче отказались запускаться с первого раза. Один работал совсем не так, как планировали авторы. Аргумент «но у меня на компе всё отлично» я не рассматривал. Особенно доставляло радовало предложение: «А теперь давайте посмотрим, как всё это будет выглядеть в Internet Explorer».

Итог. Что такое «много практики в учебном процессе»? Я для себя на этот вопрос ответил так: это возможность попробовать разработку в условиях, приближенных к производству, решая задачи, похожие на настоящие, и используя инструменты, которые применяются для коммерческой разработки. Первую часть этой формулы («задачи, похожие на настоящие») мы уже опробовали. В этом семестре попробуем и вторую часть.

После публикации предыдущей статьи о курсе в Технопарке я получил много комментариев с вопросом: «Где посмотреть материалы по курсу?» Мы записали курс в формате SCORM и сейчас его можно найти в « Национальном Открытом Университете Интуит». Здесь видеокурс «Углублённое программирование на Java». Примеры кода, о которых я рассказывал, можно найти на github.

Виталий Чибриков,
Allods Team