Теория и практика: могут ли игры научить программированию

Три проекта, которые могут помочь на пути к профессии.

Автор портала Rock, Paper, Shotgun Мэтт Сэйер (Matt Sayer) написал статью, в которой рассмотрел три игры из библиотеки Steam, использующие основные концепции программирования в игровом процессе. Сэйер проверил, могут ли игры научить программированию и как они это делают.

DTF публикует перевод материала.

Теория и практика: могут ли игры научить программированию

if(желание_программировать > 10)

continue;

else

return;

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

Но насколько хорошо эти игры могут обучить? Можно ли стать программистом, поиграв в них? Я нашёл в Steam трёх многообещающих кандидатов. Давайте рассмотрим их и узнаем, можно ли с их помощью получить навыки для работы программистом.

Теория и практика: могут ли игры научить программированию

Очевидно, что немногие игры могут научить писать код в C#, но рассматриваемые в материале проекты переводят концепции программирования в визуальные метафоры и несложные головоломки. Мы рассмотрим каждую игру с точки зрения концепций программирования, которые она используют, и того, насколько хорошо у неё получается обучать игроков этим концепциям. Игры расположим в порядке возрастания сложности, чтобы они сформировали своеобразный путь к профессии.

Также необходимо заметить, что ни одна из этих игр не обещает научить игроков программированию, просто мы думаем, что они могли бы. Вперёд!

Human Resource Machine

Теория и практика: могут ли игры научить программированию

Сложность: Низкая — Средняя

Human Resource Machine посвящена обработке данных. Конвейерная лента с надписью «IN» поставляет клетки, обозначенные номерами и буквами, а ваша задача складывать правильные — согласно условиям уровня — на ленту с надписью «OUT». Чтобы этого добиться, надо создать список команд для рабочего — по сути, программу. Входящие клетки выбираются случайно, так что ваша программа должна учитывать все возможные комбинации букв и цифр. Это условие знакомо всем программистам.

HRM объясняет концепции очень доступно, давая время запомнить новую команду, прежде чем игра представит следующую. Ещё можно замедлить время, когда рабочий выполняет программу, чтобы пошагово изучить код и понять, почему что-то работает не так, как вы задумывали. Учитывая, сколько времени программисты тратят на отладку, умение «прочёсывать» программу построчно точно пригодится.

Но доступность — лишь один аспект из необходимых. Самый важный вопрос: может ли HRM научить программированию? Чтобы ответить на него, давайте рассмотрим концепции, представленные на уровнях игры, поближе.

Теория и практика: могут ли игры научить программированию

Концепция: Базисные переменные

Что это?

Работа с неизвестными данными, будь то конвейер со случайными цифрами и буквами или молниеносные нажатия кнопок на клавиатуре киберспортсмена, — это фундаментальный компонент практически каждой программы в мире. Раз программы не могут предсказывать будущее (по крайней мере пока), им необходимы ячейки для хранения и обращения к неизвестным данным во время работы. Для этого и нужны переменные. Переменная — это отдельно обозначенная ёмкость для данных, которую можно заполнять и использовать по мере надобности.

Как этому обучают?

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

Теория и практика: могут ли игры научить программированию

Концепция: Массивы

Что это?

Переменные используются для обращения к одному значению или объекту, а к массивам прибегают, когда надо сгруппировать похожие объекты. Вместо того, чтобы назначать каждому слоту в инвентаре свою переменную, можно создать один массив «инвентарь», в котором будут находиться все предметы игрока. Плюс такого подхода в том, что к этим предметам можно обратиться через объект «инвентарь», к примеру, инвентарь[0], инвентарь[1], инвентарь[2]… Так проще написать код, проверяющий все слоты инвентаря, к тому же, массивы обрабатываются гораздо быстрее, чем отдельные переменные.

Как этому обучают?

HRM не церемонится со своей механикой массивов. Вместо обращения к клеткам пола напрямую через их названия, можно использовать значение внутри одной клетки в качестве обозначения другой. Например, клетка «0» может содержать номер 7. Если использовать на ней стандартную команду copyfrom «0», то получишь 7. А если ввести copyfrom [0], программа прочитает 7 как название другой клетки, и вернёт значение из клетки 7. Не страшно, если звучит сложно. Чтобы понять, как работают массивы, достаточно увидеть их в действии. Несколько продуманных задачек в HRM как раз позволяют запомнить эту концепцию.

