Доброго времени суток всем.

Надеюсь, на этой ветке сейчас или в некотором будущем появятся учителя программирования. В основном этот текст для них, хотя конечно и для всех кто прочитает. Я хочу изложить свои взгляды на важный вопрос - как учить программированию. Хочу сразу предупредить, что несмотря на категорическую форму вопроса, я не в коем случае не утверждаю, что это единственно правильный подход и так должны работать все. Утверждаю всего лишь следующее - такой подход возможен и он эфективен.

Несколько исходных положений.

Первое, самое важное положение. Программирование и алгоритмизация требуют определенного типа мышления и следовательно обучение программированию это прежде всего обучение мышлению в несколько специфической форме.

Второе. Любой специалист, в любой области кроме владения инструментарием, должен уметь видеть задачи, видеть взаимосвязи между задачами, видеть в целом картину общего знания хотя бы в своей области.

Третье.  Любой труд должен быть с одной стороны творческим. Это означает умение генерировать идеи, а не выводить их из имеющегося знания. С другой стороны труд должен быть хорошо организованным. Это означает наличие внутренней дисциплины позволяющей от идейного хаоса дойти до завершенного продукта. Надо четко понимать, что совершенное творчество и полная дисциплина два взаимоисключающих полюса и дело учителя найти между ними золотую середину.

Четвертое. От учебного процесса нельзя требовать 100% отдачи. Надо понимать, что отпадающие ученики это не брак, это тоже продукт, но другого характера. Для большинства осваивающих ту или иную область знаний учебный процесс является средством, а не целью (например средством развития).

Пятое. Развитие мышления большинства людей  идет от форм конкретного мышления к формам абстрактным.

Есть еще важые положения, но эти пожалуй наиболее существенны. Я не буду дедуктивно выводить свой подход из этих положений, я изложу его сразу, а читающие могут сами проверить соответствует ли теория построенной практике.

ПОСТРОЕНИЕ УЧЕБНОГО ПРОЦЕССА.

Весь учебный процесс состоит из 4 частей, на каждой из которых свои задачи и своя технология.

1) Базовый курс.

Задача. Знакомство с основам программирования.  Для большинства моих учеников он последний.

Метод. Ученик должен решить 160 задач прикладного характера. Теории в каком-то смысле ноль. Я даже не объясняю, что такое алгоритм. Мы просто решаем задачи некоторые из которых уже решены и их достаточно разобрать. А на первом уроке, первую программу надо просто набрать и суметь запустить на выполнение. Задачи разбиты не 8 тем:
1) Организация ввода/вывода
2) Статическая графика
3) Динамическая графика
4) Вычислительные задачи
5) Массивы
6) Строки
7) Файлы
Указатели и связные списки

Обратите внимание, что темы не привязаны жестко к языку программирования. Языковые конструкции вводятся по мере необходимости и очень неформально. Это порождает неточности понимания, которые затем устраняются. Неточности понимания я не рассматриваю как проблему, это скорее повод для уточнения языковых знаний. Таким образом теория все-же появляется, но вслед практике. Язык этого этапа Turbo-Pascal

2) Решение логически сложных задач.

Задачи.
- Развитие алгоритмического мышления
- Развитие умения исследовать языковые возможнсти
- Развитие умения системно излагать свои мысли. (воспитание дисциплины)

На этом этапе ученик получает 10 задач. Он должен их решить. НО в отличие от первого этапа, на котором лишь бы работало, здесь мы добиваемся оптимальности: алгоритма, программы, описания решения. Каждая задача обсасывается очень тщательно в течении нескольких занятий, поэтому я  не понимаю, как можно на олимпиаде решить 3-4 задачи за 2-3 часа. Программа составляется на Компонентном Паскале, затем описывается. Описание - процесс о котором необходимо поговорить отдельно, но не сейчас. Затем программа переводится на язык С. Таким образом языковый минимум этого этапа КП и С.

Возможно для решения задачи приходится вгрызаться в какие-то разделы и методы математики, возможно приходится изучать какие-то алгоритмы, поэтому на данном этапе теория приобретает самостоятельную ценность.

Готовых методов я не даю. Ученик должен найти их сам, единственно он получает подсказки, в каком направлени можно поискать метод и иногда если найденный метод не хорош, я позволяю себе рассказать ему о том как это можно было бы сделать.

3) Участие в групповом проекте.

Задачи.

Выработка представления о программной инженерии. Здесь уже конкретно изучаются основы модульного программирования и ООП, и некоторые другие вещи.

В качестве инструмента используются большие проекты. Эти проекты интересны тем, что они совершенно не игрушечные:  теория расписаний, защита информации и т.д.

4) Собственный проект. Для многих, кто доходит до этого этапа третий этап почти сразу переходит в четвертый. А отличаются они тем, что собственный проект требует большего самостоятельного творчества, участие в существующем проекте большей дисциплины. Большая часть наших проектов это программы играющие в интеллектуальные игры против человека, было несколько достаточно успешных попыток программирования расписания учебных занятий, было еще кое-что.

Таким образом я смею утверждать, что человек дошедший до конца это уже готовый специалист, хотя повторюсь 90% моего труда приходится на первую стадию.

Вот так если вкраце. Если будет интерес, можно пообсуждать а хорошо ли это.