In the bad old days of waterfall design was performed up front prior to the start of the coding. All the features of the system would be fleshed out and described before a line of code was written.
With Extreme Programming and Agile up front design gave way to iteration where the code was the design. Rather than thinking ahead to subsequent features only the immediate story would be considered. Refactoring was proposed as the mechanism to deal with the consequential design rework.
In this video I look at the different layers of software and the relationship between modules. Instead of an all or nothing approach we look at how to broadly define a structure and only design in more detail once we actually begin to develop the module. This is possible through design of interfaces or contracts between the different modules.