Теория и практика: могут ли игры научить программированию

Концепция: Условные выражения (или операторы IF…THEN)

Что это?

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

Как этому обучают?

HRM предлагает два типа условных выражений: «переход, если ноль» и «переход, если отрицательное». Эти команды проверяют значение, находящееся в руках у рабочего, и «прыгают» в другую часть программы, если условие верное. Если рабочий держит -5, то команда «переход, если отрицательное» сработает и проследует за стрелкой перехода в часть программы, в которую вы её направили. Если ваш рабочий держит 1, то программа продолжит выполнение как обычно. Звучит просто, но на поздних уровнях требуется сразу несколько команд перехода одновременно, и в их пересекающихся стрелках легко запутаться.

Теория и практика: могут ли игры научить программированию

Концепция: Циклы

Что это?

Повторение — жизненно важная часть программирования. Мы пишем программы, чтобы они выполняли задания, на которые у нас нет времени, и для этого используем циклы. Циклы заставляют патрульных NPC повторять один и тот же маршрут. Циклы наносят урон горящим врагам каждую секунду горения. Циклы повышают скорость машины при разгоне. Прописывать каждый проход цикла вручную было бы ужасно неэффективно, а неэффективность в программировании — это грех.

Как этому обучают?

HRM совмещает вышеупомянутые условные выражения с командой перехода для создания циклов. Игра обучает двум типам циклов: for и while. Циклы for совершают набор команд определённое число раз. В игре они представлены клеткой-счётчиком, значение которой уменьшается до тех пор, пока не соответствует проверке «переход, если ноль». Циклы while работают похоже, но они выполняются не определённое количество раз, а пока какое-то условие не выполнится. По мере усложнения задач приходится использовать оба типа циклов вкупе с массивами, чтобы обрабатывать потоки данных неизвестной длины. Это ещё одна важная часть программирования, и HRM обучает ей постепенно, позволяя запомнить все составляющие.

Теория и практика: могут ли игры научить программированию

Вердикт

Human Resource Machine использует знакомые каждому концепции конвейерных лент и клеток и использует совсем небольшой список команд. Эти команды обозначены разными цветами, а переходы — стрелками, и это упрощает наблюдение за ходом выполнения программы. В игре есть команды типа copyfrom и bump, у которых нет полных эквивалентов в современных языках программирования, но пониманию основных концепций это не мешает. После прохождения HRM вы будете готовы учиться настоящему программированию.

Hack ‘n’ Slash

Теория и практика: могут ли игры научить программированию

Сложность: Средняя — Высокая

Если вам захочется подготовиться ещё немного перед погружением в мир программирования, то вам понадобится Hack ‘n’ Slash. На первый взгляд это типичная игра в стиле Legend of Zelda, но только здесь вы «взламываете» врагов своим мечом-флэшкой и перестраиваете их поведение. Почти все объекты в игре можно перепрограммировать, можно даже заставить игру закрыться, переписав слишком много кода. Это одновременно и плюс игры, и недостаток. С одной стороны, для решения каждой задачки есть огромное количество вариантов, но с другой — когда не понимаешь, почему твоё решение не работает, испытываешь сильную фрустрацию. Хотя, честно говоря, в программировании всё точно так же.

Главная проблема Hack ‘n’ Slash — что это, по сути, две игры. Одна — головоломка в стиле Zelda, которая глубоко исследует концепции программирования, а другая — настоящая программа отладки, закидывающая игрока в сырой код без каких-либо объяснений. Из-за этого скачка сложности играть в Hack ‘n’ Slash бывает нелегко, но если вам удастся через него пройти, вы сможете узнать много полезного.

Теория и практика: могут ли игры научить программированию

Концепция: Усложнённые переменные

Что это?

Как мы уже сказали, переменные — это способ хранения и обращения к данным в программе. В Hack ‘n’ Slash они используются для хранения более продвинутых типов информации, чем в Human Resource Machine, и их воздействие на поведение программы более очевидное.

Как этому обучают?

