reading-software-design-for-flexibility