Предыстория этого кружка началась два года назад. К тому времени я уже несколько лет подрабатывал репетитором информатики и программирования, в основном ученики по информатике программировали на Pascal, он больше распространен в школах.
А осенью 2011 года у меня появился необычный ученик: ребенок в 4 классе очень хотел заниматься программированием, и узнав что я обучаю Delphi мы с его мамой договорились что попробуем обучить на нём. Ребенок оказался очень одарённым, и у нас получилось очень хорошие и плодотворные занятия. И многие идеи появились только благодаря его постоянному интересу к программированию.
К тому времени я работал в кружке робототехники Дворца Молодёжи Свердловской области. И у меня появилась мысль организовать такой кружок программирования у нас. Для создания этого кружка прежде всего надо было определить несколько вещей:
на какой возраст рассчитываем. Дело в том что я много изучал психологию (закончил психфак УрГПУ), и знаю что логическое мышление начинает развиваться (и наиболее хорошо развивается) начиная с младшего подросткового возраста. И занятия программированием будут в плане развития наиболее ценны для подростков. Это прежде всего это развитие способности держать в голове большие объёмы информации, и выстроенные между ними логические связи. Итак возраст был определён минимум от 11 лет и старше (рекомендуемый возраст 13-15 лет);
цели обучения программированию (особенно учитывая возраст детей). Первая цель как написано выше — развивающая. Вторая цель — заинтересовать, приобщить детей к этому занятию. Именно поэтому (да простят меня сторонники традиционного обучения, требующие сначала обучать на обычном языке, а потом уже на объектно-ориентированном) было четкое понимание, что именно программы с графическим интерфейсом будут интересны детям. Итак мы переходим к третьему аспекту:
в какой среде программируем. В качестве такой среды был выбран Lazarus. Во-первых синтаксис Pascal куда проще для детей, поэтому я решил отказаться от того же С#. От Delphi пришлось отказаться, потому что учреждение областного уровня не может позволить поставить пиратский софт, а на покупку софта для нового кружка скорее всего денег бы не нашлось. Поэтому был выбран бесплатный Lazarus
Следующий вопрос — как будем строить занятия. Несомненно на первых занятиях необходимо дать основной материал: научить детей ориентироваться в модели «объект — свойства — события», объяснить участие в этом операционной системы, и пониманию что такое переменные и как они связаны с памятью компьютера. Я сначала думал стоит ли объяснять на первых занятиях (как обычно делают при обучении объектным языкам) структуру библиотеки компонентов, механизмы инкапсуляции, полиморфизма и т.д. — но в итоге решил что на начальном этапе это лишний перегруз, и скорее всего дети просто не поймут. Поэтому мы об этом даже не говорим, не используем понятие «компонент», чтобы дети не запутались, вместо него термин «объект». То есть курс конечно упрощён, но зато так детям понятнее и интереснее. Я думаю что это не нанесёт большого ущерба. Ведь в школе же учат на математике что нельзя извлечь корень из минус единицы. А потом дети приходят в институт, и спокойно изучают комплексные числа, и вроде это не вызывает больших проблем с непониманием. Так и здесь я думаю стоит некоторые вещи упрощать, делая всё максимально простым и понятным. Ну и следующий важный аспект: каждая тема должна подкрепляться программированием. Если на первом занятии читать только теорию (как часто делают в институтских курсах ООП), то на втором занятии детей придёт уже в 2 раза меньше. Ну и наконец те программы, которые мы делаем должны быть интересны детям. Поэтому в курсе в основном мини-игры, программы-шутки, виртуальные энциклопедии и т.д.
После того как мы изучили основу, мы переходим к обучению по лабораторным работам.
Сожержание занятий
Полностью конечно все темы не распишешь, но что учим на первых занятиях я думаю стоит написать для понимания как мы учимся (одно занятие у нас идёт 45 минут):
Занятие 1. Привет, мир!
Общая теория: Для чего нужна ОС, её структура. Как работает графическая ОС. Что такое WinAPI. Принцип работы кроссплатформенных приложений. Объекты, свойства, события. Интерфейс Lazarus: что где находится, где брать новые объекты, где смотреть свойства, как работать с формой визуального конструирования. Новые объекты: Form, Label. Новые свойства: Caption, Font, Color Задание: Создаем программу с надписью «Привет, мир!». Меняем шрифты надписи, фон окна. Учимся правильно сохранять проект программы.
Занятие 2. События.
Общая теория: Повторение про ОС. Объекты, свойства, события. Снова вспоминаем, где какое окно в интерфейсе Lazarus и что оно означает. От конструирования к программированию. Автоматическое создание процедур обработки событий. Что такое процедура, её структура. Новые объекты: Button. Новые свойства: BorderStyle, AlphaBlend, AlphaBlendValue Новые события: OnClick Задание: Добавляем в программу «Привет, мир!» две кнопки: «Закрыть» и «Перекрасить». Пишем для них обработку событий. (Кнопка «Перекрасить» меняет цвет фона и цвет шрифта). Экспериментируем с BorderStyle и прозрачностью.
Занятие 3. Убегающая кнопка.
Общая теория: Прорисовка объекта. Координаты объекта: абсолютные и относительные. Генератор случайных чисел. Новые свойства: Height, Width, Top, Left Новые события: OnMouseMove Задание: Программа состоит из окна, в центре которого кнопка с надписью «Нажми меня». При наведении курсора кнопка убегает в случайное место. Дополнительно задание: сделать так, чтобы при изменений пользователем размеров окна программа работала корректно (то есть изменить аргумент рандома, например вместо конкретного числа указывающего высоту формы поставить свойство Form1.Height).
Занятие 4. Калькулятор.
Общая теория: Как работает оперативная память. Что такое ячейка памяти. Переменные: как правильно попросить у ОС ячейку в памяти: придумать имя, определить тип, определить размер. Типы числовых переменных: Byte, Integer, double. Как правильно объявлять переменные (пишем раздел var в процедуре). Разница между числом и текстом. Функции IntToStr и StrToInt. Новые объекты: Edit. Новые свойства: Edit.Text Задание: Программа-калькулятор. Два Edit для ввода чисел. Четыре кнопки: +, — , *, /. И Label для вывода результата.
Занятие 4. Ветвление.
Общая теория: Ситуация выбора. Оператор If, и его конструкции. Правильное использование опературных скобок. Правильная структура программы, или для чего нужны отступы. Полное и неполное ветвление. Вложенное ветвление. Комментарии к коду, как делать, для чего нужны. Задание: Доработать калькулятор. Сделать кнопку «Сравнить», при нажатии кнопки в ответ выводится, какое число больше. Дополнительное задание: сделать так, чтобы программа работала корректно: при равенстве двух чисел выводила, что они равны.
Занятие 5. Угадайка.
Общая теория: Повторение If. Изучение работы с многострочным текстовым полем Memo. Новые объекты: Memo. Новые свойства: Memo.Lines Задание: Добавляем в программу «Привет, мир!» две кнопки: «Закрыть» и «Перекрасить». Пишем для них обработку событий. (Кнопка «Перекрасить» меняет цвет фона и цвет шрифта). Экспериментируем с BorderStyle и прозрачностью.
Программа состоит из окна для ввода числа, кнопки ОК, кнопки «Загадать» и многострочного поля. Компьютер загадывает число от 1 до 100. Пользователь угадывает это значение, вводя числа в поле ввода. После ввода числа компьютер выдает подсказку в Memo: например загадано число 10, пользователь ввел 20, компьютер выдаёт: «Моё число меньше!». Дополнительное задание: доработать программу, чтобы пользователь выбирал диапазон загадываемых чисел.
Конечно вся теория объясняется языком, максимально понятным ребёнку. Если мы рассматриваем объектную модель, то мы открываем разные программы, ищем в них одинаковые объекты, дети ищут что разного в этих объектах (для понимания что такое свойства). Если мы изучаем память, то мы представляем её в виде шкафчика с ячейками (на доске в это время презентация, в которой нарисован шкафчик), и т.д. Главное чтобы всё было максимально наглядным.
Ведём тетради, но пишем по-минимуму: из этих занятий записано структура обращения к свойству объекта из программы, структура рандома, и структура If. Так же у нас в тетради отдельно три словарика: для объектов, для свойств, и для событий. Там так же пишем кратко, например Color — цвет.
Что есть сейчас, и наши планы.
В кружке у меня занимается одна группа, в этом году 9 человек. В основном это 5-7 классы. Есть один третьеклассник (пришёл с робототехники), девятиклассница, и 1 человек из 11 класса.
По способности к программированию — в принципе как в обычных группах колледжа: несколько человек обладают хорошими способностями, остальные средними. По возрасту лучше всего программируют 11классник (ну оно и понятно), и на таком же уровне три мальчика из 7 класса.
Думал что тяжелее всего будет мальчику из третьего класса (он пришел потому что по времени не мог ходить на робототехнику, а бросать занятия у меня никак не хотел), но оказалось что он вполне успевает.
В планах — постараться расширить горизонт. У меня несколько учеников занимались/занимаются кроме этого кружка в кружке робототехники, и один из примеров которые я хочу попробовать сделать в проектах к концу года — внешнее устройство с взаимодействием через COM-порт. То есть на компьютере мы пишем программу, которая осуществляет взаимодействие с COM-портом, а на Arduino собираем само устройство, которое управляется/обменивается данными с компьютером. Это конечно пока только в планах, и я ещё не знаю как пойдёт — но это из тех вещей к которым хочется стремиться.
Так же в планах написать на основе презентаций к занятиям и лабораторных работ книгу — самоучитель программирования для детей.
Пожелания, или для чего написана эта статья.
Во-первых у меня большая просьба: если вы знаете программы, которые могут заинтересовать детей (особенно мини-игры), и при этом эти программы легко пишутся — я буду рад если вы мне про них напишите. Я в своё время перелопатил кучу учебников и форумов по программированию, чтобы поискать подходящие учебные программы, и их как мне кажется до сих пор не так много как хотелось бы в моей коллекции.
Ну и во-вторых, если кто захочет организовать такой кружок(например в ближайшей школе) — буду рад поделиться опытом.