Найти в Дзене
ПК и ИГРЫ

Программирование

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

Больше интересного тут - boosty.to/ataman1399

Что такое программирование?

Аннотация

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

Введение

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

Исторические определения

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

Тем не менее, эти ранние публикации сейчас редко цитируются, и будет поучительно процитировать их. Хартри (1950) объяснил: "Процесс подготовки расчета для машины можно разбить на две части: "программирование" и "кодирование". Программирование - это процесс составления расписания последовательности отдельных операций, необходимых для выполнения вычислений" (Хартри 1950, стр. 111). Кодирование, конечно, было чрезвычайно трудоемким до разработки языков ассемблера, но программирование вскоре стало преобладающим видом деятельности. Уилкс (1956) провел различие между программой и другими формами расчетов следующим образом: "Последовательность заказов известна как программа, и машина выполняет ее автоматически без вмешательства пользователя" (Wilkes

1956, стр. 2).

Тот факт, что для выражения программы была разработана нотация или язык, привел к появлению метафор программирования как коммуникации: "Программирование по сути, это процесс перевода с языка, удобного для людей, на язык, удобный для компьютера" (McCracken, 1957).

Обратите внимание, что это определение, по-видимому, охватывает более раннюю деятельность по кодированию, уже менее значимую. Фактически определение можно было бы даже поменять местами: "Процесс организации вычислений может быть разделен на две части - математическую формулировку и фактическое программирование перевод на язык вычислительной машины" (Booth 1958). К концу первого десятилетия компьютерных исследований представления о программе как автоматической последовательности, программировании как математической спецификации и лингвистическом переводе между ними были прочно закреплены. "Эта последовательность [основных операций] называется программой, а процесс ее подготовки называется программированием" (Врубель 1959, стр. 4). Программирование - это "подготовительная работа" по нахождению точной математической формулировки и метода решения, возможно, записанных на "удобном проблемно-ориентированном языке", символы которого "более тесно связаны с математической задачей, подлежащей решению".

14thСеминар Группы по интересам "Психология программирования", Университет Брунеля, июнь 2002 г. www.ppig.org Blackwell ii

Определения исследований

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

За пределами области психологии программирования) эти достижения могут рассматриваться учеными-компьютерщиками как более или менее элегантные или интуитивно понятные (Blackwell & Hague 2001b), но критерии для определения этих терминов часто (как в математике) являются предметом вежливого согласия, а не эмпирического исследования.

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

Что касается этой обычной деятельности по программированию как таковой, то наблюдаемый характер задачи больше всего зависит от мастерства программиста - как отметил анонимный рецензент этой статьи, это очень часто обсуждается на многих онлайн-форумах. Типичным примером была тема "Насколько сложно программировать?". в списке PPIG-discussion, в котором Брукс заметил, что "коэффициент 4-5 для различий в производительности программистов уже существенно выше, чем почти любой другой человеческий навык" (Brooks 2001). Среди опубликованных исследований несколько авторов книги

"Психология программирования" (Hoc, Green, Samurcay & Gilmore 1990) в общих чертах описывают когнитивные проблемы программирования. Примеры включают "Программирование - это деятельность человека, которая является большой проблемой" (стр. 3) или "Программирование - это чрезвычайно разнообразная деятельность" (стр. 21). В разделе, озаглавленном (как и в этой статье) "Что такое программирование?" делается вывод о том, что "Важнейшими измерениями в деятельности по программированию являются обработка и представление" (стр. 160). Но это определение может относиться практически к любому человеческому когнитивному навыку.

