Правильная программа и надежная программа

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

В связи с тем, что задание на программу обычно формулируется не формально, а также из-за неформализованности понятия ошибки в программе, нельзя доказать формальными методами (математически) правильность программы. Нельзя доказать правильность программы и тестированием: как указал Дейкстра, тестирование может лишь продемонстрировать наличие в программе ошибки.

Альтернативой правильной программы является надежная программа. Надежность программы - это ее способность безотказно выполнять определенные функции при заданных условиях в течение заданного периода времени с достаточно большой вероятностью. При этом под отказом в программе понимают проявление в нем ошибки. Таким образом, надежная программа не исключает наличия в ней ошибок - важно лишь, чтобы эти ошибки при практическом применении этой программы в заданных условиях проявлялись достаточно редко. Убедиться, что программа обладает таким свойством можно при его испытании путем тестирования, а также при практическом применении. Таким образом, фактически мы можем разрабатывать лишь надежные, а не правильные программы.

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

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