A. V. Kalinin, S. V. Chentsov ALGORITM OF RESTORATION OF THE DATA ON A FILD OF THE «BAD» DATA
The updating algorithm ZET of the data restoration on the basis of the informative field and data multiregularities analysis is considered. It is given the results of the comparative analysis of data restoration on the basis of the updating algorithm ZET.
Keywords: restoration of the data, multiregularities of the data, algorithm ZET.
УДК 004.4'242
П. А. Корягин
О ПОДХОДЕ К РАЗРАБОТКЕ ПРОЕКТИВНЫХ ИНФОРМАЦИОННЫХ СИСТЕМ
С ВЕБ-ИНТЕРФЕЙСОМ
Рассмотрена проблема повышения эффективности труда программиста при разработке проективных информационных систем на основе авторского подхода, использующего концепцию метапрограммирования.
В настоящее время потребность автоматизации информационных процессов предприятий нарастает. Внедрение программ, автоматизирующих деятельность предприятий, существенно повышает уровень сервиса компаний, снижает издержки как самих предприятий, так и их клиентов. Как следствие возрастает спрос на разработку информационных систем (ИС), являющихся основой автоматизации предприятий [1].
Однако существует проблема доступности программного обеспечения для малых предприятий: при выборе готовых продуктов это объясняется высокой стоимостью внедрения; а при создании отдела разработки - трудностями управления штатными программистами, если разработка программного обеспечения не является профилем предприятия.
Уже на этапе проектирования ИС возникают проблемы нечеткого оформления технического описания со стороны заказчика. Проблема усугубляется сроком их разработки (как правило, от 0,5 до 1,5 лет), в течение которого изменяются первоначальные идеи и претензии потребителей ИС. Возникает противоречие -осознание смены потребительских качеств будущей ИС порой опережает сроки их создания. В этой связи, с одной стороны, труд разработчика-программиста требует интенсификации, с другой - необходимо изменить концептуальные основы проектирования ИС.
Наиболее полное удовлетворение потребностей заказчика ИС может обеспечить проективный подход [2]. К сожалению, популярные сегодня методы разработки показывают плохие результаты, при частом пересмотре требований к системе (Карл И. Вигерс. Разработка требований к программному обеспечению).
Авторы статьи сделали попытку обосновать подход, позволяющий существенно повысить эффективность труда программиста при разработке проективных ИС. Предлагаемый подход опирается на концепцию метапрограммирования.
Были поставлены следующие задачи:
1. Определить основные компоненты среды разработки ИС с Веб-интерфейсом и разработать проективный подход к их разработке на основе смешанных парадигм программирования.
2. Осуществить оценку эффективности предложенного метода на примере разработки конкретных проективных систем.
Исследование среды. Проведен анализ 30 проектов, выставленных на электронной бирже weblanc-er.net в категории Web-программирование. В результате обнаружено, что в 7 из них имеется техническое задание, в котором сформулированы следующие требования:
1) какие данные должны храниться в системе;
2) каким образом данные должны попадать в систему и выводиться ею.
В остальных 23 дается ссылка на готовый проект, с закрытым кодом, и выдвигается требование сделать аналогичное ПО. Второй случай сводится к первому на этапе изучения программистом продукта-образца. В ходе изучения определяются данные и их представления.
Пример описания, потребителя, приведен на рис. 1.
Опытный программист может сформировать представление о модели данных по описанию, сделанному со слов потребителя (рис. 1). Он может привести ее в нормальную форму и описать базу данных на языке SQL или построить UML-диаграмму в CASE-системе.
Заметим, что даже при незначительной корректировке технического описания заказчиком, программист вынужден изменять набор полей сущности одновременно во многих местах разрабатываемой ИС. В частности, следующие случаи обязывают его это сделать:
- непосредственная генерация базы данных;
- описание полей формы ввода;
- проверка корректности и безопасности получаемых из формы данных;
- подготовка значения к выводу в HTML;
- подготовка значения к вводу в базу данных;
- инициализация значений «по умолчанию».
В то же время известно, что в большинстве случаев как в пределах одного проекта, так и в разных проектах, к переменной поля заданного типа (например, «Текст с форматированием в формате HTML») будут применены идентичные алгоритмы.
Хранение данных Покупатели
Фамилия Имя
Отчество Почтовый адрес Количество покупок Телефон E-mail
Услуги
Название Стоимость
Договоры
Покупатель Услуга
Ответственный Стоимость Статус сделки
Возможности сотрудников Директор
Вывод списка клиентов с возможностью печати Вывод активных договоров с возможностью печати Вывод суммы по выполненным договорам Возможность изменить все цены услуг на заданный процент Менеджер Ввод клиентов Ввод договора Изменение статуса договора Ввод новых услуг Администратор (ИТ-специалист) Возможность видеть и редактировать все данные
Рис. 1. Пример описания будущей ИС со слов потребителя
Таким образом, если в программе указан набор полей для данного конкретного случая, и компилятор, или ядро программы, «знает» логику обработки полей, то описание формы для программиста будет сведено к простому перечислению полей.
Но описание будущей ИС (рис. 1) определяет не только модель данных. «Возможности сотрудников» де-факто являются вербальным описанием необходимых форм. Однако существующие системы программирования не предоставляют нам достаточного набора клише для их описания. Традиционно в этом месте начинается творческий процесс.
Чем больше шагов необходимо предпринять для получения работающей программы на основе словесного описания, и чем они сложнее, тем больше времени и других ресурсов потребует разработка. Следовательно, необходим инструмент для того, чтобы человеческий язык максимально близко отображался на язык формальный, интерпретируемый компьютером [3; 4]. Для этого необходимо обратиться к опыту практической разработки ИС с Веб-интерфейсом. В результате многолетней практики в данной области, в том числе в рамках исследований промышленной разработки ИС на базе ООО «Веб-ресурс», были отмечены следующие особенности создания исследуемых систем:
1) программный код содержит очень много клише, которые приходится набирать постоянно;
2) очень многие их появления, тем не менее, не являются штампом, имея уникальные особенности, в том или ином объеме проявляющиеся во многих частях;
3) клише встречаются на разных уровнях:
а) исполнение SQL-запроса с выводом результата в HTML-шаблон;
б) сложная форма, позволяющая просматривать таблицу и редактировать ее значения;
в) для отладки программы используются одни и те же HTML-шаблоны, часть из которых попадает в конечные версии продукта.
В первых экспериментах по внедрению метапро-граммирования в разработку было решено использовать параметризованные макросы, т. е. макросы, представляющие собой обычные процедуры с набором параметров. Результат оказался неудовлетворительным в силу ряда причин:
- количество параметров макросов очень быстро росло;
- многие значения параметров необходимо было каскадно передавать в суб-макросы;
- большинство из параметров не изменялись при конкретном вызове макроса, вызывая необходимость каждый раз явно перечислять ряд значений «по умолчанию».
Таким образом, выявлено противоречие. Мы видим преобладание клише в программном коде ИС, но существующие методы описания макрофункций дают неприемлемое решение.
Идея для разрешения противоречия была найдена в следующей аналогии. Опытный программист, пользующийся стандартными средствами (например, PHP, ASP.NET, Visual C++ и др.) в определенный момент обнаруживает предел собственной производительности. Единственным средством преодолеть это ограни-
чение является найм новых программистов. При этом координация между ними в наиболее общей форме будет происходить следующим образом:
1) формулируется знакомая задача. Например, сделать форму редактирования таблицы «user»;
2) формулируются особенности задачи. Например, при вводе нового пользователя, перед внесением данных в базу данных, необходимо генерировать случайное число «тикет», сохраняемое в базе данных, и высылать ссылку для активации записи на введенный адрес электронной почты;
3) если подчиненный, как правило, менее опытный, программист не знает решения той или иной задачи, он может получить решение у наставника, запомнив его на будущее.
Следовательно, смоделировав описанное поведение подчиненного программиста, можно получить систему, разрешающую сформулированное ранее противоречие. Для решения этой задачи необходимо создание следующих механизмов:
- пополняемая база знаний: данная подзадача неспецифична, известны разные способы ее решения;
- способ описания уточнений для клише из базы знаний, не обладающих недостатками макросов.
Для иллюстрации структуры макроса (рис. 2) использован язык C++ как наиболее популярный из языков, имеющих встроенную поддержку макросов.
Отметим также, что экспериментальная работа проводилась с использованием модифицированной среды PHP, причины выбора которой лежат за пределами предмета исследования, при этом стандартная версия PHP макросы не поддерживает.
Если решаемая задача сводится к выводу списка пользователей с сокрытием пароля для тех из них, у которых значение поля «rights» не равно нулю, то вывод списка является известным алгоритмом, описанным ранее как макрос db_list; указание таблицы или запроса со списком полей является ожидаемым параметром данного макроса; описанная манипуляция с
полем пароля является непрогнозируемой в общем случае модификацией алгоритма.
Свойством параметра-таблицы, равно как и набора полей, является то, что их будут использовать как минимум два из четырех вызываемых макроса: db_query (для запроса из указанной таблицы), fields_output_prepare (для обработки известного набора полей). В связи с расточительностью явной передачи параметров, требующей усилий программиста, не касающихся специфики решаемой им задачи, требуется механизм каскадной передачи параметров.
Таким образом, первый постулат вводимого метода состоит в наличии механизма каскадной передачи параметров. Практические испытания подтвердили целесообразность его использования. Для сравнения объема и сложности кода на рис. 3 приводится вариант с явной каскадной передачей параметров.
Информативность в этом случае не повышается, так как передаваемые объекты в памяти человека являются «текущими» вне зависимости от того, указаны они явно в коде программ или нет.
Аналогично работающая ИС может содержать множество объектов, отражающих ее текущее состояние. Например, объект «Текущий пользователь» традиционно загружается ядром ИС и попадает в набор глобальных переменных. Но каждый ее модуль не получает явной ссылки на этот объект, а сам запрашивает ее при необходимости проверить права доступа.
Сутью же модификации алгоритма, производящей манипуляции с полем пароля, является помещение алгоритма, реализующего данную модификацию, в соответствующее место макроса без повреждения структуры последнего. В данном случае это будет инъекция кода перед вызовом макроса fields_output_prepare, так как в этом месте данные уже извлечены из базы данных, но еще не обработаны для вывода в HTML. Следовательно, мы можем привязать место инъекции к макросу fields_output_prepare, потребовав разместить внедряемый код перед его вызовом.
#define db list db query; — while (db fetch row) { fields output prepare; call template item; } Условимся считать, что пример написан на языке C++. Символы «\» в конце строк для удобства чтения опущены. Все идентификаторы являются макросами, объявленными ранее при помощи директивы «define».
Рис. 2. Текст макроса db_list
#define db_list(table, field_set) db_query(table, field_set); while (db_fetch_row) {
fields_output_prepare(field_set); call_template_item;
}
Рис. 3. Текст макроса без механизма каскадной передачи параметров
Таким образом, второй постулат вводимого метода состоит в уточнении алгоритмов макросов путем инъекций кода, привязанных к местам, идентифицируемым вызовами других макросов.
Экспериментальная работа. Исследуемый подход программирования был испытан при создании серии прикладных информационных систем. Работы проходили на базе Красноярского государственного педагогического университета имени В. П. Астафьева, а также ИТ-компании «Веб-ресурс».
Для практических работ была создана динамически пополняемая среда, состоящая из следующих компонентов:
1) стандартной среды PHP, версии 5;
2) специально изготовленного компилятора расширений PHP, реализующих синтаксис макрокоманд;
3) библиотеки шаблонов.
В целях концентрации на предмете исследования второстепенные аспекты не были реализованы в испытательной среде. Так, например, описание модели данных производилось при помощи стандартного синтаксиса языка PHP (рис. 4).
Расширения языка представляют собой механизм генерации кода на языке PHP (рис. 5) и синтаксис
макросов с поддержкой описанного ранее метода инъекций кода (рис. 6).
Для генерации кода было использовано стандартное свойство интерпретатора PHP - выдавать любой программный код (не только HTML) непосредственно в браузер, попутно исполняя PHP-код, находящийся в пределах тегов «<? ... ?>». Так как компилятор тоже был написан на PHP, это свойство нашло применение. На рис. 5 можно видеть код, набранный обычным шрифтом - это продуцируемый код приложения, и полужирным - это код, управляющий компиляцией.
Для введения механизма уточнений (рис. 6) было сформулировано несколько принципов, которые следует рассматривать только как вариант реализации, но не как базис метода. Принципы следующие:
1. Макросы записываются в отдельных файлах, имена которых являются именем макроса.
2. Знак дефиса в вызове макроса соответствует разделителю каталога. Например, table-list соответствует файлу list.tpl в каталоге table.
3. Вызов макроса состоит из знака «%» в начале предложения, со следующим после него именем макроса. Заканчивается вызов знаком «;» как обычное предложение PHP.
$db_defs['customer'] => array( 'title' => 'Покупатель', 'fields' => array(
'lastname' => array('string', 'Фамилия'), 'firstname' => array('string', 'Имя'), 'middlename' => array('string', 'Отчество'), 'zip' => array('string', 'Почтовый индекс',
'db_type' => 'CHAR(6)'), 'city' => array('link', 'Город', 'link_to' => 'city' ), 'address' => array('string', 'Почтовый адрес'), 'phone' => array('phone', 'Телефон'), 'email' => array('email', 'Адрес эл. почты')
) ;
Рис. 4. Описание структуры данных сущности «Покупатель» средствами PHP
if (!isset($cms_Transfer)) {
<? if (get_param('form_enable_return_url')) { ?>
$cms_Transfer['return_url'] =
htmlspecialchars(@strval($_GET['url'])); <? } ?>
$cms_Transfer['message'] = '';
}
Рис. 5. Генерация кода при помощи встроенных средств PHP
%login-session
login-body>login-logout>run_after = { // Гостевой вход
$GLOBALS['cmsLoginExt'] = array('login' => 'Гость', 'id' = > 0); $GLOBALS['cmsLogin'] = $GLOBALS['cmsLoginExt']['login'];
},
login-is_user>replace = { return cmsLoginID() != 0;
};
Рис. 6. Вызов макроса с двумя уточнениями
4. Вызываемый макрос может иметь произвольное число параметров, указываемых между именем макроса и знаком «%» в виде пар «имя параметра = значение параметра».
5. Имя параметра является алфавитно-цифровым идентификатором. Оно может содержать несколько префиксов, являющихся именами макросов и отделенных знаком «>». Каждый префикс обозначает зону действия параметра и последующей цепочки префиксов. Например, «table-list>db-list>query» означает установку параметра query в пределах вызова макроса «db-list», но только в случае обращения к нему в пределах вызова макроса «table-list».
6. Значение параметра может быть числом, строкой или одной из констант «false», «true», «null» в соответствии с синтаксисом PHP, а также блоком кода, заключенным в фигурные скобки (рис. 6).
7. Параметры «run_before» - инъекция кода в начале работы макроса, «run_after» - инъекция кода в конце работы макроса и «replace» - замещение кода макроса интерпретируется единовременно.
8. Остальные параметры являются каскадными и сохраняют свои значения при вызове суб-макросов.
9. Для получения доступа к значению параметра используется PHP-функция «get_param», вызываемая в управляющем PHP-коде (рис. 5).
Предварительные результаты нами оцениваются как успешные. Отметим, что в настоящий момент мы не располагаем достаточным количеством разработанных проектов, чтобы произвести полную всеобъемлющую оценку технологии, но по доступным на сегодня приводимым ниже оценкам продолжительность разработки проекта сокращается от 4 до 8 раз. В некоторых вырожденных случаях, когда информационная система целиком сводится к имеющимся шаблонам, сокращение времени разработки может достигать и десятков раз.
Разработка модуля риэлтерской базы для «time-is-money CMS» заняла 4 рабочих часа, ранее подобная работа, произведенная тем же программистом, потребовала около 20 рабочих часов.
Разработка модуля управления пользователями для «time-is-money CMS» первоначально заняла около 4 ч. Повторение этой задачи по новой технологии потребовало чуть менее 10 мин. Прирост производительности составил 24 раза. В этом случае задача была вырождена до шаблона «table-edit». Тем не менее, этот случай является крайним, так как реальные задачи обычно требуют дополнительных функций и особой проработки внешнего вида.
По описываемой методике создана проективная система «Тестосфера». На примере ее модулей можно проследить изменение объема кода. Модуль «tasks», по своему назначению типичный для ИС - это 139 строк (без учета пустых и незначащих) исходного кода модуля, против 800 строк PHP-кода, полученных
в результате генерации и соответствующих прямому набору, и 214 строк в типовых HTML-шаблонах. Модуль «test» специфичен для тестовой оболочки -153 строки описаний против 248 строк полученного PHP-кода и 98 строк HTML-кода.
Интересно отметить, что 139 строк первого модуля практически не требовали отладки, так как являются рутинным описанием требуемой функциональности с опорой на уже отлаженные шаблоны. Этим фактором объясняются и большие различия в объемах исходного и результирующего кода. В то же время 153 строки второго модуля потребовали длительной и кропотливой работы, так как они представляют собой уникальный код и слабо используют преимущества технологии.
Другой проект, полностью созданный по описываемой технологии, - это система дистанционного образования Заочной естественно-научной школы (сегодня http://zensh.pk-studio.ru/). Функциональность уровня технического задания была в этом случае создана за 2 недели. Как и в случае с «Тестосферой», основное время ушло на разработку тестирующей части, алгоритмы которой не имели аналогов в ранее создававшихся ИС.
Таким образом, в работе представлен эффективный подход к разработке ИС с Веб-интерфейсом на основе концепции метапрограммирования. Показано, что в настоящее время наиболее разумными являются ИС проективного типа (разработка и развитие системы происходит непрерывно и эволюционно), а их создание на основе предложенного подхода является эффективным с точки зрения производительности труда программиста.
Библиографический список
1. Курицкий, А. Б. Общие тенденции развития занятости и изменения характера труда в Интернет экономике [Электронный ресурс] : материалы междунар. интернет-конф. «Новые инфокоммуникационные технологии в социально-гуманитарных науках и образовании: современное состояние, проблемы, перспективы развития». Электрон. дан. М., 2002. Режим доступа: http://www.auditorium.ru/. Загл. с экрана.
2. Пак, Н. И. Проективный подход в обучении как информационный процесс : моногр. / Н. И. Пак ; Краснояр. гос. пед. ун-т им. В. П. Астафьева. Красноярск, 2008.
3. Graham, P. The Hundred-Year Language [Электронный ресурс] : сб. ст. Пола Грэма / P. Graham. Электрон. дан. М., 2004. Режим доступа: http://www.paulgraham.com/hundred.html. Загл. с экрана.
4. Graham, P. Holding a Program in One's Head [Электронный ресурс] : Сб. ст. Пола Грэма / P. Graham. Электрон. дан. М., 2004. Режим доступа: http://www.paulgraham.com/head.html. Загл. с экрана.
P. A. Koryagin
ABOUT APPROACH TO DEVELOPMENT OF WEB-BASED PROJECTIVE INFORMATION SYSTEMS
It is described a solution of the problem of improvement programmer's productivity in information system development. It is based on the author's approach, which lies in the field of metaprogramming.