A practical guide to designing and implementing software architectures.