Игры для обучения программированию
Несколько десятилетий в мире наблюдается хроническая нехватка программистов при постоянном растущем спросе на них. Есть мнение, что программирование — специфическое занятие, доступное ограниченному количеству людей. В мире не так много людей с высоким IQ, способностью сохранять концентрацию длительное время, оперировать сложными абстракциями конструкциями.
Профессионалов мало. Но их можно обучать с нуля. Теоретически, при неограниченном времени любого человека можно обучить чему угодно, если у него бесконечное желание и любопытство. Кажется, любопытство даже важнее, чем способности.
Соответствующие способности можно развить, а интеллект — повысить в рамках генетически заданного широкого коридора. Это возможно в любом возрасте. Лучше всего с детства, хотя и взрослым ничто не мешает… Проще всего начинать с игр.
За счёт эмоционального вовлечения и азарта обучение в играх идёт гораздо быстрее — и приносит удовольствие, что тоже важно для эмоциональной привязки к профессии.
Некоторые игры просто созданы для формирования у человека абстрактного мышления и логики. То есть, по сути — для обучения программированию. Создатели игры не планировали обучать кодеров, но по факту игра это делает. Другие игры конкретно ставят такую задачу — подготовка программистов.
Например, на Курсере, в MIT и на других учебных сайтах обучение самых маленьких часто ведётся в игровой форме на языках Scratch или Blockly. Ребёнок составляет алгоритмы для решения простых и понятных задач. Например, провести овечку по тропинке так, чтобы не попасть к волку. Главное, что детям это нравится — и в результате они сохраняют любовь к программированию на всю жизнь (ну, таков замысел).
Мой сын в шестилетнем возрасте с удовольствием решал эти игры. Сейчас ему пятнадцать — и кажется, что заложенная база даёт эффект. Вообще, сам Scratch за эти годы доказал свою эффективность и превратился в настоящий феномен с огромной аудиторией юных (и не только) программистов.
То есть понятно, что игры такого типа конкретно используются в обучении.
Но есть другие игры — которые ставят задачу не обучить, а доставить удовольствие профессиональным программистам — так называемые игры на программирование (programming games). Здесь игрок не участвует напрямую в игровом процессе. Вместо этого — он пишет управляющую программу, которая сражается с себе подобными. В принципе, такой подход тоже подходит для обучения. Может быть, он даже лучше подходит — соревнование всегда интереснее, чем простой урок.
Знатоки в Википедии пишут, что первыми играми на программирование стали Darwin (1961) и «Бой в памяти» (Core War, 1984). В этой игре два бота (программы) сражаются за контроль над виртуальным компьютером. Задача — завесить программу противника. Боевые программы составляются на абстрактном ассемблере Redcode, а затем загружаются в память по случайному адресу. Оттуда они выполняют по одной инструкции за ход, постепенно захватывая память, уничтожая процессы врага (вызывая ошибки через замену его значений) и постепенно полностью вытесняя его с территории (см. инструкции в журнале «Хакер»).
По этой игре до сих пор проходят чемпионаты мира. Из других известных игр на программирование выделяются разные категории боевых роботов, логические игры (например, турниры шахматных программ) и прочие — управление гоночной машиной, колонией микробов и прочее. Главное, что в игре участвуют не люди, а написанные ими программы.
Самая известная игра о боевых роботах — Robocode, изначально созданная для изучения языка Java.
Позже появилась новая версия этой игры: Robocode Tank Royale (Java 11+). В отличие от оригинальной версии, тут сражение происходит не один на один (PvP), а в режиме массовой бойни, после которой остаётся один победитель, то есть «королевская битва».
▍ Robocode. Королевская битва
Цель игры — создать бота в виде виртуального танка, который будет соревноваться с другими ботами на виртуальной боевой арене. Как и в других играх на программирование, бот запускается в «свободное плавание», так что у нас нет никаких рычагов влияния на игру после того, как мы написали управляющую программу. Программа указывает, как бот должен вести себя и реагировать на события, происходящие на арене.
Пример битвы в Robocode Tank Royale:
Эта игра тоже помогает изучить Java и в целом научиться программировать или улучшить свои навыки — и получить при этом удовольствие. Robocode также полезна для изучения основ машинного обучения.
Танк состоит из трёх частей:
- корпус
- орудие
- радар
Корпус двигается вперёд и назад, а также может поворачиваться налево и направо.
Пушка стреляет энергетическими снарядами. Она тоже поворачивается относительно корпуса.
Самая сложная часть танка — радар. Он установлен на верхней части орудия и сканирует других ботов. Радар поворачивается влево или вправо. Он сканирует и обнаруживает ботов только во время поворота и только тех ботов, которые находятся в зоне действия радара. Развёртка радара определяется как дельта между начальным и конечным углами поворота. То есть если радар не поворачивается, то ничего не сканирует. А чем быстрее вращается (с учётом поворота корпуса и орудия), тем больше развёртка. В любом случае — радар должен вращаться постоянно.
Игра тоже пошаговая. На каждом шаге программа получает с сервера информацию — и отправляет на него очередные инструкции по действиям бота на арене.
Вот некоторые правила игрового мира:
- Ущерб от попадания вычисляется по формуле 4F, где F — огневая мощь танка от 0,1 до 3, которая соответствует его текущей энергии. В свою очередь, энергия повышается от попаданий в другие танки на уровень 3F.
- Нагрев ствола вычисляется по формуле (1+F)/5.
- Скорость выпущенного снаряда равна 20−3F.
В самой простой версии танк ездит по случайному азимуту, сканирует окружающее пространство и стреляет во всё подряд. Попасть в соперника не такая простая задача, ведь тот наверняка выстрелит в ответ и изменит свою траекторию при обнаружении постороннего танка.
▍ Современные боевые игры
В последние годы появилась куча новых красивых игр. Многие из них такого же типа: написать программу для управления ботом — и запустить на арену, где она сражается с такими же программами. У них более красивая графика и поддерживается обучение всем основным языкам программирования, а не только Java, как в Robocode.
Вот некоторые такие игры:
- Halite
- Yare
- Battlesnake
- Coding Games (на КДПВ)
- Screeps
- Swarm
- Lia
▍ Обучение regex
Пример ещё одной необычной игры для программистов — Regex Adventure на изучение семантики регулярных выражений, но это платная игра (есть бесплатное демо).
Здесь игрок ходит и собирает буквы, из которых может кастовать заклинания, совпадающие с именем врага. Например, три точки совпадают с любым трёхбуквенным именем — и т. д.
▍ Factorio
Ну и, конечно — нельзя не упомянуть Factorio (и мод Space Exploration), которую заслуженно любят инженеры и люди технического склада ума.
Иногда её даже используют на собеседованиях для проверки кандидатов. Сторонники такого подхода считают, что прохождение всего цикла Factorio — практически идеальный показатель, насколько хорошо человек решает общие технические проблемы.
Логистическая сеть
В самом деле, стандартные собесы не раскрывают способности кандидата, а иногда и вовсе создают искажённую картину о нём. Так что Factorio вполне рабочая альтернатива. Тут не схалтуришь и не притворишься. Вдобавок, кроме технического мышления, интеллекта и сообразительности, совместная игра в Factorio проверяет и софт-скилы: «как человек работает в команде с коллегами?». Причём не с какими-то абстрактными коллегами, а с конкретными людьми, с которыми ему предстоит работать плечом к плечу в реальности несколько ближайших лет:
Отладка — самая очевидная параллель между Factorio и реальной разработкой ПО. Способность быстро выяснить реальную проблему — это критический навык, и процесс мышления почти идентичен отслеживанию причины сбоя в реальной программе.… Бывали случаи, когда весь завод останавливался, потому что вы начали исследовать что-то, не требующее жёлтой науки. В результате вы перестали использовать каркасы дронов, которым перестали поставляться электрические двигатели, где использовалась смазочная жидкость, для производства которой забирался мазут. В итоге стопорилась выходящая труба мазута на нефтеперерабатывающем заводе, из-за чего у вас заканчивался попутный нефтяной газ, что останавливало производство пластмассы. Как результат, прекращался выпуск сигнального красного провода — и вся фабрика выходила из строя… Если хорошему программисту дадут сломавшийся нефтеперерабатывающий завод, он обычно сможет проследить проблему до источника, понять, что произошло, и быстро попытаться найти решение. С другой стороны, если человек просто плюхает на землю пару новых резервуаров без веской причины (он абсолютно уверен, что смазочная жидкость будет нужна всегда), то это большой красный флаг на методы решения проблем в его программах.
Из статьи «Совместная игра в Factorio — лучшее собеседование для программистов, что мы проводили»
Говорят, что для прокачки коммуникации полезны любые коллективные игры, а не только специфически технические, но это уже отдельная тема.
В целом, навыки логического мышления оттачиваются во многих стратегических, тактических, пошаговых, логических играх. Вообще, сложно назвать хоть одну бесполезную игру. Все они полезны. Любые видеоигры прокачивают стрессоустойчивость, скорость принятия решений, рабочую (оперативную) память или что-то ещё. Это очень полезные скилы для будущего программиста.
Поиграв во всё перечисленное, невольно думаешь: вот бы в школе и универе давали видеоигры. Например, прошли дифференциальные уравнения — прыгаем с самолёта по таймеру на раскрытие парашюта (сопротивление воздуха пропорционально квадрату скорости) со случайным ветром, высотой и гравитацией. Смысл в том, чтобы парашют раскрылся как можно ближе к земле — и за время полёта нужно рассчитать точное значение таймера. Для разных задач можно придумать какие-нибудь другие игры, это же всегда интересно.