Software design is predominantly about boundaries: what belongs inside, what remains outside, and most importantly, what goes across the boundaries - how the components are integrated with one another.