How To Prepare A Software Design Document

How To Prepare A Software Design Document

When you take on a new project, before you even open IDE, you need to have clear and agreed-upon design goals. And these goals should be established in a specification document. If the client hasn’t written one, you should write it, and submit it to them for review before you even open your IDE

A brief introduction

A software design document spells out what your development team will code. It provides a detailed description of the technical solution behind the project. Irrespective of the development methodology used, we need to create a software design document early in the software development lifecycle.

Our work to create a software design document. starts when we have the business requirements document. This document contains the functional requirements and the non-functional requirements

The software architect in our project creates an software design document. This task requires close collaboration with the following roles:

  • Business analysts
  • The lead programmer
  • The test team lead
  • The DevOps team lead

Architects need to collaborate with infrastructure, cloud architects, and information security specialists too.

The contents of a design document for a software development project

  • Introduction
  • A table of contents
  • An overview of the proposed software system
  • A reference to the software requirements document
  • A summary of the requirements
  • Considerations and parameters you use while designing the solution
  • Assumptions, dependencies, and constraints
  • A reference to the development methodology you are adopting, e.g Agile
  • Architectural decisions
  • The system architecture pattern we chose
  • An architectural diagram of the proposed software product or application system
  • The development guidelines and practices that we plan to adopt
  • The details concerning the system design, e.g definitions, classifications, subsystems, interfaces, constraints, external interfaces, processes, etc
  • Details covering the transaction validation rules
  • Descriptions of the data design and data structures
  • The description of the proposed user interface including wireframes if applicable
  • Description of any API that you need to develop
  • A conclusion
  • A glossary

Remember that we are addressing the needs of a wide range of stakeholders when you create an software design document. Developers, testers, DevOps engineers, reviewers, and the project manager will all use this document frequently.

A few key considerations while creating a system design document

  • Audience: Developers and testers are the key end-users of a software design document. DevOps engineers and the PM will use it too. When the architect creates a software design document, he/she should think from the perspective of these stakeholders.
  • The creator of a software design document: Ideally, we recommend that the software architect creates the software design document. The architect has the required knowledge to make architectural decisions. He/she remains the best person to create the overall technical solution. Having said that, high-visibility projects need professionally-written software design documents. Software quality auditors, regulatory auditors, and many other stakeholders might read such software design document. You might need professional technical writers to support the architect.
  • Review: A detailed design document like software design document needs a thorough review. You need to arrange for an experienced reviewer. Finding such reviewers can take time, therefore, plan ahead.
  • Change management: Once you have the software design document reviewed and approved, you need to distribute it to all stakeholders. All relevant stakeholders should only use the latest and greatest copy of it. Any change to the software design document must undergo the change management process in our organization.

Software design document

we need to provide a general introduction to your project. Talk about the organizational objectives, however, don’t repeat the content of the requirements document.

Here not recommend you repeat the use cases and user stories in the software design document. Refer to the requirements document but only provide only a brief summary of it here.

Talk about the target audience of our software design document. Explain the version-control and distribution mechanisms.

Software design considerations including metrics and the user interface design

2 . In this section and associated subsections, we need to explain the specific considerations you factored in while creating the software design document. Touch upon the following aspects:

  • Assumptions and dependencies: Describe the assumptions we made about the user interface design and the general system characteristics. Talk about how you validated these assumptions. Elaborate on the external and internal dependencies. If you target specific operating systems like Windows, Mac, Android, or iOS, clarify that.
  • Constraints: Talk about the constraints that we had to consider while designing. These could include security, scalability, availability, performance, regulatory standards, etc. Finally, talk about the relevant metrics here such as uptime requirements.
  • Goals and guidelines: You need to describe the relevant priorities, principles, goals, and guidelines for designing the proposed application. These could overlap with non-functional requirements like availability. Explain why these principles and goals are key to the proposed system.
  • Approaches and methods: Software design is an evolving field, and new approaches/methods emerge. Explain the design methodology and approach we have used.

3. Decisions that you had to make while choosing the system architecture pattern

This section covers the very first set of decisions that you will make after we receive the software requirements. Architectural decisions influence the architecture pattern you choose. You make these decisions to address not only the functional requirements but NFRs too.

E.g, pur architectural decisions influence the following:

  • Scalability;
  • Maintainability;
  • Availability;
  • Reliability;
  • Testability.

Take a software system with multiple services, for example. Can we separate these services from each other completely? Do they have different peaks and troughs in their demand profile? If you answer affirmatively to these questions, then you can consider the microservices architecture.

4. Concerning the chosen system architecture pattern

we have explained the project’s architectural decisions in the preceding section. Now, we need to choose an architecture pattern. This is a very important step when you create a technical solution, therefore, we need to get this right.

Large application systems might have several subsystems. we need to explain the architecture patterns for those too.

Remember that this section of the software design document carries plenty of importance. Not just the development team, but testers and DevOps engineers study this section closely. You need to make this section as clear as we can. Schematic diagrams can help. We recommend you include relevant architectural diagrams, and these should cover the external interfaces.

There are several popular architecture patterns

  • Layered architecture;
  • Event-driven architecture;
  • Microkernel architecture;
  • Microservices architecture;
  • Space-based architecture.