Hack ‘n’ Slash расширяет понятие переменных, представляя то, что мы называем типизированными переменными. Эти переменные могут хранить только определённый тип значений: например, только числа или только значения «true» или «false». Когда вы взламываете врага, появляется список переменных, которые вы можете изменить. Но их значения можно менять только в рамках их типов: в числовой переменной нельзя хранить буквы, а число нельзя сделать больше определённого предела. Благодаря этим негласным правилам можно постепенно познать разницу между булевскими, целочисленными и строковыми переменными, даже если вы не знаете их названий.

Самое главное в изучении переменных через Hack ‘n’ Slash то, что эффект от изменений виден сразу. Выбор значения для переменной — полезное умственное упражнение для любого программиста, особенно во время тестирований и отладок. Программа должна уметь работать с любой вводимой информацией, в том числе и отбрасывать данные, которые могут привести к неадекватным результатам. Осознание того, насколько легко «сломать» врагов в Hack ‘n’ Slash, сменив наносимый урон на -1, — красноречивая демонстрация важности тестирования.

Теория и практика: могут ли игры научить программированию

Концепция: Синтаксис

Что это?

Как и в языках, на которых мы общаемся, в языках программирования есть правила расположения слов в предложениях. Это называется синтаксис. Хотя он может быть уникальным для каждого языка, большая часть современных языков программирования следует стандартам, учреждённым C около 40 лет назад.

Как этому обучают?

Эта концепция появляется в Hack ‘n’ Slash во второй половине игры, когда развлечения с переменными сменяются голым кодом. Внутриигровой код, основанный на языке Lua, не так уж строг с точки зрения синтаксиса. Скорее всего это сделано, чтобы новичкам было легче его понимать. Правда, выдуманная терминология заменяет одну путаницу другой, ограничивая свою применимость в реальном мире. Но самые распространённые элементы синтаксиса всё равно присутствуют, что позволяет познакомиться с общей структурой современного кода.

Эти элементы включают точечный синтаксис, используемый в ссылках типа Port.Value (которая обращается к переменной Value в объекте Port) и структуру выражений if...then. Чтобы помочь игроку расшифровать эти правила синтаксиса, Hack ‘n’ Slash показывает ему визуализированную версию кода. В ней переменные представлены в виде разноцветных кристаллов, которые помещаются в механизмы, выполняющие определённые действия. Цветные линии между механизмами показывают ход выполнения программы, хотя машины стоят так близко друг к другу, что за порядком операций часто сложно уследить.

Теория и практика: могут ли игры научить программированию

Концепция: Функции

Что это?

У программистов есть поговорка, что 90% времени выполнения программы занимает обработка 10% кода. Иными словами, программы тратят очень много времени на повторение одних и тех же операций. Поэтому для удобства мы разделяем часто используемые фрагменты кода на отдельные функции, и каждый раз, когда нам надо, чтобы программа выполнила эти команды, мы просто вызываем функцию с помощью строчки типа funFunction(). Это позволяет нам не повторять один и тот же код много раз, и, что важнее, изменять только один фрагмент кода, если в этой функции надо что-то изменить.

Как этому обучают?

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

Теория и практика: могут ли игры научить программированию

Вердикт

Как игра Hack ‘n’ Slash очень спорная, но как способ обучения программированию она довольно полезна. Делая акцент на изменении переменных и представляя функции в виде физических механизмов, она обучает концепциям, необходимым всем начинающим программистам. Hack ‘n’ Slash хорошо даёт понять, какие системы и процессы лежат в основе всех современных языков программирования.

TIS-100

Теория и практика: могут ли игры научить программированию

Сложность: Высокая+

Первое, что вы слышите при запуске TIS-100, — звук включения старого кинескопного монитора. По первым секундам игры можно понять, понравится ли вам этот ассемблерный компилятор, маскирующийся под игру. Можете не сомневаться: TIS-100 подойдёт только самым увлечённым программистам. Если вы незнакомы с условными выражениями, циклами и так далее, вам будет нелегко. И даже если вы очень опытны, TIS-100 всё равно заставит попотеть.

