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