Software Architecture: The Hard Parts