Игровой сервер как учебная дисциплина |
Я начал работать над программой. Первая сложность, которая сразу бросалась в глаза — сервер бесполезен без клиента. Можно написать «божественный» сервер, но если к нему никто не сможет обратиться, ценность его будет невелика и писать его будет не интересно. Писать свой клиент, тем более на Java, не было ни желания, ни времени. Решение, в общем-то, тоже бросалось в глаза. В качестве клиента можно использовать браузер. И написать сервер для браузерной игры. По той архитектуре, которую я опишу ниже, с точки зрения сервера, разницы в том, какой клиент использовать, нет вообще никакой.
Вторая сложность подбора материалов была в том, что их должно быть достаточно для создания законченного проекта, но при этом не слишком много, чтобы эту работу можно было выполнить за отведенное время. За 4 месяца, которые длится курс, студенты должны выполнить работу, равнозначную работе по разработке небольших браузерных и/или социальных игр. Насколько я знаком с такого рода разработками, весь цикл создания подобных игр занимает 1-2 месяца командой из 3-4 человек. Но в разработке участвуют профессионалы (в большей или меньшей степени), и работают они full-time. А большинство студентов, с которыми нужно было работать мне, опыта разработки не имеют (не важно, на каком языке, важно, что нет опыта создания проектов) и кроме моего курса у них еще 2 курса Технопарка и еще неизвестно сколько курсов МГТУ.
Мы решили, что для достижения наших задач нужно придерживаться ряда правил. Таких как:
В результате мы решили что надо обязательно рассказать о истории и особенностях языка Java, о многопоточности и обмене данными между потоками, о том какие бывают игровые механики, о тестировании и нагрузке, о работе с файловой системой и чтении ресурсов и, в заключение, о работе с базами данных.
Подробнее программу Технопарка вы можете посмотреть здесь.
Напомню, что полное название курса «Углубленное программирование на Java». Поэтому права на резкий переход от первого занятия с Hello World к многопоточности на втором занятии у меня было. В аннотации к курсу мы написали, что для успешного восприятия студентам необходимо знакомство с базовыми понятиями в Java. Что из этого получится, можно было узнать только на практике.
Из трех слов, составляющих название курса: Java, «программирование» и «углубленное» последнее самое не однозначное. Если бы курс назывался «Введение в Java», было бы понятно, о чем рассказывать. «Углубленное» означает, что у слушателей уже есть знания. Причем не только по программированию на языке высокого уровня, а программированию именно на Java. Мы решили что для успешного восприятия курса студенты уже должны знать о примитивных типах, основах ООП, ветвлениях, порядке операторов и модификаторах видимости.
В Технопарке учатся студенты МГТУ со второго по пятый курс со всех факультетов. К моему курсу они подошли после первого семестра обучения. Проверку на мотивацию они прошли, все, кто не обладал базовыми знаниями, их получили. Среди студентов были и те, кто уже пишет на Java и зарабатывает этим деньги, и те, кто до курса на Java вообще ничего не писал.
В результате часть слушателей на первой практической работе в первый раз написали «Hello world», другая часть решила, что без шаблонизаторов и http-сессий разрабатывать не интересно. По результатам первых двух занятий я решил, что правильно будет не ограничивать студентов и разрешил использовать любые библиотеки, которые им известны. А к середине курса и вовсе разрешил писать свою Frontend-часть, то есть, всю работу сервера с браузером организовать так, как им удобнее. При этом те, кто опыта работы на java до этого не имел, могли продолжать учиться по моей программе. Использование дополнительных знаний на оценку не влияло.
Технопарк — дело добровольное. В том смысле, что мы не берем со студентов платы за обучение, не подписываем никаких контрактов и не можем заставить посещать наши занятия. Это накладывает некоторые условия на формат занятий. У студентов должна быть заинтересованность в посещении лекций и семинаров. Это должно быть их собственное желание. А это значит, что сами занятия должны быть в первую очередь интересными. Если студент заинтересован происходящим, материал лекции он тоже запомнит и, скорее всего, придет на следующее занятие. Мы решили, что сделать не просто курс по java, а курс о разработке игр — мало. Лекция в нашем понимании должна быть в некотором роде шоу, то есть учебное занятие, в котором есть место для развлечения. В первую очередь это коснулось иллюстраций к учебным материалам. Ниже я хочу привести три примера из лекций:
Кроме слайдов, для привлечения внимания оказалось очень полезным задавать аудитории странные вопросы. Например, кто помнит расстояние от Земли до Луны? Если у нас сервер с базами на Луне, какая будет минимальная задержка при записи в базу? Или, кто играл в корейские онлайновые игры? Вы можете объяснить термин ВКР?
Позитивно на восприятии сказывается и упоминание названий и игровых терминов, которые студенты не ожидают услышать в университете. Кстати, 90% опрошенных студентов играли в Tetris, Mario и GTA. Среди них нашелся эльф 80-го уровня и энтузиаст, прошедший все части Angry Birds.
Не все, что я написал о курсе до этого, может быть понятно с точки зрения преподавания теории по языку Java. Если ограничиться только прочтением лекций по приведенной выше программе, смысл многих разбираемых в курсе вопросов останется неясным. Например, зачем нам многопоточность на второй лекции, зачем нагрузочное тестирование на пятой и почему аннотации только в конце курса? Эта странность будет понятна, если рассмотреть курс со стороны домашних заданий и практической работы.
Начну с описания задачи. Предлагаемый для разработки учебный сервер состоит из 8 модулей:
Подробно о каждом модуле:
Вы можете сравнить архитектуру учебного сервера с архитектурой сервера Аллодов Онлайн. Заимствование не полное, но очевидно, что мы всячески старались им подражать.
Теперь о том, в какой последовательности мы все это писали. Работа была разбита на 6 семинаров в следующей последовательности:
Семинары проходили очень живо. Я и мой ассистент бегали между студентами, отвечали на массу вопросов разной степени сложности. Студенты показывали друг другу свои решения. Мы разбирали общие для всех проблемы и трудности. Некоторые из вопросов были действительно интересными и свое желание «узнать в процессе преподавания о себе и о Java что-то новое» было удовлетворено полностью.
Подход, при котором студент от состояния «ничего не писал на Java» за месяц переходит в состояние «написал web-сервер, который работает в 3 потока», может показаться жестоким. Однако, как показывает практика, именно он работает лучше всего.
Большинство студентов предложенную выше программу освоили. Проблемы с восприятием материала были на третьей лекции, к концу которой мы разбирали взаимодействие потоков через систему обмена сообщениями. Сейчас я прочел эту же лекцию второму потоку студентов. И теперь мне кажется, что проблемы были не столько с восприятием, сколько с моими способностями объяснить материал. Повторное чтение курса, насколько я могу судить по степени остекленения глаз студентов, проходит гораздо продуктивнее.
Почти на всех лекциях я показывал свой код и рассказывал, как он работает. В результате, даже если студент что-то не понимал на лекции, он мог просмотреть ее в записи и скопировать сложные участки кода. Исходники своего кода я не раздавал, и, как следствие, даже при заимствовании кода из лекции этот код надо было как минимум переписать.
Главным результатом первого семестра я считаю доказанную студентами возможность написать за отведенное время проект web-севера по предложенной мной архитектуре. До защиты сервера дошли шесть групп из десяти. Три группы из шести подошли к задаче творчески и кроме реализации всех модулей сервера разработали интересную игровую механику.
Ну и, конечно, опрос студентов после завершения курса:
Экзамен сдавали только те студенты, которые не смогли вовремя выполнить практическую работу. Мы решили, что это теоретики, и что они, возможно, смогут добиться признания в роли архитекторов. Чтобы получить отличную оценку, надо было ответить на 3 вопроса, случайным образом взятых из двух одинаковых наборов по 49 вопросов в каждом. Вариант, при котором студент вытащит два одинаковых вопроса, мы не стали отбрасывать. В этом случае он должен был отвечать на один и тот же вопрос дважды. Правда, таких счастливчиков на экзамене не было.
В заключение хочу заметить, что мы продолжаем работать над курсом. С каждым прочтением структура курса становится более логичной, а сам материал понятнее. В планах на будущее — сделать курс еще более ориентированным на практику, включить в обязательную программу использование шаблонизаторов для создания страниц и практику по разворачиванию продукта на сервере. Но об этом я напишу позже, когда будет достаточно нового материала.
Хочу пожелать удачи молодым специалистам и особенно тем, которые заинтересовались серверным программированием. И помните, именно благодаря вашему коду игра обретает настоящую жизнь в сети.
Все, кто хочет примкнуть к нашей команде, отправляйте, пожалуйста, свои резюме в нашу HR-службу на адрес job.gamedev@corp.mail.ru
В работе над статьей и курсом мне помогали:
Copyright © 2021 ООО "ДТФ.РУ". Все права защищены.
Воспроизведение материалов или их частей в любом виде и форме без письменного согласия запрещено.
Замечания и предложения отправляйте через форму обратной связи.