Traditional software lifecycle development methodologies grew out of a need to control ever-larger development projects, and the difficulties of estimating and managing these efforts to reliably deliver results. These methodologies drew heavily on the principles from engineering such as construction management. As a result, they stressed predictability (one has to plan every last detail of a bridge or building before it is built), and linear development cycles – requirements led to analysis which led to design which in turn led to development. Along with predictability, they inherited a deterministic, reductionist approach that relied on.