Надежность, прочность, устойчивость
При обсуждении свойств программной системы мы часто оперируем такими терминами, как надежность, прочность и устойчивость, не проводя четких различий между ними. Однако, при формулировании требований эти понятия следует рассматривать отдельно. Если вы думаете, что это не столь важно, то инженеры NASA, которые занимаются проектированием систем жизнеобеспечения, так не считают. Как мне кажется, данный опыт вполне применим и при проектировании программных систем.
Надежность (Reliability) - вероятность того, что система не выйдет из строя в течении определенного периода времени и при определенных условиях эксплуатации. Иначе говоря, в заданных условиях эксплуатации система стабильна и отвечает проектным требованиям.
Прочность (Robustness) - способность системы работать удовлетворительно или даже в соответствии с заявленными требованиями, несмотря на воздействия, выходящие за рамки предопределенных условий эксплуатации, но при этом являющимися возможными. Прочность рассматривается в контексте предвидимых проблем.
Устойчивость (Resilience) - способность системы быстро восстанавливаться или адаптироваться к непредвиденным происшествиям или изменениям, которые нарушают базовые проектные предположения. Устойчивость рассматривается в контексте непредвиденных или маловероятных проблем.
Таким образом, надежность, прочность и устойчивость определяют поведение системы на трех уровнях сложности условий эксплуатации. Сначала в заданной среде; затем в среде с вероятными проблемами; наконец, во враждебной, деструктивной среде.
Предполагается, что по мере развития системы уточняются условия её эксплуатации, модель оперативного окружения становится более точной и реалистичной. Мы сталкиваемся с непредвиденными проблемами, понимаем причины их возникновения, а затем решаем эти проблемы, переводя их в статус известных. Таким образом, совершенствование системы заключается в движении от уровня устойчивости к уровню надежности. Когда мы понимаем, что возникшая непредвиденная ситуация является нормой, которую мы не учли на ранних стадиях проектирования, мы уточняем требования к прочности или даже надежности.
Всегда ли необходимо заботиться об устойчивости? Зависит от рисков, которые несет бизнес при возникновении таких ситуаций. Последствия могут включать временные, репутационные, финансовые риски или даже создавать угрозу жизни людей. С одной стороны, совсем игнорировать уровень непредвиденных ошибок, упрощая модель системы, конечно, было бы глупо. С другой, попытка учесть всевозможные ситуации для большинства программных систем, является неоправданным усложнением.
***
P.s. Если вам интересна данная тематика, присоединяйтесь к моей новостной ленте в Telegram или здесь. Буду рад поделиться опытом. ;-)