Несколько десятилетий в мире наблюдается хроническая нехватка программистов при постоянном растущем спросе на них. Есть мнение, что программирование — специфическое занятие, доступное ограниченному количеству людей. В мире не так много людей с высоким 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.

Вот некоторые такие игры:

  1. Halite
  2. Yare
  3. Battlesnake
  4. Coding Games (на КДПВ)
  5. Screeps
  6. Swarm
  7. Lia

▍ Обучение regex


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

Здесь игрок ходит и собирает буквы, из которых может кастовать заклинания, совпадающие с именем врага. Например, три точки совпадают с любым трёхбуквенным именем — и т. д.



▍ Factorio


Ну и, конечно — нельзя не упомянуть Factorio (и мод Space Exploration), которую заслуженно любят инженеры и люди технического склада ума.

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


Логистическая сеть

В самом деле, стандартные собесы не раскрывают способности кандидата, а иногда и вовсе создают искажённую картину о нём. Так что Factorio вполне рабочая альтернатива. Тут не схалтуришь и не притворишься. Вдобавок, кроме технического мышления, интеллекта и сообразительности, совместная игра в Factorio проверяет и софт-скилы: «как человек работает в команде с коллегами?». Причём не с какими-то абстрактными коллегами, а с конкретными людьми, с которыми ему предстоит работать плечом к плечу в реальности несколько ближайших лет:

Отладка — самая очевидная параллель между Factorio и реальной разработкой ПО. Способность быстро выяснить реальную проблему — это критический навык, и процесс мышления почти идентичен отслеживанию причины сбоя в реальной программе.

… Бывали случаи, когда весь завод останавливался, потому что вы начали исследовать что-то, не требующее жёлтой науки. В результате вы перестали использовать каркасы дронов, которым перестали поставляться электрические двигатели, где использовалась смазочная жидкость, для производства которой забирался мазут. В итоге стопорилась выходящая труба мазута на нефтеперерабатывающем заводе, из-за чего у вас заканчивался попутный нефтяной газ, что останавливало производство пластмассы. Как результат, прекращался выпуск сигнального красного провода — и вся фабрика выходила из строя… Если хорошему программисту дадут сломавшийся нефтеперерабатывающий завод, он обычно сможет проследить проблему до источника, понять, что произошло, и быстро попытаться найти решение. С другой стороны, если человек просто плюхает на землю пару новых резервуаров без веской причины (он абсолютно уверен, что смазочная жидкость будет нужна всегда), то это большой красный флаг на методы решения проблем в его программах.

Из статьи «Совместная игра в Factorio — лучшее собеседование для программистов, что мы проводили»

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

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



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