Дальнейший анализ приводит также к подзадачам, выходящим за рамки программирования, таким как "понимание проблемы, проектирование, кодирование и сопровождение" (стр. 46), и, таким образом, к наблюдению, что "программирование является сложной когнитивной и социальной задачей" (стр. 47). Многие навыки профессионального программиста связаны с социальным контекстом, а не с техническим - написание и интерпретация технических документов, участие в совещаниях по проектированию, оценка усилий и так далее. На самом деле действия, описанные в ранних текстах по программированию выше (теперь называемые "дизайн" и "кодирование"), являются небольшим компонентом работы профессиональных программистов. Одной из реакций на это в исследовательском сообществе стало расширение сферы исследований, включив в них различные социальные аспекты (а не просто когнитивные) задачи профессионального программиста. Это приводит к таким исследовательским вопросам, как "Что мы можем предположить о навыках, методах работы, прошлом, обмене информацией друг с другом? Работают ли они по отдельности или вместе? и т. д." (Зеленая 1998) в настоящей работе предлагается двигаться в другом направлении - от обычного программирования и программной инженерии, чтобы сосредоточиться на характеристике познавательных задач по программированию, является ли или не они происходят в социальном контексте, который обычно называется программированием.

Технические факторы для переоценки

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

PPIG 2002, Университет Брунеля

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

Определение A: Кто такой программист?

Когда Вайнберг писал свою раннюю монографию "Психология компьютерного программирования" (Weinberg

1971), предполагалось, что каждый серьезный пользователь компьютера будет программистом. Он использовал термин "программист" почти как синоним слова "пользователь" (некоторые люди выполняли рутинные операции, такие как ввод данных или управление заданиями - но они существовали исключительно для обслуживания программистов). Именно разработка стандартизированного упакованного программного обеспечения (которое не требовало программистов на этапе использования) и более сложных интерактивных приложений (которые требовали специальной подготовки и опыта вне программирования) привела к появлению классов профессиональных пользователей компьютеров, которые не были программистами. Демаркационные линии в сообществе разработчиков программного обеспечения всегда были подвижными в результате изменения инструментов программирования. Например, различие между "аналитиками" и "программистами" стерлось, когда 4GLs позволили программировать на уровне абстракции, который был сопоставим со словарным запасом аналитика. Таким образом, аналитики стали аналитиками / программистами в 1980-х, а к 90-м годам их снова стали просто называть программистами. Те же тенденции наблюдались и в других профессиях специалистов . Инженеры по модульному тестированию изначально были программистами (которые писали тестовые наборы), затем простыми операторами инструментов регрессионного тестирования, затем снова программистами, когда инструменты тестирования стали программируемыми. Последние тенденции заключаются в увеличении числа людей, которые могли бы заниматься программированием в ходе своей работы. Почти все основные программные приложения включают в себя языки сценариев или макроязыки того или иного рода, используемые для настройки поведения приложения. Большинство операционных систем включают в себя языки сценариев. Один из наиболее широко используемых классов программных продуктов, электронные таблицы, сам по себе является декларативным языком программирования. Многие люди, которые не являются профессиональными программистами, используют электронные таблицы для создания больших и сложных приложений, таким образом наследуя все проблемы разработки программного обеспечения, связанные со спецификацией, проектированием, тестированием и обслуживанием.

Это явление все чаще описывается как "программирование конечным пользователем". Конечные пользователи обычно определяются такими терминами, как "люди, для которых программирование не является основной работой". Это также делает различие между аналитиками, которые когда-то представляли требования пользователей программистам, но сами не были пользователями, и конечными пользователями, которые создают программы для собственного использования. Эти аспекты термина "конечный пользователь" становятся понятными, но использование слова "программирование" в данном контексте менее актуально. Превосходный веб-сайт Goodell, посвященный этой теме (Goodell 1999), предлагает определения "конечного пользователя" и " программирования конечного пользователя", но не "программирования". Разработка для конечных пользователей, кастомизация для конечных пользователей и разработка программного обеспечения для конечных пользователей также были предложены в качестве выражения проблем, с которыми сталкиваются пользователи, сталкиваясь с этими новыми инструментами. Некоторые из этих терминов явно преуменьшают сложность требуемого программирования ("кастомизация"), в то время как другие подчеркивают тот факт, что разработка больших или сложных приложений затруднена, независимо от используемых инструментов ("разработка программного обеспечения").

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

