Flexible, Reliable Software: Using Patterns and Agile Development (Textbooks in Computing)