Existing means for representing design decisions are deeply flawed. These flaws are at the root of many of the common problems in software development and maintenance. Understanding these essential difficulties will motivate our presentation.
The history of software engineering is often told as the history of monumental failures. The very name of the discipline has been intimately tied with the “software crisis” [Naur & Randell 1969]: a syndrome associated with the abundance of ambitious software development projects which end up as “a monster of missed schedules, blown budgets, and flawed products” [Brooks 1987]. With time, pundits came to describe this on-going state of affairs as “software's chronic crisis” [Gibbs 1994] and even “software hell” [Carr 2004]. Indeed, even laymen have come to accept the fact that software used in daily life suffers from a higher rate of errors that any other commodity.1 What explanations can be offered for this situation?
In “No Silver Bullet”, Frederick Brooks  attributes the difficulties that software development projects face to four inherent properties of their products: complexity, conformity, invisibility, and changeability:2