Flexible software design : (Auerbach, 2005)