Научная статья на тему 'Система для поддержки использования комментариев и содержательных имен переменных при обучении программированию'

Система для поддержки использования комментариев и содержательных имен переменных при обучении программированию Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
70
16
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
СРЕДА РАЗРАБОТКИ / КОММЕНТАРИИ / СТИЛЬ ПРОГРАММИРОВАНИЯ / ОБУЧЕНИЕ ПРОГРАММИРОВАНИЮ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Симуни Михаил Лазаревич

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

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Система для поддержки использования комментариев и содержательных имен переменных при обучении программированию»

Симуни М.Л.

Санкт-Петербургский государственный университет, старший преподаватель кафедры

информатики, simuni @ mail.ru

Система для поддержки использования комментариев и содержательных имен переменных при обучении

программированию

КЛЮЧЕВЫЕ СЛОВА

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

АННОТАЦИЯ

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

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

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

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

являются понятыми и без комментариев, а комментарии считаются признаками плохого кода. В то же время, такие технологии, как технология грамотного программирования Д. Кнута [3] предполагают очень активное использование комментариев, при котором комментарии фактически становятся документацией к программе.

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

В разрабатываемой системе поддержки обучения программированию EasyAssist предлагается использовать подход, при котором обучающиеся, задающие осмысленные имена переменных и комментарии к ним, получают от этого непосредственную практическую пользу. Система делает процесс программирования для таких пользователей более простым и обеспечивает их полезными подсказками. Система ориентирована на язык C# [4], который используется для обучения студентов младших курсов на математико-механическом факультете СПбГУ

Приведем простой пример использования системы EassyAssist. На одном из первых занятий студенты изучают темы «ввод данных с клавиатуры» и «суммирование данных и схожие операции». Типичным упражнением по этим темам может быть задача: «Ввести несколько чисел, пока не будет введен 0. Найти произведение последних цифр всех чисел, которые делятся на 2».

Допустим, студент написал следующее описание переменной для суммирования:

int product = 0;

(Отметим, что студент, по-видимому, допустил ошибку, неправильно инициализировав переменную).

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

В рассматриваемой ситуации система EasyAssist обеспечивает следующие возможности:

• при вводе имени переменной product появится список

автодополнения [5], содержащий, в данном случае, операцию product *=

... ;

• выдаются предупреждения о возможном некорректном применении переменной. Допустим, пользователь добавил оператор product++;. Скорее всего, это ошибочное использование переменной (по крайней мере, оно не соответствует предполагаемому смыслу имени переменной). Пользователь получает соответствующее предупреждение;

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

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

Рассмотрим некоторые дополнительные возможности системы, которые делают работу с ней более комфортной:

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

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

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

Рассмотрим теперь пример использования комментариев в системе EasyAssist. В описанной выше задаче о произведении цифр четных чисел

пользователь должен описать и переменную, содержащую очередное введенное число. Видимо, оно будет описано как-то так: int n;

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

int n; // Введенное число

Система анализирует такие комментарии, и, как результат, пользователь может воспользоваться теми же преимуществами при дальнейшей работе с переменной, что и в случае с переменной product:

• при вводе имени переменной n появится список автодополнения, Пользователь может выбрать один из нескольких типичных сценариев — или чтение одной переменной из строки, или, как более сложный случай, может выбрать последовательность действий для получения нескольких числовых значений из одной строки;

• как правило, переменные, используемые для ввода значений не должны изменяться в других местах программы. Однако начинающие студенты часто пытаются «сэкономить» переменные, и использовать их в нескольких ролях. В рассматриваемом примере, значительная часть студентов использует оператор n = n % 10; для получения последней цифры числа. Это противоречит хорошей практике программирования, и пользователь получит об этом предупреждение. Как и вообще все предупреждения системы EasyAssist, оно будет минимально обязывающим и легко отключаемым.

Таким образом, система EasyAssist хранит информацию о наиболее типичных ролях переменных, используемых в простых программах [6], и о типичных именах и комментариях, которые могут быть связанны с этими ролями. Рассмотрим информацию, которая хранится в системе для каждой роли:

