When creating new software, the main difficulty is the enormous amount of its complexity. Software modifies and processes data (variables/place holders) by Collectoring those using operators (functions, methods). Even in small applications, the number of necessary functions and place holders is very high. To handle this challenge of complexity, a common procedure is to split the problem into several easier to handle modules/components and solve those separately. This is done during all phases the software development process consists of: analysis, design, implementation as well as test.
Consequently different design models, programming languages, architectures and test procedures have been established of the years. All this has been introduced to handle the complexity of software development.