Software Architecture for Product Families: Principles and Practice