One of the most important insights gained from more than 30 years of history in software engineering history is that one solution never fits all: no single "silver-bullet" model, practice or technology works in all contexts. Appropriate solutions depend on the project goals, requirements, application domain and other factors, and it is common that a solution that worked wonderfully in one project results in a catastrophic failure in others.
Therefore, an important question is "what works when, and why." A factor that makes it difficult to answer this question is that software development is a human process. Due to the complexity and uncertainty of human activities, reasoning from theory is often insufficient to understand true implications.
The above discussion leads to a need of empirical research in software engineering. An empirical paradigm involves the following steps:
* Building models
* Experimenting
* Learning, encupsulating knowledge
Note that this involves an iterative improvement.