Designing Software Architectures: A Practical Approach (SEI Series in Software Engineering)