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?