Единственный аспект, в котором программирование "для конечного пользователя" отличается от этих, заключается в том, что методы программирования, используемые для разработки или кастомизации, потенциально могут быть настолько непохожими на обычные языки программирования. Является ли язык сценариев действительно языком программирования? Как насчет электронной таблицы? Или языка макросов? Или макроса клавиатуры? Файла конфигурации? Программы Java?

Программа на Javascript? Макрос включения на стороне сервера? Каскадная таблица стилей? HTML-страница?

Документ Microsoft Word? Различия с точки зрения непрограммиста или конечного пользователя

PPIG 2002, Университет Брунеля

Блэквелл iv

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

"профессиональных" программистов. В следующем разделе рассматривается классификация языков программирования, которая учитывает эти точки зрения пользователей, а не традиционную теоретическую перспективу.

Определение B: Что такое язык программирования?

Какой аспект языков программирования отличает их от других видов использования компьютеров?

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

Эти простые различия противоречат некоторым идеалам современного дизайна в отношении удобства использования. То, что пользователь видит при создании страницы в формате HTML, отличается от того, что он или она получает при ее просмотре - это противоречит идеалу WYSIWYG. То, чем он или она манипулирует, - это не конкретный пример желаемого результата, а абстрактная запись, определяющая поведение в различных обстоятельствах - противоречащая идеалу прямого манипулирования. Конечно, эти отклонения от "идеала" необходимы здесь для того, чтобы достичь поставленной задачи. Дополнительные проблемы, стоящие перед пользователем, типичны для проблем, которые отличают деятельность по программированию от тех действий, которые допускают прямое манипулирование и WYSIWYG. Когда мы рассматриваем другие примеры, приведенные выше, сходные свойства становятся очевидными. Различие между написанием HTML-документа и документа Word заключается в том, что HTML-документ может выглядеть по-разному для разных пользователей (в зависимости от размера и формы окна браузера, версии браузера, платформы, доступных шрифтов и т.д.). Таким образом, одно-единственное решение автора может иметь множество различных последствий. И снова, этот диапазон эффектов достигается за счет использования абстрактной нотации для определения поведения в различных обстоятельствах (язык разметки). Как и при использовании JavaScript, это может привести к синтаксическим ошибкам, ошибкам во время выполнения или ошибкам в виде непреднамеренного или исключительного поведения.

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

Все эти примеры, хотя и тривиальны по сравнению с крупными программными проектами, имеют общие важные характеристики обычного программирования. Пользователь должен определить предполагаемый результат выполнения программы (требования), определить, когда она будет выполнена, и учесть вариации в различных обстоятельствах (спецификация), выбрать из набора технических функций, которые могут поддерживать это поведение (дизайн), ввести абстрактные команды управления, а также данные (кодирование), а также предвидеть и учитывать отклонения от предполагаемого поведения (отладка). Все эти вещи являются интеллектуальными вызовами, и они все чаще возникают во всех аспектах использования компьютера. Рассмотрим, например, определение шаблона документа или даже стиля абзаца в текстовом редакторе. Даже вполне рутинные задачи пользователя могут включать сбор требований, спецификацию, проектирование, кодирование и отладку. Второе предложение этой статьи заключается в том, что почти все основные программные приложения теперь включают языки программирования. Если это так, исследования в области программирования должны быть сосредоточены на типичном опыте программирования, особенно том, который возникает, когда абстрактные обозначения заменяют прямое манипулирование.

PPIG 2002, Университет Брунеля.

Определение C: Когда мы должны использовать слово программирование?

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

