В информатике надежность — это способность компьютерной системы справляться с ошибками во время выполнения [1] [2] и справляться с ошибочным вводом. [2] Надежность может охватывать многие области информатики, такие как надежное программирование , надежное машинное обучение и надежная сеть безопасности . Формальные методы, такие как нечеткое тестирование , необходимы для демонстрации надежности, поскольку этот тип тестирования предполагает неверные или неожиданные входные данные. В качестве альтернативы для проверки устойчивости можно использовать внесение ошибок . Различные коммерческие продукты выполняют тестирование надежности анализа программного обеспечения. [3]
В целом, построение надежных систем, охватывающих каждую точку возможного отказа, сложно из-за огромного количества возможных входных данных и их комбинаций. [4] Поскольку для тестирования всех входных данных и комбинаций входных данных потребуется слишком много времени, разработчики не могут исчерпывающе рассмотреть все случаи. Вместо этого разработчик постарается обобщить такие случаи. [5] Например, представьте, что вы вводите несколько целочисленных значений . Некоторые выбранные входные данные могут состоять из отрицательного числа, нуля и положительного числа. Используя эти числа для тестирования программного обеспечения таким образом, разработчик обобщает набор всех действительных чисел до трех чисел. Это более эффективный и управляемый метод, но более подвержен неудачам. Обобщение тестовых примеров — это пример всего лишь одного метода борьбы с сбоями, а именно сбоями из-за недопустимого пользовательского ввода. Системы обычно могут выходить из строя и по другим причинам, например, из-за отключения от сети.
Несмотря на это, сложные системы должны корректно обрабатывать любые возникающие ошибки. Есть много примеров таких успешных систем. Некоторые из наиболее надежных систем можно развивать и легко адаптировать к новым ситуациям. [4]
Программы и программное обеспечение — это инструменты, ориентированные на очень конкретную задачу, поэтому они не являются обобщенными и гибкими. [4] Однако наблюдения в таких системах, как Интернет или биологические системы, демонстрируют адаптацию к окружающей среде. Одним из способов адаптации биологических систем к окружающей среде является использование избыточности . [4] У человека многие органы являются избыточными. Почки – один из таких примеров . Обычно человеку нужна только одна почка, но наличие второй почки оставляет место для отказа. Тот же принцип можно применить и к программному обеспечению, но здесь есть некоторые проблемы. При применении принципа избыточности в информатике не рекомендуется слепо добавлять код. Слепое добавление кода приводит к большему количеству ошибок, усложняет систему и затрудняет ее понимание. [6] Код, который не обеспечивает никакого усиления уже существующего кода, нежелателен. Вместо этого новый код должен обладать эквивалентной функциональностью , чтобы в случае поломки функции ее могла заменить другая, обеспечивающая ту же функцию, с использованием ручного или автоматизированного программного обеспечения . Для этого новый код должен знать, как и когда устранить точку отказа. [4] Это означает, что в систему необходимо добавить больше логики . Но по мере того, как в систему добавляется больше логики, компонентов и увеличивается размер, она становится более сложной. Таким образом, при создании более избыточной системы сама система становится более сложной, и разработчикам приходится учитывать баланс между избыточностью и сложностью.
В настоящее время практика информатики не ориентирована на создание надежных систем. [4] Скорее, они склонны фокусироваться на масштабируемости и эффективности . Одна из основных причин, по которой сегодня не уделяется внимания надежности, заключается в том, что это сложно сделать в общих чертах. [4]
Надежное программирование — это стиль программирования, ориентированный на обработку неожиданного завершения и неожиданных действий. [7] Требуется код, который корректно обрабатывает эти завершения и действия, отображая точные и недвусмысленные сообщения об ошибках . Эти сообщения об ошибках позволяют пользователю легче отлаживать программу.
Надежное машинное обучение обычно означает надежность алгоритмов машинного обучения. Чтобы алгоритм машинного обучения считался надежным, либо ошибка тестирования должна соответствовать ошибке обучения, либо производительность остается стабильной после добавления некоторого шума в набор данных. [8] В последнее время, по мере роста их популярности, растет интерес к надежности нейронных сетей. В частности, это связано с их уязвимостью к неблагоприятным атакам. [9]
Надежное проектирование сети — это исследование проектирования сети с учетом переменных или неопределенных требований. [10] В некотором смысле надежность в проектировании сети имеет такое же широкое значение, как и надежность в разработке программного обеспечения, из-за огромных возможностей изменений или входных данных.
Существуют алгоритмы, допускающие ошибки во входных данных. [11]