Software Design for Flexibility: How to Avoid Programming Yourself into a Corner PDF Strategies for building large systems that can be easily adapted for new situations with only minor