Formal nonmonotonic reasoning provides a promising basis for meeting the demands inherent in the incomplete, evolving and inconsistent requirements that characterise large-scale industrial software systems. This paper explores formal reasoning in requirements analysis, design and implementation. It indicates how the notion of provability in maximal consistency logics might be used to extend current logical foundations for existing formal notations for specifying requirements. A number of definitions are then developed, using notions from level default theories to specify preference between consistent subsets of possibly inconsistent requirements, (partial) satisfaction of requirements by programs and by designs, the best subset of the requirements satisfied by a given design, implementation of a design and design improvement. These definitions provide a foundation for some very interesting directions for formal methods research.