What should the Architecture cover for a software project?
• Architectural Goals, Constraints, Risks
• System Level Requirements (both related to hardware & operating system)
• High Level System Architecture overview - the system and the major elements of the system with dependencies & constraints
• High Level Components Overview - the major components of the system
• Resource Consumption Objectives - the resource consumption objectives of the system (e.g. memory, CPU, Hard Disc space etc)
• Data Security objectives - secured data storage, encryption, input validation, output encoding, error handling, logging requirements, cryptography, session management
• Structure of the system, relevant design patterns, interfaces of the system components
• An overview of the open source libraries, 3rd parties, components that are reused
• Data Flow between Software Components - the interaction between relevant software components
What should the Detailed Design cover for a software component?
• The Structure of the Component (Class diagrams) - classes & interfaces including the relationships (inheritance, aggregation, composition etc), constraints & dependencies. Some of the goals are reusability (building components that generic), maintainability, testability (the ability to add unit tests - if the architecture uses globals/singletons the code will be hard/impossible to unit test)
• Interfaces of the Components - the public interfaces that can be used to access functionalities by the callers (APIs, parameters, properties, call-backs etc). The team members who integrate or build at the top of these components can review the public interfaces and share feedback about potential problems, gaps, missing items etc
• The Interaction or Data Flow between software components – The data that goes in & out from / to the software components (e.g. an authentication module most likely receives as input the username & password and retrieves as output an authentication token / session ID with expiration date)