Недавно попалась интереснейшая английская статья, написанная Трейси Гарднер из TechAgeKids. В ней она делится интересными мыслями по поводу программирования детьми в текстовых и визуальных языках. Она приводит интересные наблюдения, которые совпадают с моим опытом развития детей в программировании. Представляю вам перевод данной статьи. Говорят, что дети должны начинать с визуальных языков программирования, таких как Скретч (Scratch), а затем переходить к текстовым, например Python или JavaScript. Я считаю, что это просто смешно, особенно если учитывать, что большую часть карьеры я работал над созданием визуальных языков, позволяющих сделать разработку программного обеспечения более доступной для тех взрослых, которые обладают предметными знаниями, но не опытом программирования. Я также потратил много времени на разработку программного обеспечения с использованием визуальных языков (зачастую включающих текстовые фрагменты). В этой статье рассказаны все подробности. Сразу подведу итог для родителей, которые интересуются, нужно ли их ребенку переходить к языкам на основе текста: Прежде всего, давайте взглянем на то, зачем мы учим детей программированию. Некоторые дети станут программистами в будущем. Другие займут рабочие места, на которых наряду с другими знаниями требуются элементарные навыки программирования. Остальных нужно обучить программированию просто для того, чтобы они лучше понимали мир, в котором живут, были в состоянии контролировать его. При обучении детей младшего возраста моя цель состоит не в том, чтобы дать им профессиональные навыки. Я пытаюсь научить их двум основным вещам: Когда вы обучаете подростков, заинтересованных в программировании, робототехнике и т.п., во главу ставится обучение соответствующим навыкам. Вы можете использовать тот же подход для обучения способных детей младшего возраста, особенно когда у тех есть родители, готовые помочь детям использовать известные им самим языки программирования, но намного меньше родителей, мотивированных помогать с детскими языками программирования. Легче дать определение текстовым языкам программирования. Эти языки, введенные с клавиатуры и хранящиеся в виде текстовых файлов. Графический или визуальный язык, как правило, использует функцию перетаскивания, а не ввода. Он может содержать значки или текстовые метки на блоках и элементах. Часто используются такие GUI элементы, как диалоги и выпадающие меню выбора. Популярные детские языки – это Блокли (Blockly) и блокли-подобные. Как правило, когда люди говорят о текстовых языках, они ссылаются на такие языки программирования, как Python, Lua и JavaScript, которые являются «реальными» языками программирования и используются профессиональными разработчиками программного обеспечения. Интересно, что есть и детские текстовые языки программирования, например, Лого (Logo) и Снифф (Sniff) (не блокли-подобные, а именно текстовые), которые можно рассматривать в качестве ступеньки между визуальными и текстовыми языками. Одна из важных особенностей визуальных языков – то, что дети не должны помнить список команд или сложный синтаксис, который их окружает. Это слишком большое количество данных для детей, изучающих новый язык программирования. Множество профессиональных разработчиков программного обеспечения тратят десятки часов еженедельно, программируя на одном языке. Это означает, что взрослые могут запомнить многое о синтаксисе и API и, когда знания понадобятся, они мгновенно доступны. Дети, как правило, находятся в других обстоятельствах. Многие дети будут писать код только во время еженедельного 45-минутного урока, так что они никогда не смогут достичь мастерства и будут вынуждены постоянно повторять команды. Мой младший сын любит использовать электронные компоненты SAM Labs и изобретать оригинальные штуковины.  Между рабочими сессиями в SAM Labs может пройти несколько недель, но он по-прежнему сможет мгновенно вспомнить, как соединить блоки в визуальном редакторе. Я уверен: если бы для достижения того же результата он использовал текстовый язык, было бы значительно сложнее найти, на чем он остановился. На самом деле, для решения более сложных задач SAM Labs действительно использует текстовое программирование, и, когда я помогаю сыну, за период между сессиями сам успеваю забыть нюансы языка. (Чем быстрее SAM Labs смогут реализовать большинство возможностей в визуальном слое, тем лучше). Конечно, удобная среда программирования может облегчить обучение и запоминание синтаксиса текстовых языков. Хорошая IDE (интегрированная среда разработки) с этим сильно помогает. Но универсальность типичного языка программирования затрудняет предоставление языка в той же доступной форме, которая есть в Scratch или блокли-подобных языках. Ошибки в синтаксисе – огромная проблема детей и взрослых. Кто хочет тратить дни, считая скобки, исправляя опечатки или выискивая пропущенное двоеточие, которое точно должно где-то быть? Да, хорошие редакторы могут помочь вам обнаружить эти ошибки, но даже лучшие редакторы не позволяют сделать синтаксическую ошибку и не исправить ее. В Scratch вы работаете непосредственно с концепцией программирования вместо того, чтобы разбивать ее на отдельные фрагменты задач. (Это иногда разочаровывает, если, например, вы хотите поменять местами повторения в бесконечном цикле. Но это просто работа, сделать ее не сложно. – Вся сложность в том, чтобы упростить полученное решение.) Дети часто не имеют доступа к отличным инструментам, и в конечном итоге оказываются в ситуации, когда приходится бороться с синтаксическими ошибками. Я обнаружил, что CodeCombat – отличный способ познакомить детей с текстовым программированием и различными IDE, но эта платформа – не универсальная среда программирования. Существуют проекты, нацеленные на перенос преимущества визуального редактирования в текстовую среду программирования для детей (например, редактирование на основе фреймов). Некоторые визуальные языки полагаются на изобразительные символы или значки, например, LEGO Mindstorms в своем программном обеспечении использует обозначения на основе пиктограмм. Для маленьких детей, которые еще не умеют читать код, часто используют изображения. Если дети научились читать, то, чтобы достойно конкурировать с текстовыми метками, система на основе пиктограмм должна быть очень хорошо разработана. Если ребенку для понимания увиденного приходится в уме проделывать путь от изображения к слову, вы только создаете ему дополнительные сложности. Такие языки, как Scratch и Блокли, используют на перемещаемых визуальных элементах текстовые метки. Мой опыт показывает, что для умеющих читать детей это –лучший рабочий вариант. Профессиональные разработчики программного обеспечения часто предполагают, что такие языки, как Scratch являются «упрощенной дальше некуда» версией программирования. Но все не совсем так. Что реально делает Scratch, так это удаляет лишние детали, которые на самом деле лишь мешают детям быстро пройти путь от зарождения идеи до запуска кода. Вместо того, чтобы тратить дни и обнаруживать, что в конце строки пропущено двоеточие, дети могут провести больше времени в размышлениях о логике своего проекта. Они реально тратят больше времени на вычислительное мышление и меньше на то, чтобы осчастливить компьютер. Scratch может быть сложным настолько, насколько это необходимо. Вы можете рисовать в нем фрактальные деревья и решать сложные проблемы синхронизации. Я подробнее осветил эту тему в статье «Scratch – неправильный подход к компьютерному программированию, не так ли?» (Статья автора на английском). Одна из особенностей текстовых языков – то, что они по своей природе линейны. Текстовые языки не очень хорошо показывает связи между различными частями кода (хотя, конечно, эти связи там есть и должны быть пройдены парсером). Визуальные языки обычно поддерживают нелинейную структуру. Современное программирование, особенно разработка игр, аппаратное обеспечение и Интернет вещей, зачастую работают на основе событий и выполняются одновременно. Код – это не книга, он не выполняется последовательно от начала до конца. В Scratch я могу организовать код, чтобы переместить спрайт следующим образом: Это ведет непосредственно к фактическому движению спрайта. В текстовом языке понадобилось бы поместить команды в произвольном порядке, и вы бы потеряли дополнительную информацию. Я изучил Sonic Pi, текстовый язык для создания музыки, и меня обескуражила сложность создания линейного кода, который должен работать одновременно. В Scratch есть функция для создания макета кода в 2D-пространстве, так что, если вы пишете музыку для нескольких, звучащих одновременно, инструментов, вы можете просто выложить участки кода по горизонтали или разместить их в различных спрайтах, которые будут выполняются одновременно автоматически. Для Scratch параллелизм – это естественная концепция. Однако, Scratch по-прежнему в основном линейный. Может быть трудно понять модели поведения, которые зависят от одного передающего сообщение спрайта, и нескольких других, которые его получают. Воркшоп Wonder использовал другой подход к языку Wonder для роботов Dash&Dot. В нем используется многопоточность. Потоки обычно применяют для описания бизнес-процессов точным (и иногда исполняемым) способом. Блоки состояния часто используются в системах управления. Это полезное средство для описания поведения систем, которые ведут себя по-разному в зависимости от текущего состояния. Очень интересен подход к программирование в Minecraft, там используют смесь текстовых команд и визуальных блоков в 3D-пространстве. Код фактически является частью мира, а ведь для многих детей Minecraft столь же реален, как и настоящий мир вокруг. (Подумайте об Интернете вещей и даже большем!) (Я еще даже не затрагивал обучение детей искусственному интеллекту и основам машинного обучения, которые требуют различных стилей языка. Поговорим об этом подробнее в будущем.) Взрослые, которые мало времени проводят с детьми, учащимися программировать на визуальных языках, часто предполагают, что программирование на визуальном языке происходит медленно. Медлительность ощущает взрослый человек, который сравнивает скорость разработки кода в визуальной среде с его скоростью набора кода в текстовой среде. Но лишь немногие дети умеют печатать быстро, поэтому смотреть на их попытки писать текстовый код действительно тяжело. (Да, они должны научиться печатать, но это тема другой беседы.) Они также делают много опечаток: орфовизуальных ошибок, лишних пробелов. Кроме того, большая часть времени, затраченного на программирование – это время размышлений. Мысли о том, чего вы хотите добиться от приложения и какой код для этого использовать, занимают больше часов, чем сама процедура ввода команд. Для многих современных детей первым опытом работы за компьютером становится телефон или планшет с сенсорным экраном. Визуальные языки очень легко переводить на сенсорный интерфейс. Большинство маленьких детей гораздо быстрее работают с интерфейсом перетаскивания на планшете, а не при помощи клавиатуры и мыши или трекпада. И у большинства подростков телефон все время находится под рукой. Существует множество приложений типа Scratch Junior или Pocket Code, которые эффективно используют сенсорный интерфейс, чтобы позволить «поколению смартфонов и планшетов» писать код. Microsoft создал сенсорный язык разработки, ориентированный на телефоны и планшеты. Это текстовый язык, но фактически в нем снижена доля набора благодаря использованию нажатий. Эта идея, безусловно, заслуживает изучения. Apple запускают приложение Swift Playground, которое будет учить детей писать на языке Swift, используя все возможности мультитача на IPad. Дети часто создают визуальные приложения и игры. Визуальные языки зачастую имеют очень тесную связь между конечным результатом и используемым для его достижения языком. Например, в Scratch вы можете нажать на спрайт, чтобы изменить свой код. Это прямое соединение снижает познавательную перегрузку при разработке визуального приложения. В Minecraft код действительно встроен в окружающую среду. Управление потоком достигается с помощью игровой пыли Redstone. Большинство детей предпочитают визуальную среду, ведь она приносит им больше удовольствия. Работа в ней ощущается как менее тяжелая. Среда на основе текста может показаться детям довольно сухой. Такие компании, как Tech Rocket, пытаются сделать текстовое программирование интереснее – достаточно посмотреть на их бесплатный учебник Python. Ребенка, который хорош в создании игр на Scratch, может очень разочаровать переход к среде, где создавать подобные игры намного сложнее. Не «по-взрослому» делать больше работы, чем это необходимо. Иногда приходится затруднять процесс, идя на компромисс ради большей гибкости. Но я считаю, что в других случаях профессиональным языкам разработки ПО и IDE есть чему поучиться у Scratch и подобных языков. Существует тенденция предлагать детям инструменты, которые позволяют создать из блоков и текстовых команд один и то же код. При этом именно текстовый код считается «реальным» языком программирования. Например, это предлагается в Code.org и CodeKingdoms and the Microsoft micro:bit (редакторе битовых блоков). Мой 9-летний сын в настоящее время учится программировать моды Minecraft при помощи Java и блочного редактора из Code Kingdoms. Достаточно хороший подход, ведь сын может частично применять знания текстовых языков в визуальной среде. Язык программирования Ready позволяет детям и подросткам писать игры в среде, которая работает поверх игрового движка Unity. Это интересный подход, который позволит устранить одну из основных претензий к таким языкам, как Scratch – в конечном счете вы можете создать приложение, которое можно запустить вне Scratch или представить на App Store. Визуальные языки могут быть эффективнее текстовых, если используются для решения разовых задач или непрограммистами, которые обладают предметными знаниями. Программирование все больше входит в повседневную жизнь. IFTTT (если это, тогда то) – очень популярный сервис, который позволяет людям автоматизировать свою жизнь. Он использует визуальный редактор для создания правил. Вам не придется изучать сложный синтаксис для использования IFTTT, вы просто используете собственный редактор. Является ли это на самом деле программированием? Ну, подход предполагает, что вам придется писать код, чтобы сделать все по-другому. Он – то, что нужно, чтобы больше людей могли запрограммировать свою жизнь без необходимости изучать сложный язык. Игровые движки часто на нижних уровнях детализации сочетают визуальные редакторы с текстовым кодом. Создатели программного обеспечения всегда ищут способы, позволяющие включить в программные решения менее технически сфокусированных бизнес-пользователей. Эти пользователи обычно понимают (и определяют) бизнес-процессы в организации: определяют детали работы банковского счета или расчета скидок. Они должны быть в состоянии точно указать нужное поведение, чтобы компьютер может выполнить код, но они не хотят беспокоиться о таких вещах, как ошибки синтаксиса импорта библиотек и превращение типов integer в string, так что вы можете добавить их в рассылку. Также существует практика предлагать взрослым неспециалистам использовать визуальные языки, позволяющие им быстро приступить к работе. Например, эта статья содержит много примеров визуального программирования в Интернете вещей. Для многих людей программирование является средством для достижения цели, а не самоцелью! Если среда на основе блоков делает программирование доступным большему числу людей, это просто фантастика. Возможно, многие дети, которые учатся программировать сегодня, позже будут в своей работе и хобби использовать визуальные, а не текстовые языки. Некоторые дети с самого раннего возраста искренне любят текстовое программирование. Безусловно, не стоит останавливать их, наоборот, есть все основания для поощрения. Многие маленькие дети способны писать HTML&CSS и изучать Python, JavaScript или Lua. И для некоторых соблазн написать моды Minecraft приведет к изучению Java. Сегодня вышеперечисленные языки – лучшие инструменты для решения различных задач. А некоторые дети просто хотят научиться программировать, чтобы поднять академическую успеваемость. Все это – важные аспекты. Я сам был одним из таких детей! (Только в мои дни были языки Spectrum Basic и C на Amiga.) Но это не значит, что все маленькие дети обязаны выучить текстовый язык или что текстовые языки «лучше». Текстовое программирование – не приоритет в обучении дошкольников и детей младшего школьного возраста. Программирование в Scratch и других визуальных языках может не только послужить ступенькой для дальнейшего изучения Python и Java. Изучение Scratch полезно само по себе, и некоторые дети продолжат использовать визуальную среду, но уже «взрослую». Цель обучения – дать детям навыки создания цифровых проектов и профессиональные знания, которые можно применить независимо от языка программирования. Конечно, некоторые дети станут разработчиками программного обеспечения и должны будут изучать языки, которые используются в коммерческой разработке. Но они должны будут выучить текстовый язык потому, что это подходящий инструмент для разработки их проекта; потому, что они заинтересованы и/или это принесет пользу их профессиональному мастерству. И переходить к этим языкам нужно, когда они достаточно улучшат навыки печати. До тех пор больше пользы принесут визуальные языки программирования. Я предпочел бы научить ребенка программировать в Scratch, чтобы он мог с энтузиазмом создавать фантастические проекты, а не заставлять того же ребенка бороться с синтаксисом в текстовом редакторе. Ведь так он больше узнает о вычислительном мышлении и будет иметь лучшее представление о мире технологий вокруг. Дополнительная информация для родителей. Мне известно про зимний городской лагерь в котором дети будут программировать на Scratch и создавать свои проекты для решения реального кейса. Он проходит в центре Москвы 4-6 января 2017. Если это будет вам интересно и полезно, пожалуйста, смотрите подробности здесь.  Руководитель программ ИТ проектов