Development of Fault-Tolerant Software Systems Based on Architectural Abstractions