Простые интуитивные модели
В поисках средств прогнозирования надежности программного обеспечения было разработано и несколько чрезвычайно простых моделей для оценки числа ошибок. Из-за их простоты им часто уделяется недостаточно внимания, но они основаны на более реальных предположениях, чем сложные модели, и могут оказаться очень полезными.
Первый из них – метод независимого тестирования. Он предлагает начинать тестирование двумя совершенно независимыми группами, использующими независимые наборы тестов. Этим двум группам (или двум сотрудникам – в зависимости от размеров проекта) в течение некоторого времени позволяется тестировать систему параллельно, а затем их результаты собирают и сравнивают. Обозначим через N1и N2число ошибок, обнаруженных каждой из групп соответственно, а через N12– число ошибок, обнаруженных дважды (т.е. обеими группами). Это отношение изображено на рис. 3.7.
Пусть N обозначает неизвестное полное число ошибок в программе. Можно установить эффективность тестирования каждой из групп: E1=N1/N, E2=N2/N. Предполагая, что возможность обнаружения для всех ошибок одинакова (что справедливо далеко не для всех программ), мы можем рассматривать каждое под множество пространства N как аппроксимацию всего пространства. Если первая группа обнаружила 10 % всех ошибок, она должна была найти примерно 10 % всякого случайным образом выбранного подмножества, например подмножества N2. Отсюда
E1 = (N1/N) = (N12/N2).
Выполняя подстановку для N2, получаем
E1=N12/(E2·N)
и
(3.7)
N12известно, а Е1и Е2можно оценить как N12/N2и N12/N1соответственно, откуда мы получаем приближение для N.
Рис. 3.7. Множества ошибок, обнаруженных на независимых тестах
Например, предположим, что две группы нашли по 20 и 30 ошибок соответственно, и, сравнивая их, мы замечаем, что восемь ошибок из них –общие. Имеем E1 = 0,27, E2 = 0,4, что дает, оценку N = 74 и примерно 32 необнаруженные ошибки (74 – 20 – 30 + 8).
Второй метод (вероятно, самый простой) – метод накопления статистики. Он строит оценки, основываясь на исторических данных, в частности на среднем числе ошибок, приходящемся на один оператор в предыдущих проектах. В литературе сведения о частоте ошибок программистов довольно немногочисленны, но на основании имеющихся данных представляется, что в среднем по «отрасли» на каждую тысячу операторов программы после автономного тестирования остается примерно 10 ошибок. Таким образом, если нет более точных данных, можно предположить, что в программе из 32 000 операторов после автономного тестирования еще остается 320 ошибок. Интенсивность отказов из-за одной ошибки при непрерывном использовании программы составляет в среднем 10–4 1/ч.
Этими данными следует пользоваться с осторожностью, поскольку это всего лишь средние оценки, основанные на сведениях, собранных в основном до распространения новых методов программирования, например структурного и объектно-ориентированного программирования. Сторонники этого метода заявляют о значительно более низких оценках, но вследствие хорошо известной тенденции сообщества программистов к чрезмерному оптимизму может оказаться безопаснее опираться на пессимистические оценки.
Из-за неопределенностей во всех обсуждавшихся моделях пока самый разумный подход – воспользоваться несколькими моделями сразу и объединить их результаты. Если имеется возможность создать имитационную модель процесса, ее тоже следует использовать для уточнения результатов.