Origins of Software Architecture
Software engineers have always used software architectures, often without explicitly realizing it.
Software architecture developed to address important software engineering problems, including:
- Essential software engineering difficulties
- Problems associated with programming-in-the-large
- The need for software reuse
Many architectural ideas also originated from non-computing domains.
Software Engineering Difficulties
Software engineers deal with a unique set of problems because software systems are:
- Highly complex
- Intangible
- Expected to meet tremendous demands
- Required to conform to changes in other engineering areas
Software is not useful by itself in the same way as a physical product such as a car. Therefore, it must adapt to changes in its surrounding environment.
Software engineering difficulties can be divided into two categories:
| Type | Description |
|---|---|
| Accidental Difficulties | Problems that can potentially be eliminated through better techniques, tools, or abstractions |
| Essential Difficulties | Fundamental problems that cannot be completely eliminated |
Accidental Difficulties
Accidental difficulties are problems for which solutions exist or may be discovered.
Past increases in software productivity came partly from overcoming accidental difficulties.
Inadequate Programming Constructs and Abstractions
Early programming languages made software development more difficult.
This difficulty was reduced through the development of high-level programming languages.
High-level languages improved programmer productivity by providing better abstractions.
Long Programming Turnaround Time
Programmers previously had to wait a long time to see the results of their programming decisions.
This problem was reduced through time-sharing.
Time-sharing reduced turnaround time to a level approaching the limits of human perception.
Heterogeneous Programs
Using different and heterogeneous programs created difficulties for software developers.
This was addressed through integrated software development environments.
These environments integrate different development tasks into a common environment.