For large-scale systems, diverse customer needs must be communicated and translated into precise implementations that are consistent with the existing system. Typically, we have relied on English-language text as a communications medium. But requirements written in English are often imprecise, and translating them into a finished product is largely a manual effort. As a result, the front end of the software development process — from analysis of customer requirements to high-level design — is generally time consuming, labor intensive, and error prone. In this paper, we discuss ways to apply computer-aided software-engineering technologies to the front-end process. We discuss ways to capture customer requirements in a machine-processable form where they can be reviewed, revised, analyzed, and refined into clear, unambiguous descriptions of what needs to be done and how to do it. Our goal in applying new and existing technologies is to mechanize much of the front-end process and thus reduce development costs and improve product quality.