Языки программирования в школе

Исходный вариант статьи (А. В. Ворожцов, Языки программирования в школе) опубликован в журнале «Потенциал».

Уроки по информатике в школе и вузе: какой язык программирования выбрать? Насколько глубоко его изучать и нужно ли вообще в школе изучать языки программирования? Есть мнение, что учащихся нужно знакомить с различными языками и различными стилями программирования. Видимо, наиболее подходящими учебными языками программирования сегодня являются Форт, Ruby, Python, Си, Паскаль и Java.

Введение

править

Первым кодировки на бумаге придумал Паскаль. В одной строке умещалось от 0 до 255 символов. Первым языком электрического типа считается Планкакюль. Его изобретателем считается немец Конрад Цузе. Элементы ячейки располагались в две строки. В первой писались натуральные, а во второй аргументы. Один из четырех его компьютеров был частично из консервных банок. Использовалась двуличная система в одной ячейке. Один элемент заряжен положительно, а другой отрицательно. Мнения о том, какой язык лучше преподавать в школе, разнятся: от того, что программирование изучать не нужно, а следует просто поднимать компьютерную грамотность и осваивать офисные программы (как на Западе), до того, что нужно изучать операционные системы и несколько языков программирования различных уровней абстракции и с различными парадигмами. Это крайние случаи, но золотую середину найти непросто. В первую очередь, нам нужно определить цель. Научить школьников логически и алгоритмически мыслить? Познакомить с компьютерами на бытовом уровне, чтобы школьники умели пользоваться интернетом, электронной почтой и текстовыми редакторами? Заложить базовые знания, необходимые для будущих инженеров, математиков, физиков и специалистов по информационным технологиям? А может, нам нужно каждого школьника познакомить с программированием как явлением, чтобы он представлял потенциал компьютерных систем? Много ли школьников станет программистами? Немного. Но синусами и уравнениями Кирхгофа в жизни тоже пользуется не каждый. Безусловно, в науке о программировании есть фундаментальная составляющая, но определить её непросто. Некоторые считают, что не так важно, какой язык программирования взять: на уроках информатики нужно учить не языку программирования, а методам программирования и системному подходу решения задач. Нужно развивать алгоритмическое мышление и на примерах знакомиться с принципами построения современных компьютерных систем.

Неужели действительно не так важно, какая среда и какой конкретный язык программирования будет использован для практических занятий? Оказывается, что у каждого преподавателя есть свой список требований к учебному языку программирования. Например: простой, интуитивный синтаксис, наличие высокоуровневых инструментов для обнаружения и недопущения ошибок и для отладки программ, наличие качественной документации с примерами, наличие дружелюбной среды разработки, межплатформенность (наличие версий под различные платформы), … У некоторых преподавателей этот список очень короткий, например: «Только Паскаль» или «Любой, кроме Бейсика!» Попробуем подойти к проблеме конструктивно.

Бейсик и Паскаль

править

Когда-то наиболее популярными языками программирования в школах мира были Бейсик и Паскаль. Бейсик всегда считался самым простым языком программирования, а Паскаль — самым подходящим языком для обучения программированию. Но теперь это не так. Да, Бейсик прост. Но он создавался во времена, когда человечество не имело никакого опыта создания компьютерных систем, и основан на устаревших и не оправдавших себя принципах. Собственно, никакой фундаментальной целостной идеи в основе Бейсика не лежит. Сегодня есть простые и при этом более наглядные и идейно замкнутые языки программирования, нежели Бейсик. Паскаль удобен в учебных целях; ведь именно для них он и создавался. Студенты быстро учатся решать с его помощью алгоритмические задачки. Но так получается, что изучать Паскаль полезно только для того, чтобы писать программы на Паскалe. А если нужно создать настоящий программный продукт, Паскаль оказывается неудобен. И студентам, знающим только Паскаль, приходится переучиваться, что часто сложнее, нежели изучить правильные языки и технологии с нуля. Часто слышишь от преподавателей школ и вузов:

«Уж лучше Паскаль, чем Бейсик. И лучше Java, а не Паскаль: в Java есть сборка мусора, а это очень удобно для изучения программирования. А еще лучше какой-нибудь сценарный слабо типизированный язык. Там и сборка мусора есть, и в типах путаться не будут, всё будет просто и понятно.»

