Managing trade-offs in adaptable software architectures. (2016)