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?
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.
Code Complete provides a decent starting point:
Architecture
- Is the overall organization of the program clear, including a good architectural overview and justification?
- Are modules well defined, including their functionality and their interfaces to other modules?
- Are all the functions listed in the requirements covered sensibly, by neither too many or too few modules?
- Is the architecture designed to accommodate likely changes?
- Are necessary buy-vs.-build decisions included?
- Does the architecture describe how reused code will be made to conform to other architectural objectives?
- Are all the major data structures hidden behind access routines?
- Is the database organization and content justified?
- Are all key algorithms described and justified?
- Are all major objects described and justified?
- Is a strategy for handling user input described?
- Is a strategy for handling I/O described and justified?
- Are key aspects of the user interface defined?
- Is the user interface modularized so that changes in it won't affect the rest of the program?
- Are memory-use estimates and a strategy for memory management described and justified?
- Does the architecture set space and speed budgets for each module?
- Is a strategy for handling strings described, and are character-string storage estimates provided?
- Is a coherent error-handling strategy provided?
- Are error messages managed as a set to present a clean user interface?
- Is a level of robustness specified?
- Is any part over- or under-architected? Are expectations in this area set out explicitly?
- Are the major system goals clearly stated?
- Does the whole architecture hang together conceptually?
- Is the top-level design independent of the machine and language that will be used to implement it?
- Are the motivations for all major decisions provided?
- Are you, as a programmer who will implement the system, comfortable with the architecture?
I'm looking for practical knowledge with examples, e.g., what were the most painful points in an architecture you've created?