В течение последних более чем 15 лет на
нашем факультете для начального обучения студентов программированию используется язык программирования
Паскаль, который изучается в рамках курса
«Алгоритмы и алгоритмические языки». В последние годы все чаще высказываются мысли о том, что не пора бы его заменить, например, на
Си. Мой коллега по
кафедре, Андрей Викторович
Столяров обстоятельно
высказался по этому вопросу, чем натолкнул.
Я согласен, что переход от Паскаля к Си скажется на качестве подготовки студентов крайне негативно. Четвертый год по окончании факультета занимаясь преподаванием практикума по программированию (два года на втором курсе, где изучается Си, а теперь и на первом, где Паскаль), я, при мощной интеллектуальной поддержке коллег по факультету и по промышленности, понемногу приближаюсь к пониманию того, как и почему должно быть устроено программирование в голове у квалифицированного специалиста, и каким образом мог бы способствовать этому наш факультет. Воспользуюсь поводом хотя бы фрагментарно привести мысль в порядок. ;)
Характерной особенностью занятий по практикуму является то, что работа собственно на машинах под присмотром преподавателя составляет чуть менее чем четверть времени (6-7 из 32 семинаров в семестре, не считая 32 лекций). Иными словами, существенную часть времени, особенно в начале семестра, студенты проводят в программировании на доске и на бумаге, используя вначале базовые вычислительные модели и соответствующие им формы записи алгоритмов (
машины Тьюринга,
нормальные алгорифмы Маркова), затем переходя к более высокоуровневой модели, основанной на языке Паскаль.
Ключевым фактором успешного освоения программирования является, на мой взгляд, умение когнитивно ухватить (как метко выражается Э. Дейкстра, «to get an
intellectual grip») модель целиком, так, чтобы уметь в каждом конкретном случае разобрать написанный фрагмент программы до отдельных, полностью определенных элементов, и составить максимально точно представление о его смысле, то есть о вычислении, которое будет произведено исполнителем. С многократной постановкой себя на место исполнителя, письменным и мысленным исполнением рассматриваемых программ практикант привыкает к преимуществам качественного понимания процессов, происходящих в исполнителе, и учится целенаправленно этого понимания добиваться, в том числе и при работе на машине, попутно осваивая вспомогательные к этому средства, такие как отладочная печать, пошаговая отладка и т.п.
Иными словами, вначале тренируется работа на максимальном уровне понимания за счет использования когнитивно небольших моделей, затем происходит повышение размера и выразительной мощности модели (элементов больше, комбинаций и смыслов больше, уровень абстракции выше, те же алгоритмы теперь записываются короче), с сохранением требования к полноте понимания (так, на письменных контрольных работах по Паскалю нельзя пользоваться транслятором и вообще вычислительной техникой, а на письменном экзамене - вообще ничем кроме собственных знаний).
Такие вычислительные модели как машина Тьюринга, нормальные алгорифмы Маркова и язык программирования Паскаль образца
ISO 7185:1983 могут быть в рамках первого семестра обучения в университете изучены полностью, с выработкой у студентов того самого качественного понимания. Язык Си - нет. Проблемы с объяснением даже простеших программ проиллюстрированы в статье А.В. Таким образом, на начальном этапе изучения программирования (возьмем первый семестр или даже первый курс) невозможно полностью освоить язык Си и соответствующую ему вычислительную модель.
А что возможно?.. Очевидно, освоить неполностью.
Ну а поскольку речь идет о начальном этапе обучения, когда закладываются основы дисциплины мышления в определенной области, чрезвычайно важно следить за тем, что именно закладывается.
Использование неполностью освоенного инструмента в условиях острой необходимости решить задачу в кратчайшие сроки соблазняет к снижению строгости рассуждений, предпочтению метода проб и ошибок, и т. п. Это чревато закреплением и развитием такого подхода к решению задач, который вообще основан на адаптации шаблонов применения элементов, понимаемых как черные ящики -- в лучшем случае в рамках внешней спецификации, в худшем -- в рамках своего внешнего поведения, наблюдаемого в течение кратчайшего периода экспериментального освоения.
Быстрейшее решение методом проб и ошибок, подражания и адаптации шаблонов, несомненно, позволяет для ряда актуальных задач получать приемлемый результат с небольшими затратами. Пожалуй даже, подобная шаблонно-ориентированная деятельность довольно характерна для т.н. "промышленного программирования" (неполным списком: собственно,
шаблоны проектирования (
GoF),
проприетарные API/SDK с упором на справочник с примерами, «
вначале-тест-затем-простейшая-реализация»-программирование).
Понятно также, каким промышленным требованиям это служит: повторное использование ранее изготовленного, стандартизация и взаимозаменяемость сотрудников, снижение рисков и затрат, и т.п.
Думается, что квалифицированному программисту подобает владеть более чем одним из описанных подходов к решению задач, да и вообще уметь осознать объем и качество своего понимания предстоящей ему темы и подготовить себя до подходящего уровня.