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,