Essential Difficulties and Design

Work in progress. This note is still being written and incomplete.

Essential difficulties are fundamental problems in software development that cannot be completely eliminated.

The four essential difficulties are:

  1. Complexity
  2. Conformity
  3. Changeability
  4. 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.

Written by October 5, 2026 2 min read
Was this helpful?