title: What should be included in an Application Architecture checklist?
body: <p>I'm trying to come up with a checklist or set of questions/criteria to assess and evaluate proposed or emergent architectures (perform architectural reviews).  What are the most important questions you ask when trying to plan, assess or review an architecture?  </p>
  
  <p>I know this is a large topic so I'd like to constrain it to a single end-to-end system and not the architecture for an entire organization.</p>
  
  <p><em>Code Complete</em> provides a decent starting point:</p>
  
  <blockquote>
    <p>Architecture</p>
    
    <ul>
    <li>Is the overall organization of the program clear, including a good
    architectural overview and
    justification?</li>
    <li>Are modules well defined, including their functionality and
    their interfaces to other modules?</li>
    <li>Are all the functions listed in the requirements covered sensibly, by
    neither too many or too few modules?</li>
    <li>Is the architecture designed to accommodate likely changes?</li>
    <li>Are necessary buy-vs.-build decisions included?</li>
    <li>Does the architecture describe how reused code will be made to conform to
    other architectural objectives?</li>
    <li>Are all the major data structures hidden behind access routines?</li>
    <li>Is the database organization and content justified?</li>
    <li>Are all key algorithms described and justified?</li>
    <li>Are all major objects described and justified?</li>
    <li>Is a strategy for handling user input described?</li>
    <li>Is a strategy for handling I/O described and justified?</li>
    <li>Are key aspects of the user interface defined?</li>
    <li>Is the user interface modularized so that changes in it won't affect the
    rest of the program?</li>
    <li>Are memory-use estimates and a strategy for memory management
    described and justified?</li>
    <li>Does the architecture set space and speed budgets for each module?</li>
    <li>Is a strategy for handling strings described, and are character-string
    storage estimates provided?</li>
    <li>Is a coherent error-handling strategy provided?</li>
    <li>Are error messages managed as a set to present a clean user interface?</li>
    <li>Is a level of robustness specified?</li>
    <li>Is any part over- or under-architected? Are expectations in
    this area set out explicitly?</li>
    <li>Are the major system goals clearly stated?</li>
    <li>Does the whole architecture hang together conceptually?</li>
    <li>Is the top-level design independent of the machine and
    language that will be used to
    implement it?</li>
    <li>Are the motivations for all major decisions provided?</li>
    <li>Are you, as a programmer who will implement the system, comfortable with
    the architecture?</li>
    </ul>
  </blockquote>
  
  <p>I'm looking for practical knowledge with examples, e.g., what were the most painful points in an architecture you've created?  </p>