Understanding business drivers and architectural drivers, as well as design patterns, is crucial for designing effective solutions.
In this article, we will explore what design truly entails and its relationship with Agile methodology. We will also answer the question: how can you design without creating unnecessary work?
What is Software Design?
Software design involves transforming user requirements into a form that helps the team in programming and implementing software. During the design process, several factors must be considered, such as user requirements, technical conditions, available tools, business drivers, and architectural drivers. These elements serve as the starting point for the design process and allow for the development of an appropriate solution.
The most important forms that software design can take include:
- Architectural system diagram: This helps in determining the structure of the system and the relationships between its components.
- List of components or layers: These outline the functionality and scope of the system.
- Business processes and use cases: These aid in understanding user needs and defining appropriate functionalities.
- External systems: These allow integration with solutions developed by the team.
- Selected technologies and programming languages: These significantly impact the design process, influencing the feasibility and efficiency of solutions.
Designing is a key element in the Software Development Life Cycle (SDLC) because it provides a solid foundation for the team’s work and speeds up the implementation process.
Goals of Design
The goal of designing a solution is to align the understanding of requirements and transform them into a concrete solution. During this process, software designers (developers, leaders, architects) aim to enable asking more complex questions that help identify potential gaps in requirements and solutions.
Designing a solution is a crucial step for the entire team and organization to understand the proposed solution. It also allows for estimating the scope of work and defining the risks associated with the project, thereby avoiding unnecessary delays and costs.
How to Design Effectively
First and foremost: always design with a specific goal in mind. Rarely do we design for the sake of designing. 😊
Therefore, design should be based on user and business needs, not personal preferences or ideas. It is also essential to focus on the value that the project will bring and avoid creating additional, unnecessary artifacts.
Two key questions to consider are discussed below.
Matching Technique to the Problem
It does not make sense to apply the same design technique to every problem, as each problem is different and requires an individual approach.
When designing a solution, determine what questions the design needs to answer:
- What functions must be fulfilled?
- What are the use cases?
- What do the business processes look like?
- What are the components of the system?
- How does communication occur within the system?
I will discuss how to choose the right design technique and when it works best in future articles.
Adapting Technique to the Audience
When designing solutions, it is not enough to just match the technique to the problem. Knowing the audience and designing with their needs in mind is equally important. Without this, the project will not serve its purpose, and even the best techniques will be ineffective if the audience cannot or does not want to use the designed artifacts.
Consider these questions:
- Who is the project aimed at?
- What audience groups are involved?
- Are there materials tailored to different groups?
- Do we want to reach them differently?
- How can I teach the audience the techniques?
Is Design Agile?
The answer to this question is: I don’t know. Because for me, the question itself is nonsensical.
Simon Brown, the creator of the C4 model, emphasizes the importance of identifying the main design risk and prioritizing it by the likelihood of occurrence and impact. This approach allows for designing solutions that address the most critical risks and mitigate them. This way, more complex methods can be used when necessary, but also focus on programming when the problem is simpler.
The key to designing is the ability to adapt techniques to the problem and knowing the audience for the solution, who should influence the design process. Whether design is agile or not is secondary.
Recommendations
Finally, as usual, I recommend two books on the topic of design:
- Just Enough Software Architecture: A Risk-Driven Approach by George H. Fairbanks, which Simon Brown drew heavily from.
- Fundamentals of Software Architecture: An Engineering Approach