Sustainability guidelines for long-living software systems
design patterns : elements of reusable object - oriented software .