Robustness
Robustness in the context of software systems and applications is defined as the degree to which a system or component can still function in the presence of pertubations: faults, failures or adverse conditions. It is is associated with the resilience of a system and the ability to maintain function despite adverse (worst case) conditions and unfavorable changes in internal structure or external environment. A robust system is "pertubation-resistant". A system which can stil function in the presence of faults is called fault tolerant. Robustness depends on the fragility and brittleness of a system, and is a measure of how sensitive a particular system is to changes and disturbances. Reliability, robustness and fault tolerance can be achieved by redundancy and replication.
Basically, a system is robust if a certain operation or process can be achieved in many ways, if there are many ways of doing the same thing. For example, there are many different ways to reach a node, because there is more than one path to it, or there are many different ways to access a certain node type, because there are many redundant instances.
- diversity of links: reach a node on different paths
- diversity of nodes: access different redundant instances of a node
- diversity of design/versions: reach a computational goal in different ways
In any case, diversity and redundancy are the key. There are in general two different ways to increase robustness in distributed systems: first redundancy of components, elements and nodes, and second redundancy of paths, links and channels between them. The former can be found in the replication of nodes, the latter can be observed in the internet, if one route is blocked, then another is taken. If there is always another way to reach the goal, then the failure of a single node or link does not affect the function of the system. A third method to increase robustness and fault tolerance is 'design diversity' to protect the system against design faults: the use of multiple functionally equivalent but diverse program versions based on the same specification to ensure safety in critical applications and to protect the most vital subsystems of complex systems and networks against design faults (also known as N-Version Programming or NVP which was first proposed by Algirdas Avizienis in 1977).