По итогам очередного обсуждения на одном из форумов читабельности синтаксиса различных языков программирования решил опубликовать еще одну цитату из упоминавшейся ранее книги Making Software: What Really Works, and Why We Believe It, из главы про обучение программированию:

Л.А. Миллер попросил участников своего исследования написать указания для задачи, которую должен выполнять кто-то другой [Miller, 1981]. Участники получали наборы данных (например, информацию о работниках, должностях и зарплате) и задачи вида:

Составьте список работников удовлетворяющих хотя бы одному из следующих критериев.
1) Работник занимает должность техника и зарабатывает не менее 6 долларов в час.
2) Работник не состоит в браке и зарабатывает менее 6 долларов в час
Список должен быть упорядочен по имени.

Миллер узнал много нового о том, что было трудно, а что было просто для участников. Прежде всего все участники эксперимента справились со своей задачей. Он не говорит, что 1/3 участников сдались или потерпели неудачу, как это постоянно происходит на курсах программирования. Похоже, проблема связана не со сложностями описания процесса.

Ключевое различие между решениями задач Миллера на естественном языке и задачами по программированию, изучавшимися предыдущими исследователями, относится к структуре решения. Участники эксперимента Миллера определяли не итерации, а операции. Например, они не говорили: «Возьмите каждую запись и проверьте, если она начинается с буквы ‘А’…» Вместо этого они использовали формулировки вида: «Для всех фамилий начинающихся с буквы ‘А’…» Миллера это удивило: никто не указывал условие завершения цикла. Некоторые участники говорили о проверяемых IF-подобных конструкциях, но никто и никогда не использовал ELSE. Уже одни эти результаты указывают на возможность определения языка программирования на естественном уровне более понятного для новичков.

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

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

Группа исследователей, называющая себя CCG (Commonsense Computing Group), занялась изучением подобных вопросов. Студентам, не прошедшим даже начальный курс программирования, было предложено решить нетривиальные алгоритмические задачи (такие как сортировка и параллелизация процессов) на естественном языке, до изучения каких-либо программных конструкций. Участники эксперимента на удивление успешно справлялись с этими задачами.

В одном из исследований [Lewandowski et al. 2007] студентам было предложено создать модель театра с двумя продавцами билетов:

Предположим, билеты заказываются по телефону следующим образом: когда покупатель звонит и заказывает n билетов, продавец (1) находит n лучших свободных мест, (2) помечает эти n мест как зарезервированные и (3) обсуждает с клиентом условия покупки (запрашивает номер кредитной карты, отправляет билеты в окно выдачи и т.д.). В театре одновременно работают несколько продавцов. Какие проблемы могут возникнуть, и как предотвратить эти проблемы?

Задача была предложена 66 участникам из 5 образовательных учреждений — и они решили ее с поразительным успехом! Как видно из табл. 7.2, почти все студенты распознали суть проблемы, а 71% предложил работоспособное решение. В большинстве предложенные решения были неэффективными (в них использовался централизованный арбитраж), так что студентам еще предстоит многому научиться. Тем не менее, сам факт решения задачи параллельной обработки наводит на мысль, что трудности с программированием у студентов возникают из-за неподходящего инструментария. Возможно, студенты в большей степени способны к компьютерному мышлению, чем нам кажется.