Essential difficulties are fundamental problems in software development that cannot be completely eliminated.
The four essential difficulties are:
- Complexity
- Conformity
- Changeability
- Intangibility
Only partial solutions may exist for these difficulties.
Complexity
Software systems can become extremely complex as they grow.
- No two software parts are necessarily alike.
- If two parts are alike, they can be abstracted into one.
- Complexity grows non-linearly with size.
- For large programs, it may be impossible to enumerate all possible program states.
Conformity
Software must conform to its surrounding environment.
It needs to conform to:
- Operating environment
- Hardware
Software is often perceived as the part of a system that must adapt to changes in its environment.
Changeability
Software is expected to change when requirements or surrounding conditions change.
Changes may originate from:
- New applications
- New users
- New machines
- New standards
- New laws
- Hardware problems
Software is therefore viewed as highly malleable.
Intangibility
Software is intangible.
- It is not embedded in physical space.
- It often has no physical laws constraining its structure.
- It does not have an obvious physical representation such as familiar geometric shapes.
Promising Attacks on Complexity
Several approaches have been suggested to deal with software complexity.
Buy vs Build
A development organization can decide whether to:
- Build the required system
- Buy an existing solution
Requirements Refinement and Rapid Prototyping
One of the hardest parts of software development is deciding what to build or buy.
Rapid prototyping helps by:
- Showing the product to the customer.
- Refining requirements.
- Obtaining iterative feedback.
Incremental, Evolutionary and Spiral Development
The basic idea is:
Grow systems rather than trying to build everything at once.
Advantages include:
- Early prototypes
- Easy backtracking
- Better development morale
Great Designers
Good design can be taught, but great design requires developing and nurturing great designers.
Primacy of Design
Traditional software engineering activities include:
- Requirements collection
- Coding
- Testing
- Integration
- Configuration
An architecture-centric approach places greater emphasis on design.
Design should influence software engineering from the very beginning, rather than being treated as a separate activity added later.