Archive for

Декабрь, 2011

...

Естественное понимание

По итогам очередного обсуждения на одном из форумов читабельности синтаксиса различных языков программирования решил опубликовать еще одну цитату из упоминавшейся ранее книги 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% предложил работоспособное решение. В большинстве предложенные решения были неэффективными (в них использовался централизованный арбитраж), так что студентам еще предстоит многому научиться. Тем не менее, сам факт решения задачи параллельной обработки наводит на мысль, что трудности с программированием у студентов возникают из-за неподходящего инструментария. Возможно, студенты в большей степени способны к компьютерному мышлению, чем нам кажется.

Недавний выпускник в своем первом программном проекте

Читаю сейчас книгу Making Software: What Really Works, and Why We Believe It*, хочу процитировать отрывок из главы о первых шагах выпускников ВУЗов в профессиональной разработке ПО. По-моему, это интересно.

Студентам, входящим в трудовой коллектив профессиональных программистов, приходится осваивать новые навыки, методы и процедуры, то есть фактически снова оказываться в роли новичков. Для многих оказывается неожиданным то обстоятельство, что социальные навыки являются важным компонентом их новой работы [Curtis et al. 1988], [Perkins et al. 1989].

Шейн предположил, что процесс вхождения новичков в организацию имеет три основных аспекта: функциональный, иерархический и социально-сетевой [Schein, 1971].

Функциональный аспект
Задачи и технические требования должности. Необходимые знания в достаточном объёме преподаются на учебных курсах общих (программирование, структуры данных, программотехника и т.д.) и специализированных дисциплин (графика, искусственный интеллект, операционные системы).

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

Социально-сетевой аспект
Продвижение новичков с периферии к центру сети по мере формирования личных связей. К сожалению, этот аспект слишком часто полностью упускается из виду в процессе обучения. В лучшем случае преподаватели напоминают о том, что обманывать и слишком тесно сотрудничать над домашними заданиями не хорошо.

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


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