4 essential steps to take before making any technical decision
And why discovery and preparation are key?
Intro
Making technical decisions or architectural improvements is not easy. It takes effort, preparation, conscious planning, thoughtful thinking, a strategic approach, and trade-offs. All this because there’re no silver-bullets.
Making the right choices can significantly impact the efficiency and scalability of your project.
Discovery and Preparation are key.
In this article, I’m sharing a 4-step approach to guide you before making any technical decision.
1. Understand the Business Domain and How It Operates
Before diving into any technical specifics, it’s crucial to have a solid understanding of the business domain for which the project is being developed. Know the core processes, business operations, customers, and the everyday challenges the business faces. This understanding ensures that the technical solution aligns with the business objectives and addresses real needs.
Building software for a small business is not easy.
=> We must understand the business and its domain.
You can also talk with the different stakeholders inside the business like finance, ops, etc., and see their everyday tasks, challenges, and the domain language they use daily. This will give you additional context and understanding of the business and how to design the new architecture or project.
Strategic DDD and Event Storming
In my experience, I’ve found Strategic DDD and Event Storming as great tools to start the business domain exploration.
Strategic DDD is a subset of the Domain-Driven Design (DDD). Strategic DDD consists of identifying two key things:
your Ubiquotous Langauge
your Bounded Contexts and the relation between them.
Event Storming is an interactive workshop technique that brings together domain experts and development teams to explore complex business domains.
Note: More about Strategic DDD and Event Storming in the upcoming articles.
2. Find out what are the Top Technical Challenges
Identify the major technical challenges and problems currently faced by the organization. This might include scalability issues, technical debt, security vulnerabilities, or integration challenges with other systems. Recognizing these problems early will help in prioritizing which issues need immediate attention and which architectural improvements can resolve these challenges.
Prioritization is key to successfully mitigate critical technical problems.
If the technical decision we aim to make doesn’t solve them then what’s the point in taking it in the first place? 🤷♂️
Example
Here is an example from a discovery of a project I’ve worked on in the past:
As a first step, we listed the different technical challenges we had at that moment:
As a second step, we prioritized what are the most critical ones we should focus on first:
It’s important to mention that this step, requires, research, thoughtful thinking, discussions, and trade-offs.
We can’t solve all challenges at once. Clear priorities and order are crucial.
Note: The “Why?” behind the decision hides behind a lot of context. The main idea of the example is to showcase what this step looks like in practice.
3. Decide on your Architectural Quality Attributes
Architectural quality attributes define the non-functional requirements like performance, scalability, maintainability, reliability, security, etc. Determining what attributes are most critical to your business goals will influence the architectural decisions you make.
For example, if reliability is a crucial factor for your business, you’ll prioritize solutions that enhance uptime and fault tolerance.
Example
Here is an example from a discovery of a project I’ve worked on in the past:
As a first step, we listed and prioritized the different architectural quality attributes based on their importance at that moment:
As a second step, we picked the attributes our technical decision must satisfy:
Note: The “Why?” behind the decision hides behind a lot of context. The main idea of the example is to showcase what this step looks like in practice.
4. Have Clear Goals
Set clear and measurable goals for what the architectural improvements should achieve. Whether it’s cutting down on maintenance costs, reducing server response times, or improving user experience, having specific targets will help you guide your decisions and make it easier to evaluate the success of the implemented changes.
This step will be much easier and transparent if you already outlined the top technical challenges and problems as well as your architectural quality attributes.
Conclusion
Technical decisions and architectural improvements require thoughtful preparation, strategic approach and trade-offs.
By following these steps:
understanding your business domain
identifying key technical challenges
deciding on critical quality attributes
setting clear goals
you can ensure that your decisions lead to successful outcomes.
Include these steps and considerations as part of your planning process and enhance your architectural designs and solutions.
We’re modeling software to solve complex real-life business problems.
📣 Articles worth reading:
How Dropbox Scaled to 100 Thousand Users in a Year After Launch by System Design Newsletter,
How I Setup my Terminal for Ultimate Productivity by Dev Design Digest,
Practical Learning Strategies for Engineers by The Hybrid Hacker,
10 Must-Reads for Engineering Leaders by Leading Developers,
Great article Petar. The first one is very underrated. When you are junior, you are mostly taught to just deliver good code as fast as possible. But when you want to transition to a senior role - a business understanding is a must.
The expectation is that you won’t be a ‘parrot’ anymore, that you will challenge the PM and try to understand what exactly are we solving.
Great article, Petar. I really like your approach.