What should the Architecture & Design 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)