The main technique in software design is this: You look at the entirety of your system and you decompose it into pieces that are more manageable and have clear interfaces. This approach is usually referred to as modularization. But what’s the point of investing such an effort if in the end only the externally visible properties of a software matter? In his classic paper “On the Criteria To Be Used in Decomposing Systems into Modules”1, David Parnas gives the following rationale: David P...