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