Языки ассемблера — это вид языков программирования, который был распространён в 50-е и 60-е, пока в 70-е его не заменили языки более высокого уровня типа С. Инструкции ассемблера обычно основаны на коде, которым пользуется сам компьютер, поэтому они гораздо сложнее для понимания и использования, чем, например, Java и C#. Но, несмотря на идейную архаичность, TIS-100 использует несколько концепций, которые полезны и сейчас.

Теория и практика: могут ли игры научить программированию

Концепция: Коммуникация

Что это?

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

Как этому обучают?

Программы в TIS-100 разделены на узлы, каждый из которых может выполнить ограниченное количество команд. Чтобы пройти уровень, надо настроить коммуникацию между узлами. При этом каждый узел может общаться только с соседними, что ещё сильнее усложняет задачу. Чтобы найти решение, нужно воспринимать каждый узел как отдельную программу, занятую только своими операциями. Заставить их работать вместе означает разработать протокол взаимодействия, как делают сетевые программисты. Вы быстро поймёте, что уговорить несколько программ сотрудничать гораздо сложнее, чем кажется.

Теория и практика: могут ли игры научить программированию

Концепция: Стек

Что это?

Стек похож на массив — это тоже ячейка для хранения группы связанных данных. Но стек лучше подходит для среды с общими данными, в которых разным программам нужно обращаться к одной и той же информации без прямого взаимодействия друг с другом. Стек хранит информацию в вертикальном списке, организованном по протоколу Last In, First Out (LIFO): новый объект добавляется на вершину списка, оттуда же и удаляется при необходимости. Похоже на стопку тарелок: чистые тарелки берут сверху, туда же кладут и только что вымытые.

Как этому обучают?

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

Правда, дополнительная вместимость имеет свою цену. Нужно следить, чтобы не было взаимоблокировки: один узел ждёт, когда заполнится пустой стек, а узел, который должен это сделать, ждёт какого-то действия от первого узла. Ступор! Ещё существует проблема хранения нескольких наборов данных в одном стеке без путаницы между ними. Нелёгкий выбор между использованием стеков и работой с данными вручную — нечто, с чем программисты сталкиваются постоянно.

Теория и практика: могут ли игры научить программированию

Вердикт

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

Теория и практика: могут ли игры научить программированию

Выводы

Итак, можно ли научиться программированию через игры? Я бы сказал да, но с парой оговорок. Во-первых, проблемы в программировании редко бывают настолько же явными, как задачки в вышеупомянутых играх. Требования к проекту могут меняться несколько раз по мере разработки. Иногда вы даже можете не знать, возможно ли что-то, пока не сделаете — или не сдадитесь. Так что, пожалуй, не стоит включать Human Resource Machine в своё резюме. Во-вторых, одни лишь игры не сделают из вас Джона Кармака. Они могут обучить вас основам и способствовать развитию необходимого склада ума, но вам всё равно придётся прочитать несколько книг, прежде чем вы создадите следующий DOOM.

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

1010
8 комментариев

https://codecombat.com/
https://www.codingame.com
https://www.codewars.com/

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

4
Ответить

Ну и как продвигаются ваши дела? Стали программистом?

1
Ответить

А после TIS переходим к SHENZHEN I/O и Factorio
http://store.steampowered.com/app/504210/
http://store.steampowered.com/app/427520/

2
Ответить

Colobot еще был, не самая известная игрушка.

1
Ответить

я специально зарегался на этом сайте, чтобы написать про колобот, а тут ты...

1
Ответить

Еще как вариант подойдет создание модификаций к разным играм, например к Don't Starve. 70% любого мода к нему, это код, который должен написать создатель. И да, абсолютно не нужно знать какой-либо язык программирования для этого, несмотря на то, что игра на нем базируется.
Для таких людей, у которых появится желание сделать что-то классное в игре, уже заранее дана база, которую при желании можно найти на форуме игры или непосредственно в самом стимовском воркшопе. Причем всё, что указано в первых двух играх статьи, там присутствует. Отталкиваясь от данного опыта, проведенного в такой среде, можно полностью понять или предварительно изучить материал первого курса программирования (или как минимум первого семестра, зависит от языка и ВУЗа) в любом универе. Говорю как человек, который учится на данной специальности.
И, опять же, игра хоть и не предназначена конкретно для данных целей, это действительно хороший опыт для дальнейшего изучения языков программирования.

1
Ответить