22 февр. 2011 г.

О программировании в школе

Одной из самых сложных наук, изучаемых в школе, является, несомненно, программирование. Казалось бы, что сложного в том, чтобы научиться выдавать последовательность действий, которые компьютер бы преобразовал в программу? Ведь программирование, по сути, сродни переводу. Точно также, как мы переводим тексты с русского на английский, программист перевод последовательность действий в программу на одном из языков программирования. Что в этой схеме сложного? Как ни странно, та самая магическая "последовательность действий", называемая алгоритмом.

Алгоритм — это набор логически связанных, часто последовательных, действий, приводящий к заданному результату. Я не буду углубляться в свойства теории алгоритмов, в понятия дискретности, полноты и конечности, а остановлюсь лишь на фразе "логически связанных". Чтобы программировать необходимо знать и понимать логику и логическое мышление. В обычной жизни мы руководствуемся правилами. Программа — это жёсткий набор действий (за исключением декларативных языков, но они — тема отдельного разговора). Возьмём самое простое — заварку чая. Вы когда-нибудь задумывались над тем, что необходимо сделать, чтобы заварить чай. Вспоминается "вскипятить воду, налить в кружку, положить пакетик чая и сахар, выпить". Однако алгоритм, даже приблизительный, выглядел бы по-другому:

  1. Взять чайник
  2. Если в чайнике нет воды, налить туда холодную воду.
  3. Поставить чайник и включить его.
  4. Ждать до тех пор, пока чайник не закипит.
  5. Когда чайник закипел, взять кружку.
  6. Положить в кружку пакетик с чаем и сахар.
  7. Залить водой из чайника.
  8. Если чай не сладкий, то добавить сахара. 
  9. Повторять п. 8 до получения приемлимого вкуса
И это — вкратце. Чтобы объяснить машине, что человек от неё хочет, требуется гораздо больше команд. В таком простом алгоритме, который наш мозг никак не хочет рассматривать, как сложный, используются и условия, и циклы, и предикаты. Разумеется, реальные программы сложнее.

И вот тут у множестве учеников возникает когнитивный диссонанс. Например, КАК заставить машину что-то делать? Мозг отказывается писать программу "в очевидном случае", отказывается понимать "очевидное". Изучение блок-схем и логики может помочь этому процессу, но не до конца. Понимание приходит с практикой.

Поэтому с программированием так плохо в обычных школах. В гимназиях, особенно, физ.-мат., дела обстоят чуть лучше, так как таких детей заставляют думать ещё в раннем возрасте. Но без чёткого понимания цели, без умения разделить "сложное на простое", без умения выстраивать логические цепочки, нельзя научиться программировать. Можно научиться писать программы, похожие на те, что уже проходили. Но что-то новое будет всегда вызывать ступор. Ступор, сформированный в том числе и современной системой образования, в которой нет места ни логике, ни мышлению.

К чему я весь этот разговор? К тому, что, по-моему, большую часть преподавателей информатики можно разделить на 2 класса: идиоты (те, которые с компьютером на Вы, преподают по учебникам, сами понимают с огромным трудом, если понимают) и те, которые что-то выучили / осознали в силу возраста, и теперь считают сие очевидным и искренне удивляются, какие же тупые дети, раз не могут написать простенькую программу. В качестве примера приведу реальный случай задачи для ученика 8 класса, которую меня попросили решить. Мне пришлось потратить час. При 7-летнем опыте работы + 5 годам МатМеха + 4 физ.-мат. школы.
Краткая формулировка задачи: Нужно нарисовать в паскале несколько окон, в каждом из которых бегает змейка, управляемая с клавиатуры, меняющая цвет и "символ" при отскоке или смене направления, окна переключаются по нажатию клавиши Z.
При этом циклы практически не проходились, функциональное программирование не изучалось, вообще, объяснений, как таковых, не было. Вопрос: как такую задачу могут решать в 8 классе, при условии, что, собственно, программирование в 8 классе и начинается (в некоторых школах)? При всём своём самоуважении и прочая, я не даю задач подобной сложности в 10 классе, когда дети имеют гораздо больше здравого смысла, чем 8-классники. Не понимаю...