In software engineering, the terms “front end” and “back end” are distinctions which refer to the separation of concerns between a presentation layer and a data access layer respectively. The front end is an interface between the user and the back end. The front and back ends may be distributed amongst one or more systems. In software architecture there may be many layers between the hardware and end user. Each can be spoken of as having a front end and a back end. The front is an abstraction, simplifying the underlying component by providing a user-friendly interface. In software design, for example, the model-view-controller architecture, provides front and back ends for the database, the user, and the data processing components. The separation of software systems into front and back ends simplifies development and separates maintenance. A rule of thumb is that the front (or “client”) side is any component manipulated by the user. The server-side (or “back end”) code resides on the server. The confusion arises when one must make front-end edits to server-side files. Most HTML designers, for instance, don’t need to be on the server when they are developing the HTML; conversely, the server-side engineers are, by definition, never on anything but a server. It takes both to ultimately make a functioning, interactive website. For major computer subsystems, a graphical file manager is a front end to the computer’s file system, and a shell interfaces with the operating system. The front end faces the user, and the back end launches the programs of the operating system in response. Using the command-line interface (CLI) requires the acquisition of special terminology and memorization of commands, so a graphical user interface (GUI) acts as a front end desktop environment instead. In the Unix environment, ncurses is a simpler, semi-graphical front end to the CLI. At the level of the Unix CLI itself, most byte stream-oriented (that is, using stdin/stdout/stderr as their interface) programs act as filters—standalone programs that can also serve as front ends and back ends to other programs. (They function by piping data between themselves, mostly for text processing; for example: $ grep word ~user/dir/infile | sort | tee ~user/dir/outfile) In network computing, front end can refer to any hardware that optimizes or protects network traffic. It is called application front-end hardware because it is placed on the network’s outward-facing front end or boundary. Network traffic passes through the front-end hardware before entering the network. In content management systems the terms front end and back end may refer to the end-user facing views of the CMS and the administrative views respectively. In compilers, the front end translates a computer programming source code into an intermediate representation, and the back end works with the intermediate representation to produce code in a computer output language. The back end usually optimizes to produce code that runs faster. The front-end/back-end distinction can separate the parser section that deals with source code and the back end that generates code and optimizes. Some designs, such as GCC, offer choices between multiple front ends (parsing different source languages) or back ends (generating code for different target processors). In speech synthesis, the front end refers to the part of the synthesis system that converts the input text into a symbolic phonetic representation, and the back end converts the symbolic phonetic representation into actual sounds. In the context of WWW applications, a mediator is a service that functions simultaneously as a server on its front end and as a client on its back end.