Explain your decisions on why you choose a particular architecture pattern. For strategic software development projects, external software quality auditors might review the software design document. They look for the rationale behind architectural decisions. A well-documented software design document will help we in such cases.

5. Brief Explanations for the design-related choices

While some software development projects can be straightforward, other projects involve complexities. we will face several choices. we need to contend with trade-offs. Design-related decisions and choices are often functions of these trade-offs.

we need to explain our choices and trade-offs. These could involve one or more of the following

  • Infrastructure-related choices, e.g whether to use a cloud computing platform
  • The kind of cloud computing delivery model to use, e.g public, private, or hybrid cloud
  • The choice of the technology stack, e.g. MEAN stack (MongoDB-Express.js-Angular.js-Node.js)
  • The choice of libraries like jQuery
  • Coding standard and guidelines
  • The choice of application security model
  • Which testing frameworks and tools to use
  • The granularity of your requirements traceability matrix
  • The plans for establishing an effective Continuous Integration”(CI)/Continuous Delivery (CD) pipeline
  • Planning the testing and deployment of the application
  • The choice of DevOps tools
  • The choice of external APIs if applicable
  • Planning the maintenance of the software.

You might have many more choices and trade-offs, and the above list is a example one only.

6. Detailed system design

In this section, I’m going to cover the details at a program or module level. The development team and testers pay plenty of attention to this section, especially software developers who consider this section as very important.

Accordingly, you need to provide sufficient details here for everyone who needs them. Avoid jargon and acronyms. Talk about the following aspects:

  • The design of each component and module
  • Relevant details of each file
  • How the proposed system delivers its stated functionality
  • The dependencies between different programs
  • Inputs to each program and their outputs
  • The business logic and validation rules for each functionality
  • The resources used by each component or module
  • The tasks performed by each component and the associated user interactions
  • Constraints and assumptions at a subsystem level.

If we have several subsystems that make up the proposed system, then we need to provide a detailed design for each subsystem.

Aspects of a software design document where we need to provide plenty of details

A software development project always requires a lot of close collaboration, therefore, team members will always share a few details informally. That’s both normal and desirable.

However, this informal approach will simply not work in all cases so we need to provide details upfront. Without that, we can’t consider an software design document complete.

We now talk about these aspects, which are as follows:

1. Capabilities involving cutting-edge technologies

we might choose to offer advanced capabilities in our application, which requires cutting-edge technologies. E.g. we might use Artificial Intelligence or Machine Learning .

In addition to the standard details in a software design document, we need to explain the technical solutions around these technologies in great detail. E.g. we might need to develop ML algorithms to meet our requirements. Talk about them in detail.

Cutting-edge technologies like ML and blockchain require we to hire a software engineer with niche skills. Naturally, we want the best value from their effort. An software design document with sufficient details will help developers to become productive far more quickly.

2. Application security

Security is a key non-functional requirement

Therefore, you might have already talked about it in your software design document. It’s a vast area though. we need to provide sufficient details about our application security solutions.

Talk about the following:

  • Whether you would use multi-factor authentication (MFA)
  • How we would mitigate the key application security risks
  • Whether we would encrypt data-at-rest and in-transit
  • Whether we would use digital signatures
  • How we would use technologies like firewall and antivirus
  • Whether you would use cybersecurity threat intelligence capabilities
  • How we plan to secure APIs.

3. Data models and database design

When you create an software design document, you need to talk about the data models and database design in detail. You need to work closely with the database administrator in our organization.

Our development team, testers, and database administrator will use the information concerning data models and database design. Cover the following aspects:

  • Entity-Relationship diagrams for the relational database tables that you will use;
  • The database schema for NoSQL databases that you plan to use;
  • Performance optimization considerations for programmers and database administrators
  • Database backup and recovery considerations.

4. We approach to cloud computing

We might use a cloud computing platform in your project. There are different kinds of cloud platforms, which are as follows:

  • Infrastructure-as-a-Service (IaaS)
  • Platform-as-a-Service (PaaS)
  • Mobile-Backend-as-a-Service (MBaaS).

Our project requirements will determine which type of cloud platform we will use. Explain our choice and decision-making process in the software design document.

We might also need to choose a cloud computing delivery model. The various models are as follows:

  • Public cloud: We share the cloud infrastructure with other organizations/users. While this delivers cost advantages, we might need to contend with security risks.
  • Private cloud: WE use a private cloud if WE don’t want a shared cloud infrastructure. You exercise full control. However, this model costs more.
  • Hybrid cloud: Hybrid cloud is a mix of public and private cloud computing delivery models. While some of your workloads require high security, the others might not need it. Workloads that require high security can run on a private cloud. The other workloads can run on a public cloud.

Our decision-making process will depend on our project requirements, information security considerations, and regulatory requirements. Explain our choice and the decision-making process in our software design document .

5. API development

We might use APIs in various ways in our proposed system. In some cases, we might choose to use an external API. It might make sense if you find a well-established provider. Remember that we will add an external dependency for every external API that you use. This could adversely impact the performance of our system, therefore, think through this carefully.

we will likely create our APIs to reflect our core business capabilities. Describe our API development plans in the software design document. Talk about how we would secure the API, furthermore, plan the API endpoint carefully. Formulate the rules for API requests and responses.