As software engineers, we are used to designing large system architectures by defining the roles and responsibilities of each component. We assess whether some components have overlapping responsibilities, are overburdened with too many responsibilities, or if there is a gap that must be filled with a new component. Defining, maintaining,