Designing Reliable Systems with Unreliable Components