Но есть и другие мнения:

«Первый язык программирования должен быть требовательным к ученику. Необходимо, чтобы ученик имел чёсткое представление о том, что его программа делает на каждом шаге, и уметь записывать алгоритмы на строгом формальном языке, без лишних поблажек, которые имеются, например, в языке Перл, где можно писать круглые скобки вокруг аргументов функций, а можно не писать, и делать другие подобные вещи. Первый язык должен быть cтрого типизированным, ибо смешение целых чисел, вещественных чисел и текстовых переменных приводит у начинающих программистов к неправильному представлению о методах хранения данных в памяти компьютера. Чем больше сообщений об ошибках ученики увидят от компилятора, и чем больше из этих сообщений они поймут, тем больше фундаментальных знаний о программировании они получат. Паскаль — неплохой язык в этом смысле. Особенно приятно, что в нём есть проверка на принадлежность индекса массива допустимому множеству значений. Это школьникам очень полезно. Но Паскаль редко применяется на практике, и специалист по паскалю оказывается мало востребованным на рынке труда; для реальной работы приходится учить более популярный язык[1] (Java, C/C++, PHP и т. д.). С языком Си другая проблема: в нём много отпугивающих конструкций. С другой стороны, никто не заставляет учителей показывать все глубины Си. С ним можно[источник?] работать на том же уровне, что и с Паскалем, не занимаясь сложными махинациями c указателями и не используя сложных конструкций.»

«Язык Бейсик, используемый сейчас в большинстве школ, просто вреден как для будущих программистов, так и для обычных школьников. Он не имеет никакой системы отладки[источник?], не имеет контроля типов и не требует явного объявления переменных. Это приводит к тому, что ученики не могут находить ошибки в своих программах. Ошибки, с которыми они встречаются, обычно неадекватны и создают у учеников отвратное представление о программировании вообще. Бейсик в принципе не пригоден для учебных, и тем более практических целей.»

«Скриптовые языки больше соответствуют потребностям среднего пользователя компьютера. Многие из существующих скриптовых языков имеют достаточно серьёзный идеологический фундамент, замкнутую модель, наглядный естественный синтаксис и хорошие учебные материалы с примерами, в том числе на русском языке. В первую очередь, я имею в виду языки Форт, Руби и Питон

«Ныне школьникам приходится работать с морально устаревшими и неудобными системами Borland Pascal и Бейсик. Введение в школах более современных языков программирования автоматически поднимет уровень преподавания информатики, и уровень учителей тоже.»

«Если кто хочет заниматься программированием и идти дальше, желательно начать изучение с Паскаля, прорешивать задачи по циклам, массивам, матрицам и т. д. Когда базовые понятия уже будут заложены можно переходить на Borland Delphi, это тот же Паскаль, только там используется объектно-ориентированный подход. Этот язык имеет Ооо! какие возможности.»

Какие есть альтернативы?

править

