Skip to content

/approach

How I Approach IT Architecture and Project Design

From business processes and applicable obligations to a system that works. Follow the decisions, step by step.

  • Requirements before products
  • Decisions with trade-offs
  • Evidence through delivery
Interactive blueprint

Business processes

Agreed workflows & owners

Applicable obligations

Law, contracts & standards
Keep the loop open
Inside the decision

Start with the organisation

Understand the context

Understand how the organisation works, who owns its processes and which obligations apply.

RequestReviewApprove

BPMN · Mermaid · draw.io

Regulations, where applicable

GDPRNIS2CRADORAEU AI Act

Standards & guidance

ISO/IEC 27001ISO/IEC 42001

What this step produces

  • Process map & stakeholders
  • Applicability & scope
  • Assumptions & constraints
What moves forwardAn agreed problem and scope
Read the explanation for this step

Make the problem testable

Define the requirements

Translate the context into functional needs, quality attributes and acceptance criteria.

Who approved this change, and why?
REQ–01Requirement
ADR–03Decision
TEST–08Evidence

What this step produces

  • Functional & quality requirements
  • Risk & data classification
  • Measurable acceptance criteria
What moves forwardTraceable, prioritised requirements
Read the explanation for this step

Choose an approach to the problem

Choose design patterns

Compare proven ways to solve the problem. Record why a pattern fits, and what complexity it introduces.

Reconstruct how state changed

Domain eventEvent storeRebuild state

Append events to a durable system of record and replay them to reconstruct state.

Trade-off: event versioning, replay and personal-data lifecycle need explicit design.

Microsoft Learn — Read the pattern on Microsoft Learn

Give reads and writes distinct models

CommandWrite model
QueryRead model

Separate models for changing data and querying it. They can share a database.

Trade-off: separate stores introduce synchronisation and consistency concerns.

Microsoft Learn — Read the pattern on Microsoft Learn

Contain a failing dependency

ClosedOpenHalf-open

Stop calls after repeated failures, then allow limited probes before restoring traffic.

Trade-off: choose thresholds, recovery behaviour and fallback deliberately.

Microsoft Learn — Read the pattern on Microsoft Learn

What this step produces

  • Candidate patterns & alternatives
  • Proofs of concept for key risks
  • Explicit trade-offs
What moves forwardA justified design direction
Read the explanation for this step

Give the design a concrete shape

Select the technology

Choose services that support the required behaviour, operating model and constraints.

Azure Cosmos DBPossible event store
Azure FunctionsEvent processing
Azure SQLRead projection

Illustrative Event Sourcing + CQRS implementation; validate ordering, concurrency and consistency.

What this step produces

  • Service & integration choices
  • Cost & operational fit
  • Lock-in & exit considerations
What moves forwardA feasible technology selection
Read the explanation for this step

Make the design safe to deliver

Engineer the guardrails

Turn platform guidance into concrete controls and checks that the team can implement and verify.

IdentityManaged identities · least privilege
DeliveryInfrastructure as code · CI/CD
VerificationSecurity tests · recovery tests
ObservabilityLogs · metrics · traces

What this step produces

  • Identity & security controls
  • ALM & infrastructure as code
  • Observability & recovery design
What moves forwardTestable controls & engineering practices
Read the explanation for this step

Make the reasoning reviewable

Agree the architecture

Bring processes, requirements, views and decisions together in a reviewed architecture baseline.

Architecture Design DocumentLiving baseline · reviewed & versioned
  • Context & requirements
  • Views & interfaces
  • Decisions & alternatives
  • Controls & acceptance criteria
Architecture Decision RecordsContext → options → decision → consequences

What this step produces

  • Architecture Design Document
  • Decision records & alternatives
  • Requirements-to-controls traceability
What moves forwardAn agreed design, with open risks visible
Read the explanation for this step

Stay involved as the system takes shape

Guide the delivery

Align budget, team and sequencing. Validate the design during implementation and update decisions as evidence changes.

Plan
Build
Validate
Release
Budget & ownershipTeam & skillsReview gates

What this step produces

  • Delivery plan & responsibilities
  • Incremental implementation & reviews
  • Acceptance & operational readiness
What moves forwardA validated, operable implementation
Read the explanation for this step

Architecture continues after go-live

Operate, learn & adapt

