Building Fault Tolerant Systems