Альтернатив много. Ныне есть целый зоопарк (экосистема) языков программирования, которые постоянно эволюционируют, расщепляются и сливаются. Это уже упомянутые выше языки Форт, Ruby и Python. Дерево эволюции видов языков программирования можно найти в Сети [1] [2]. Перечислим ключевые факторы, управляющие отбором:

  • Предоставление языком высокоуровневых средств контроля за целостностью и безошибочностью кодa на первом этапе сборки проектов. Это относится в первую очередь к языкам Java, Haskell, и Python. Языки стараются делать такими, чтобы программист просто не мог допускать ошибок. А если ошибки все-таки делаются, то на этапе компиляции (трансляции) они должны находиться. В частности, опечатка в одном символе не должна приводить к тому, что программа компилится и запускается (а такое бывает, например, в языках Бейсик и Perl, если не указан явно специальный режим strict. Язык Java создавался в контексте анализа типичных ошибок и проблем, возникающих в проектах на языке Си++. Создатели Java постарались внести в синтаксис и базовую парадигму такие ограничения, чтобы типичные ошибки программистов на Си++ просто не могли появиться в проектах на Java. Это очень важная идея: если умело заключить себя в рамки, можно получить выгоду. Следует отметить, что в крупных корпорациях часто программистам выдаётся список правил оформления программ и набор конструкций, которые нельзя использовать в коде, несмотря на то, что сам язык их допускает. Излишняя гибкость языка иногда вредна, так как позволяет программистам писать мутные и запутанные программы. Новые языки программирования делают так, чтобы не искушать программистов и не давать им возможности писать запутано и с ошибками.
  • Чистота и ясность кода, читаемость кода. Далее всего здесь продвинулся, видимо, Руби. Сегодня на всех официальных сайтах программных средств среди первых достоинств указывается «естественность синтаксиса» или «близость к естественному языку» (обычно английскому). Конечно, это немаловажный фактор. Давно прошло время, когда люди подстраивались под компьютеры и кропотливо переводили свои идеи и алгоритмы в машинный язык нулей и единиц. Сегодня компьютеры все более и более подстраиваются под человеческий язык. Это удобно. Увеличивается скорость написания программ, хотя обычно это идёт в ущерб скорости выполнения и вообще рациональности получающейся программы.
  • Чистота и целостность парадигмы, заложенной в основу языка. Например, языки Smalltalk и Ruby базируются на чистой объектно-ориентированной парадигме, а Haskell — на чистой функциональной парадигме. Эта чистота полезна, чтобы программист чётко представлял модель, которой он ограничен, и в терминах которой ему нужно мыслить при проектировании программы.
  • Простота синтаксиса, прозрачность интерпретации языковых конструкций. Например, синтаксис языка Python настолько прост, что его описание помещается на одну страницу. Это позволяет программисту всегда понимать то, что он написал. Простота синтаксиса, которая с одной стороны является ограничением, может быть очень полезной, так как позволяет писать ясные, читаемые программы и не думать о том, как же именно компилятор (интерпретатор) оттранслирует ту или иную конструкцию.
  • Многогранность и гибкость, возможность писать сложные программы коротко и красиво. Таким свойством обладают сейчас языки Perl, Ruby, Python. Но следует отметить, что такая универсальность языков может иметь и недостатки, так как часто приводит к излишнему усложнению синтаксиса. Например, очень многогранен Perl, он богат различными конструкциями и хитрыми штучками, которые позволяют записывать сложную логику очень коротко («коротко о многом»). В итоге очень легко написать программы, которые потом невозможно читать. Впрочем, то же самое касается и языков Си и Си++. Языкам Ruby, Python многогранность даётся с меньшими потерями, нежели Perl и Си++.
  • Наличие стандартных библиотек и наличие средств интеграции проектов друг с другом и с другими системами и технологиями. Cегодня все уважающие себя языки предоставляют средства для работы с базами данных, для создания графических интерфейсов, для работы с сетевыми протоколами и создания приложений с архитектурой клиент-сервер. Сегодня идёт непрерывное соревнование между скриптовыми языками программирования типа PHP, Ruby, Python, Perl и др. в том, насколько хорошо развиты в них средства интеграции с различными технологиями. Кто-то умеет работать с OpenGL, а кто-то нет.
  • Возможность разрабатывать адаптивные системы. Язык должен быть таким, чтобы программы, написанные на нём, не были косными и неповоротливыми. Язык должен допускать возможность внесения малых изменений в код, чтобы подстроится под динамически меняющуюся и усложняющуюся задачу. Краеугольными камнями адаптивности языковых программных средств являются гибкая многоуровневая модульность (как у языков Java, Ruby, Python, Tcl) простота средств экспорта и импорта функциональности (имеются в виду средства, направленные на то, чтобы проекты могли делится друг с другом классами, объектами и функциями) и средства поддержки рефакторинга — глобальных революционных изменений кода, проходящих сквозь модули и направленных на улучшение читаемости кода и избавление от накопившегося в процессе эволюции груза ненужной функциональности.

Есть и другие номинации. Язык Python сегодня победитель в номинации «простота синтаксиса», а Perl более, чем какой-либо другой язык удобен для обработки текстов и CGI-программирования. Язык Python в принципе создавался как язык интегратор. С его помощью можно интегрировать различные приложения и создавать свои собственные пакеты и новые макроязыки. (Прошу извинения у школьников, которые, скорее всего, не знают, что такое «парадигма программирования», «Скриптовые языки», «Объектно-ориентированное программирование» и «макроязык». На страницах этого журнала мы понемножку будем освещать эти понятия и давать базовые знания, которые необходимы молодому уму, для того, чтобы развиваться и творить, используя современные компьютерные технологии.)

Итак, Perl многогранен, Python прост, Python красив, Ruby тоже молодец, Java и Си технологичны. Номинаций много и явного победителя нет, так же как и нет одежды, которая одинаково хорошо подходит под летнюю, дождливую или зимнюю погоду. Температура и влажность — всего лишь два параметра, а в языках программирования их гораздо больше.

А что можно сказать про Паскаль и Бейсик?

  1. Когда-то я сам программировал на Visual Basic формочки и диалоги, и мне это даже нравилось. И сейчас многие продолжают это делать. Но в программировании на Visual Basic очень мало от программирования и ещё меньше фундаментальных основ информатики.
  2. Borland Pascal нужно просто отправить на пенсию — он своё отслужил.
  3. Статистика показывает, что победители школьных и студенческих олимпиад по программированию пишут в основном на Паскаль. Но следует отметить, что Паскаль активно теснят языки Java, C# и Haskell. В частности, на последней олимпиаде на международном соревновании по функциональному программированию два победителя писали на Haskell (http://www.haskell.org, http://www.cs.luc.edu/icfp). А на международном соревновании ImagineCup победитель использовал язык C#.
  4. Паскаль и Бейсик по-своему неплохие языки, только не пригодятся они при решении практических задач. Конечно, на Delphi (32-разрядная расширенная версия Паскаль) пишутся промышленные системы, но делается это программистами, которые так и не смогли избавиться от своих школьных привычек.

В индустрии компьютерных технологий возникают самые различные задачи. Для одной задачи удобен один язык, для второй — другой. В индустрии WEB-программирования популярны языки Perl, PHP. Мало кто пишет динамические сайты на машинных языках типа Си, так как «игра не будет стоить свеч». Зато при написании операционных систем и системных инструментов, при решении задач, где скорость важна, при разработке крупных систем, от которых требуется переносимость, производительность и технологичность, язык Си является стандартом де-факто. Физики и математики (в том числе школьники) просто обязаны познакомится с функциональными языками программирования типа Лиспа, Хаскелла или Mathematica. Mathematica позволяет строить различные модели и интерактивно исследовать их, по ходу дела визуализируя (О языках, предоставляющих инструменты для визуализации данных, следует отвести отдельный разговор.) результаты и анализируя их статистическими и другими методами. Кроме того, Mathematica позволяет производить символьные вычисления, например, находить производные и первообразные функций, вычислять суммы бесконечных рядов, и др. По-своему хороши, интересны и уникальны языки Prolog, Caml, Clips, Assembler — познакомиться с их принципами полезно каждому программисту.

В поисках царского пути

править

Давайте вернёмся к нашему вопросу — какой язык программирования преподавать в школе?

Бесспорно можно сказать лишь одно: каждый из языков стремится удовлетворить определённому набору требований, жертвуя другими. Так, выбор языка для преподавания определяется в конечном итоге педагогическим методом. Нельзя просто «выучиться программированию», ибо это слишком богатая, необъятная и сложная область. Но можно действовать по принципу отбрасывания бесполезного и изучать то, что содержит больше фундаментальных и полезных идей на единицу технических деталей и сложности усвоения. Интересные эксперименты проводятся в московских школах, в школах Петрозаводска, в физико-математической гимназии № 17 города Винницы и многих других школах. А именно, там используются различные современные языки типа Ruby, Python или Java как первые языки программирования, которым учат школьников. Отзывы учителей и школьников очень положительные. За рубежом накоплен большой опыт в преподавании информатики в школах и колледжах с практикой программирования на самых разных языках. В качестве первого языка используются Java, Lisp, Haskell, Си, Паскаль, Prolog и др. Наиболее популярны следующие линейки языков (последовательности изучения):

Высокоуровневый набор
Питон или Руби → Лисп или Хаскелл → Java или C#
Путь уменьшения абстракции от машины
Питон или Руби → Java → Си → Ассемблер

Пути увеличения абстракции:

От ассемблера до самых «человечных» языков
Ассемблер → Си → Питон или Руби
Смещённый в сторону высокоуровневости
Си → Си++, Java или C# → Руби, Питон, Лисп или Хаскелл,
С математическим уклоном
Си → Java → Хаскелл или Mathematica
Набор популярных языков разных видов
Паскаль → Си → Лисп или Хаскелл → Си++ или Java.

Здесь правильнее рисовать дерево зависимостей между языками. Не имеет смысл изучать и Python, и Ruby, ибо они похожи. Изучать их оба значит загружать учащихся двойным грузом технических деталей, и при этом одарить лишь одним стилем программирования (стилем мышления при проектировании программ). Также неправильно рассказывать студентам и про Си, и Паскаль. Время, потраченное на один из них будет просто потеряно зря. Но тем не менее, шаг от Паскаль к Си делали многие программисты, после чего Паскаль успешно ими забывался. Язык Java стоит рассказывать вместо языка Си++, так как Java более модульный и имеет явно выраженную объектную парадигму, да и намного проще в изучении. Не имеет смысла учить Lisp и Haskell одновременно, разве только студентам факультетов и групп, специализированных на функциональном программировании. А школьникам и студентам первого курса достаточно одного из них. Просто полезно получить представление о том, что бывают стили программирования, отличные от императивного. В этом смысле также полезен язык Prolog. Очень много педагогов соглашается, что рассказывать про один язык программирования так же нелепо, как учить повара готовить только одно блюдо (правда очень хорошо). Нет необходимости знакомить учащихся со всеми тонкостями и техническими подробностями языка программирования. Необходимые детали он сможет узнать сам, если его научат пользоваться документацией. Гораздо важнее познакомить учащегося с различными парадигмами программирования (чтобы наш повар знал о китайской, о русской кухне, и имел представления о всех этапах подготовки пищи — от выращивания овощей до сервировки). Но при этом есть опасность того, что наши поварята не смогут приготовить для себя ничего съедобного. Мнений очень много, и нельзя ничего здесь категорично заявлять.

Важно, чтобы учитель информатики не забывал о главном — о том, что цель не изучить конкретный язык программирования (конечно, живые примеры и практика с конкретным языком нужна), а цель в том, чтобы развивать алгоритмическое мышление, знакомить с разными стилями мышления и методами, которые применимы при решении различных задач . Мне кажется, что в школе правильнее познакомиться (без детального изучения) с несколькими языками программирования. Достаточно вместе с классом разобрать несколько простых классических алгоритмических задач, и посмотреть на то, как они решаются на различных языках программирования.

Вот примерный список этих задач:

  • Сложить два введённых числа.
  • Найти максимум из n введённых чисел (однопроходный алгоритм)
  • Найти n-е число Фибоначчи (знакомство с рекурсией).
  • Вывести таблицу умножения (цикл в цикле).
  • Вывести треугольник Паскаля (попробовать рекурсивный алгоритм с запоминанием и без).
  • Найти сумму обратных квадратов натуральных чисел.
  • Определить правильность скобочной структуры («[]», «[[][]]», «[[]]» — примеры правильных скобочных структур, «][», «[[]», «[[]]]]» — примеры неправильных скобочных структур). Найдите однопроходный алгоритм.
  • Сортировка пузырьком и быстрая сортировка. Численные эксперименты по определению времени работы.
  • Найти кратчайший путь в лабиринте.

/* По рассматриваемому вопросу полезно ознакомиться с проектом Информатика-21. Уже в 2006 году предлагался переход на язык Оберон/Компонентный Паскаль http://is.ifmo.ru/education/_v2a_public.pdf */

О программировании

править

Программирование развивает ясность мысли, умение решать новые задачи и логически мыслить.

Дерево эволюции языков программирования

править

 

Дальнейшее чтение

править

В Викиучебнике:

…и так далее по категории «Программирование»

Статьи в Википедии:

Ссылки

править

Официальные страницы языков:

Примечания

править