Комментарии (20)


  1. SergeySavkin
    25.07.2022 13:48
    +8

    Забыли упомянуть игру COLOBOT из моего детства. Цель игры - подготовка планет для колонизации с помощью ботов.


    1. constXife
      25.07.2022 21:12
      +9

      Да! Я даже вдохновился игрой и начал делать свою версию на Unreal Engine и с возможностью программирования роботов на любом языке. Пока что сделал маленькое технодемо. Как будет что показать, может напишу статью на хабре.


      1. SergeySavkin
        25.07.2022 22:24

        Буду ждать с нетерпением


      1. DungeonLords
        26.07.2022 17:12

        Не поверите, но Colobot учит еще и такому направлению как

        Системы сборки исходного кода.

        Пользуясь случаем приглашаю всех развивать Colobot


  1. Gremlinquisitor
    25.07.2022 14:28

    Ещё вопрос по опросу ниже: что считается первым кодом?

    Всякая примитивная всячина, которую гоняют в школе для младших классов? У нас вот в роли такого была игрушка, где управляли погрузчиком. Название уже не вспомню. Ну и какие-то развлекухи с более внятным кодом.

    Если же что-то осмысленнее, то другое дело)


    1. LordDarklight
      25.07.2022 14:55
      +2

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

      Вот так я в детстве ещё на ZX Spectrum на встроенном Бейсике писал микропрограммы по рисованию геометрии, и различных картинок, и даже игру в змейку - там всё было встроено - команды простые и результат сразу отображался - это вам не OpenGL проект подымать!

      В школе уроки по программированию начались чуть позже - на каких-то советских ЭВМ - тоже началось всё с алгоритмического рисования статической графики при помощи русскоязычных команд(Scratch то ещё не было). Ну а в средней школе уже началось более серьёзное программирование на Turbo Pascal.

      Вообще тема приучения молодых людей к программированию очень правильная и очень нужная для любой страны в цифровом обществе - даже если приучать каждого 10 ребёнка в стране - только каждый 10-ый из них потом свяжет свою жизнь с различными условно профессиональными программами и лишь каждый десятый из них будет профессионально программировать - это будет уже очень хорошо - каждый 1000-ый станет программистом! А каждый 1000-ый программист станет гением! Сейчас их большой дефицит (не гениев, а просто профессиональных программистов) - и любая развитая страна очень сильно в них нуждается - а лет через 50 будет нуждаться ещё сильнее - возможно через пару сотен лет потребность уже пойдёт на спад - когда бОльшую часть программного кода будут создавать уже AI системы - но, думаю, ближайшие 100-200 лет программисты-люди ещё будут сильно востребованы - даже через 1000 лет на них ожидается будет ещё некоторый спрос (и я думаю спрос будет больше, чем предложение).

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


    1. me21
      25.07.2022 15:04

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


      1. LordDarklight
        26.07.2022 13:51

        В первом классе читать описания и писать программы - это очень круто! Родители молодцы! А так того глядишь в следующем веке у нас все малые детки будут учиться писать программы раньше, чем писать прозу на родном языке.... под диктовку :-D а там того глядишь писать программы будут раньше, чем говорить - так и будут общаться - через программируемые синтезаторы речи :-))))))))))


        1. DungeonLords
          26.07.2022 17:16

          Даёшь республику носителей языка Си!


          1. LordDarklight
            27.07.2022 09:39

            С синтетическим населением!


    1. DrGluck07
      27.07.2022 10:42

      Сокобан на Правец-8Д считается? А то мы в 12 лет такое писали, правда на Бейсике. А потом, конечно, и Спекки был, писали демо, начали делать свой движок для Диззи, с несколькими слоями для размещения объектов и прочими плюшками, но потом бросили, конечно. Ибо написать демо легко, а написать что нужно сделать для написания игр мы ещё не понимали.


  1. bilayan
    25.07.2022 14:48

    codecombat забыли что то. На бесплатной версии вроде можно достаточно далеко пройти (недоступны отдельные части)


  1. TimsTims
    25.07.2022 15:44

    Игра из первого скриншота: https://www.codingame.com/ide/puzzle/onboarding


  1. Kellis
    25.07.2022 20:47
    +5

  1. Megadeth77
    25.07.2022 21:12
    +1

    А ктоньть за секретч может сказать? Как к нему подступиться? Программер с овер дофига стажем ассемблер си питон, как ни открою - мозг взрывается и дальше дело не идет.


    1. Admz
      26.07.2022 14:17

      Всё не так уж сложно. Включите мозг новичка, ребёнка и подступайтесь.

      Всё довольно просто сделано, блоками. На самом сайте достаточно много учебного материала. Более того, даже опытным прогерам помогает преодолеть некоторые сложности так как всё сделано визуально, красочно, логично ровно.


  1. Goerging
    26.07.2022 04:24
    +2

    Есть еще опенсурсная mindustry, хороший и более простой аналог factorio


  1. bbs12
    26.07.2022 06:45
    +5

    Есть мнение, что программирование — специфическое занятие, доступное ограниченному количеству людей.

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


  1. iboltaev
    26.07.2022 12:56
    +4

    Иногда её даже используют на собеседованиях для проверки кандидатов.

    да блин, теперь еще и Factorio прокачивать что ли?


  1. AdVv
    27.07.2022 17:33

    Хочется порекомендовать https://tomorrowcorporation.com/humanresourcemachine и ее продолжение https://tomorrowcorporation.com/7billionhumans