A prototype is a live, data-driven model that is capable of evolving through user interaction with system designers. Prototyping is used when requirements cannot be fully specified up front, such as with historical data or emerging technologies, as users can state goals and objectives but are unclear on how to accomplish them. Prototyping incorporates a learning process into system design, resulting in improved quality, higher user satisfaction, and shorter development times compared to the classical waterfall methodology. It allows creating preliminary models to drive evolutionary development, though project control is critical to avoid endless projects from non-essential requirements.