Briefly describe the purpose of the system, for an audience of developers.
Describe the current software architecture for the system, if there is one. If this is a new system, mention that fact.
Provide a bird's-eye view of the software architecture.
Using UML class diagrams (or similar graphical depiction), present the subsystems of the architecture and their connections, omitting details about their specific interfaces. Each subsystem should correspond to a C++ class. Also list the subsystems, with a brief description of the functionality of each.
If there is any non-standard hardware involved, describe how subsystems are assigned to these components.
Describe the file format(s) used by the system, as well as the format of any other type of persistent object (e.g., database).
If the system performs any kind of access control (e.g., user account access using passwords), provide the access matrix and describe the use of encryption, the authentication mechanism used, the management of keys, etc.
Describe any synchronization and concurrency issues, such as constraints upon the order of class construction/destruction or interaction between multiple threads.
Describe the startup, shutdown, and error behavior of the system. Include concepts like command-line parameters, types of exceptions that may be thrown, and who is responsible for catching exceptions, and what happens when an exception is caught.
For each subsystem, provide an external reference specification (ERS) that captures its interface. Be sure to include all important details that are needed by anyone using the subsystem. This section will serve as an initial reference manual for all developers, as well as a starting point for those implementing the subsystems.