Software Design and Architecture: Key Concepts and Practices

Understanding Diversification in Software Projects

This concept states that different software projects need different design strategies, techniques, and tools based on their unique nature, size, and objectives. For instance, a project focusing on a mobile application for end-users will have a vastly different design approach compared to a large-scale enterprise software solution.

Domain of Software Design

It involves the identification, definition, and organization of all requirements, constraints, technologies, principles, and goals relevant to a specific software project. The knowledge and understanding of the software domain greatly affect its architecture and design.

Software Design Description (SDD)

As an IEEE standard, SDD is a primary medium for communicating program design and explaining the system to stakeholders outside the technical team. It defines the software’s high-level structure and identifies its components, their interfaces, and interactions.

Rough Up-Front Design Approach

This is a design methodology where the main focus is to understand and document high-level design elements before delving into detailed design or coding. This approach aims to identify major components, their relationships, and interactions up-front to reduce uncertainties and changes later during development.

Design Strategies

They are the high-level approaches and guidelines followed during the software design process. They dictate how the software’s structure and components will be defined and organized. Some common strategies include:

  • Top-down design
  • Bottom-up design
  • Modular design
  • Object-oriented design

Each strategy has its strengths and weaknesses, and the choice depends on the software requirements, technical constraints, team expertise, and the development timeline.

IEEE Software Architecture Definition

According to IEEE, software architecture encompasses the set of significant decisions about the organization of a software system – the selection of the structural elements, their interfaces, collaborations, patterns, composition, and the architectural style that guides this organization.

Uses of Architecture Description

Architectural descriptions provide a basis for:

  • Communication between stakeholders
  • System analysis
  • Constructing the system
  • Documenting early design decisions

They depict a holistic view of a software system and encapsulate essential elements, defining their relationships and interactions.

Architectural Style Categories

Architecture styles refer to the pre-defined ‘patterns’ that guide the system organization. Some common categories include:

  • Layered (e.g., n-tier applications)
  • Pipe and filter (e.g., in compilers or workflows)
  • Client-server
  • Microservices
  • Event-driven architectures

Associated Quality Attributes

These attributes refer to the system requirements that provide value and functionality to the user and the system itself. Software architecture significantly impacts quality attributes like performance, security, modifiability, usability, and reliability.

Descriptive Architecture

Descriptive architecture is a portrayal of the system architecture as it is, i.e., in its existing form. It is derived from the system’s codebase and provides a view of how the system has been built over time.

Elements Established in Each ADD Iteration

In each iteration of the Attribute-Driven Design (ADD) method, a set of quality attribute scenarios and constraints determine how to shape the system decomposition. Key elements produced in an ADD iteration typically include:

  • A refined module and component structure
  • Interface specification
  • Responsibilities of each module
  • The rationale for design decisions taken

The iterations continue until all primary system requirements have been adequately addressed.