High-Level Design Have you used round-trip design, selecting the best of several attempts rather than the first attempt? Is the design of the current subprogram consistent with the design of related subprograms? Does the design adequately address issues that were identified and deferred at the architectural level? Are you satisfied with the way the program has been decomposed into modules or objects? Are you satisifed with the way that modules have been decomposed into routines? Are subprogram boundaries well-defined? Are subprograms designed for minimal interaction with each other? Does the design make sense both from the top down and the bottom up? Does the design differentiate between the problem-domain component, the user-interface component, the task-management component and the data-management component? Is the design intellectually manageable? Does the design have low complexity? Will the program be easy to maintain? Does the design hold connections among subprograms to a minimum? Does the design account for future extensions to the program? Are subprograms designed so that you can use them in other systems? Do low-level routines have high fan-in? Do most routines have low-to-medium fan-out? Will the design be easy to port to another environment? Is the design lean? Are all of its parts strictly necessary? Is the design stratified into layers? Does the design use standard techniques and avoid exotic, hard-to-understand elements?