Самое простое, но трудное

Самое простое, но трудное

Люди, начиная изучать программирование, сталкиваются со значительными трудностями. Исключений совсем немного, и впору назвать данное утверждение правилом. Интересно попытаться исследовать природу затруднений начинающих. Это имеет больший смысл, чем может показаться. Дело в том, что вопросы, с которыми они сталкиваются, тесно связаны с самой сущностью программирования. Упражнения, предлагаемые новичкам, всегда просты. Нелегким оказывается постижение основополагающих принципов.

Положение парадоксальное: рассуждать о проблемах начинающих берется далеко не новичок. Разве не правильнее спросить их самих? Смешно, когда о трудностях, связанных с обучением младенцев прямохождению, судит взрослый человек. Согласен, сравнение неверно. Но есть другое, точное: обучение грамоте.

Хотите верьте, хотите нет, но в русском языке мало что "пишется так, как слышится". Давным-давно научившись письму, я был просто поражен, когда моя дочь начала писать, ошибаясь в каждом слове.

Глядя на ее ошибки, я неожиданно понял, что она пишет именно то, что слышит. Это мы, взрослые, настолько зашорены своими прочно усвоенными знаниями, что бессознательно искажаем действительность и не можем судить о фактах объективно.

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

То, о чем я пытаюсь толковать, можно выразить иными словами: правильный вопрос в состоянии задать только знающий львиную долю ответа. Невозможно дать верный ответ на неверный вопрос. Приходится давать верный ответ на верный, но лишь предполагаемый вопрос. Как в анекдоте: "Этот вопрос я сам придумал, поскольку у меня есть замечательный ответ." Итоговый вывод малоутешителен. Одни не понимают, другие давно забыли. Одни задают вопросы, не имеющие отношения к сути дела, другие отвечают им тирадами на посторонние темы. Самое поразительное, что первые все-таки обучаются и неуклонно превращаются во вторых. Складывается впечатление, будто процесс обучения и усвоения знаний интуитивен, бессознателен и иррационален по своей природе, принципиально не поддающейся исследованию. Окажись это не так, мы, наверное, давно бы наслаждались общением с разумными самообучающимися машинами или боролись с ними за мировое господство.

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

Она состоит в однозначности и контекстной независимости предложений языков программирования. Привыкнув без труда справляться с неоднозначностью и контекстной зависимостью языка человеческого общения, люди теряются перед языками машинными. Формальные, более чем примитивные, языки программирования кажутся им сложными, хотя они не сложны, а просто невнятны и невразумительны.

Свой вклад в копилку недоразумений вносят широко применяемые в постановках и разъяснениях учебных задач сбивающие с толку антропоморфизмы. Скажите на милость, с какой стороны подойти к написанию программы, которая должна "ввести, начертить, рассортировать"? Студент невольно прибегает к человеческим аналогиям и попадает впросак. Ведь нельзя сказать компьютеру "Ну-ка нарисуй!" Точно также нельзя, что бы там ни говорили учителя, представить, как сам делаешь это "по шагам". Сам просто берешь карандаш - и рисуешь! Из этого следует общая проблема новичков: в записываемые предложения программ они невольно вкладывают подразумеваемый, но не соответствующий действительности смысл.

Они лишь предполагают там, где следует знать. Это объяснимо: общаясь с человеком, можно лишь предполагать понимание с его стороны, а знать - невозможно. Начинающие не умеют анализировать написанное в уме, превращая свой мозг в подобие компьютера, исполняющего программу. Точнее, не умеют записывать уже проанализированное.

Этот способ выражения мыслей им просто неизвестен. Согласитесь, люди так не поступают. Когда вы говорите, то в первую очередь выражаете свои мысли и чувства, учитывая (зачастую бессознательно) возможную, хотя и редко предсказуемую реакцию собеседника. В программировании поступают прямо противоположным образом. Совершенно сознательно выражают только то, что вызовет строго определенную реакцию со стороны компьютера. Эта реакция - решение поставленной задачи. А о собственных мыслях программиста вообще нет речи.

Хотите приведу пример из жизни? Мне рассказывали о парне, который развлекался тем, что реагировал буквально. Спросивший, есть ли у него закурить, получал ответ "есть", но не саму сигарету. Развив эту тему, можно хорошо осознать разницу между однозначностью и неоднозначностью языка.

Еще больше путает факт, что антропоморфные формулировки имеют право на существование, более того, без них не обойтись.

Когда (неизвестно откуда) приходит некоторый опыт, уже не новичок с воодушевлением обнаруживает, что способен перевести словесную постановку задачи в построения из операторов изучаемого языка программирования. Более того, при известной практике он может посмотреть на текст программы и сказать: "А! Она делает то-то и то-то." Словом, язык программирования - все-таки язык, а программист - переводчик. Учиться программировать означает учиться переводить, что непросто само по себе.

Задача осложняется тем, что слова и предложения машинного языка не имеют ничего общего с человеческим. Зато язык машины несравненно беднее людского. Трудности вызваны не языком машины, а тем, что машина не похожа на человека.

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

Когда начинающему объясняют смысл операторов языков программирования, то всегда прибегают к пояснениям происходящего в компьютере при исполнении этих операторов. Тем самым его снабжают интуитивно ясными элементарными "кирпичиками" знания. Из них новичок в конце концов возведет свое понимание программирования и перестанет быть начинающим.

Подводя итог рассуждениям, хочу сказать, что главные трудности, с которыми встречаются люди, впервые сталкивающиеся с программированием, по моему глубокому убеждению, носят не интеллектуальный, а психологический характер.

Евгений Щербатюк


Компьютерная газета. Статья была опубликована в номере 15 за 1997 год в рубрике программирование :: разное

©1997-2024 Компьютерная газета