Понятие отказа программного обеспечения как ошибки в нем
Программа - согласно ГОСТ 19781-90 - данные, предназначенные для управления конкретными компонентами системы обработки информации в целях реализации определенного алгоритма. Следовательно, по Тейеру, программа обладает свойством надежности в той мере, в какой она способна удовлетворительно выполнять функции, для которых она предназначена. Надежность программного обеспечения может быть определена как свойство программы, которое выражается в выполнении заданных функций в заданных условиях работы и на заданной вычислительной машине.
Что значит программа не выполняет свои функции? Что такое ошибка в программе? Дело в том, что разные люди по-разному понимают, что такое ошибка в программном обеспечении.
Пример из книги Майерсу «Надежность ПО».
Система раннего обнаружения баллистических снарядов Ballistic Missile Early Warning System должна наблюдать за объектами, движущимися по направлению к США, и, если объект не опознан, начать последовательность защитных мероприятий - от попыток установить с объектом связь до перехвата и уничтожения. Одна из ранних версий системы ошибочно принимала поднимающуюся над горизонтом Луну за снаряд, летящий над Северным полушарием. Является ли это ошибкой? С точки зрения пользователя (Министерства обороны США) - да. С точки зрения разработчика системы - возможно, и нет. Разработчик может настаивать на том, что в соответствии со спецификациями защитные действия должны быть начаты по отношению к любому движущемуся объекту, появившемуся над горизонтом и не опознанному как мирный летательный аппарат.
Программное обеспечение содержит ошибку, если:
· его поведение не соответствует спецификациям.
Недостатки: неявно предполагается, что спецификации корректны. Это если и бывает справедливым, то редко; подготовка спецификаций - один из основных источников ошибок. Если поведение программного продукта не соответствует его спецификациям, ошибка, вероятно, имеется. Однако если система ведёт себя в соответствии со спецификациями, мы не можем утверждать, что она не содержит ошибок.
· его поведение не соответствует спецификациям при использовании в установленных при разработке пределах. Это определение ещё хуже первого. Если система случайно используется в непредусмотренной ситуации, её поведение должно оставаться разумным. Если это не так, она содержит ошибку. Например, авиационная диспетчерская система, согласно спецификациям, должна управлять движением до 200 самолётов одновременно. Но однажды, в районе появился 201 самолёт. Если поведение системы неразумно - скажем, она забывает об одном из самолётов или выходит из строя, система содержит ошибку, хотя и используется вне пределов, установленных при проектировании.
· программное обеспечение ведёт себя не в соответствии с официальной документацией и поставленными пользователю публикациями.
А если ошибки содержатся и в программе и в публикациях? Или если в руководстве описана только ожидаемая и планируемая работа с системой. Например, написано: "Чтобы получить то-то, нажмите один раз то-то". Предположим, что пользователь случайно два раза нажимает то-то и система выходит из строя, потому что её разработчики не предусмотрели такой ситуации. Система, очевидно, содержит ошибку, но ведёт себя в соответствии с публикациями.
· система не способна действовать в соответствии с исходным контрактом и перечнем требований пользователя. Это утверждение тоже не лишено недостатков, поскольку письменные требования пользователя редко детализированы настолько, чтобы описывать желаемое поведение программного обеспечения при всех мыслимых обстоятельствах.
Окончательное определение: В программном обеспечении имеется ошибка, если оно не выполняет того, что пользователю разумно от него ожидать. Отказ программного обеспечения - это проявление ошибки в нём.
Ошибками в ПО являются все возможные несоответствия между демонстрируемыми характеристиками его качества и предписанными требованиями и, иногда, ожиданиями пользователей.
В англоязычной литературе используется несколько терминов, часто переводящихся как «ошибка» на русский язык.
· defect — самое общее нарушение каких-либо требований или ожиданий, не обязательно проявляющееся вовне (к дефектам относятся и нарушения стандартов кодирования, недостаточная гибкость системы и пр.)
· failure — нарушение требований, проявляющееся при каком-то реальном сценарии работы ПО, это скорее проявление ошибки
· fault — ошибка в коде программы, вызывающая нарушения требований при работе (failures), то место, которое надо исправить. Хотя это понятие используется довольно часто, оно, вообще говоря, не вполне четкое, поскольку для устранения нарушения можно исправить программу в нескольких местах. Что именно надо исправлять, зависит от дополнительных условий, выполнение которых мы хотим при этом обеспечить.
· error — используется в двух смыслах.
Первый — это ошибка в ментальной модели программиста, которая заставляет его делать ошибки в коде (faults).
Второй смысл — это некорректные значения данных (выходных или внутренних), которые возникают при ошибках в работе программы.
Первое место в неформальном состязании за место «самой дорого обошедшейся ошибки в ПО» долгое время удерживала ошибка, приведшая к неудаче первого запуска ракеты Ариан-5 4 июня 1996 года, стоившая около $500 миллионов. После произошедшего 14 августа 2003 года обширного отключения электричества на северо-востоке Северной Америки, стоившего экономике США и Канады от 4 до 10 миллиардов долларов, это место закрепилось за вызвавшей его ошибкой в системе управления электростанцией.
Программные, как и технические отказы выражаются в утрате объектом работоспособности. Несмотря на внешнее сходство проявления отказов аппаратуры и дефектов ПО механизмы их формирования имеют различную природу. Для программ фундаментальной является идея проектных дефектов, а теория надежности техники учитывает отказы из-за износа, старения или других причин, изменяющих характеристики устройств во времени. Отказ программного обеспечения обусловлен несоответствием программного обеспечения поставленным задачам. Несоответствие может возникнуть по двум причинам: либо разработчиками программы допущено нарушение спецификации - технических требований к программе, либо спецификация неточная или неполная.