Надежность (информатика) - Robustness (computer science)

В Информатика, надежность это способность компьютерной системы справляться с ошибками во время выполнения[1][2] и справиться с ошибочным вводом.[2] Устойчивость может охватывать многие области информатики, такие как надежное программирование, надежное машинное обучение, и Надежная сеть безопасности. Формальные методы, такие как нечеткое тестирование, необходимы для демонстрации устойчивости, поскольку этот тип тестирования включает неверные или неожиданные входные данные. В качестве альтернативы, введение неисправности может использоваться для проверки устойчивости. Различные коммерческие продукты выполняют тестирование устойчивости программного обеспечения для анализа.[3]

Вступление

В общем, создание надежных систем, охватывающих все точки возможного отказа, затруднено из-за огромного количества возможных входов и комбинаций входов.[4] Поскольку для тестирования всех входных данных и комбинаций входных данных потребуется слишком много времени, разработчики не могут полностью рассмотреть все случаи. Вместо этого разработчик попытается обобщить такие случаи.[5] Например, представьте, что вы вводите целые числа. Некоторые выбранные входы могут состоять из отрицательного числа, нуля и положительного числа. Используя эти числа для тестирования программного обеспечения таким образом, разработчик обобщает набор всех действительных чисел на три числа. Это более эффективный и управляемый метод, но он более подвержен неудачам. Обобщение тестовых примеров - это пример всего лишь одного метода работы с ошибками, в частности, сбоя из-за недопустимого ввода данных пользователем. Системы обычно могут выходить из строя и по другим причинам, например, при отключении от сети.

Тем не менее, сложные системы должны корректно обрабатывать любые обнаруженные ошибки. Есть много примеров таких успешных систем. Некоторые из наиболее надежных систем можно развивать и легко адаптировать к новым ситуациям.[4]

Вызовы

Программы и программное обеспечение - это инструменты, ориентированные на очень конкретную задачу, и поэтому они не являются универсальными и гибкими.[4] Однако наблюдения в таких системах, как Интернет или же биологические системы продемонстрировать адаптацию к окружающей среде. Один из способов адаптации биологических систем к окружающей среде - использование избыточности.[4] Многие органы у человека лишены. В почка один из таких примеров. Люди обычно нужна только одна почка, но наличие второй почки допускает отказ. Этот же принцип можно применить и к программному обеспечению, но есть некоторые проблемы. При применении принципа избыточности к информатике слепое добавление кода не рекомендуется. Слепое добавление кода приводит к большему количеству ошибок, усложняет систему и затрудняет понимание.[6] Код, который не подкрепляет уже существующий код, нежелателен. Вместо этого новый код должен иметь эквивалент функциональность, так что если функция сломана, другой, предоставляющий ту же функцию, может заменить ее, используя ручной или автоматический разнообразие программного обеспечения. Для этого новый код должен знать, как и когда устранить точку отказа.[4] Это значит больше логика необходимо добавить в систему. Но по мере того, как система добавляет больше логики, составные части, и увеличивается в размере, становится более сложным. Таким образом, при создании более избыточной системы система также становится более сложной, и разработчики должны учитывать баланс между избыточностью и сложностью.

В настоящее время практика информатики не фокусируется на создании надежных систем.[4] Скорее они сосредотачиваются на масштабируемость и эффективность. Одна из основных причин, по которой сегодня не уделяется внимания устойчивости, заключается в том, что это сложно сделать в общих чертах.[4]

Области

Надежное программирование

Устойчивое программирование - это стиль программирования, который фокусируется на обработке неожиданного завершения и неожиданных действий.[7] Для изящной обработки этих завершений и действий требуется код, отображающий точные и недвусмысленные Сообщения об ошибках. Эти сообщения об ошибках позволяют пользователю более легко отлаживать программу.

Принципы

Паранойя - При создании программного обеспечения программист предполагает, что пользователи взламывают свой код.[7] Программист также предполагает, что его собственный написанный код может дать сбой или работать некорректно.[7]

Глупость - Программист предполагает, что пользователи будут пытаться вводить неверные, поддельные и искаженные данные.[7] Как следствие, программист возвращает пользователю недвусмысленное, интуитивно понятное сообщение об ошибке, которое не требует поиска кодов ошибок. Сообщение об ошибке должно быть максимально точным, не вводя пользователя в заблуждение, чтобы проблему можно было легко решить.