"программируют" свой документ Word при определении стиля абзаца. Но многие люди говорят (даже в своих резюме, как я обнаружил), что они "программировали" на HTML. Более того, люди говорят, что они "программируют" свой видеомагнитофон, микроволновую печь, автомагнитолу или пульт управления бойлером. Есть ли какой-либо смысл рассматривать эти распространенные варианты использования термина, когда мы проводим исследование когнитивных требований программирования? Когда мы рассматриваем опыт использования технологий маргинального программирования , рассмотренный в предыдущем разделе, мы видим, что даже эти обыденные действия обладают многими одинаковыми свойствами. Все они обладают тем свойством, что пользователь напрямую не манипулирует наблюдаемыми объектами, а определяет поведение, которое произойдет в какой-то момент в будущем.

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

Последствия: Почему программирование - это сложно?

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

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

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

Потеря прямого манипулирования

Когнитивные преимущества прямого манипулирования частично возникают из-за того факта, что представления изображений смягчают "проблему фрейма" в когнитивной науке (Линдси, 1988). Это гласит, что если агент планирования поддерживает ментальное представление ситуации, в которой он действует, процесс планирования зависит от того, что агент способен моделировать обновления модели ситуации, чтобы оценить результаты потенциальных действий. Проблема в том, что планирование возможно только в том случае, если объем последствий данного действия может быть ограничен, а это означает, что должна существовать строго определенная граница, за пределами которой действие не будет иметь никаких последствий. Если это не так, любое действие потенциально может иметь бесконечные последствия, и невозможно ограничить процесс планирования. В системах прямого манипулирования многие ограничения на причинно-следственную связь напрямую связаны с восприятием ситуации действующим лицом. Это в меньшей степени верно для лингвистических репрезентаций, где нет ограничений на абстрактную выразительную силу репрезентативной системы (Стеннинг и Оберландер, 1995), и, следовательно, нет границ, которые можно использовать для ограничения рассуждений во время планирования.

Эти когнитивные соображения приводят к хорошо известным преимуществам прямого манипулирования (Шнейдерман 1983). В системе прямого манипулирования текущее состояние системы должно постоянно обновляться.

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

В системах программирования ни одна из этих вещей не обязательно является истинной. Ситуация, в которой должна выполняться программа, может быть недоступна для проверки, потому что это может произойти в будущем или потому, что программа может быть применена к большему диапазону ситуаций с данными, чем в настоящее время видно программисту. В то время как действие в отдельной ситуации является конкретным (действия имеют видимые последствия в текущей ситуации), программирование абстрактно (эффекты могут проявляться во многих различных ситуациях, которые в данный момент не видны). Множественные эффекты действия будут распределены либо в пространстве, либо во времени, либо и в том, и в другом (если два события происходят в одном и том же месте в одно и то же время, это одно и то же событие). В предыдущих публикациях мы описывали эти фундаментальные непрямые манипуляции с программированием как "абстракцию во времени" и "абстракцию над классом ситуаций" (Blackwell & Green 1999, Blackwell & Hague

2001a).

Использование обозначений

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

Можно было бы программировать, используя представления, которые обычно не рассматриваются как условные (например, разговаривая с компьютером или рисуя картину требуемой ситуации в мире), но эти альтернативы для наших целей можно рассматривать как обедненные системы обозначений. Когнитивные преимущества различных вариантов обозначения были подробно проанализированы Грином с различными сотрудниками в рамках концепции когнитивных измерений обозначений (Green 1989, Green & Petre 1996, Готовится к печати компания Blackwell & Green). Здесь нет необходимости рассматривать эти анализы сколь-либо подробно, за исключением того, чтобы отметить основные выводы - что системы обозначений разрабатываются, а не предписываются какими-либо необходимыми ограничениями, и что при выборе дизайна учитываются компромиссы между факторами, которые облегчают одни виды когнитивных задач, препятствуя другим. Таким образом, не существует идеальной нотации для любой ситуации программирования, есть только проекты, которые более или менее хорошо подходят для деятельности людей, занимающихся программированием.

Абстракция как инструмент усложнения

