  A software architect turns system requirements into a suitable software
architecture through an architecture optimization process. However, how should
the architect decide which quality improvement to prioritize, e.g., security or
reliability? In software product line, should a small improvement in multiple
products be preferred over a large improvement in a single product? Existing
architecture optimization methods handle various steps in the process, but none
of them systematically guides the architect in generating an optimal
architecture from the initial requirements. In this work we present an
end-to-end approach for generating an optimal software architecture for a
single software product and an optimal family of architectures for a family of
products. We report on a case-study of applying our approach to optimize five
industry-grade products in a real-life product line architecture, where 359
possible combinations of ten different quality efforts were prioritized.