Опасные орудия - Пользователи не должны получать доступ к библиотеки, структуры данных, или же указатели в структуры данных.[7] Эта информация должна быть скрыта от пользователя, чтобы пользователь случайно не изменил ее и не привел к ошибке в коде. Когда такие интерфейсы правильно построены, пользователи используют их, не находя лазеек для модификации интерфейса. Интерфейс уже должен быть правильно реализован, поэтому пользователю не нужно вносить изменения. Таким образом, пользователь ориентируется исключительно на свой собственный код.

Не может случиться - Очень часто код видоизменяется, что может привести к возникновению «невозможного» случая. Поэтому предполагается, что невозможные случаи очень маловероятны.[7] Разработчик думает о том, как поступить с маловероятным случаем, и соответствующим образом реализует обработку.

Надежное машинное обучение

Надежное машинное обучение обычно означает надежность алгоритмов машинного обучения. Чтобы алгоритм машинного обучения считался надежным, либо ошибка тестирования должна согласовываться с ошибкой обучения, либо производительность должна быть стабильной после добавления некоторого шума в набор данных.[8]

Надежная сетевая конструкция

Надежный дизайн сети - это исследование дизайна сети перед лицом переменных или неопределенных требований.[9] В некотором смысле надежность в проектировании сети широка, как и надежность в разработке программного обеспечения, из-за огромных возможностей изменений или вводимых данных.

Надежные алгоритмы

Существуют алгоритмы, допускающие ошибки во входных данных.[10] или во время вычисления.[11] В этом случае вычисление в конечном итоге сводится к правильному результату. Это явление получило название «влечение к правильности».[11]

Смотрите также

Рекомендации

  1. ^ «Модельно-ориентированный подход к тестированию на устойчивость» (PDF). Dl.ifip.org. Получено 2016-11-13.
  2. ^ а б 1990. Стандартный глоссарий терминологии программной инженерии IEEE, IEEE Std 610.12-1990 определяет надежность как «степень, в которой система или компонент могут правильно функционировать при наличии недопустимых входных данных или стрессовых условиях окружающей среды»
  3. ^ Бейкер, Джек У .; Шуберт, Матиас; Фабер, Майкл Х. (2008). «Об оценке устойчивости» (PDF). Структурная безопасность. 30 (3): 253–267. Дои:10.1016 / j.strusafe.2006.11.004. Получено 2016-11-13.
  4. ^ а б c d е ж грамм Джеральд Джей Сассман (13 января 2007 г.). "Создание надежных систем: эссе" (PDF). Groups.csail.mit.edu. Получено 2016-11-13.
  5. ^ Джозеф, Джоби (21 сентября 2009 г.). «Важность создания обобщенных тестовых примеров - Клуб тестирования программного обеспечения - Сообщество онлайн-тестирования программного обеспечения». Клуб тестирования программного обеспечения. Получено 2016-11-13.
  6. ^ Агенты в Интернете: надежное программное обеспечение. "Создание надежных систем: эссе" (PDF). Cse.sc.edu. Получено 2016-11-13.
  7. ^ а б c d е ж «Надежное программирование». Nob.cs.ucdavis.edu. Получено 2016-11-13.
  8. ^ Эль-Сайед Махмуд. «Каково определение надежности алгоритма машинного обучения?». Получено 2016-11-13.
  9. ^ «Надежный сетевой дизайн» (PDF). Math.mit.edu. Получено 2016-11-13.
  10. ^ Карбин, Майкл; Ринард, Мартин К. (12 июля 2010 г.). «Автоматическое определение критических областей ввода и кода в приложениях» (PDF). Материалы 19-го международного симпозиума по тестированию и анализу программного обеспечения - ISSTA '10. ACM. С. 37–48. Дои:10.1145/1831708.1831713. ISBN  9781605588230. S2CID  1147058.
  11. ^ а б Данглот, Бенджамин; Preux, Philippe; Бодри, Бенуа; Монперрус, Мартин (21 декабря 2017 г.). «Привлечение корректности: исследование устойчивости поведения программного обеспечения в условиях возмущения во время выполнения». Эмпирическая разработка программного обеспечения. 23 (4): 2086–2119. arXiv:1611.09187. Дои:10.1007 / s10664-017-9571-8. S2CID  12549038.