Статья опубликована в рамках: CXCVIII Международной научно-практической конференции «Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ» (Россия, г. Новосибирск, 14 октября 2024 г.)
Наука: Информационные технологии
Скачать книгу(-и): Сборник статей конференции
дипломов
МЕТОДЫ ОБУЧЕНИЯ ПРОГРАММИРОВАНИЮ
METHODS OF TEACHING PROGRAMMING
Denis Sinitskiy
student of the Department of Automated Control Systems, Lipetsk State Technical University,
Russia, Lipetsk
Gaev Leonid Vitalievich,
Ph.D. in Engineering, Associate Professor, Department of Automatic Control Systems, Lipetsk State Technical University,
Russia, Lipetsk
АННОТАЦИЯ
Статья рассматривает эволюцию методологий обучения программированию, начиная с первых этапов развития информационных технологий и заканчивая современными подходами. Автор анализирует различные методы преподавания, начиная с языка программирования и алгоритмо-ориентированных методов, до более комплексных, таких как алгоритмически-ориентированные и основанные на данных методологии. В статье также уделяется внимание спецификационно-ориентированным методам, которые используют формальные доказательства и математические модели, а также подходам, ориентированным на решение типовых задач, которые особенно эффективны для начального и среднего образования. Основное внимание уделяется тому, как эти методы могут применяться на разных уровнях образования — от начальной школы до университетов и профессиональной подготовки.
ABSTRACT
The article examines the evolution of programming teaching methodologies, from the early days of information technology to modern approaches. The author analyzes various teaching methods, from programming language and instruction-oriented methods to more complex ones, such as algorithm-oriented and data-driven methodologies. The article also focuses on specification-oriented methods, which use formal proofs and mathematical models, as well as problem-solving approaches, which are particularly effective for primary and secondary education. The main focus is on how these methods can be applied at different levels of education, from primary school to universities and vocational training.
Ключевые слова: методология программирования, обучение программированию, алгоритмическое мышление, методы преподавания, языки программирования.
Keywords: programming methodology, teaching programming, algorithmic thinking, teaching methods, programming languages.
Преподавание программирования практически так же старо, как и сама информатика. В начале (до 1950 года) оно означало понимание того, как работают компьютеры и как их можно использовать. В те времена программирование считалось "искусством", программисты использовали различные трюки и создавали новые алгоритмы для каждой задачи. Знания передавались устно, даже в 1950-е годы. Языки программирования были привязаны к определенным вычислительным машинам, поэтому программисты больше времени тратили на детальный подход к решению задач на определенных машинах, чем на суть самих задач. Компьютеры были медленными и с малым объемом памяти.
С появлением языков высокого уровня стало важно преподавать программирование, но обучение сосредотачивалось на одном языке. Учебные задания заключались в понимании инструкций языка и его применении. Современное преподавание программирования начинается с 1970-х годов. Прорыв был достигнут благодаря книге "Структуры в программировании" (Даль, Дейкстра, Хоар, Вирт), предложившей методы деления задач на подзадачи и абстрактные алгоритмы, независимые от конкретного языка программирования.
В конце 1970-х появился другой подход к обучению, основанный на особенностях мышления детей, разработанный главным образом Сеймуром Пейпертом. С тех пор было создано множество методик преподавания программирования. Некоторые из них устарели, но многие до сих пор используются на разных уровнях обучения.
Вот список самых распространённых методов в обучении программированию:
- методически-алгоритмический
- ориентированный на данные
- ориентированный на спецификации
- ориентированный на тип задачи
- ориентированный на язык программирования
- ориентированный на инструкции
- математически ориентированный
- ориентированный на аппаратное обеспечение
- ориентированный на модели.
Отметим, что большинство преподавателей предпочитают использовать несколько методов одновременно, а не придерживаться одного.
Метод, ориентированный на алгоритмы. Этот метод, как и многие другие, охватывает весь процесс программирования: определение проблемы, спецификации, планирование алгоритма и структуры данных, проверку корректности, кодирование, тестирование, выявление и исправление ошибок, контроль эффективности и качества, документацию. Каждая деятельность выполняется отдельно, с использованием подходящих инструментов. Особое внимание уделяется разработке алгоритмов, которая является ключевым этапом, и на этом делается акцент в обучении. В более поздних этапах также присутствуют элементы, ориентированные на алгоритмы.
Основная идея разработки алгоритма — систематический подход. Первый шаг — выделение общих типов задач и моделей их решений, т. е. программных теорем. Второй шаг — редукция задач к программным теоремам, определение способов их применения. Особенность метода в том, что одновременно анализируются спецификация и алгоритм. На третьем этапе программные теоремы комбинируются для их совместного применения. Важно задать правила интерполяции программ как для спецификации, так и для комбинации алгоритмов.
Планирование структуры данных основано на методологии программирования: структура данных определяется как тип с описанием спецификации, представлением структуры и реализацией операций. На этапе кодирования принимается множество решений в зависимости от используемого языка программирования, но основной упор делается на алгоритмы, включая преобразования между итеративными и рекурсивными алгоритмами.
Этот метод также охватывает инструменты удобного программирования, например, реализацию контекстного меню. Для тестирования рассматриваются методы, основанные на спецификации (черный ящик) и алгоритме (белый ящик). Контроль эффективности осуществляется с помощью алгоритмов, включая классификацию проблем по времени выполнения и сложности. Программный язык не играет ключевой роли в этом методе, что освобождает программистов от привязки к конкретному языку.
Один из главных принципов алгоритмической концепции — это возможность программиста мысленно стать исполнителем алгоритма, что способствует неформальному пониманию его корректности и улучшает работу в различных моделях.
Метод, ориентированный на данные. Этот метод фокусируется на организации данных и их представлении как центральных элементов разработки. Программирование в рамках данного подхода начинается с анализа структуры данных, выявления их взаимосвязей и оптимизации их расположения в памяти. Основной целью является повышение производительности и эффективности программ за счёт уменьшения затрат на доступ к данным и улучшения кэширования. [1, 2]
Первым шагом является определение форматов данных и их структуры, исходя из требований задачи. Вместо того чтобы исходить из поведения системы (как это делается в объектно-ориентированном программировании), здесь акцент делается на том, как данные будут использоваться на уровне аппаратного обеспечения. Это включает в себя оптимизацию использования кэш-памяти процессора, выравнивание данных и минимизацию пропусков в доступе к памяти.
На следующем этапе происходит разделение данных на небольшие, чётко определённые блоки, которые можно эффективно обрабатывать в циклах. Этот этап также подразумевает анализ потоков данных и их пересечения, что позволяет минимизировать избыточность и избегать ненужных вычислений.
Кодирование в данном подходе сводится к организации операций так, чтобы они соответствовали структуре данных. В результате получается код, оптимизированный для работы с большими объёмами данных, в котором основное внимание уделяется потоку данных через систему, а не взаимодействию объектов или функций.
Тестирование и отладка в данном подходе сосредоточены на измерении производительности и выявлении узких мест в обработке данных. Эффективность алгоритмов оценивается по тому, насколько хорошо они работают с реальными данными и насколько оптимизированы для современных архитектур процессоров. Таким образом, ключевым показателем успешности программы является её способность эффективно обрабатывать большие объёмы данных в реальных условиях.
В отличие от других методов, подход, ориентированный на данные, часто требует использования конкретных языков программирования или инструментов, которые поддерживают низкоуровневую работу с памятью и оптимизацию данных. [3]
Метод, ориентированный на спецификацию. Этот метод имеет много общего с двумя предыдущими, однако он выделяет формальную спецификацию как центральный и самый значимый элемент процесса разработки программного обеспечения. В данном подходе алгоритм выводится из спецификации автоматически, после чего код создаётся по жёстким инструкциям, строго следуя установленным правилам кодирования. Как и в методе, ориентированном на алгоритмы, здесь также используются программные теоремы, однако алгоритмы этих теорем выводятся непосредственно из заданной спецификации.
Особенность данного подхода заключается в том, что если в алгоритмически ориентированном методе ключевую роль играет трансформация алгоритма, то здесь основной упор делается на трансформацию самой спецификации. Это означает, что весь процесс разработки программного обеспечения, начиная от структуры данных и заканчивая алгоритмами, строится на теоретических основах, которые включают доказательства корректности, необходимые для эффективной реализации программных решений. Таким образом, предметы, связанные со структурами данных и алгоритмами, могут содержать больше теоретических аспектов и основываться на доказуемых теоремах и правилах их применения.
Каждый этап разработки в рамках этого метода включает математическое осмысление и проработку, что делает его особенно требовательным к уровню теоретической подготовки разработчика. Этот подход требует не только глубокого понимания математики, но и способности к абстракции, поскольку каждая фаза — от спецификации до реализации — связана с высоким уровнем абстрагирования от конкретных данных и операций.
Метод ориентирован на создание программ, которые базируются на формальных моделях, где каждое решение поддаётся строгому логическому анализу и проверке. Дизайнеры программ должны обладать не только навыками программирования, но и способностью понимать глубокие математические концепции, которые лежат в основе каждого алгоритма и структуры данных. Ключевой особенностью является то, что разработка программного обеспечения здесь проходит через этапы формализации, трансформации и доказательства, что делает его применимым для систем, где ошибки недопустимы, а надёжность программ критически важна, например, в системах безопасности или в финансовом секторе.
Не рекомендуется начинать использование данного метода без достаточного уровня подготовки, так как математическая сложность и необходимость строгого логического мышления делают его доступным только для специалистов с высоким уровнем теоретической подготовки.
Метод, ориентированный на язык программирования. Это один из самых старых подходов, где, как и в предыдущем случае, цель — создание эффективной программы. Важная особенность данного метода заключается в тесной привязке к конкретному языку программирования, что видно из следующих примеров. Часто можно услышать такие разговоры:
- «Чему ты учишься в программировании?»
- «Паскалю».
Иными словами, есть "программисты на Паскале", "программисты на С", и так далее. Основная идея этого метода заключается в том, что обучение ведётся через один конкретный язык программирования, и программные понятия объясняются с его помощью. Поскольку в центре внимания здесь сам язык программирования, метод включает множество специфичных для языка понятий, которые могут восприниматься как общие термины программирования. Например, команды DATA-READ-RESTORE в языке BASIC часто запоминаются как общее знание, хотя они характерны только для этого языка. Это одна из причин, почему программисты, освоившие только один язык, сталкиваются с трудностями при переходе на другой.
Ещё одной проблемой является то, что сложность отдельных языковых элементов не всегда коррелирует с их применением на практике, что может быть недостаточно подчеркнуто при обучении, ориентированном на язык. Примером этого являются команды условного ветвления и предварительной проверки цикла (в Паскале это IF и WHILE). По языковым критериям они примерно одинаково сложны, однако задачи, требующие циклов, встречаются в программировании гораздо чаще, чем задачи, ограниченные ветвлениями.
Кроме того, существуют программные концепции, такие как стек, очередь, методы сортировки, которые не связаны напрямую с элементами конкретного языка программирования (по крайней мере, для языков, которые обычно преподают), и поэтому могут быть исключены из процесса обучения. Однако, несмотря на это, существует ряд успешных примеров, особенно связанных с языками программирования, которые отличаются от традиционных языков, основанных на принципе фон Неймана. [5]
Метод, ориентированный на тип задачи. Этот метод принципиально отличается от предыдущих четырёх. Программирование здесь рассматривается как единая глобальная деятельность, которую невозможно разделить на отдельные части. В отличие от предыдущего подхода, здесь всегда работаем с целой программой. Это будет верно и для следующих методов. Метод последовательно проходит через все этапы разработки, открывая новые подходы на каждом шаге. Мы начинаем с определённого класса задач, часто связанных с классической математикой, например, с задачами теории чисел (делимость, простые числа, разложение на простые множители), хотя этот метод с успехом применим в других областях, особенно в сфере начального и среднего образования, таких как:
- графика
- обработка текста
- стандартные алгоритмы
Суть метода заключается в решении серии взаимосвязанных задач. Для решения каждой новой задачи нам требуются новые программные понятия и элементы, которые "изобретаются" по мере необходимости для решения конкретной проблемы. Это делает процесс обучения более естественным: новые знания появляются из практической потребности, а не подаются абстрактно. К тому же решение задачи идёт параллельно с усвоением знаний, а высшая степень понимания – это умение применять новое знание на практике.
Метод, основанный на распространённых алгоритмах, особенно подходит для знакомства с программированием в раннем возрасте (в первые годы начальной школы или даже в детском саду). Он строится на врождённых знаниях ребёнка, и программные понятия выводятся из этого. Важно отметить, что алгоритмы давно преподаются в детских садах и начальных школах, хотя это и не связывали с обучением информатике и алгоритмизации. Следует также подчеркнуть, что концепция "алгоритм работает так же, как мы делали бы это вручную" используется во многих методах обучения программированию. [4]
Инструкция-ориентированный метод. Этот метод похож на подход, ориентированный на язык программирования, однако здесь основной акцент делается не на конкретном языке, а на общем типе языков программирования. Это ключевое отличие между двумя методами: вместо привязки к одному специфическому языку, метод основан на абстракции общих элементов языков, что решает проблемы, возникающие при использовании одного языка. Однако проблемы, связанные с обобщением, остаются.
Метод определяет основные элементы программирования, соответствующие принципу фон Неймана:
- присваивание, выражения;
- ввод и вывод данных;
- ветвления (операторы IF, Case);
- итерации (счётные циклы, циклы с пред- и постусловиями);
- функции и операторы;
- модули.
Хотя метод избегает привязки к конкретному языку, он сохраняет все недостатки предыдущего подхода. Проблемы, связанные с неудачным выбором языка, устранены, однако остаются те же сложности с обучением, поскольку привязка к конкретной реализации инструкций может по-прежнему затруднять переход между различными языками и подходами. Этот метод может считаться рискованным, поскольку он наследует недостатки подхода, ориентированного на язык программирования, такие как сложности с пониманием универсальных понятий программирования, не зависящих от конкретного языка.
Математически ориентированный метод. Этот подход основан на понятиях другой дисциплины — в нашем случае это математика, хотя это может быть любая другая наука. Проблемы, которые необходимо решать в процессе программирования, берутся из математики, причём каждая задача строится на предыдущих, следуя математическим принципам и логике. Однако, несмотря на структурированность математической теории, нет гарантии, что такая последовательность задач будет логична или завершена с точки зрения программирования.
Главная сложность этого подхода заключается в соблазне следовать внутренней логике и красоте математики, не учитывая реальные цели программирования. Внутренняя структура математики может не совпадать с задачами программирования, что может создать несоответствие между учебными задачами и реальной целью — созданием работающих программ. Тем не менее, для некоторых преподавателей и студентов математика может стать привлекательным инструментом для обучения программированию, благодаря своей строгости и теоретической глубине.
Интересным примером такого подхода является учебник, написанный Миклошем Симоновицем и Маргит Гемеш, который, хотя и был выпущен на ранних этапах развития метода, демонстрирует высокий уровень проработки и логической взаимосвязи между математическими задачами и их программной реализацией. Однако, даже этот высокий уровень не устраняет проблему: математическая логика не всегда совпадает с требованиями программирования, что требует дополнительных усилий для интеграции этих двух дисциплин в единое образовательное русло.
Метод, ориентированный на аппаратное обеспечение. Этот метод предполагает, что знание алгоритмов невозможно понять без знания языков высокого уровня; знание языков программирования невозможно без понимания ассемблера или машинного кода; а знание ассемблера — без понимания работы процессора и других аппаратных компонентов. Этот подход основывается на привлекательной, но ошибочной логике, что знания программирования должны строиться «снизу вверх», следуя такой цепочке:
- Чтобы понимать структуру инструкций ассемблера и уметь выполнять программы на этом уровне, нужно знать, как работают процессоры.
- Освоив язык ассемблера, можно понять, как работают инструкции языков высокого уровня.
- Зная инструкции языков высокого уровня, легче понять, как работают конкретные алгоритмы.
В результате этот метод утверждает, что знание программирования (в частности, алгоритмов и моделирования данных) не нужно до университетского или колледжного уровня. Однако это утверждение полностью противоречит факту, что базовые навыки алгоритмического мышления и исполнительных способностей необходимы каждому, как это подчёркивается в области общественной информатики.
Основные проблемы этого подхода:
- Игнорирует важность алгоритмического мышления на ранних этапах обучения.
- Предполагает, что понимание аппаратного уровня важно для освоения программирования, что не всегда оправдано для повседневных задач.
- Может отложить реальное изучение программирования до поздних этапов образования, упуская возможность раннего знакомства с логикой и структурой программ.
Оценка Методов. В заключение можно сказать, что каждый из методов, рассмотренных в этой работе, имеет свои сильные и слабые стороны. Алгоритмический подход отличается систематичностью и упором на разработку корректных и эффективных алгоритмов, что особенно полезно при обучении начинающих программистов. Однако, при всей своей теоретической мощи, этот метод может быть чрезмерно сложным для освоения на практике без достаточной подготовки и понимания базовых принципов. Данные, как центральный элемент разработки, определяют подход, ориентированный на работу с большими объемами информации, но такой метод требует более глубокого понимания низкоуровневых аспектов работы с памятью и архитектурой компьютера.
Методы, ориентированные на спецификацию и язык программирования, подчеркивают важность формальных правил и стандартов в процессе создания программного обеспечения, что делает их незаменимыми в высококритичных сферах. Однако они также накладывают ограничения, связанные с жесткостью используемых моделей и привязкой к конкретным языкам. Наконец, методы, ориентированные на тип задачи и аппаратное обеспечение, позволяют более гибко подходить к процессу обучения, адаптируя его под конкретные задачи и уровень подготовки учеников, что делает их особенно полезными в образовательных целях.
Каждый из этих методов может найти свое применение в зависимости от контекста и целей, и их комбинирование может дать наилучшие результаты как в обучении, так и в профессиональной практике разработки программного обеспечения.
Список литературы:
- Джексон М.А. Принципы проектирования программ // Academic Press, 1976.
- Джексон М.А. Структурно-ориентированное программирование // В: Преобразование программ и программные среды. Springer, 1984. С. 169-180.
- Бентли Дж.Л. Программные жемчужины // Communications ACM, февраль-ноябрь 1984, том 27, № 2-11.
- Костер Х.А. Систематическое изучение программирования // Educaboek, 1984.
- Николсон А. Э., Фрейзер К. М. Методологии обучения новым языкам программирования: пример обучения LISP // Communications of the ACM, 1997.
дипломов
Оставить комментарий