Доброго времени суток всем.
Надеюсь, на этой ветке сейчас или в некотором будущем появятся учителя программирования. В основном этот текст для них, хотя конечно и для всех кто прочитает. Я хочу изложить свои взгляды на важный вопрос - как учить программированию. Хочу сразу предупредить, что несмотря на категорическую форму вопроса, я не в коем случае не утверждаю, что это единственно правильный подход и так должны работать все. Утверждаю всего лишь следующее - такой подход возможен и он эфективен.
Несколько исходных положений.
Первое, самое важное положение. Программирование и алгоритмизация требуют определенного типа мышления и следовательно обучение программированию это прежде всего обучение мышлению в несколько специфической форме.
Второе. Любой специалист, в любой области кроме владения инструментарием, должен уметь видеть задачи, видеть взаимосвязи между задачами, видеть в целом картину общего знания хотя бы в своей области.
Третье. Любой труд должен быть с одной стороны творческим. Это означает умение генерировать идеи, а не выводить их из имеющегося знания. С другой стороны труд должен быть хорошо организованным. Это означает наличие внутренней дисциплины позволяющей от идейного хаоса дойти до завершенного продукта. Надо четко понимать, что совершенное творчество и полная дисциплина два взаимоисключающих полюса и дело учителя найти между ними золотую середину.
Четвертое. От учебного процесса нельзя требовать 100% отдачи. Надо понимать, что отпадающие ученики это не брак, это тоже продукт, но другого характера. Для большинства осваивающих ту или иную область знаний учебный процесс является средством, а не целью (например средством развития).
Пятое. Развитие мышления большинства людей идет от форм конкретного мышления к формам абстрактным.
Есть еще важые положения, но эти пожалуй наиболее существенны. Я не буду дедуктивно выводить свой подход из этих положений, я изложу его сразу, а читающие могут сами проверить соответствует ли теория построенной практике.
ПОСТРОЕНИЕ УЧЕБНОГО ПРОЦЕССА.
Весь учебный процесс состоит из 4 частей, на каждой из которых свои задачи и своя технология.
1) Базовый курс.
Задача. Знакомство с основам программирования. Для большинства моих учеников он последний.
Метод. Ученик должен решить 160 задач прикладного характера. Теории в каком-то смысле ноль. Я даже не объясняю, что такое алгоритм. Мы просто решаем задачи некоторые из которых уже решены и их достаточно разобрать. А на первом уроке, первую программу надо просто набрать и суметь запустить на выполнение. Задачи разбиты не 8 тем:
1) Организация ввода/вывода
2) Статическая графика
3) Динамическая графика
4) Вычислительные задачи
5) Массивы
6) Строки
7) Файлы
Указатели и связные списки
Обратите внимание, что темы не привязаны жестко к языку программирования. Языковые конструкции вводятся по мере необходимости и очень неформально. Это порождает неточности понимания, которые затем устраняются. Неточности понимания я не рассматриваю как проблему, это скорее повод для уточнения языковых знаний. Таким образом теория все-же появляется, но вслед практике. Язык этого этапа Turbo-Pascal
2) Решение логически сложных задач.
Задачи.
- Развитие алгоритмического мышления
- Развитие умения исследовать языковые возможнсти
- Развитие умения системно излагать свои мысли. (воспитание дисциплины)
На этом этапе ученик получает 10 задач. Он должен их решить. НО в отличие от первого этапа, на котором лишь бы работало, здесь мы добиваемся оптимальности: алгоритма, программы, описания решения. Каждая задача обсасывается очень тщательно в течении нескольких занятий, поэтому я не понимаю, как можно на олимпиаде решить 3-4 задачи за 2-3 часа. Программа составляется на Компонентном Паскале, затем описывается. Описание - процесс о котором необходимо поговорить отдельно, но не сейчас. Затем программа переводится на язык С. Таким образом языковый минимум этого этапа КП и С.
Возможно для решения задачи приходится вгрызаться в какие-то разделы и методы математики, возможно приходится изучать какие-то алгоритмы, поэтому на данном этапе теория приобретает самостоятельную ценность.
Готовых методов я не даю. Ученик должен найти их сам, единственно он получает подсказки, в каком направлени можно поискать метод и иногда если найденный метод не хорош, я позволяю себе рассказать ему о том как это можно было бы сделать.
3) Участие в групповом проекте.
Задачи.
Выработка представления о программной инженерии. Здесь уже конкретно изучаются основы модульного программирования и ООП, и некоторые другие вещи.
В качестве инструмента используются большие проекты. Эти проекты интересны тем, что они совершенно не игрушечные: теория расписаний, защита информации и т.д.
4) Собственный проект. Для многих, кто доходит до этого этапа третий этап почти сразу переходит в четвертый. А отличаются они тем, что собственный проект требует большего самостоятельного творчества, участие в существующем проекте большей дисциплины. Большая часть наших проектов это программы играющие в интеллектуальные игры против человека, было несколько достаточно успешных попыток программирования расписания учебных занятий, было еще кое-что.
Таким образом я смею утверждать, что человек дошедший до конца это уже готовый специалист, хотя повторюсь 90% моего труда приходится на первую стадию.
Вот так если вкраце. Если будет интерес, можно пообсуждать а хорошо ли это.