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