It is generally agreed that formulating careful specifications of software is a good idea, whether before or after the software is written. Specifications improve software design, by revealing unclear behaviour or complicated cases. Specifications guide programming, by offering an objective criterion for whether a program is right or wrong. Specifications assist reuse, by documenting exactly what software is supposed to do.

However, specifications are used much less in practice than one might expect. Our goal in developing QuickCheck is to add value to specifications, by offering a short-term payoff for their use.