Software Design - Goals
Source of Program Complexity
As more modules are added, the number of possible interactions and communication paths increases at a faster rate than the number of modules. Therefore, program complexity grows in a non-linear fashion. In a complex program, the behavior the user sees is determined more by the communication paths between modules (the integration) than by the functions of the modules themselves. The System's Analyst (or Software Architect) has to be responsible for the System interaction.
This is also why Object-Oriented Design works so well. It focuses on the interfaces and interactions between modules, making it possible to build more complex systems.
Conway's Law Happens
Most often, the task is partitioned among the available developers, using functional decomposition (e.g. "Joe likes to do user interfaces and Mary likes the database stuff."). Modules are designed to match the staffing, not to a conscious design. The design emerges, rather than being planned in advance, because the focus is on dividing the work among the team members - not on designing objects and interfaces. Module interfaces and communication grow to match the developers interfaces.