• типичные форматы имен, в виде регулярных выражений. Например, для роли «произведение» имя может иметь формат product* или prod*. Форматов может быть достаточно много. Для роли «подсчет количества» переменная может называться counter или cnt или number и т.д. Пользователь, даже начинающий, может легко добавить свой формат имени переменной. Если, например, он предпочитает имена переменных на основе русских слов, он может называть их int proizedenie;, или даже назвать переменную по-русски int произведение; (язык С# обеспечивает такую возможность). Нам

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

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

• набор операций, которые предполагается осуществлять с переменными данной роли. Например, для произведения — это операция «переменная *= значение,» и инициализация значением 1. В большинстве случаев, с каждой ролью связано небольшое количество операций (одна или две);

• ограничения на последовательность операций, если ее можно сформулировать. Например, при вычислении произведения типичная последовательность действий — это инициализация 1, и за ней несколько операций *=. В случае нарушения этой последовательности пользователь получит предупреждение;

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

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

Наиболее часто встречающимся при обучении основам программирования являются, видимо, различные варианты переменных, используемые для получения суммарного агрегированного значения некоторой последовательности. Такие операции называются также операциями свертки [7]. К таким ролям относится сумма значений, произведение значений, количество значений, максимум или минимум. Например, если обучающийся напишет: int max;

то система предложит ему при автодополнении оператор

if (max > ...) max = ..;,

Кроме этого система напомнит о необходимости присвоить переменной достаточно малое начальное значение.

Важным частным случаем является переменная, использующаяся для получения агрегированного логического значения. Рассмотрим в качестве примера следующую задачу для начинающих: «Ввести 100 чисел, и определить, есть ли среди них хотя бы одно четное». Типичным подходом к решению может быть введение логической переменной: bool b = false;

В дальнейшем, для этой переменной в какой-то момент надо установить значение true и вернуть результат.

У многих студентов такие задачи вызывают существенные трудности. Встречаются самые разнообразные ошибки: устанавливается неправильное начальное значение; в дальнейшем, после того, как переменная получила значение true, ей снова присваивается значение false и т.д. С другой стороны, можно отметить, что именно имена логических переменных у начинающих программистов, как правило, не несут никакой смысловой нагрузке. Почти всегда используются имена b, flag и т.п., указывающие только на тип переменной, но не на ее смысл.

В системе EasyAssist присутствуют несколько различных ролей для логических переменный и, в частности, «проверка для всех» и «проверка существования». В данном случае программисту имеет смысл выбрать имя переменной, начинающееся со слов any или has. Например: bool anyEven = false;

Для такой переменной EasyAssist выберет роль «проверка существования» и поможет сформировать правильную последовательность действий. А именно, единственным оператором, который система будет предлагать при автодополеиии, будет anyEven = true. Кроме этого, при неправильной инициализации значением true пользователь увидит предупреждение и т.д.

Еще одна группа ролей, часто встречающихся при обучении основам программирования — это роли, связанные с различными случаями генерации последовательности данных (разворачивание [7]). Примерами являются чтение чисел с консоли или из файла, последовательное получение цифр числа, проход по однонаправленному списку и т.д. Например, обучающийся может написать: int d; // Цифра числа n

В этом случае система предложит ему при автодополнении операторы

d = n % 10; d /= 10;

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

используют для имен таких переменных специальный префикс. Например, можно предположить, что переменная prevSize содержит предыдущее значение переменной size. Для такой роли единственный предполагаемый способ изменения значения переменой — это оператор prevSize = size;. Причем, как правило, он выполняется непосредственно перед изменением переменной size.

И наконец, в качестве последнего примера, приведем ситуацию, когда мы фактически описываем составное значение из некоторой предметной области. Например:

double x, у; // Координаты точки

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

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

• для словосочетаний, которые можно использовать в комментариях, рекомендуется использовать имена, начинающиеся на символ # (по аналогии с так называемыми 'хештегами', хорошо известными и привычными пользователям социальных сетей [8]. Такое соглашение позволяет избежать возможной неоднозначности. В то же время, это позволит обучающимся использовать для аннотации переменных привычную им систему обозначений.

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

является ее использование при освоении студентами программирования в специализированных предметных областях. В качестве примера такого использования рассмотрим возможность применения предложенной технологии для обучения программированию в предметной области обработки разреженных матриц [9]

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

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

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

Система EasyAssist реализуется, как расширение среды разработки Visual Studio [10].

Литература

1. Макконнелл С. Совершенный код. Мастер-класс / Пер. с англ. — М.: Издательство «Русская редакция», 2010. — 896 с.

2. Бек К. Экстремальное программирование / Пер. с англ. — СПб.: Издательство «Питер», 2002. — 224 / Пер. с англ. — М.: Издательство «Русская редакция», 2010. — 896 с.

3. Knuth D. Literate programming //Computer Journal. 1984, 27 (2), P. 97-111.

4. Албахари Д., Албахари Б. C# 5.0. Справочник. Полное описание языка/ Пер. с англ. — М.: Издательство «Вильямс», 2013. — 1008 с.

5. Omar C., Yoon Y., LaToza T., Myers B. Active Code Completion // Proceedings of the 34th International Conference on Software Engineering ICSE 12. — 2012. — P. 859-869.

6. Sorva J., Karavirta V., Korhonen A. Roles of Variables in Teaching //Journal of Information Technology Education. 2007, 7 P. 407-423.

7. Meijer E., Fokkinga M., Paterson R. Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire. // Proceedings of the 5th ACM conference on Functional programming languages and computer architecture, 1991 —. P. 124-144.

8. Wei Feng Jianyong Wang Learning to Annotate Tweets with Crowd Wisdom WWW 2013 Companion, May 13-17, 2013, Rio de Janeiro, Brazil URL: http://www2013.org/companion/p57.pdf

9. Симуни М.Л. Проект системы рефакторинга, ориентированной на программы обработки разреженных матриц. //Вестник Санкт-Петербургского университета. Серия 10: Прикладная математика. Информатика. Процессы управления. 2010, 2. — C. 122-128.

10. Gilbert J. R., Moler C., Schreiber R. Sparse Matrices in MATLAB: Design and Implementation. // SIAM J. Matrix Anal. Appl. 1991, 13. P. 333-356.

11. ReSharper Plugin Development. URL: http://confluence.jetbrains.com/display/NETCOM/ReSharper+8+Plugin+Development.

i Надоели баннеры? Вы всегда можете отключить рекламу.