Design techniques to improve the resilience of computing systems: software layer