что делают в школе программирования
Почему школьники не любят уроки программирования
Почему обучение основам программирования в школах такое ужасное и что с этим можно сделать.
Когда речь заходит о школьном программировании, ученики смотрят на всех как на безумных: о чём вы вообще говорите? Чтобы вы поняли всю глубину проблемы, скажем, что больше половины российских выпускников не знают, что такое алгоритмы и логические операции. Написать программу хоть на каком-нибудь языке могут только ученики профильных классов в школах с углублённым изучением физико-математических дисциплин.
Мы специально не рассматриваем в этом материале квалификацию преподавателя и его педагогические способности. Будем исходить из того, что у нас есть обычный учитель информатики, который знает свой предмет, но действует в условиях, которые часто от него не зависят.
Вот в чём проблема и как тут быть.
Старые компьютеры
В большинстве школ нет современного железа. И речь не о самых новых и навороченных компьютерах, а хотя бы о тех, которые могут запустить браузер Chrome и не зависнуть на пару минут.
На устройствах, которыми обычно располагают школы, сложно преподавать что-то современное, потому что оно банально не запустится. В итоге практическая работа превращается в мучение и проверку терпения учеников. Можно, конечно, поставить какой-нибудь лёгкий Linux и настроить его для необходимых задач, но чаще всего такой квалификации у учителя нет.
Древние языки программирования
Если спросить детей, какой язык они проходят на информатике, рейтинг ответов будет таким:
Проблема в том, что во многих школах даются знания по языкам, которые не используются сейчас в профессиональной разработке.
С точки зрения кадров это, наверное, правильно, потому что не нужно переучивать учителей и переписывать учебники. Но ни Паскаль, ни Бейсик, ни блок-схемы сейчас не нужны в профессиональном программировании — разработческая мысль давно шагнула вперёд.
Ещё это тесно связано с возрастом школьных компьютеров, о которых мы говорили. Современная среда разработки для какого-нибудь модного Go или даже классического языка C# на них просто не запустится. Вот и приходится использовать Паскаль, который работает на чём угодно, но который полностью устарел для практического применения.
Паскаль прекрасно помогает преподавать алгоритмику, но писать современные программы на нём крайне сложно, и вот почему:
Нет единой методической базы
Каждый учитель сам решает, как рассказывать о своём предмете. Один подойдёт к вопросу творчески и заинтересует детей, другой отнесётся формально и прочитает материал по учебнику. Но и здесь есть подвох: учебников по информатике много, все они одобрены Минобром, и все дают разные представления о программировании. Книга авторства Семашко для 10 класса рассказывает про блок-схемы и абстрактный язык, Угринович предлагает изучать Visual Basic, а Босова и Поляков вообще ничего не говорят про программирование в 10 классе.
А теперь добавьте сюда уроки по замене, когда в параллельных группах дети занимаются по разным программам, возможный перевод в другую школу с другими стандартами, а также экспериментальные методики от самих учителей. В итоге в голове получается каша из знаний, а ребёнок вырастает уверенным в том, что программирование — очень сложная штука, про которую он что-то слышал.
Это примерно как если бы детей в школе учили вождению: где-то на «тойотах»-автоматах, где-то на убитых «запорожцах», где-то на тетрадях в клетку, а где-то ещё их бы учили собирать и разбирать танк. И ребёнок, к примеру, перевёлся с уроков в тетрадке на разбор танка.
Непонятно, как применять знания в жизни
Когда выпускник начинает изучать программирование глубже, чем в школе, то понимает, что между его знаниями и современными языками — пропасть. Проще начать всё заново или вообще не заниматься этим, чем опираться на старые сведения.
Даже если он умеет хорошо писать код на алгоритмическом языке или даже на Visual Basic, то в мире современной разработки он будет чувствовать себя как автолюбитель из середины прошлого века. Перед тем как покинуть гараж, он каждый раз обязательно вручную проверит давление в каждой шине, линейкой измерит люфт рулевого колеса и будет искать карбюраторную заслонку. Сейчас же можно просто сесть и поехать, машина многое умеет сама, и к ней уже совершенно другие требования.
В современных языках программирования точно так же многое уже встроено в язык и не требует сложных действий. Возьмём простую задачу: отсортировать элементы массива по порядку, расставить их от большего к меньшему. На Паскале код выглядит так:
А теперь посмотрим на код JavaScript, который делает то же самое:
Как видите, код стал компактнее и проще. Это благодаря тому, что современные языки уже умеют сами сортировать массивы, работать с переменными, размер которых заранее неизвестен, и объявлять их в том месте, где они понадобились.
Как разжечь в ребёнке интерес к программированию
Лучший способ привлечь детей к любому занятию, в том числе программированию, — личный пример. Когда в семье мама и папа увлекаются кодом, пусть даже и непрофессионально, ребёнку тоже будет интересно попробовать. Робототехника, программируемые контроллеры, Arduino и Raspberry Pi, программы на Scratch и робоконструкторы — всё это помогает разжечь интерес.
Если просто заставлять ребёнка заниматься, в то время как в семье никто не интересуется кодом, эта затея скорее провальная. Личный пример — лучший путь.
Почему программирование — новая грамотность и зачем учить этому детей
Умение программировать также важно как умение читать. Это требования рынка и нового мира. Разбираем доклад НИУ ВШЭ «Универсальные компетентности и новая грамотность» и рассказываем, зачем и как учить ребенка программированию
Почему программирование стало частью новой грамотности
Навыки компьютерной грамотности помогают любому человеку решать повседневные и профессиональные задачи. Согласно результатам исследования Открытого университета Израиля, программирование стимулирует креативное мышление и формирует умения учиться. Авторы доклада «Универсальные компетентности и новая грамотность» сравнивают развитие компьютерной грамотности с этапами развития грамотности как умения читать, писать и считать.
В истории грамотности выделяют два этапа:
На первом этапе текст становится частью инфраструктуры. Они занимают центральное место в жизни людей. Текст использовался как инструмент создания законов и разработки стратегий. Особенно это касается земельных законов, которые стали оформлять в виде письменных текстов вместо персональных свидетельств.
На втором этапе текст становится неотъемлемой частью повседневной жизни. Благодаря массовым кампаниям по ликвидации неграмотности, начиная с XIX века, большинство людей освоили навыки письма и чтения. Грамотность помогала получить доступ к информации в газетах с описаниями событий, в буклетах с рекомендациями для фермеров и счетах для отслеживания задолженностей. Чем больше людей осваивали навыки чтения и письма, тем более массовой должна была становиться грамотность.
В развитии компьютерной грамотности можно выделить те же этапы, только развитие происходит в течение десятилетий, а не веков.
Сначала компьютеры становятся частью инфраструктуры, когда их использует государство для переписи населения. Университеты, авиакомпании и банковский сектор начали использовать компьютеры c 1950-х годов. Примерно в 1980-х компьютеры стали доступными для большинства людей, а знания о компьютерах начали проникать из областей знаний узких специалистов в жизнь обычных людей. Люди чаще пользовались компьютерами при обращениях в больницы, организации данных о государственном управлении и управлении образованием.
Затем компьютеры становятся частью жизни. Способность написать несложную программу или код постепенно становится базовым навыком. Программирование и вычислительное мышление расширяют возможности и становятся обязательным требованием к любому специалисту — от физика до журналиста. Способность читать и понимать компьютерный код становится более востребованной, поэтому программирование переходит из специального знания в универсальную грамотность. Это грамотность использования современных инструментов общения и работы — компьютеров. И если это аспект грамотности, то развивать его нужно с детства.
Как программирование учит решать задачи
Программирование развивает вычислительное мышление. Это набор приемов для решения задач в компьютерных науках, но применимых в любых сферах. Например, вычислительная наука помогает в образовании. Специальная платформа собирает данные об активностях студентах. С помощью данных преподаватель отслеживает неэффективные задания, чтобы составить новую учебную программу.
Вычислительное мышление учит формулировать проблему, искать решение и анализировать его. Программирование — часть вычислительного мышления и самый эффективный способ его освоить. Например, перед программированием мы анализируем и разбиваем задачу на подзадачи. Программирование конкретизирует вычислительное мышление и может стать инструментом получения знаний.
Зачем учить детей программированию
Идеолог конструктивизма в педагогике Жан Пиаже предложил такую идею: дети учатся быстрее, когда сами формируют свои представления об увиденном и делают собственные заключения, а не когда им говорят, как они должны воспринимать мир. Дети оказываются не пассивными получателями знаний, а наоборот, сами их конструируют.
Программист и один из основоположников теории искусственного интеллекта Сеймур Пейперт добавил: эффективное обучение происходит, когда ученик создает значимый для него объект, будь то песочный замок или теория. Конструкционизм объединяет два типа конструирования: дети конструируют вещи в реальном мире и конструируют новые идеи в своей голове. Два типа конструирования создают непрерывную спираль обучения: когда у ребенка появляются новые идеи, он конструирует новые вещи в реальном мире. Программирование помогает детям воплотить эти идеи в жизнь.
Через программирование ребенок развивает вычислительное мышление. Вычислительное мышление помогает детям развивать навыки решения задач, креативное мышление, умение учиться и навыки совместной работы.
Программирование и вычислительное мышление помогают детям учиться сетевым взаимоотношениям: общаться в чатах, видеоконференциях, соцсетях. Решая сложные задачи, дети используют четыре основных компонента вычислительного мышления: декомпозицию, выделение паттернов, автоматизацию и абстрагирование.
Обучать детей программированию нужно не для того, чтобы они в будущем стали программистами. Задача программирования — подготовить детей к вычислительному мышлению, которое поможет им уверенно справляться с комплексными задачами XXI века, которые не имеют однозначного решения.
Дети смогут применять «вычислительные» подходы в разных контекстах и дисциплинах. Если ребенок научился раскладывать большую задачу на маленькие фрагменты, находить сходства в разных элементах, выявлять и устранять незначимые детали, выстраивать фрагменты в единый алгоритм для получения результата, он сможет решить задачи в любой дисциплине.
Митч Резник, руководитель исследовательской группы, которая разработала язык программирования Scratch, уверен, что креативность можно поддерживать, подпитывать и стимулировать.
За компьютером дети потребляют информацию, играют в игры и только малую часть времени придумывают и создают что-то свое. Тенденция начала меняться с распространением инструментов программирования для детей, например Scratch, Alice или Kodu. С помощью таких инструментов дети учатся создавать игры, анимацию, истории и художественные элементы. Программирование помогает поддерживать и стимулировать креативность, открывает источники вдохновения, чтобы выражать свои идеи и раскрывать личность.
Обучаясь программированию, дети учатся мыслить по-новому. Если написанная программа не работает или работает не так, как ожидал ребенок, ему приходится разбираться и придумывать решение задачи. Ребенок начинает понимать новые идеи и учится учиться.
По сравнению с другими видами учебной деятельности программирование — более щадящий и мягкий процесс. Работа с кодом помогает учиться на своих ошибках и не вызывает дискомфорта, если дети их совершают. Например, ребенок может отменить команду, чтобы исправить ошибку в коде, внести правки и попробовать что-то новое. Благодаря программированию дети перестают бояться ошибок. Вот что рассказывала мать девочки, которая работала на Scratch:
«Она набралась храбрости и больше не боится пробовать новые вещи. Даже если первая попытка оканчивается неудачей, дочка воспринимает ее не как “конец игры”, а как напоминание, что стоит попробовать другой путь, что в нужное место можно идти разными маршрутами и что не бывает маршрутов “правильных” и “неправильных” как таковых»
Ребенок начинает ценить обучение программированию, когда выражает себя через продукт, который может показать другим. Такой подход обозначают понятием «вычислительное участие» (computational participation).
Профессора Кафаи и Берк описали вычислительное участие в книге «Связанный код: почему детям нужно учиться программированию». Они считают, что вычислительное участие — это решение задач и разработка интуитивно понятных систем с другими и для других. Изучение культурной и социальной природы поведения человека с применением понятий, практик и подходов компьютерных наук. Например, работа в группах и использование кодов других людей.
Благодаря совместному программированию, в школе можно создать среду, основанную на сотрудничестве. Запрограммированные игры или истории, которые создает ребенок, могут связывать разных детей друг с другом.
В традиционном классе учитель дает задания, а ученики их решают. Если у детей есть внутренняя мотивация к учебе, такой подход будет работать, но не для всех. При этом у детей почти не остается времени и ресурсов для самовыражения. Вычислительное участие помогает решить эту проблему за счет персонализации и опоры на внутреннюю мотивацию.
Персонализация. В программировании дети персонализируют проекты, «добавляя в них самих себя». Например, в программе Scratch можно добавить свою фотографию и запись голоса. Персонализация вовлекает в обучение, делает его более интересным и мотивирующим.
Опора на внутреннюю мотивацию и интересы. Через программирование можно задействовать внутреннюю мотивацию ребенка, а не использовать систему внешних вознаграждений. Например, Scratch выбирает отдельные проекты для показа на главной странице, вместо прямого вознаграждения в виде очков, баллов или звездочек. Дети радуются, когда выбирают именно их проект. Идея такого подхода в том, чтобы мотивировать других, подсказывая им новые идеи. В профиле пользователя не говорят, сколько раз его проекты оказывались на главной странице, а лишь над сколькими проектами ребенок работал.
Обычный результат программирования — это проект. Ребенок сразу видит: работает или не работает программа. Если не работает, он старается понять, что нужно узнать для завершения проекта. Ученик мотивирован, ему интересно искать ответы на вопросы, на которые и учитель не знает ответа, но точно может помочь их найти.
Как учить детей программированию
Согласно исследованию по развитию компьютерного мышления, формальная обстановка развивает систематическое мышление и подходы, а неформальная помогает детям развивать мотивацию и определить сферу интересов. Идеальная обстановка должна совмещать то и другое. Распространение технологий размывает границы между формальным и неформальным образованием. Учителю больше не нужно «пропускать через себя» все образовательные программы — ученики сами выстраивают новые связи с миром.
Профессора Кафай и Берк создали две среды обучения, чтобы оценить различия между структурированным обучением и внеучебной средой. В каждой из них, ученики создавали цифровые истории с одним и тем же преподавателем на протяжении десяти недель.
Согласно результатам исследования, во внеучебной среде меньше детей закончили свои проекты, но сделали их сложнее и больше. Ученики в клубе использовали больше креативных навыков программирования и вдвое активнее сотрудничали со своими сверстниками. При этом для тех, кто только знакомится с программированием, структурированное занятие будет более эффективным.
Авторы доклада «Универсальные компетентности и новая грамотность» предлагают дополнять занятия в классе мейкингом, мероприятиями по программированию и походами в технопарки.
Мейкинг. Педагоги объединяют детей на внеклассных мероприятиях для создания физических или цифровых проектов — мейкинга. Создание реального продукта дает ученикам стимул учиться, возможность применить знания на практике и понять, что еще нужно освоить.
На базе философии мейкинга можно создавать школы. Например, в 2011 году в Сан-Франциско открыли школу Brightworks для детей от 5 до 15 лет. Для обучения детей там используют полностью проектно-ориентированный подход. На уроках ученики делают проекты, например строят «Детский город».
По всему миру создают клубы программирования для детей. Они основаны на движении CoderDojo, которое поощряет сообщества создавать лагеря программирования свободного доступа — додзё. Например, в России работают два международных бесплатных клуба под руководством волонтеров CoderDojo и Code Club.
Мероприятия по программированию. На таких мероприятиях участникам дают материалы, чтобы самим провести занятия по программированию. Учителю, родителю или ребенку остается собрать других детей вместе и начать учиться. Например, некоммерческая организация Code.org проводит три популярных международных мероприятия, посвященных программированию — Час кода (Hour of Code), Неделя кода в Европе (Code Week EU) и конкурс по информатике «Бобер» (Bebras Challenge).
Час кода — часовая учебная программа, разработанная для всех возрастов на более чем 45 языках. Час кода проводят в 180 странах.
Неделя кода — двухнедельные мероприятия для детей, организованные волонтерами по всему миру. Неделю кода проводят в 50 странах. В 2016 году в Европе приняли участие почти 1 млн человек.
Конкурс «Бобер» проводят каждый год в 38 странах для детей от 8 до 19 лет. По условиям конкурса, каждому участнику дают 45 мин на выполнение 18 заданий в области информационных технологий. Организаторы не требуют специальных навыков программирования, поэтому с заданиями может справиться каждый. Конкурс проводят на базе школ при поддержке учителей. Победители получают сертификаты и призы.
Детские технопарки. Это образовательные площадки для школьников. В технопарках устанавливают высокотехнологичное оборудование, чтобы мотивировать детей учиться проектированию и компьютерным технологиям.
Например, «Кванториум» — сеть детских технопарков в России. Сейчас работают 24 технопарка в 19 регионах страны.
Зачем учить детей программированию
Больше информации и новостей о трендах образования в нашем Telegram-канале. Подписывайтесь.
Опыт обучения школьников программированию
Примерно полтора года назад компания, в которой я работал, приняла решение начать образовательный проект: готовить будущих программистов со студенческой и даже школьной скамьи. Решение было вызвано как нехваткой квалифицированных программистов в нашем регионе, так и тем, что приходящих выпускников приходится очень многому доучивать – получаемое в вузе образование не полностью отвечает современным реалиям индустрии разработки ПО. Проект взаимовыгодный как для студентов, которые получают возможность познакомиться с промышленным программированием на практике, так и для компании, которая получит через несколько лет квалифицированных специалистов.
Но еще интереснее оказалась часть проекта, ориентированная на работу со школьниками. Я принимаю непосредственное участие именно в этой части, поэтому хочу рассказать о ней.
Проблема школьного обучения программированию
Почему нужно работать именно со школьниками? Мне кажется, что наибольшего успеха можно достичь, начиная обучать учеников 8-9 класса — в дальнейшем обучаемость снижается. Детей успевают «научить плохому» школьные учителя информатики, в том числе они часто отбивают интерес к программированию, в результате остаются только те, кто готов учиться «не благодаря, но вопреки» — те, кто в любом случае будут стремиться стать программистами, «технарями». Имеющие же меньшую тягу к этой области, но весьма способные ребята, к сожалению, отсеиваются уже на этом этапе.
Главная проблема школьного обучения программированию — отсутствие системного подхода в этом вопросе. Беда в том, что в школе учат не решению проблем с помощью программирования, не разработке программ, а лишь языку программирования как таковому. Школьные уроки сводятся, по сути, к изучению конструкций языка и выполнению каких-либо заданий на эти конструкции, но не учат намного более важному умению — применять их для решения возникающих на практике задач. Те из учащихся, кто имеет талант к программированию, учатся этому самостоятельно, остальные получают представление о программировании как «скучном и нудном занятии для ботаников».
Но программирование ведь нужно не только «избранным». На уроках программирования дети учатся в первую очередь работать с информацией, структурировать её, управлять ею, а эти навыки жизненно необходимы в условиях все нарастающего «информационного вала» современной жизни. Даже приблизительное понимание, как устроен компьютер, как он работает и исполняет программы, каковы его возможности и ограничения, — важный навык в нынешних условиях, когда компьютеры проникли буквально повсюду и все больше и больше становятся для обычного человека какой-то магией («я только кнопочку нажал, и тут тако-о-ое. »). Даже если ребенок и не станет программистом, приобретенные во время занятия программированием навыки будут для него хорошим подспорьем в будущей жизни. От компьютеров ведь он никуда не уйдет.
Методика И. Р. Дединского
Поиск методик преподавания, отличных от современных школьных шаблонов, вывел нас на замечательного, увлеченнейшего человека — Илью Рудольфовича Дединского. Он работает старшим преподавателем в московском Физтехе (МФТИ) плюс учителем в физматшколе, и добивается со школьниками потрясающих успехов — его ученики уже в 9-11 классе пишут программы, по сложности соответствующие 3-4 курсу технического вуза (!) — компиляторы, трехмерные движки, моделируют физические процессы, осознанно работая с проектами значительно большего объема, чем можно ожидать даже от студентов. Причем, что важно, Илья Рудольфович добивается таких результатов регулярно. Это не звезды, это обычные ученики (правда, из физматшколы). Как говорит он сам, «методику нужно судить по середнякам». «Звезды» будут всегда, отстающие, увы — тоже. Уровень же, достигнутый основной частью группы — вот истинный показатель качества применяемой методики и работы учителя. Примеры достижений его учеников приведены на сайте Ильи Рудольфовича, в частности, это работа десятиклассника Ивана Шаповалова Платформа для машинно-независимого исполнения программного кода с возможностью JIT-компиляции и коллективная работа Леонида Столярова (9 класс), Федора Петряйкина (9 класс) и Никиты Уварова (7 класс) Платформа для автоматной многоагентной системы в стиле 3D-Action.
Мне довелось встретиться с Ильей Рудольфовичем, пообщаться с ним лично, послушать рассказ о его методике «из первых рук». Взяв ее за основу, мы разработали собственный вариант его программы обучения, основанный на тех же принципах. К сожалению, использовать оригинальную методику Ильи Рудольфовича для нас очень сложно в силу нехватки педагогического опыта. Вполне вероятно, что мы пока не оценили всех её преимуществ и возможностей, поскольку Илья Рудольфович оттачивает свою программу обучения не один год. Полагаю, что с опытом придет понимание, что можно улучшить в нашей программе. Но, как вы понимаете, программа обучения — не та вещь, которую можно бездумно копировать, её нужно понять на собственном опыте. Ниже изложены принципы, которые положены в основу нашей программы обучения, как я их понимаю и применяю в своей практике (с оригинальным изложением принципов авторской методики вы можете ознакомиться на сайте И.Р. Дединского в разделе «Основные материалы»):
Последовательность задач
Последовательность знаний и умений, получаемых детьми, ориентирована на их практическое использование. Как я уже писал выше, конструкции даются как результат возникающих у детей в процессе обучения проблем. Разумеется, задания подбираются именно так, чтобы проблемы эти возникали в определенном порядке — в этом состоит одна из задач преподавателя. Задачи подбираются по принципу: чем важнее навык, тем раньше он изучается. Важность понимается как частота употребления конструкции в промышленном коде. Именно поэтому функции, важнейший элемент программирования, изучаются как можно раньше.
Зачем нужен баннер (монолог вредного заказчика)
«Понимаете, я владелец крупной торговой сети «Чайник анлимитед». Мы продаем любую посуду — от коллекционных чашечек тончайшего фарфора до металлических чайничков. Вот недавно продали в Эмираты сервиз… миллионов за 50, из платины. Сейчас переговоры с Китаем на крупные поставки недорогой посуды. Так вот, я открываю магазин в вашем городе, и так получилось, что совершенно забыл про рекламу. Помощник заболел, а у меня из головы вылетело. Дату открытия сдвинуть не могу — все распланировано, заказано, будет ущерб для репутации… Я, честно говоря, сегодня с этим вопросом был у ваших конкурентов, мы много говорили, пили чай, все было очень мило, но… в последний момент они сказали, что у них какие-то сложности, и заказ они не возьмут. И я пришел к вам. В общем, нужен баннер. Хотя бы один. Я немного устал от разговора у ваших конкурентов, поэтому не хотел бы снова излагать детали заказа, и поэтому давайте так — если вы что-то хотите спросить или уточнить, то спрашивайте, и это и составит текст нашего договора.»
Далее следуют ответы заказчика на вопросы школьников, описание, что нужно изобразить и как и т.д. Тут-то дело и доходит до чертежа, размеров и сроков. Если игра происходит в Москве, то этот огромный баннер предлагается прилепить к стене небоскреба — так его будет издалека видно. В моем случае, за неимением небоскреба даже в проекте, пришлось прифантазировать аэростат, на котором реклама будет висеть над городом.
Кто же это сделает?
После неожиданных ответов о размерах и сроках этого у ребят наступает легкий шок. Это важный момент: они узнают, как существенно выяснить все детали до начала работы, даже если их не было в явном виде в задании. Фактически, это игровой тренинг на составление ТЗ. Когда эта фаза закончена, преподаватель «выкатывает на сцену» «секретное оружие» — выясняется, что у дизайнерской фирмы есть знакомый художник, который-таки может нарисовать требуемый баннер в срок. Но живет этот художник в дальней глуши, и единственный способ с ним связаться — позвонить по телефону. Тип он вредный, разговаривать с ним нужно аккуратно и точно, а то чуть услышит незнакомое слово — бросит трубку и придется звонить снова. Дальше идет список фраз, которыми с ним нужно разговаривать: установи холст, установи цвет, нарисуй линию и т.д. Фактически, так вводится абстрактный исполнитель («Тупой художник») и его система команд. Но не лишь формально, а с привязкой к ситуации, что воспринимается учениками гораздо более естественно.
Далее дети сообща «звонят» «тупому художнику» (роль которого играет преподаватель) и команда за командой управляют «художником», который выполняет их действия — ну или «обижается» на синтаксическую ошибку и бросает трубку, и тогда диалог начинается снова. По сути это исполнение первой программы на псевдокоде исполнителем в режиме интерпретации. После 4-5 неудачных попыток программа написана.
Таким образом, на первом же занятии дети узнают два важных момента: постановку задачи и написание первой программы. Программа записывается на доску, причем очень большое внимание уделяется отступам, пустым строкам и пробелам — тому, что часто опускается и чему так трудно потом осознанно научить.
Как уже говорилось, при записи этой программы особое внимание уделяется форматированию — пустым строкам, делящим программу на логические фрагменты, отступам и пробелам, позволяющим легко читать программу. В дальнейшем преподаватель придает этому очень большое значение и ворчит, пока ученик не оформит код должным образом: «Спрашиваешь, почему вот этот твой код не работает? Да кто ж его знает —в нем сходу не разберешься. Имена все однобуквенные, пробелов нет, отступы поставлены случайно… Сделай, чтобы программу было легко читать, тогда помогу найти ошибку».
Кратко о дальнейшем обучении
Домашним заданием после этого занятия является написание программы, рисующую несколько героев будущего мультфильма. Функция main сразу распухает до 50-100 строк, а у некоторых увлеченных учеников и больше. Поэтому на втором же занятии вводим понятие «функция» — пока без параметров, вида void DrawMan(),— и таким образом разбиваем программу на части. Для часто использующихся цветов вводим понятие «константа» и называем появляющиеся в программе константы понятным образом. Упор делается именно на понятность имен функций и констант. Фактически, это занятие о группировке кода и именовании.
Далее пробуем нарисовать один и тот же объект в разных местах экрана, разным цветом и т. д. Вводим понятие «функция с параметрами», добавляем в написанные на прошлом шаге функции параметры — это типичный рефакторинг. Упор делается на понятность имен, на «гибкость» получающейся функции и на взаимную независимость ее параметров.
После этого пробуем сделать анимацию — движущиеся объекты, простейший «мультик». Вводим понятие «цикл» (и здесь же локальные переменные). Опять упор на понятные имена переменных, на отступы в цикле. Пишем цикл, в котором рисуются персонажи мультика. Уже на этом этапе дети начинают рисовать достаточно сложные и эффектные сцены: например, у одного из моих учеников был нарисован домик, над которым «пролетало» солнце от восхода до заката, затем луна. Цвет всего рисунка менялся в зависимости от положения солнца (луны) на небе. Словами это описать непросто, но выглядело весьма эффектно.
Когда у функций становится ну очень много параметров, вводится понятие «структура», и объекты мультфильма описываются в виде структур. Снова делается упор на понятность имен структур и их полей, на логичность группировки данных в структуры.
Развитие проекта превращает мультфильм в простую компьютерную игру (в нашем случае был выбран «Арканоид»). В процессе написания игры приходится иметь дело с функциями, меняющими состояние своих параметров, и, пользуясь этим, вводится понятие «указатель» и передача параметров по указателю. В нашем случае через некоторое время потребовались еще и массивы. (Важно: адресной арифметики здесь не даем.)
В процессе написания игры возникает необходимость обработать нажатия клавиш пользователем — появляется такая конструкция как «ветвление». В принципе, ветвление может появиться и раньше, но у меня необходимость в нем возникла только в этом месте. Сравните с классическим курсом, где if дается чуть ли не первым же оператором, а о функциях говорят ближе к концу, отчего ими пользуются мало, «развивая» в себе умение писать «макаронный» код. Позднее появление if вызвано спецификой выбранного проекта — «мультфильм», при другой последовательности учебных задач, оно может быть введено даже раньше цикла. Но в этом проекте движение (цикл) более актуально чем вариативность (ветвление) и работа условия в цикле более наглядна.
Что характерно, детям весь первый год не рассказывается о глобальных переменных. Наоборот, везде подчеркивается локальность переменных и параметров функций. Что «вот этот „икс“ в этой функции и вот тот „икс“ в другой функции — совершенно разные, никак не связанные между собой».
В дальнейшем дети узнают об указателях на функции, строках, классических алгоритмах, начинают знакомиться с синтаксическим разбором арифметических выражений. Но это уже очень большая и длинная история.
Я занимаюсь со школьниками по этой программе примерно один учебный год (с прошлого октября). Режим занятий — 2 раза в неделю, одно занятие — 3 академических часа (120 минут, включая десятиминутный перерыв). Группа разновозрастная, от 8 до 11 класса. Но результатом я могу гордиться — дети действительно научились решать задачи самостоятельно. Уверен, что мои ученики 8-9 класса школьные разделы по программированию 10-11 класса пройдут с легкостью. Последний раз, когда было дано задание написать программу «Угадай число» (компьютер загадывает, игрок угадывает по принципу «больше-меньше» — двоичный поиск) все справились с ней самостоятельно. Я просто ходил и наблюдал, как дети итеративно накручивают функционал — почти все начали с главной проверки (if на совпадение/больше/меньше), потом «обернули» её в цикл, потом начали добавлять «украшения». В результате, после нескольких замечаний, получился код, за который мне никак не стыдно. Разумеется, это далеко не самая сложная задача, которую ученики способны решить, но этот пример оказался для меня очень показательным, поскольку дал возможность увидеть самостоятельную работу с начала и до конца за один урок.
Могу сказать, что, по моему мнению, взятая нами за основу методика обучения И. Р. Дединского, — это большой прогресс в области обучения детей программированию. Она подводит базу под процесс обучения, позволяет систематизировать его, заинтересовать детей, показать им, что программирование — это очень интересно, позволяет дать детям больше знаний и навыков в области программирования, чем традиционная школьная программа. Но хочу отметить, что эта методика предъявляет немалые требования к преподавателю. Многие не всегда осознаваемые нюансы (например, выбор преподавателем чересчур абстрактного имени для функции или переменной ради сокращения записей, или введение глобальных переменных для «упрощения» объяснения работы функций) имеют далеко идущие неприятные последствия, которые нужно хорошо осознавать. Преподаватель должен обладать опытом практического программирования, чтобы внятно объяснить, почему нужно делать именно так, а не иначе, и очень желательно на примерах из практики (а не через запреты без объяснений). Он должен уметь быстро разбираться в коде учеников, оценить его состояние и последствия его развития, представить себе, мог ли подобный фрагмент кода быть использован в реальном проекте. Допустим, оставленная неинициализированной переменная: на учебной машине она не всегда приводит к ошибке, но при смене компилятора/версии компилятора/версии ОС/фазы луны может приводить к неопределенному поведению программы. Неудачные имена переменных, нарушение стиля: почему здесь все с большой буквы, а тут с маленькой? почему здесь «верблюжий» стиль, а здесь через подчеркивание? —вот некоторые из «мелочей», из которых складывается не только функционально рабочий, но и чистый, правильный, профессиональный код, и на это преподаватель должен обращать особое внимание. К сожалению, без практического опыта этот навык приобрести довольно сложно. Практический опыт, кроме того, хороший аргумент. При объяснениях я часто использую пример «… и улетели вы в отпуск на Таити. А тут — бац, ошибка в вашем модуле! Коллеги в панике, разобраться в вашем коде быстро не могут, вас срочно отзывают из отпуска —и вот вы прямо в пляжных шортах оказываетесь на рабочем месте». Немного преувеличено, конечно, но суть передает.
Разумеется, в этой статье невозможно рассказать все. Разумеется также, что этот подход не претендует на единственную верность, ведь есть много способов учить программированию. Если данная тема вам интересна, — прошу задавать вопросы в комментариях, отвечу. Если будет много вопросов, — статья получит продолжение.