Backup and Restore in Software: Designing for Recovery and Reliability