Многим знаком Scratch – детская среда программирования, обучение в которой обычно сводится к созданию творческих проектов по принципу «от простого к сложному». При этом «классический подход» к изучению программирования (переменные > ветвления > циклы > функции > структуры > объекты > …) в Scratch затруднителен.
Однако изменение последовательности изучения понятий (назовем их концепциями) структурного, объектно- и событийно-ориентированного программирования, их сокрытие за яркими спрайтами и интерактивной анимацией, не означает, что на концепциях не следует делать акцент. Особенно, если целью ставится не столько развитие творческих способностей, сколько обучение программированию. Эту идею я постаралась отразить в своем курсе.
Первым, с чем сталкивается начинающий скретчер, являются спрайты. Хотя в Scratch как такового объектно-ориентированного программирования нет, спрайты можно считать объектами. На этом этапе обучающийся видит, что в программе может быть множество объектов, поведением которых управляют внешние для них скрипты. Спрайты получают команды или по требованию передают информацию о своем состоянии, то есть программирование сводится к управлению объектами.
Вторым, что в Scratch сразу сваливается на голову юного программиста, является понятие о многопоточности. Каждый спрайт может иметь по несколько скриптов, выполняемых одновременно. Несколько спрайтов также могут выполнять свои программы одновременно друг с другом. Причем оказывается сложнее организовать последовательное выполнение.
Уже на первом занятии мы не можем избежать знакомства с циклами. Иначе кот особо не разбежится. На этом этапе знакомство приходится оставлять интуитивным и поверхностным. Мы ограничиваем его циклами «повторять всегда» и «повторить … раз», которые более просты для понимания. Цикл с условием изучается в уроке, специально посвященном циклам. Этот урок предполагает знание логических выражений и переменных.
Поскольку Scratch событийно-ориентированная среда, блоки условного оператора удобнее изучить до переменных. Условием могут выступать те или иные события.
На мой взгляд, такая последовательность лучше, так как за каждый урок мы вводим минимум понятий. Причем не абстрактных, а сразу видим их практическую пользу.
Если же сначала изучать переменные, то их назначение и пользу сложно продемонстрировать, поскольку до этого не изучен условный оператор, ввод данных и генерация случайных чисел.
В Scratch, не считая списков, программист сталкивается с тремя типами данных: числами, строками и булевым типом. При этом тип привязан к значению, а не переменной. Преобразовывать строки в числа и обратно не требуется. Строки в кавычки не заключаются.
Блок, возвращающий логическое значение и имеющих характерную для него угловатую форму, можно вставлять в округлые поля. Обратное не верно: там где предполагается логическое выражение, нельзя вставить обычную переменную.
Scratch реализован так, чтобы в процессе выполнения не возникало критических ошибок. Видимо поэтому, если попытаться использовать строку в арифметической операции, она заменяется нулем (см. первый скрин).
Программист должен знать, что возможности языков программирования расширяются библиотеками. Работая в Scratch, ученик может подключать дополнения, которые приводят к появлению в среде новых команд.
Функции в Scratch реализованы в разделе «Другие блоки», где с одной стороны вы создаете собственный блок, который можно вставлять в другие скрипты. С другой стороны – должны собрать функциональность этого блока, то есть то, что он будет делать.
Возврата значении из скретч-функции нет.
Таким образом, изучение концепций программирования в событийно-ориентированной среде накладывает свой отпечаток. По сути мы сначала изучаем более сложные и абстрактные понятия и, лишь углубляясь в процесс, переходим к элементам структурного программирования. Плюс это или минус для первого знакомства – вопрос спорный.
Комментарии (9)
akryukov
15.03.2019 21:31Классно наверное на скретче с нуля программирование давать.
Взрослым он уже не серьезный, приходится на какой-нибудь джаве текст в консоль разными способами писать. Задания в итоге выглядят слегка оторванными от реальности.
Вот если бы было что-нибудь вроде скретча, но например с башенным краном или моделью станка вместо кота, было бы намного проще объяснять те же циклы.
Хотя в Scratch как такового объектно-ориентированного программирования нет, спрайты можно считать объектами.
Думаю тут лучше подойдёт термин "формальный исполнитель" вместо "объект".
Объекты из ООП это все таки уже про абстрактные типы данных: упаковка множества значений в одну переменную, скрытие состояния, операции над скрытым состоянием.
Формальный исполнитель имеет особенность по сравнению с объектами — он может "если касается края, оттолкнуться". То есть он может получать информацию о внешнем мире. В ООП обычно наоборот — объект знает только о себе, а мир — о себе. При этом объекту давать знания о мире нельзя — нарушит SRP. Придется заводить менеджер передвижения и отталкивания.
Причем оказывается сложнее организовать последовательное выполнение.
Эта мысль как то не развернута. Сложнее по сравнению с чем? В чем именно сложность?
Многопоточность сложная не сама по себе, а когда нужно организовать синхронизацию состояния. Тогда начинаются всякие мьютексы, семафоры и т.п.
Судя по вашей статье, вы синхронизацию организовываете до объяснения условий и переменных. В скретче какие то особые механизмы предусмотрены?
Условием могут выступать те или иные события.
На мой взгляд тут путаница в терминах. События это ведь что то такое, с чего начинается выполнение подпрограммы. В вашем примере в условии было "мышь нажата". Это не столько событие, сколько состояние внешнего мира.
plustilino Автор
15.03.2019 22:56Вот если бы было что-нибудь вроде скретча, но например с башенным краном или моделью станка вместо кота, было бы намного проще объяснять те же циклы.
App Inventor ( ru.wikipedia.org/wiki/App_Inventor ) хотя тоже позиционируется как продукт для подростков, но насколько знаю там некоторые взрослые реальные приложения под андроид запиливают.
Многопоточность сложная не сама по себе, а когда нужно организовать синхронизацию состояния. Тогда начинаются всякие мьютексы, семафоры и т.п.
Судя по вашей статье, вы синхронизацию организовываете до объяснения условий и переменных. В скретче какие то особые механизмы предусмотрены?
Согласна, что просто понятие многопоточности не сложное. В скретч она как бы по умолчанию, как данность. Возможно по внутренней реализации к настоящей многопоточности отношения не имеет. Но обратить на нее внимание ученика следует, так как в реальном программировании — это важная тема. А в Scratch он сразу видит, что два скрипта выполняются одновременно.
В вашем примере в условии было «мышь нажата». Это не столько событие, сколько состояние внешнего мира.
Формально «мышь нажата» — логическое выражение. Либо правда, либо ложь. Неформально — вопрос: «Мышь нажата?».
nomadmoon
16.03.2019 02:29Для взрослых пытались делать Visual Age for Java
Заголовок спойлераFForth
16.03.2019 10:27LabView используется в промышленности, не говоря о графических языках для ПЛК.
Из развиваемых сообществами HiAsm и FlProg но это не совсем классическое понимание программирования.
Для контроллеров AVR кто то ещё использует Algorithm Builder Здесь форумная тема его применения — это уже улучшенный вариант ассемблера в блок-схемном исполнении.
P.S. В качестве блок-схемного отображения может быть использован «язык» Дракон :)akryukov
16.03.2019 10:44Так смысл не в том, чтобы блоки расставлять мышкой, а в API для формального исполнителя.
Хочется с анимацией этого исполнителя и простым синтаксисом, но реальность иная. В ней студенты хотят промышленный язык и не готовы платить за курсы по "специальному" языку для изучения программирования.
Есть ведь еще всякие игры в кодинг, но это опять же "не серьезно" и платным курсам методически не подходит.
phaggi
16.03.2019 10:49С «Драконом» всё непросто. Он, с одной стороны, очень строгий и поэтому уменьшает шанс на ошибку в алгоритме; а с другой стороны — он, как мне показалось, заточен под написание простых программ. Мне совершенно не понятно, как на нём сделать что-то реально сложное; как там работать со структурами и объектами; видимо, в этом направлении Дракон требует доработки. Я уж не говорю о попытке автоматического превращения схем Дракона в код…
FForth
Знакомы ли Вам проекты языка программирования Форт (Forth) на базисе языка Scratch
и если да, то что Вы об этом думаете?
Примеры таких проектов с Github:
ikforth is an idiomatic Forth implementation written from scratch.
MOBLuSE_FORTH — a Forth (programming language) in Scratch 2 for Scratch.MIT.Edu
plustilino Автор
Не знакомы. Как нибудь посмотрю.