Traditional shops will have programmers or architects produce a detailed thorough design of the software, before it is even developed. For a shop with several developers, this makes sense, because the cost of any design errors grows rapidly with time, especially when multiple developers are involved and code needs to be integrated. Design documents also serve a second purpose as a communication tool for the rest of the team.
XP shops will eschew up-front design for a more iterative form of development. To compensate for lack of design, developers practice test-first development in which units tests are constructed before any actual development has started. Communication of design is achieved through other mechanisms such as pair programming, frequent small releases and integration, and regular dialogue with the customer.
While I use unit tests for development, I don’t usually construct unit tests before development. I do some upfront design, but I don’t go into heavy detail. For me developing a large application on my own, I try to avoid any unnecessary work. I obtain licenses to commercial libraries and graphics, utilize the most productive tools and languages, and reuse code extensively.
One significant practice of mine is to develop first in XML. The XML file, which specifies how my application should function, is later transformed to C# via code generation or processed at runtime as data by the application. Effectively, I am using XML, in some ways, for design. This approach reduces my testing costs and allows my to make major changes to implementation quickly.