22 февр. 2011 г.

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

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

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

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

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

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

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

18 комментариев:

  1. Согласен. Кстати, у меня знакомый учился в математической школе. Так у них там с 1 класса был предмет "логика". А с 4 - та самая информатика, какой мы её знаем с 8 класса.

    ОтветитьУдалить
  2. По-моему, Вы сами на свой вопрос ответили. "В гимназиях, особенно, физ.-мат., дела обстоят чуть лучше, так как таких детей заставляют думать ещё в раннем возрасте" - потому-то они, возможно, и могут решать подобные задачи. Пусть и не быстро, но могут.
    А вот с 10-классниками хорошо подметили. Докатились. Мне известно из Ваших же слов, что все мы в плане программирования и информатики тупые, но я все же не думала, что на столько, чтобы 8-классники других школ нас опережали. Это трагично. Что самое обидное, даже несмотря на то, что есть желание (по крайней мере у некоторых из нас) нет ни времени, ни возможности на то, чтобы повысить уровень. Не знаю, как остальным, а лично мне стыдно, что кто-то разбирается в программировании лучше меня, в тот момент, когда я не могу разбираться на том, уровне, который в данный момент мне положен. Стыдно. Очень стыдно.

    ОтветитьУдалить
  3. > потому-то они, возможно, и могут решать подобные задачи. Пусть и не быстро, но могут.

    Дык не решают. Задачи такого уровня могут решать только в единичных школах типа 239, АГ, ФТШ, 533 и 30-ки. Для всех остальных подобные задачи в 8 классе некорректны. Их решают только те, у кого родственники — программисты. Или хорошие знакомые.

    > Мне известно из Ваших же слов, что все мы в плане >программирования и информатики тупые

    Я никогда не делаю точных оценок, Вы ошиблись :)

    > на столько, чтобы 8-классники других школ нас опережали

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

    ОтветитьУдалить
  4. программирование в большинстве школах по факту вообще не преподается....зарплата то какая??!!! программер на фрилансе больше заработает чем в школе, да еще нервы тратить....у нас вот старая бабка была которая кроме ворда ничего не знала...и видимо везде так, потому что когда я пришел в технарь и мы стали изучать коммандную строку, никто не допер даже help написать или знак вопроса чтоб посмотреть комманды...а какое было мучение папки создавать и удалять.....какое нафиг программирование....кстат преподавала тож бабка, все с экрана читала..ну а дома у себя мало кто интересуется, все в игрушки играют

    ОтветитьУдалить
  5. В гимназиях обычно ЗП повыше, плюс туда люди идут не за деньгами, поэтому иногда с информатикой людям "везёт". Правда, и в таком случае бывают перегибы.

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

    Категорически не согласен.
    Я не кодер, хотя приблизительную структуру и логику языков программирования понимаю (писал скрипты для mIRC на внутреннем языке, иногда пишу объемные функции в Экселе — там ведь VBA, кажется?).
    Но мне никогда не казалось это легким и очевидным.

    Хоть я и умею (слегка) «думать как программист» и алгоритмизировать задачи, но я не считаю, что это легко, просто, очевидно и должно быть понятно всем «по дефолту».

    ОтветитьУдалить
  7. > Хоть я и умею (слегка) «думать как программист» и >алгоритмизировать задачи, но я не считаю, что это легко, просто, >очевидно и должно быть понятно всем «по дефолту».

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

    ОтветитьУдалить
  8. Опыт скорее не так важен как логичность мыслей.
    "Умные люди не учат, они итак все знают"(с)

    ОтветитьУдалить
  9. В таком случае на свете не существует умных людей. Всегда есть множество вещей, которые человек не знает.

    ОтветитьУдалить
  10. >> Единственная сложность — научиться алгоритмике. Тут нужна логика и опыт.

    У меня богатейший горький опыт общения с гуманитариями - вы удивитесь, насколько их способ мышления далёк не только от алгоритмики, но и вообще от сколько-нибудь вменяемой логики :-)

    Это для нас с вами очевидно, что если А=В и В=С, то А=С. А есть люди, для которых эта задача имеет десяток абсолютно разных, но одинаково правильных решений.

    ОтветитьУдалить
  11. Один из моих бывших преподавателей по астрономии читал курс по естествознанию у гуманитариев (философов). Так вот, они умеют такие перлы выдавать из серии "Солнце — самый большой объект во Вселенной", "Земля вращается вокруг Солнца". За знание гелиоцентрической системы ставят зачёт сразу.

    А по поводу логики — проблема в школьных информатиках. Логика входит в курс информатики в школе. У меня, например, достаточно сложно получить что-то, отличное от 2, если не уметь хотя бы решать логические задачи.

    ОтветитьУдалить
  12. У меня была мысль рассказывать про программирования как про работу с концептами )
    И можно интересно рассказать, почему вообще нужно программирование, почему приходится вообще писать какие-то программы чтобы что-то сделать )

    ОтветитьУдалить
  13. Это рассказывается, наблаго примеров я знаю много. Проблема в мышлении, в алгоритмическом мышлении. Ему нужно учить с детства. Умению составить и реализовать алгоритм. Те, например, кто играл в логические игры (последовательные), легче осваивают тему.

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

    ОтветитьУдалить
  15. Тут палка о двух концах. С одной стороны, Вы правы, нужно уметь "разделять и властвовать". С другой стороны, большинство школьных задач решаются в два действия. Например, поиск наибольшего общего делителя или расчёт n-ного числа Фибоначчи. Тут задача настолько проста, что её не разделить. По сути, один цикл / рекурсия. И проблема в том, чтобы научить понимать, где и что использовать.

    ОтветитьУдалить
  16. Лично на моем опыте: в 10 лет я задавался вопросом как сделать игру? Все искал и искал легчайшие способы. Наткнулся на такой язык под названием ActionScript 3.0. По началу не мог понять как программировать, но так как я изучал это самостоятельно, у меня не было возможности попросить помощи у кого-нибудь. Но потом постепенно стал понимать как это делать. Я постоянно брал какие-нибудь исходники по этому языку, пытался что-нибудь изменить, и это мне очень помогало, уже к 11 лет у меня были отличнейшие навыки в программировании ActionScript 3.0. После уже началась информатика, конечно там был другой язык программирования(Pascal), но все же, чтобы понять как этот язык работает, его синтаксис, мне нужно было просто узнать базовый шаблон. Язык казался чуть проще, хоть и типизация более строгая чем в предыдущем, но по моему легче писать программы без создания своих функций и процедур, обычный сплошной текст(последовательность действий), на AS3 же я уже писал на классах(объектная модель, тогда уже понимал что тип переменной это какой-то класс). В общем изучение паскаля и других языков было для меня не так уж сложно, главное - хотение, и хоть какое-нибудь понятие. Сейчас же знаю несколько языков(AS3, PHP, JS, HTML5, CSS3, C++) изучаю еще(Ruby, Java, Python). Как видите, хоть я и самостоятельно все делал без просьбах о помощи, но все же добился больших успехов.

    ОтветитьУдалить
    Ответы
    1. Честно говоря, из опыта собеседования программистов за последние несколько лет я понял одно — знать более чем два языка на разумном уровне практически нереально. Знание синтаксиса и умение писать программы не есть знание языка. Я могу, например, без проблем написать программу хоть на ассемблере или коболе, по работе приходится писать и на Фортране, но ни один из этих языков я не знаю. Нельзя знать ActionScript, PHP, JS, HTML5, C++ (про последний вообще молчу) "в совершенстве". А уж про мешанину объектной Java и функционального ruby я вообще молчу.

      Это к вопросу о том, что Вы называете "успехом". Успех — это реализованные проекты высокого уровня, а не умение сказать (по сути) "Я твой дом труба шатал" на десятке языков программирования. Нужно выбрать один и совершенствовать его, шлифовать, набираться опыта в смежных областях.

      P.S. Кстати, если я в резюме человека вижу более 2 языков программирования, я даже с таким не созваниваюсь. Это уже показатель уровня знаний.

      Удалить
    2. Во-первых, в резюме я пишу 3 языка (C++, Java, Haskell, несмотря на то, что последний не использовал в крупном проекте). Я бы сказал, что это пессимизм относительно людей, которые хотели бы у Вас работать, считать, что они в принципе не способны поддерживать знание более двух языков на актульном уровне. И если человек честно пишет, что писал проекты на, скажем, Perl и PHP, но для боевого применения знания нужно освежить, не вижу вообще никакой пробемы.
      Во-вторых, знание большого количества языков положительно влияет на программирование. Например, знание того, что такое чистые функции, незануляемые указатели и как работает виртуальный полиморфизм, может навести на их использование в языке, в котором их нет, в качестве конвенции кодирования или библиотеки. Также в программировании, как правило, важно не столько то, сколько человек знает, но насколько быстро он осваивает новое. Однако, стоит отметить, глубину полученных знаний сложно измерить по резюме.
      И кстати, "реализованный проект высокого уровня" не является показателем знания языка, так как его не требует. Примером здесь может быть проект на C++ без сложных шаблонов, где (и это достигается практически в любом проекте) избегаются наиболее изощренные случаи для процедуры разрешения имен. Противоположным примером будет компилятор, который требует чуть большего понимания синтаксиса и семантики языка, чем кодирование на нем, и при этом практически не требует собственно кода, если сам компилятор пишется на другом языке.

      Удалить