The key principle during the domain implementation phase is separation of concerns. Separating the variable parts from the common parts of a software system is essential in order to easily reuse the common parts. Abstraction is the principal method to separate concerns, chiefly by separating the "what" from the "how." Engineers use a variety of techniques to separate concerns, most of which are standard software engineering practices. One technique is program generation. A program generator separates concerns by placing generation-time variabilities in a specification. There are many different ways for expressing specifications from simple textual languages to sophisticated visual languages. XML provides one standard way for expressing specifications.