© Е.Е. Карпович, 2013
УДК 681.324.067 Е.Е. Карпович
ОЦЕНИВАНИЕ КАЧЕСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ САПР НА ОСНОВЕ МЕТРИЧЕСКИХ ХАРАКТЕРИСТИК
Определено назначение метрических характеристик качества программного обеспечения. Представлена классификация программных метрик. Рассмотрены существующие подходы к определению метрик программного продукта. Обсуждаются возможности автоматизации определения, анализа и визуализации метрических характеристик программ на языках высокого уровня.
Ключевые слова: сложность программ, программные метрики, языки программирования высокого уровня, язык М001ЛА-2.
Метрология программного обеспечения является относительно новым и весьма актуальным направлением технологии программирования, связанным с измерением различных характеристик программ и процесса их разработки. С помощью метрик можно оценивать стоимость программных проектов, управлять ресурсами проектирования, оценивать эффективность методов и инструментальных средств разработки программного обеспечения, а также качество и надежность разрабатываемых программ.
Метрики включают в себя измерения сложности, трудоемкости программирования, корректности, тестируемости, познаваемости, сопровождаемости, достоверности и точности, оценки ресурсов, стоимости разработки программных продуктов, распределения персонала и.т.д.
Термин «метрика программного обеспечения» означает числовую характеристику некоторого свойства программы. Метрики обеспечивают количественный подход к оцениванию качества программного обеспечения и процесса его разработки.
Одной из важнейших проблем метрологии программных продуктов является формализация характеристик качества и методология их оценки. Для определения адекватности качества функционирования программ, наличия технических возможностей программных средств к взаимодействию, совершенствованию и развитию необходимо использовать стандарты в области оценки характеристик их качества. Основой регламентирования показателей качества программных средств ранее являлся международный стандарт ISO 9126:1991 (ГОСТ Р ИСО/ МЭК 9126-93) "Информационная технология. Оценка программного продукта. Характеристики качества и руководство по их применению".
Завершается разработка и формализован последний проект состоящего из четырех частей стандарта ISO 9126-1-4 для замены небольшой редакции 1991 года. Проект состоит из следующих частей под общим заголовком "Информационная технология — характеристики и метрики качества программного обеспечения": "Часть 1. Характеристики и субхарактеристики качества" Часть
2. Внешние метрики качества" "Часть 3. Внутренние метрики качества" "Часть 4. Метрики качества в использовании" (см. публикации Липаева В.В. [1,2]).
Результаты исследования метрических характеристик качества представлены в SWEBOK (Software Engineering Body of Knowledge), в документ, издаваемый комитетом Software Engineering Coordinating Committee, в который вовлечено сообщество IEEE Computer Society. Назначение SWEBOK состоит в объединении знаний по инженерии программного обеспечения (разработке программного обеспечения) [3].
Рассмотрим способы классификация измеряемых характеристик программного обеспечения. В настоящее время в программной инженерии еще не сформировалась окончательно система метрик. Действуют разные подходы к определению их набора и методов измерения. Однако всП множество метрик программного обеспечения можно разбить на три большие группы:
> метрики программного продукта, которые используются при измерении его характеристик — свойств;
> метрики процесса, которые используются при измерении свойства процесса ЖЦ создания продукта.
> метрики использования.
Метрики программного продукта включают:
• внешние метрики, обозначающие свойства продукта, видимые пользователю;
• внутренние метрики, обозначающие свойства, видимые только команде разработчиков.
• Внешние метрики продукта — это метрики:
• надежности продукта, которые служат для определения числа дефектов;
• функциональности, с помощью которых устанавливаются наличие и правильность реализации функций в продукте;
• сопровождения, с помощью которых измеряются ресурсы продукта (скорость, память, среда); применимости продукта, которые способствуют определению степени доступности для изучения и использования;
• стоимости, которыми определяется стоимость созданного продукта.
• Внутренние метрики продукта включают:
• метрики размера, необходимые для измерения продукта с помощью его внутренних характеристик;
• метрики сложности, необходимые для определения сложности продукта;
• метрики стиля, которые служат для определения подходов и технологий создания отдельных компонентов продукта и его документов.
Внутренние метрики позволяют определить производительность продукта и являются релевантными по отношению к внешним метрикам.
Внешние и внутренние метрики задаются на этапе формирования требований к программному обеспечению предметом планирования и управления достижением качества конечного программного продукта.
Метрики продукта часто описываются комплексом моделей для установки различных свойств, значений модели качества или прогнозирования. Стандарт ISO/IEC 9126-2 определяет следующие типы мер:
• мера размера программ в разных единицах измерения (число функций, строк в программе, размер дисковой памяти и др.);
• мера времени (функционирования системы, выполнения компонента и др.);
• мера усилий (производительность труда, трудоемкость и др.);
• мера учета (количество ошибок, число отказов, ответов системы и др.).
Примером широко используемых метрик программных продуктов являются
метрики Холстеда — это характеристики программ, выявляемые на основе статической структуры программы на конкретном языке программирования: число вхождений наиболее часто встречающихся операндов и операторов; длина описания программы как сумма числа вхождений всех операндов и операторов и др.
Метрики процесса включают время разработки, число ошибок, найденных на этапе тестирования и др. Практически используются следующие метрики процесса:
• общее время разработки и отдельно время для каждой стадии;
• время модификации моделей;
• время выполнения работ на процессе;
• число найденных ошибок при инспектировании;
• стоимость проверки качества;
• стоимость процесса разработки.
Метрики использования служат для измерения степени удовлетворения потребностей пользователя при решении его задач. Они помогают оценить не свойства самой программы, а результаты ее эксплуатации — эксплуатационное качество. Примером может служить — точность и полнота реализации задач пользователя, а также затраченные ресурсы (трудозатраты, производительность и др.) на эффективное решение задач пользователя. Оценка требований пользователя проводится с помощью внешних метрик.
Рассмотрим подробно метрики программного продукта, базирующиеся на статистическом анализе текстов программ. К ним относятся:
• метрики, основанные на лексическом анализе программ,
• метрики структурной сложности.
Лингвистические исследования количественных характеристик текстов позволили установить ряд эмпирических закономерностей, имеющих важное значение и в текстах программ на языках высокого уровня. Результаты таких исследований впервые были опубликованы в работе М. Холстеда [4]. Любая программа определяет некоторое упорядоченное множество действий над операндами с помощью операторов. Операнд - это некоторая постоянная или переменная величина, обрабатываемая в программе, а оператор представляет собой обозначение конкретного действия, выполняемого по отношению к операнду.
Исходя из идентификации операторов и операндов в тексте программы, можно определить ряд измеряемых свойств, в состав которых Холсте дом включены следующие основные метрические характеристики:
• nul - число отдельных (уникальных) операторов в программе;
• nu2 - число отдельных (уникальных) операндов в программе;
• N1 - общее число всех операторов в программе;
• N2 - общее число всех операндов в программе;
• flj - частота встречаемости j-го оператора в программе, где j = 1,2, „.nul;
• f2i - частота встречаемости i-го операнда в программе, где i = 1,2, ...nu2.
Лля выше перечисленных характеристик справедливы следующие соотношения:
nul nu2
Nl = X flj N2 = x f2i
j=l i=l
Учитывая эти основные метрические характеристики для программы, можно определить:
n=nu1+nu2 — словарь программы,
N=N1+N2 — длина реализации программы,
N'= nu1*log2(nu1) + nu2*log2(nu2) — теоретическая длина программы (для стилистически корректных программ отклонение N от N' не превышает 10%)
V=N*log2n — объем программы,
L'=2*nu2/(nu1*N2) - уровень программы,
Ep = N'* log2n/L' - оценка трудоемкости разработки программы,
Ec = V/L' - оценка трудоемкости изучения программы.
Словарь программы - это сумма отдельных операторов и отдельных операндов программы, длина реализации равна сумме всех операторов и операндов. Длина реализации программы N может быть близко аппроксимирована как функция N'(n1,n2), эта аппроксимация является достаточно точной для хорошо написанных программ.
Оценка объема программы V представляет собой объем программы в битах, делая его независимым от набора символов языка, на котором написана программа. Уровень программы является мерой краткости реализации алгоритма. Наивысшим уровнем, на котором может быть представлен алгоритм, представляется в форме вызова процедуры. Уровень такого представления равен 1. Более длинные представления алгоритма, включающие много операторов и повторяющееся использование операндов, имеют более низкий уровень.
По определению уровень L=V/V*, где V* — объем операции, выраженной в виде вызова процедуры. Определение V* — непростая задача, поэтому используют оценку уровня L' по формуле: L'=2*nu2/(nu1*N2).
Предполагая, что трудоемкость программирования возрастает при увеличении объема программы и уменьшается при увеличении уровня, Холстед предложил в качестве трудоемкости разработки программы оценку Ep, получаемую по формуле: Ep =V/L = N'* log2n/L' .
Для оценки трудоемкости изучения текста программы была предложена оценка Ec, которая вычисляется по формуле: Ec=V/N'.
Были проведены эксперименты, подтверждающие практичность метрической теории программ для различных языков высокого уровня [5].
Структурная сложность программ определяется:
• количеством взаимодействующих компонентов;
• сложностью взаимодействия;
• числом связей между компонентами.
На уровне программной единицы (процедуры, подпрограммы) структурную сложность можно оценить с помощью метрики Мак-Кейба [6]. Мак-Кейб выполнял численные измерения независимых путей выполнения в программах на основе анализа их исходных текстов и предложил в качестве меры сложности тестирования программ использовать цикломатическое число управляющего графа программы.
Любая программа (или алгоритм) представляется в виде управляющего ориентированного графа G=(V,E) c V вершинами и E дугами, где вершины соответствуют операторам, а дуги определяют передачи управления от одного оператора к другому. Такой граф называется графом потока управления или управляющим графом программы. Цикломатическое число управляющего графа программы определяется по формуле: Cm=m-n+2,
где m — количество дуг графа, n - число вершин графа.
Метрика Мак-Кейба Cp или цикломатическая сложность программы (или подпрограммы) - это число линейно независимых маршрутов, проходящих через программный код, она равно цикломатическому числу управляющего графа программы, увеличенному на 1, Cp=Cm+1. Метрику Мак-Кейба можно определять на основе статического анализа текста программы следующим образом:
Ср=1, если программа линейной структуры, т. е. не включает операторы IF-ELSE, CASE и циклы.
В общем случае, если программа включает условные операторы и циклы, то
Ср = CI+CLOOP+ICASE +1;
где CI — число условных операторов; CLOOP — число операторов цикла; ICASE — число ветвей в операторах CASE.
Рассмотрим возможности автоматизации определения, анализа и визуализации метрических характеристик программ. Примеры практического освоения методов метрического оценивания программ и задания для лабораторных работ представлены в практикуме Черникова Б.В. и Поклонова Б.Е. [7]. В данном учебном пособии студентам предлагается вручную просматривать тексты простых программ и оценивать их с использованием метрик. Лля более сложных программ объем ручных расчетов существенно возрастает, что приводит к ошибкам в оценке программного обеспечения. В связи с этим становится актуальной проблема разработки инструментальных программных средств поддержки процесса оценивания качества программного обеспечения. Примером такой программы является разработанная автором программа MERA, предназначенная для оценивания сложности программ на языке MODULA-2 и описанная в [8, 9].
Язык MODULA-2 - это паскаль — подобный язык программирования, разработанный Н. Виртом для создания системного программного обеспечения в 1977 году в Институте информатики г. Цюриха. Язык Модула-2 — структурный, модульный язык программирования, с синтаксисом, основанным на языке
Паскаль. Компиляторы языка Модула-2 были разработаны для персональных ЭВМ, работающих под управлением операционной системы MS DOS, в начале 90-х годов прошлого века.
Программа MERA предназначена для автоматизации вычисления метрических характеристик сложности программ на языке Модула-2. Исходными данными для подсистемы является синтаксически правильный текст программного модуля или модуля реализации, содержащий произвольное количество вложенных процедур. Программа MERA является статическим анализатором исходного текста программ и выполняет следующие функции:
— определение метрических характеристик модуля;
— определение метрических характеристик вложенных процедур;
— вычисление суммарных метрик сложности и трудоемкости разработки модуля.
Результаты записываются текстовый файл, имя которого совпадает с именем модуля, а расширение — .mtr. Пример файла метрик приведен ниже.
Программа MERA выполняет следующие действия:
1. Вводит имя файла, в котором находится измеряемая программа пользователя. Файл имеет расширение ".mod"
2. Формирует имя файла, в который записывается метрические характеристики. Файл имеет имя <имя программы>.т^
3. Текст программы пользователя считывается в оперативную память в массив TEXTPGM и формируется таблица внутренних процедур с помощью процедуры VVODMOD.
4. Затем в цикле производится анализ текста модуля и входящих в него процедур и расчет метрик.
5. Тексты процедур считываются в оперативную память с помощью процедуры VVODPRC.
6. Для модуля подсчитывается число импортируемых процедур с помощью процедуры CHETIMP; для процедуры — число параметров KPAR с помощью процедуры PARPROC.
7. Определение числа констант NCS производится с помощью процедуры CHETCONS.
8. Анализ описаний переменных и построение таблицы переменных производится процедурой CHETVAR.
9. С помощью процедуры CHETOPR производится анализ текста выполняемых операторов программы пользователя, построение таблицы операторов TABOPR и определение следующих элементарных метрик программы:
ETA1 — ЧИСДО ОТДЕДЬНЫХ ОПЕРАТОРОВ;
ETA2 — ЧИСДО ОТДЕДЬНЫХ ПЕРЕМЕННЫХ;
NO1 — ОБЩЕЕ ЧИСДО ОПЕРАТОРОВ;
NO2 — ОБЩЕЕ ЧИСДО ИСПОДЬЗОВАНИЙ ПЕРЕМЕННЫХ;
ICASE -ОБЩЕЕ ЧИСДО АДЬТЕРНАТИВ В ОПЕРАТОРАХ CASE.
10. На основе этих элементарных характеристик производится подсчет метрик Холстеда процедурой HMETRIC и топологических метрик с помощью процедуры FPMERA. Выходные результаты записываются в файл с именем <имя программы>.т^.
Пример файла метрических характеристик. MODULE TEST4;
(* ВСТРОЕННЫЕ ФУНКЦИИ ОБРАБОТКИ СТРОК *) FROM InOut IMPORT ReadString, WriteString, WriteCard, WriteLn, WriteInt; FROM Strings IMPORT Concat, CompareStr, Assign, Copy, Delete,
Insert, Length, Pos; VAR S1,S2: ARRAY[0..80] OF CHAR; STR: ARRAY[0..80] OF CHAR;
I: CARDINAL; CHR : CHAR; BEGIN
WriteString(' ВВЕДИТЕ СТРОКУ '); WriteLn; ReadString(STR); WriteLn; WriteString(STR); WriteLn; WriteString(' ПРИСВАИВАНИЕ '); WriteLn; WriteString('Assing(STR,S1) S1= '); Assign(STR,S1); WriteString(Sl); WriteLn; WriteString(' КОНКАТЕНАЦИЯ СТРОК '); WriteLn; WriteString('Concat(STR,S1,S2) S2= '); Concat(STR,S1,S2); WriteString(S2); WriteLn;
WriteString(' ПЕРЕСЫЛКА СТРОКИ '); WriteLn; WriteString('Copy(S1,1,3,S2) S1,S2= ');
Copy(S1,1,3,S2); WriteString(S1); WriteLn; WriteString(S2); WriteLn; WriteString(' ДЛИНА СТРОКИ '); WriteLn; WriteString('Length(STR) '); WriteLn; I:=Length(STR); WriteString('STR= '); WriteString(STR); WriteString(' Length(STR)= '); WriteCard(I,4); WriteLn; WriteString(' УДАЛЕНИЕ СТРОКИ '); WriteLn; WriteString('Delete(STR,1,6) STR= '); Delete(STR,1,6); WriteString(STR); WriteLn; WriteString(' ВСТАВКА ПОДСТРОКИ '); WriteLn; WriteString('Insert("***",STR,4) STR= '); Insert('***',STR,4); WriteString(STR); WriteLn;
WriteString(' ОПРЕДЕЛЕНИЕ ПОЗИЦИИ ПОДСТРОКИ '); WriteLn; WriteString('Pos("***",STR) '); I:=Pos('***',STR); WriteCard(I,4); WriteLn; WriteString('Pos("***",S1) '); I:=Pos('***',S1); WriteCard(I,4); WriteLn; I:=Length(S1); WriteString('Length(S1) = '); WriteCard(I,4); WriteLn; WriteString(' СРАВНЕНИЕ СТРОК '); WriteLn; WriteString('CompareStr(S1,STR)= ' ); WriteInt(CompareStr(S1,STR),4); END TEST4.
МЕТРИЧЕСКИЕ ХАРАКТЕРИСТИКИ МОДУЛЯ TEST4 В МОДУЛЕ TEST4 НЕТ ОПИСАНИЙ ПРОЦЕДУР ДЛИНА МОДУЛЯ = 1972 ЧИСЛО СТРОК ИСХОДНОГО ТЕКСТА = 52 ЧИСЛО ИМПОРТИРУЕМЫХ МОДУЛЕЙ = 2
ЧИСЛО ИМПОРТИРУЕМЫХ ПРОЦЕДУР И ДРУГИХ ОБЪЕКТОВ = 13 В МОДУЛЕ TEST4 НЕТ ОПИСАНИЙ КОНСТАНТ
ЧИСЛО КОНСТАНТ ЫСБ = 0
ЧИСЛО ОБЪЯВЛЕНИЙ ПЕРЕМЕННЫХ ЕТА2= 5
ЧИСЛО ОПЕРАТОРОВ ЕТА1= 11
ЧИСЛО ПЕРЕМЕННЫХ ЕТА2= 5
ОБЩЕЕ ЧИСЛО ОПЕРАТОРОВ N01= 66
ОБЩЕЕ ЧИСЛО ИСПОЛЬЗОВАНИЙ ПЕРЕМЕННЫХ N02= 32
МЕТРИКИ ХОЛСТЕЛА
СЛОВАРЬ ПРОГРАММЫ — ЕТА = 16
ЛЛИНА ПРОГРАММЫ — N = 98
ОБЪЕМ ПРОГРАММЫ — V = 265.38892
ОЦЕНКА ЛЛИНЫ ПРОГРАММЫ — NH = 31.92203
УРОВЕНЬ ПРОГРАММЫ — LN = 0.02273
УСИЛИЯ НА ИЗУЧЕНИЕ ПРОГРАММЫ — ЕС = 11677.11247
УСИЛИЯ НА РАЗРАБОТКУ ПРОГРАММЫ — ЕР = 21068.53679
ПОТОКОВЫЕ МЕТРИКИ
МЕТРИКА МАК-КЕЙБА СР = 1
ОБОБЩЕННАЯ ПОТОКОВАЯ МЕТРИКА ГР = 41
* ТАБЛИЦА ПЕРЕМЕННЫХ
* ИМЯ ПЕРЕМЕННОЙ * ЧИСЛО ИСПОЛЬЗОВАНИЙ
и«
* Б1 * 8 *
* Б2 * 4 *
* БТН * 12 *
* I * 8 *
* CHR * 0 *
* ТАБЛИЦА ОПЕРАТОРОВ
* ИМЯ ОПЕРАТОРА 51! * ЧИСЛО ИСПОЛЬЗОВАНИЙ
* WriteString * 29 *
* WriteLn * 22 *
* ReadString * 1 *
* Assign * 1 *
* Concat * 1 *
* Copy * 1 *
!I! # _ * 4 *
* WriteCard * 4 *
* Delete * 1 *
* Insert * 1 *
* WriteInt * 1 *
СУММАРНЫЕ ЗНАЧЕНИЯ МЕТРИК
СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ УСИЛИЙ НА РАЗРАБОТКУ ЕРБиМ = 21068.53679
СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ УСИЛИЙ НА ИЗУЧЕНИЕ
БСБиМ = 11677.11247
СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ МАК-КЕЙБА СРБиМ = 1 СУММАРНОЕ ЗНАЧЕНИЕ ОБОБЩЕННОЙ ПОТОКОВОЙ МЕТРИКИ ЕРБиМ = 41
СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ "ЧИСЛО СТРОК В ПРОГРАММЕ НБТНБиМ = 52
СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ "ЛЛИНА ПРОГРАММЫ" ОЕБиМ = 1972
СУММАРНОЕ ЗНАЧЕНИЕ МЕТРИКИ "ЧИСЛО ОПЕРАТОРОВ" ШБУМ = 66
Заключение
Язык MODULA-2 не получил такого широкого применения, как языки программирования Pascal, C++ и C#. Тем не менее, выше описанный алгоритм анализа исходного кода и определения метрических характеристик сложности программ является основой для разработки статических анализаторов программного кода на языках Pascal, C++ и C# современных версий. Такие статические анализаторы могут использоваться в учебном процессе при проведении практических и лабораторных занятий по дисциплинам «Технология программирования» и «Метрология программного обеспечения».
- СПИСОК ЛИТЕРАТУРЫ
1. Липаев В. В. Выбор и оценивание характеристик качества программных средств. Методы и стандарты. М: СИНТЕГ, 2001, -228 с.
2. Липаев В. В. Программная инженерия. Методологические основы. Учебник. — Москва: Теис, 2006.- 608 с.
3. http //swebok.sorlik.ru/10_software_quality.html
4. M. Halstead Elements of software science. 1977. Purdue University/ Имеется русский перевод — Холстед М. Начала науки о программах: пер. с англ. М.: Финансы и статистика, 1981. - 128 с.
5. Gordon R. D. Measuring improvement in program clarity. - IEEE Transations of software engineering, v. SE-5, N 2, 1979, c. 79-90.
6. McCabe T. J. A complexity measure. - IEEE Transations of software engineering, v. SE-2, N 4, 1976, c. 308-320.
7. Черников Б.В., Поклонов Б.Е. Оценка качества программного обеспечения: Практикум: Учебное пособие. М.: ИД ФОРУМ, 2012.- 400 с.
8. Инструментальная система тестирования, отладки и оценки качества программ на языке Модула-2. Отчет о НИР. ДЕП.№ 90.Г20428. НИОВТ МЭИ, 1990, 2-й, промежуточный — 41 с. Научный руководитель: Рякин О.М.
9. Программная документация по инструментальной системе программирования на языке Модула-2. Отчет о НИР. ДЕП. №91.Г27021. НИОВТ МЭИ, 1991, 3-й, заключительный, 61 с. Научный руководитель: Рякин О.М. ШНЭ
КОРОТКО ОБ АВТОРЕ -
Карпович Елена Евгеньевна - доцент кафедры САПР, Московский государственный горный университет, [email protected]