Use operational evidence and changing business needs to revisit assumptions, requirements and design.

ObserveLearnAdapt
Service objectivesRunbooksRecovery evidence

What this step produces

  • Service objectives & ownership
  • Operational feedback & recovery tests
  • Updated requirements & decisions
What moves forwardEvidence for the next design iteration
Read the explanation for this step

Read the full explanation

The thinking behind the steps

In this explanation

I often get asked how to properly plan and structure an IT project. This is, surprisingly to many, relatively easy in principle, but much more challenging in practice. An IT system does not create value just by existing (okay, maybe Bitcoin :-)), but it usually serves a purpose, at least in B2B business applications.

1. Understand the context

View this step in the illustration

A solid start is to fully understand the core processes of the organization using the tool. It is important not to be too narrow at this point. Try to understand the big picture and get to the drawing board. Align this with the organization and get it into some form of artifact, like a Mermaid chart, BPMN 2.0 (if you are no longer in your 20s, like me :-)), Draw.io or whatever you like.

Align this with key stakeholders to ensure it is clear what the tool is doing and in which procedural context it will be embedded. This sounds easy but is already hard for many organizations.

Already at this point, you should check and discuss legal and compliance restrictions the organization must follow to ensure the design is legally compliant and secure from the ground up. Check for GDPR, NIS2, the AI Act, CRA and all other relevant legislation, where applicable, and speak to the legal department or a lawyer if needed.

2. Define the requirements

View this step in the illustration

After this step is done, we should have a solid understanding of what the organization needs. Now we can translate this into a set of requirements. This includes functional requirements, meaning what the system should do, but also non-functional requirements such as performance, availability, security, scalability and maintainability.

Try to make these requirements as concrete and measurable as possible. For example, a requirement like “the system should be fast” is not helpful. What does fast mean? 100 milliseconds? 2 seconds? And under which circumstances?

Also, do not forget that requirements can contradict each other. The business might want a highly available system with real-time processing, but at the same time have almost no budget for infrastructure.

These are discussions you need to have early, not when the system is already half implemented.

The outcome should be a clear set of requirements, constraints and expected results that the organization agrees on.

3. Choose design patterns

View this step in the illustration

Problems arise. This is the part where we need solutions!

The best way is to solve problems with proven, time-tested solutions: design patterns, for example the Cloud Design Patterns (ideally from Microsoft :-)). You should work with established design patterns where they make sense. Read them, understand them, apply them and build your design based on these patterns. There is usually no reason to reinvent the wheel.

For example, if you need to build a system that processes events, stores historical changes and provides different views of the same data, you might want to look into Event Sourcing and CQRS. If you have external services that can temporarily fail, look into Retry and Circuit Breaker patterns.

Of course, not every system needs a complicated architecture. Sometimes a simple application with a relational database is perfectly fine. The point is to understand the problem first and then evaluate which existing solutions are suitable. Also, document why you selected a particular pattern and why you rejected alternatives. This is very important in case another architect takes over. Then this person knows your design choices were deliberate and can understand your reasoning.

4. Select the technology

View this step in the illustration

After this is clear, we know which design patterns we need to implement to address the concrete problems and challenges. Now we can evaluate which technology is suitable and which might not be suitable. This is an important distinction because I have seen projects where the technology was already decided before anyone properly understood the requirements.

“We want Kubernetes.”

“We want microservices.”

“We want everything in Azure.”

Okay, but why?

Technology should follow the requirements and architecture, not the other way around. For example, if we decided to implement Event Sourcing with CQRS, we could use Azure Cosmos DB as an event store, Azure Functions for event processing and Azure SQL for read projections.

This is just one possible implementation, of course. We also need to consider costs, existing infrastructure, available skills in the organization, vendor lock-in and long-term maintenance. There is little value in building a technically beautiful system if nobody in the organization can maintain it afterwards.

At the end of this step, we should have a feasible technology selection that supports our design.

5. Engineer the guardrails

View this step in the illustration

Now we know what we want to build and which technologies we intend to use.

But before we start implementing everything, we need to ensure the system will be secure, reliable and compliant with the applicable requirements. Remember the legal and compliance restrictions we identified in the first step? Now we need to translate them into actual technical controls, taking into account what we have already defined during the earlier design steps.

