![Арифметическая операция в Scratch между числом и строкой](https://habrastorage.org/getpro/habr/post_images/094/d49/b2f/094d49b2f1ee87f2b95cc9da3270943b.png)
Многим знаком Scratch – детская среда программирования, обучение в которой обычно сводится к созданию творческих проектов по принципу «от простого к сложному». При этом «классический подход» к изучению программирования (переменные > ветвления > циклы > функции > структуры > объекты > …) в Scratch затруднителен.
Однако изменение последовательности изучения понятий (назовем их концепциями) структурного, объектно- и событийно-ориентированного программирования, их сокрытие за яркими спрайтами и интерактивной анимацией, не означает, что на концепциях не следует делать акцент. Особенно, если целью ставится не столько развитие творческих способностей, сколько обучение программированию. Эту идею я постаралась отразить в своем курсе.
Первым, с чем сталкивается начинающий скретчер, являются спрайты. Хотя в Scratch как такового объектно-ориентированного программирования нет, спрайты можно считать объектами. На этом этапе обучающийся видит, что в программе может быть множество объектов, поведением которых управляют внешние для них скрипты. Спрайты получают команды или по требованию передают информацию о своем состоянии, то есть программирование сводится к управлению объектами.
Вторым, что в Scratch сразу сваливается на голову юного программиста, является понятие о многопоточности. Каждый спрайт может иметь по несколько скриптов, выполняемых одновременно. Несколько спрайтов также могут выполнять свои программы одновременно друг с другом. Причем оказывается сложнее организовать последовательное выполнение.
![Одновременное выполнение скриптов](https://habrastorage.org/getpro/habr/post_images/eb8/3e2/54c/eb83e254c229ab611223c1e9decc2d69.png)
![Последовательное выполнение](https://habrastorage.org/getpro/habr/post_images/2e7/d20/01a/2e7d2001a0af574d22af0d81a74e5aa4.png)
Уже на первом занятии мы не можем избежать знакомства с циклами. Иначе кот особо не разбежится. На этом этапе знакомство приходится оставлять интуитивным и поверхностным. Мы ограничиваем его циклами «повторять всегда» и «повторить … раз», которые более просты для понимания. Цикл с условием изучается в уроке, специально посвященном циклам. Этот урок предполагает знание логических выражений и переменных.
Поскольку Scratch событийно-ориентированная среда, блоки условного оператора удобнее изучить до переменных. Условием могут выступать те или иные события.
![Условный оператор, в котором логическим выражением выступает событие](https://habrastorage.org/getpro/habr/post_images/33c/11e/f92/33c11ef92be2d50c206ae394de5d3706.png)
На мой взгляд, такая последовательность лучше, так как за каждый урок мы вводим минимум понятий. Причем не абстрактных, а сразу видим их практическую пользу.
Если же сначала изучать переменные, то их назначение и пользу сложно продемонстрировать, поскольку до этого не изучен условный оператор, ввод данных и генерация случайных чисел.
В Scratch, не считая списков, программист сталкивается с тремя типами данных: числами, строками и булевым типом. При этом тип привязан к значению, а не переменной. Преобразовывать строки в числа и обратно не требуется. Строки в кавычки не заключаются.
Блок, возвращающий логическое значение и имеющих характерную для него угловатую форму, можно вставлять в округлые поля. Обратное не верно: там где предполагается логическое выражение, нельзя вставить обычную переменную.
![Строковая переменная в арифметической операции](https://habrastorage.org/getpro/habr/post_images/39e/7e9/7ea/39e7e97eaaf51d91ff489b32bed77fcf.png)
Scratch реализован так, чтобы в процессе выполнения не возникало критических ошибок. Видимо поэтому, если попытаться использовать строку в арифметической операции, она заменяется нулем (см. первый скрин).
Программист должен знать, что возможности языков программирования расширяются библиотеками. Работая в Scratch, ученик может подключать дополнения, которые приводят к появлению в среде новых команд.
![Расширения в Scratch](https://habrastorage.org/getpro/habr/post_images/3c7/829/a1f/3c7829a1ff736e28b361cdbd78dc9306.png)
Функции в Scratch реализованы в разделе «Другие блоки», где с одной стороны вы создаете собственный блок, который можно вставлять в другие скрипты. С другой стороны – должны собрать функциональность этого блока, то есть то, что он будет делать.
![Определение и вызов функции](https://habrastorage.org/getpro/habr/post_images/878/bfa/007/878bfa007aa94428bc1611693c0fd46f.png)
Возврата значении из скретч-функции нет.
Таким образом, изучение концепций программирования в событийно-ориентированной среде накладывает свой отпечаток. По сути мы сначала изучаем более сложные и абстрактные понятия и, лишь углубляясь в процесс, переходим к элементам структурного программирования. Плюс это или минус для первого знакомства – вопрос спорный.
Комментарии (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 Автор
Не знакомы. Как нибудь посмотрю.