Инструменты для обработки абстракций предоставляют дополнительные преимущества помимо определения действий в будущем или в нескольких ситуациях, когда присутствие действующего лица не обязательно. Концептуальные абстракции также могут быть определены и интегрированы для управления сложностью. Это является результатом сочетания двух основных характеристик абстрактного действия: косвенных эффектов и использования обозначений. В простом программировании, таком как программирование видеомагнитофона, пользователь определяет некоторое абстрактное поведение, которое не можно наблюдать напрямую, потому что оно будет иметь место в будущем. Это делается с помощью простого обозначения - возможно, отображения времени запуска и идентификации канала. Но пользователь манипулирует этим обозначением напрямую - не существует механизма более высокого порядка, с помощью которого пользователь может указывать изменения в программе, отличные от тех, которые определяются непосредственно элементами управления видеомагнитофоном. В отличие от этой очень простой ситуации, более сложные программы могут быть разработаны путем внесения изменений в саму нотацию, чтобы пользователь мог расширить словарный запас для выражения требуемого поведения. Примером этого в бытовом контексте является сложное управление котлом (например, распространенное в Центральной Европе), в котором пользователь может задать один или несколько режимов работы, затем указать, что конкретный режим должен работать в определенное время суток. Это делает само программирование более эффективным, позволяя пользователю ссылаться на новую абстракцию (режим) вместо повторения

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

Использование абстракции, при котором пользователь концептуализирует общие черты сложного поведения и формулирует нотационные абстракции, с помощью которых их можно выразить, дополняет диапазон общих программных поведений, для которых мы предлагаем общее описание когнитивных проблем. В области профессионального программирования этот тип использования абстракции по-прежнему является очень активной темой исследований. Один из способов ответить на вопрос "что такое программирование" в традиционном контексте компьютерных наук (ответом, за который я обязан Тони Хоару (личное общение)), заключается в том, что программирование - это процесс описания ситуации с последующим рефакторингом этого описания в соответствии с набором вычислительных формализмов. Процесс рефакторинга сам по себе имеет решающее значение для профессионального проектирования программных систем и для совершенствования конструкций в современных методиках разработки систем, таких как аспектно-ориентированное программирование (Dias-Pace & Campo 2001).

Предложение: Когнитивная модель для использования абстракции в программировании

Определения программирования с вычислительной точки зрения часто основываются на атрибутах программы, а не на атрибутах пользователя, таких как: "Мое личное минимальное определение программирования - это "написание программы", где "program" - это описание, содержащее цикл "while"" (Пречелт 1998).

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

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

Взаимосвязь между этими факторами в контексте профессионального программирования обсуждалась ранее (Green & Blackwell 1996, Blackwell & Green 1999). Многие виды деятельности по программированию обещают, благодаря автоматизации, сэкономить внимание в будущем. Это всегда было основной целью программирования, как отмечает Уилкс, чье определение компьютерной программы заключается именно в том, что

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

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

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

оценка имеющихся данных. В последнем случае сам процесс принятия мысленного решения должен рассматриваться как вид действия, и необходимо предвидеть издержки этой деятельности (в терминах когнитивной науки, "метапредметность" или "мышление как действие" - Russel & Wefald 1991). В модели инвестирования внимания затраты на умственную деятельность должны учитываться как усилие на внимание. Это полностью согласуется как с общим пониманием природы концентрации, так и с когнитивными моделями внимания, в которых локус внимания может применяться как к внутренним, так и к внешним объектам. Разработанная нами модель имитирует эти явления с использованием агентной архитектуры (Staton 2002), в которой все возможные варианты действий представлены агентами, конкурирующими за то, чтобы быть запланированными в единой программе обработки. Одновременно может быть активирован только один агент, тем самым имитируя единый локус внимания человека. Агент, подлежащий активации, выбирается в соответствии с критерием принятия решения, который оценивает наилучшее соотношение затрат и выгод в зависимости от качества информации, на которой основана эта оценка

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

Эти имитируемые действия могут включать "программирование" или "прямое манипулирование".

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

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

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

Выводы

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

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

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