В компьютерных науках (информатике) надёжность — это способность компьютерной системы справляться с ошибочными данными и с ошибками во время выполнения задач[1][2]. Надёжность может охватывать многие области компьютерных наук, например: надежное программирование, надежное машинное обучение и надежная безопасность сети. Формальные методы, такие как нечеткое тестирование, важны для демонстрации надежности, поскольку этот тип тестирования включает неверные или неожиданные входные данные. В качестве альтернативы, неисправность работающей системы может быть использована для проверки устойчивости. Различные коммерческие продукты выполняют тестирование надежности через программный анализ[3].
Введение
правитьВ целом, создание надежных систем, охватывающих каждую точку возможного отказа, затруднено из-за огромного количества возможных входов и их комбинаций[4]. Поскольку для тестирования всех входов и их комбинаций потребуется слишком много времени, разработчики не могут исчерпывающе исследовать все случаи. Вместо этого разработчик попытается обобщить такие случаи[5]. Например, представьте, что вы вводите целочисленные значения. Некоторые выбранные входные данные могут состоять из отрицательного числа, нуля и положительного числа. Используя эти числа для тестирования программного обеспечения таким образом, разработчик обобщает набор всех случаев тремя числами. Это более эффективный и управляемый метод, но более подверженный сбоям. Обобщение тестовых примеров является примером только одного метода для решения проблемы с отказом, а именно с ошибкой из-за неправильного ввода данных пользователем. Системы обычно также могут выходить из строя по другим причинам, таким как отключение от сети.
Несмотря на это, сложные системы должны обрабатывать любые ошибки. Есть много примеров таких успешных систем. Некоторые из самых надежных систем являются развивающимися и могут быть легко адаптированы к новым ситуациям[4].
Проблемы
правитьПрограммы и программное обеспечение являются инструментами, ориентированными на очень специфическую задачу, и поэтому не являются обобщенными и гибкими[4]. Однако наблюдения за такими системами, как Интернет или биологические системы, демонстрируют такую важную характеристику, как адаптация к окружающей среде. Одним из способов адаптации биологических систем к окружающей среде является использование избыточности[4]. Многие органы функционально избыточны в биологическом организме. Например, почка является одним из таких примеров. Людям, как правило, нужна только одна почка, но наличие второй почки сохраняет возможности организма при отказе первой. Этот же принцип может быть применен к программному обеспечению, но есть некоторые проблемы. При применении принципа избыточности к информатике слепое добавление кода не рекомендуется. Слепое добавление кода приводит к большему количеству ошибок, усложняет систему и усложняет её понимание[6]. Код, который не обеспечивает подкрепления уже существующему коду, нежелателен. Вместо этого новый код должен обладать эквивалентной функциональностью, чтобы в случае нарушения функции код, предоставляющий ту же функцию, смог заменить её, используя ручное или автоматическое разнесение программного обеспечения. Для этого новый код должен знать, как и когда следует учитывать точку сбоя[4]. Это означает, что в систему необходимо добавить больше логики. Но поскольку система добавляет больше логики, компонентов и увеличивается в размерах, она становится все более сложной. Таким образом, при создании более избыточной системы она также становится более сложной, и разработчики должны учитывать балансирование избыточности со сложностью.
В настоящее время компьютерные технологии не направлены на создание надежных систем[4]. Скорее они стремятся сосредоточиться на масштабируемости и эффективности. Одна из главных причин того, почему сегодня не уделяется внимания надежности, заключается в том, что это трудно сделать в общем виде[4].
Области
правитьНадёжное программирование
правитьнадёжное программирование — это стиль программирования, который фокусируется на обработке неожиданного завершения и неожиданных действий[7]. Используется специальный код для изящной обработки этих завершений и действий путем отображения точных и однозначных сообщений об ошибках. Эти сообщения об ошибках позволяют пользователю легче настраивать программу.
Принципы
правитьПаранойя — при создании программного обеспечения, программист предполагает, что пользователи хотят нарушить свой код. Программист также предполагает, что его собственный написанный код может не работать или работать некорректно.
Глупость — программист предполагает, что пользователи будут пытаться вводить неверные, поддельные и некорректные данные. Как следствие, программист возвращает пользователю однозначное, интуитивно понятное сообщение об ошибке, которое не требует поиска кодов ошибок. Сообщение об ошибке должно быть максимально точным, не вводя пользователя в заблуждение, чтобы проблему можно было легко устранить.
Опасные инструменты — пользователи не должны получать доступ к библиотекам, структурам данных или указателям на структуры данных. Эта информация должна быть скрыта от пользователя, чтобы пользователь не мог случайно изменить её и внести ошибку в код. Когда такие интерфейсы построены правильно, пользователи используют их, не находя лазеек для изменения интерфейса. Интерфейс уже должен быть правильно реализован, поэтому пользователю не нужно вносить изменения. Поэтому пользователь фокусируется исключительно на своем коде.
Не может случиться — очень часто код модифицируется и может привести к возникновению «невозможного» случая. Поэтому предполагается, что невозможные случаи крайне маловероятны. Разработчик понимает как обращаться с случаями, которые крайне маловероятны, и соответственно реализует разработку.
Надёжное машинное обучение
правитьНадёжное машинное обучение обычно относится к надёжности алгоритмов машинного обучения. Чтобы алгоритм машинного обучения считался надёжным, либо тестовая ошибка должна соответствовать ошибке обучения, либо производительность должна оставаться стабильной после добавления некоторого шума в набор данных[8].
Надёжный дизайн сети
правитьНадёжный дизайн сети — это исследование дизайна сети в условиях переменных или неопределенных требований[9]. В некотором смысле, надёжность в проектировании сети является такой же широкой, как и в проектировании программного обеспечения, благодаря огромным возможностям изменений или вводимых данных.
Надёжные алгоритмы
правитьСуществуют алгоритмы, которые допускают ошибки во входящих данных[10] или во время вычислений[11]. В этом случае вычисления в конечном итоге сходятся к правильному выводу. Это явление было названо «правильностью притяжения» (англ. correctness attraction)[11].
Примечания
править- ↑ A Model-Based Approach for Robustness Testing // Dl.ifip.org. Retrieved 2016-11-13.. Архивировано 24 ноября 2020 года.
- ↑ 1990. Стандартный глоссарий IEEE по терминологии разработки программного обеспечения, стандарт IEEE 610.12-1990, определяет надёжность как «степень, в которой система или компонент могут правильно функционировать при наличии неверных входных данных или стрессовых условий окружающей среды».
- ↑ Jack W. Baker, Matthias Schubert, Michael H. Faber. On the assessment of robustness // Structural Safety 30. — 2008. — № 30. — С. 253–267. — doi:10.1016/j.strusafe.2006.11.004. Архивировано 25 ноября 2020 года.
- ↑ 1 2 3 4 5 6 7 Gerald Jay Sussman. Building Robust Systems an essay // Groups.csail.mit.edu. Retrieved 2016-11-13.. — January 13, 2007. Архивировано 12 августа 2017 года.
- ↑ Joseph, Joby. Importance of Making Generalized Testcases - Software Testing Club - An Online Software Testing Community // Software Testing Club. Retrieved 2016-11-13.. — 2009-09-21. Архивировано 24 июня 2016 года.
- ↑ Building Robust Systems an essay // Agents on the wEb : Robust Software : Cse.sc.edu. Retrieved 2016-11-13.. Архивировано 25 января 2020 года.
- ↑ Robust Programming . Nob.cs.ucdavis.edu. (13 ноября 2016). Дата обращения: 18 февраля 2020. Архивировано 17 февраля 2020 года.
- ↑ El Sayed Mahmoud. What is the definition of the robustness of a machine learning algorithm? ResearchGate. Retrieved 2016-11-13.. Дата обращения: 23 февраля 2020. Архивировано 14 ноября 2020 года.
- ↑ Robust Network Design . Math.mit.edu. Retrieved 2016-11-13.. Дата обращения: 24 февраля 2020. Архивировано из оригинала 9 сентября 2016 года.
- ↑ Carbin, Michael; Rinard, Martin C. Automatically identifying critical input regions and code in applications // Proceedings of the 19th international symposium on Software testing and analysis - ISSTA '10. — С. 37–48. — ISBN 9781605588230. — doi:10.1145/1831708.1831713. Архивировано 13 ноября 2019 года.
- ↑ 1 2 Danglot, Benjamin; Preux, Philippe; Baudry, Benoit; Monperrus, Martin. Correctness attraction: a study of stability of software behavior under runtime perturbation // Empirical Software Engineering. 23 (4). — 21 December 2017. — С. 2086–2119. — doi:10.1007/s10664-017-9571-8. — arXiv:1611.09187. Архивировано 24 февраля 2020 года.