For example, GDPR requirements might affect how we store personal data, who can access it, how long it is retained and how it can be deleted. NIS2-related requirements, where applicable, might influence our security controls, incident handling and operational procedures. For AI systems, the EU AI Act might introduce additional requirements depending on the system’s classification and intended purpose.

This is also where we define things like authentication, authorization, logging, monitoring, encryption, backup and recovery. And please, do not confuse writing a security policy with implementing security. A document saying that access is restricted does not restrict access. The controls need to exist in the system, and ideally we should be able to demonstrate that they work. How individual regulations translate into architecture decisions is covered in more depth under Compliance & Governance.

6. Agree the architecture

View this step in the illustration

Now we have the business context, requirements, design patterns, technology selection and technical guardrails.

Time to bring everything together. And by everything, I mean everything relevant to the design.

Create a proper architecture design document (ADD) and discuss it with the relevant stakeholders. This does not mean writing a 200-page Word document that nobody will ever read. Keep it brief, but include everything that is needed.

Use architecture diagrams, data-flow diagrams, interface definitions and Architecture Decision Records (ADRs) where they add value. I personally prefer visual representations because they make it much easier to discuss complex systems with people from different backgrounds. Also, challenge the architecture or speak with friends or other architects. You might have missed something. Work with AI to double-check and challenge your reasoning, but verify its conclusions. You still have time to make corrections, and there is no shame in this.

What happens if a service is unavailable? What happens if the database fails? How do we restore the system? What happens if the amount of data increases tenfold? And who is actually going to maintain all of this?

These questions might sound obvious, but they are often overlooked. The objective is to agree on a design that is realistic, maintainable and aligned with the requirements.

7. Guide the delivery

View this step in the illustration

Now we can finally start building the system.

But the architect’s job does not end here. A good architecture on paper is relatively useless if the actual implementation looks completely different.

Stay involved during implementation, work with the development teams and review important technical decisions.

Make sure the agreed patterns and security controls are actually implemented. I would not recommend babysitting the implementation team, but as an architect, you still need to double-check whether what is being implemented follows the agreed plan.

Use automated testing, CI/CD pipelines, code reviews and infrastructure as code where appropriate.

At the same time, do not turn architecture into a bureaucratic nightmare where developers need approval for every small change.

Developers should have enough freedom to make technical decisions within the agreed architectural boundaries. And if something does not work as expected, change it! An ADD can and should be a living document (within limits).

There is no reason to defend an architectural decision just because it was made six months ago.

8. Operate, learn and adapt

View this step in the illustration

The system is now in production.

Great, but we are not finished.

In fact, this is where we find out whether many of our assumptions were actually correct.

Maybe the system is slower than expected. Maybe operational costs are higher. Maybe users work with the application in a completely different way than originally anticipated.

This is why monitoring, logging and operational feedback are so important. Compare the actual behavior of the system with the requirements we defined earlier. If something does not work, investigate why. Challenge your assumptions along the way.

Maybe we need to optimize a database, change an integration, improve a business process or even reconsider an architectural decision. Also, requirements do not remain static. Organizations change, legislation changes and technology changes.

The architecture needs to be able to adapt.

Keep the loop open

One final point: These eight steps are not meant to be a strict waterfall process. I know the term is unpopular these days, but try to work in an agile way.

You do not finish step one, never look at it again and blindly continue until step eight.

In practice, you will go back and forth. Take a whiteboard or an iPad and start drawing an architecture with pen and “paper”. This helps a ton.

During implementation, you might discover that a requirement was wrong. During testing, you might find that a design pattern is not suitable. During operations, you might discover that the business process itself needs to change.

That is perfectly normal. And frankly speaking, if nobody ever challenges an assumption or questions an architectural decision during a project, I would start wondering whether we are looking critically enough at what we are building.

The important part is to keep the loop open and validate assumptions early.

Feed what you learn during development and operations back into the requirements and architecture. In the end, planning and structuring an IT project is not particularly complicated in principle.

Understand the business, define the requirements, use proven design patterns, select suitable technologies, implement the necessary controls and make sure the system actually works.

The difficult part is doing all of this consistently while dealing with budgets, deadlines, different stakeholders and changing requirements.

And that is where the real work begins. :-)

Back to the illustration

Next step

See the approach in practice

Anonymised client projects show how these steps hold up under real constraints.