Надежность (информатика)
Сложные системы |
---|
Темы |
В информатике . надежность — это способность компьютерной системы справляться с ошибками во время выполнения [1] [2] и справиться с ошибочным вводом. [2] Надежность может охватывать многие области информатики, такие как надежное программирование , надежное машинное обучение и надежная сеть безопасности . Формальные методы, такие как нечеткое тестирование , необходимы для демонстрации надежности, поскольку этот тип тестирования предполагает неверные или неожиданные входные данные. В качестве альтернативы внесение ошибок для проверки устойчивости можно использовать . Различные коммерческие продукты выполняют тестирование надежности анализа программного обеспечения. [3]
Введение
[ редактировать ]В целом, построение надежных систем, охватывающих каждую точку возможного отказа, сложно из-за огромного количества возможных входных данных и их комбинаций. [4] Поскольку для тестирования всех входных данных и комбинаций входных данных потребуется слишком много времени, разработчики не могут исчерпывающе рассмотреть все случаи. Вместо этого разработчик постарается обобщить такие случаи. [5] Например, представьте, что вы вводите несколько целочисленных значений . Некоторые выбранные входные данные могут состоять из отрицательного числа, нуля и положительного числа. Используя эти числа для тестирования программного обеспечения таким образом, разработчик обобщает набор всех действительных чисел до трех чисел. Это более эффективный и управляемый метод, но более подвержен неудачам. Обобщение тестовых примеров — это пример всего лишь одного метода борьбы с сбоями, а именно сбоями из-за недопустимого пользовательского ввода. Системы обычно могут выходить из строя и по другим причинам, например, из-за отключения от сети.
Несмотря на это, сложные системы должны корректно обрабатывать любые возникающие ошибки. Есть много примеров таких успешных систем. Некоторые из наиболее надежных систем можно развивать и легко адаптировать к новым ситуациям. [4]
Проблемы
[ редактировать ]Программы и программное обеспечение — это инструменты, ориентированные на очень конкретную задачу, поэтому они не являются обобщенными и гибкими. [4] Однако наблюдения в таких системах, как Интернет или биологические системы, демонстрируют адаптацию к окружающей среде. Одним из способов адаптации биологических систем к окружающей среде является использование избыточности . [4] Многие органы у человека являются избыточными. Почки – один из таких примеров. Обычно человеку нужна только одна почка, но наличие второй почки оставляет место для отказа. Тот же принцип можно применить и к программному обеспечению, но здесь есть некоторые проблемы. При применении принципа избыточности в информатике не рекомендуется слепо добавлять код. Слепое добавление кода приводит к увеличению количества ошибок, усложняет систему и затрудняет ее понимание. [6] Код, который не усиливает уже существующий код, нежелателен. Вместо этого новый код должен обладать эквивалентной функциональностью , чтобы в случае поломки функции ее могла заменить другая, обеспечивающая ту же функцию, с использованием ручного или автоматизированного программного обеспечения . Для этого новый код должен знать, как и когда устранить точку отказа. [4] Это означает, что больше логики в систему необходимо добавить . Но по мере того, как в систему добавляется больше логики, компонентов и увеличивается размер, она становится более сложной. Таким образом, при создании более избыточной системы сама система становится более сложной, и разработчикам приходится учитывать баланс между избыточностью и сложностью.
В настоящее время практика информатики не ориентирована на создание надежных систем. [4] Скорее, они склонны фокусироваться на масштабируемости и эффективности . Одна из основных причин, по которой сегодня не уделяется внимания надежности, заключается в том, что это сложно сделать в общих чертах. [4]
Области
[ редактировать ]Надежное программирование
[ редактировать ]Надежное программирование — это стиль программирования, ориентированный на обработку неожиданного завершения и неожиданных действий. [7] Требуется код, который корректно обрабатывает эти завершения и действия, отображая точные и недвусмысленные сообщения об ошибках . Эти сообщения об ошибках позволяют пользователю легче отлаживать программу.
Принципы
[ редактировать ]- Паранойя
- Создавая программное обеспечение, программист предполагает, что пользователи хотят взломать его код. [7] Программист также предполагает, что его собственный написанный код может дать сбой или работать некорректно. [7]
- Глупость
- Программист предполагает, что пользователи будут пытаться вводить неверные, поддельные и искаженные данные. [7] Как следствие, программист возвращает пользователю однозначное, интуитивно понятное сообщение об ошибке, не требующее поиска кодов ошибок. Сообщение об ошибке должно быть максимально точным и не вводить пользователя в заблуждение, чтобы проблему можно было легко устранить.
- Опасные орудия
- Пользователи не должны получать доступ к библиотекам , структурам данных или указателям на структуры данных. [7] Эта информация должна быть скрыта от пользователя, чтобы пользователь случайно не изменил ее и не внес ошибку в код. Когда такие интерфейсы построены правильно, пользователи используют их, не находя лазеек для модификации интерфейса. Интерфейс уже должен быть правильно реализован, поэтому пользователю не нужно вносить изменения. Поэтому пользователь сосредотачивается исключительно на своем собственном коде.
- Не может случиться
- Очень часто код модифицируется и может привести к возникновению «невозможного» случая. Поэтому невозможные случаи считаются крайне маловероятными. [7] Разработчик думает о том, как поступить в крайне маловероятном случае, и соответствующим образом реализует обработку.
Надежное машинное обучение
[ редактировать ]Надежное машинное обучение обычно означает надежность алгоритмов машинного обучения. Чтобы алгоритм машинного обучения считался надежным, либо ошибка тестирования должна соответствовать ошибке обучения, либо производительность стабильна после добавления некоторого шума в набор данных. [8] В последнее время, по мере роста их популярности, растет интерес к надежности нейронных сетей. В частности, это связано с их уязвимостью к неблагоприятным атакам. [9]
Надежная конструкция сети
[ редактировать ]Надежное проектирование сети — это исследование проектирования сети с учетом переменных или неопределенных требований. [10] В каком-то смысле надежность в проектировании сети является такой же широкой, как и надежность в разработке программного обеспечения, из-за огромных возможностей изменений или входных данных.
Надежные алгоритмы
[ редактировать ]Существуют алгоритмы, допускающие ошибки во входных данных. [11]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Модельный подход к тестированию устойчивости» (PDF) . Dl.ifip.org . Проверено 13 ноября 2016 г.
- ^ Jump up to: а б 1990. Стандартный глоссарий терминологии программной инженерии IEEE, IEEE Std 610.12-1990 определяет надежность как «степень, в которой система или компонент могут правильно функционировать при наличии неверных входных данных или стрессовых условиях окружающей среды».
- ^ Бейкер, Джек В.; Шуберт, Матиас; Фабер, Майкл Х. (2008). «Об оценке устойчивости» (PDF) . Структурная безопасность . 30 (3): 253–267. doi : 10.1016/j.strusafe.2006.11.004 . Проверено 13 ноября 2016 г.
- ^ Jump up to: а б с д и ж г Джеральд Джей Сассман (13 января 2007 г.). «Очерк создания надежных систем» (PDF) . Groups.csail.mit.edu . Проверено 13 ноября 2016 г.
- ^ Джозеф, Джоби (21 сентября 2009 г.). «Важность создания обобщенных тестовых примеров — Клуб тестировщиков программного обеспечения — онлайн-сообщество тестировщиков программного обеспечения» . Клуб тестировщиков программного обеспечения . Проверено 13 ноября 2016 г.
- ^ Агенты в Интернете: надежное программное обеспечение. «Очерк создания надежных систем» (PDF) . Cse.sc.edu . Проверено 13 ноября 2016 г.
- ^ Jump up to: а б с д и ж «Надежное программирование» . Nob.cs.ucdavis.edu . Проверено 13 ноября 2016 г.
- ^ Эль Сайед Махмуд. «Каково определение надежности алгоритма машинного обучения?» . Проверено 13 ноября 2016 г.
- ^ Ли, Линьи; Се, Тао; Ли, Бо (9 сентября 2022 г.). «SoK: сертифицированная надежность глубоких нейронных сетей». arXiv : 2009.04131 [ cs.LG ].
- ^ «Надежный сетевой дизайн» (PDF) . Math.mit.edu . Проверено 13 ноября 2016 г.
- ^ Карбин, Майкл; Ринар, Мартин К. (12 июля 2010 г.). «Автоматическое определение критических областей ввода и кода в приложениях» (PDF) . Материалы 19-го международного симпозиума по тестированию и анализу программного обеспечения - ISSTA '10 . АКМ. стр. 37–48. дои : 10.1145/1831708.1831713 . ISBN 9781605588230 . S2CID 1147058 .