Domain-Driven Design improves your DORA KPIs

Philipp Kostyra
25 min readMar 19, 2024

--

An well-modualrized architecture optimized for flow and DORA KPIs
Well-Modularized Architecture — DALL-E

Domain-Driven Design emerges as a linchpin in optimizing DORA KPIs. By embracing Conway’s Law, nurturing socio-technical architectures, aligning with Feature Driven Development, and facilitating modern software architectures, DDD propels software development into a realm where efficiency, collaboration, and continuous improvement reign supreme. The evidence is clear: integrating DDD principles enhances not only software design but also the key performance indicators that define success in the dynamic landscape of software delivery.

What is DORA?

The DORA KPIs are a set of metrics that measure the performance and efficiency of software development and delivery processes.They are based on six years of research by the DORA (DevOps Research and Assessment) team, which was founded by Google and later acquired by CloudBees. The DORA team surveyed thousands of development teams across multiple industries, to try to understand what makes a high performing team different from a low performing team. They found that high performing teams have higher levels of customer satisfaction, profitability, productivity, and innovation.

  • Deployment Frequency: How often an organization successfully releases to production.
  • Lead Time for Changes: How long it takes a commit to get into production
  • Change Failure Rate: How often deployments cause a failure in production.
  • Median Time to Restore: How long it takes an organization to recover from a failure in production.

These metrics reflect the key aspects of software delivery and operations, such as speed, quality, reliability, and resilience. They also align with the core principles of DevOps, such as continuous integration, continuous delivery, automation, collaboration, and feedback. The DORA team also identified the capabilities that drive these metrics, such as technical practices, organizational culture, leadership, and learning.

The DORA KPIs are relevant for modern software development because they help organizations assess their DevOps maturity, identify areas for improvement, and measure the impact of changes over time. They also enable organizations to benchmark their performance against their peers and industry standards, and learn from the best practices of high performing teams. The DORA KPIs are widely used and recognized as a reliable and valid way to measure software delivery and operational performance.

The DORA KPIsare a set of metrics that measure the performance and efficiency of software development and delivery processes. They are based on six years of research by the DORA (DevOps Research and Assessment) team. Let me explain the concepts behind the terms you mentioned:

Velocity: This is the speed at which a software team can deliver value to the customers or users. It reflects how quickly and frequently the team can release new features, bug fixes, or improvements to the software. A high velocity means the team can respond to changing market demands and customer feedback faster, and deliver better quality software.

  • Deployment Frequency: It indicates how often an organization successfully releases to production. It is calculated by counting the number of deployments (or releases) per unit of time (such as per day, week, month, etc.). A higher deployment frequency means the team can deliver smaller and safer changes to the software more frequently, reducing the risk of failures and increasing customer satisfaction.
  • Lead Time for Changes: It indicates the amount of time it takes a commit to get into production. It is calculated by measuring the time elapsed from the moment a code change is made (such as a pull request or a merge) to the moment it is deployed to production. A shorter lead time for changes means the team can deliver value to the customers or users faster, and get feedback sooner.

Stability: This is the reliability and resilience of the software system. It reflects how well the system can handle failures, errors, or disruptions, and how quickly it can recover from them. A high stability means the system can maintain a consistent and acceptable level of performance and availability, and minimize the impact of incidents on the customers or users.

  • Change Failure Rate: It indicates the percentage of deployments causing a failure in production. It is calculated by dividing the number of failed deployments by the total number of deployments in a given period of time. A failure is defined as any event that requires a hotfix, rollback, or patch to restore the system to a normal state. A lower change failure rate means the team can deliver changes to the software with higher confidence and quality, and reduce the cost and effort of fixing errors.
  • Median Time to Restore: It indicates how long it takes an organization to recover from a failure in production. It is calculated by measuring the median time elapsed from the moment a failure is detected to the moment it is resolved. A shorter median time to restore means the team can restore the system to a normal state faster, and minimize the downtime and disruption for the customers or users.

DORA Capabilities

Out of the aforementioned KPIs DORA extracts technical, process and culture capabilities, which make an organization high performant.

Technical capabilities

Code maintainability: This is the ability to make changes to the code easily and reliably, without introducing errors or breaking existing functionality. Code maintainability depends on factors such as code quality, readability, consistency, modularity, and documentation.

Continuous delivery: This is the practice of delivering software to production in small and frequent increments, using automated pipelines and processes. Continuous delivery enables faster and more reliable software delivery, and reduces the risks and costs of deployment.

Continuous integration: This is the practice of merging code changes from multiple engineers into a shared repository, and running automated tests to verify the integration. Continuous integration ensures that the code is always in a working state, and detects and fixes errors early.

Database change management: This is the process of managing changes to the database schema and data, and ensuring that they are consistent and compatible with the application code. Database change management involves tools and techniques such as version control, migration scripts, testing, and automation.

Deployment automation: This is the use of tools and technologies to automate the deployment of software to different environments, such as development, testing, staging, and production. Deployment automation reduces manual intervention and human errors, and increases the speed and consistency of deployment.

Empowering teams to choose tools: This is the practice of giving teams the autonomy and responsibility to select the best tools and technologies for their services, as long as they adhere to the domain model and the ubiquitous language. Empowering teams to choose tools allows them to use the most suitable and effective tools for their specific problems and contexts.

Flexible infrastructure: This is the ability to adapt the infrastructure to the changing needs and demands of the software systems, by using modern platforms and tools, such as containers, orchestration, and cloud services. Flexible infrastructure enables elasticity and scalability, and optimizes the use of resources and costs.

Loosely coupled architecture: This is the design of software systems that consist of discrete and self-contained services that communicate and cooperate over a network, without depending on or affecting other services. Loosely coupled architecture reduces the complexity and coupling of the software systems, and increases the modularity and flexibility of the software systems.

Monitoring and observability: This is the ability to measure and understand the health and performance of the software systems, and to identify and troubleshoot issues and anomalies. Monitoring and observability involve tools and techniques such as metrics, logs, traces, alerts, dashboards, and visualizations.

Shifting left on security: This is the practice of incorporating security considerations and practices into the software development lifecycle, rather than treating security as a separate or later concern. Shifting left on security improves the security and quality of the software systems, and reduces the vulnerabilities and risks of the software systems.

Test automation: This is the use of tools and technologies to automate the testing of software systems, and to perform different types of testing, such as unit, integration, functional, performance, and security testing. Test automation improves the quality and reliability of the software systems, and reduces the time and effort of testing.

Test data management: This is the process of managing the data that is used for testing the software systems, and ensuring that the data is accurate, consistent, and secure. Test data management involves tools and techniques such as data generation, data masking, data subsetting, and data refresh.

Trunk-based development: This is the practice of having a single branch of code that is the source of truth for the software systems, and having engineers commit their code changes to the trunk frequently and regularly. Trunk-based development prevents merge conflicts and integration issues, and enables continuous integration and delivery.

Version control: This is the practice of tracking and managing changes to the code and other artifacts of the software systems, and maintaining a history of the changes. Version control enables reproducibility and traceability, and supports collaboration and coordination among engineers.

Process capabilities

Customer feedback: This is the practice of gathering and incorporating feedback from the customers and users of the software systems, and using the feedback to inform and improve the product and feature design. Customer feedback enables customer satisfaction, loyalty, and retention, and drives better organizational outcomes.

Documentation quality: This is the quality of the documentation that describes the software systems, such as the requirements, specifications, design, architecture, code, tests, deployment, operation, and usage. Documentation quality depends on factors such as accuracy, clarity, consistency, completeness, and relevance.

Monitoring systems to inform business decisions: This is the practice of using the data and insights from the monitoring and observability of the software systems, to inform and support the business decisions and strategies. Monitoring systems to inform business decisions enables data-driven and evidence-based decision making, and improves the alignment and performance of the software systems and the business goals.

Proactive failure notification: This is the practice of setting up alerts and notifications that inform the engineers and operators of the software systems about any failures or issues that occur or are likely to occur, and that require attention or action. Proactive failure notification enables faster and easier detection and resolution of failures and issues, and reduces the impact and cost of failures and issues.

Streamlining change approval: This is the practice of simplifying and reducing the change approval process that is required for deploying software changes to production, and replacing the formal and centralized change approval process with a more informal and decentralized change approval process, such as peer review. Streamlining change approval enables faster and more reliable software delivery, and reduces the overhead and bureaucracy of the change approval process.

Team experimentation: This is the practice of allowing and encouraging teams to experiment with different solutions and approaches for their problems and contexts, and to learn from their successes and failures. Team experimentation enables innovation and improvement, and fosters a culture of learning and feedback.

Visibility of work in the value stream: This is the practice of making the work of the teams and the value stream more visible and transparent, and showing the progress and status of the work and the value stream. Visibility of work in the value stream enables better communication and collaboration, and improves the efficiency and effectiveness of the work and the value stream.

Visual management: This is the practice of using visual tools and techniques, such as charts, graphs, diagrams, maps, and boards, to represent and communicate the information and data related to the software systems, such as the requirements, specifications, design, architecture, code, tests, deployment, operation, and usage. Visual management enables better understanding and comprehension, and improves the quality and reliability of the software systems.

Work in process limits: This is the practice of limiting the amount of work that is in progress at any given time, and focusing on completing the work that is already started, rather than starting new work. Work in process limits enable faster and more frequent delivery, and reduce the waste and inefficiency of the work.

Working in small batches: This is the practice of breaking down the work into small and manageable units, and delivering the work in small and frequent increments. Working in small batches enables faster and more reliable software delivery, and reduces the risks and costs of the work.

Cultural capabilities

Generative organizational culture: This is the type of organizational culture that promotes a collaborative and creative interaction between technical and domain experts, to iteratively refine a conceptual model that addresses the domain problems. Generative organizational culture encourages a culture of trust, learning, innovation, and excellence.

How to empower software delivery teams as a business leader: This is the practice of giving teams the autonomy, accountability, and alignment to deliver value to customers and stakeholders. This means that teams are empowered to make decisions and take actions that are aligned with the domain model and the ubiquitous language, and that teams are accountable for the outcomes and impacts of their services. This also means that teams are aligned with the business goals and strategies, and that they communicate and collaborate with other teams and functions.

How to transform: This is the process of changing the way software systems are designed and developed, and the way software organizations are structured and operated, to match the domain according to input from the domain experts. This means that software systems are transformed from being rigid and complex, to being agile and simple. This also means that software organizations are transformed from being siloed and bureaucratic, to being collaborative and innovative.

Job satisfaction: This is the degree of satisfaction and fulfillment that engineers experience from their work, and the extent to which their work meets their needs and expectations. Job satisfaction depends on factors such as motivation, engagement, recognition, reward, and growth.

Learning culture: This is the type of organizational culture that encourages and enables continuous and iterative exploration and refinement of the domain model and the ubiquitous language. This requires and enables the engineers to learn from the domain experts, from the customers, from the feedback, and from each other. This also requires and enables the engineers to share their knowledge, insights, and experiences with other engineers, teams, and functions.

Transformational leadership: This is the type of leadership that provides a vision and a direction for designing and developing software systems that match the domain according to input from the domain experts. This inspires and influences the engineers to follow and contribute to the vision and the direction, and to achieve high performance and organizational outcomes. This also empowers and mentors the engineers to grow and develop their skills and capabilities, and to take ownership and responsibility for their services.

Well-being: This is the state of physical, mental, and emotional health and happiness that engineers and customers experience from their work and their software systems. Well-being depends on factors such as stress, frustration, satisfaction, fulfillment, and quality.

Why Domain-Driven Design is a driver to improve your DORA KPIs

What is Domain-Driven Design?

In today’s rapidly evolving software development landscape, it’s crucial to build applications that not only meet technical requirements but also align with the needs of the business. This is where Domain-Driven Design (DDD) comes into play. Following we will explore the main concepts and practices of DDD, its history, and its relevance in modern software architecture and development.

History of Domain-Driven Design

Domain-Driven Design has its roots in the early ideas of object-oriented analysis and design. However, it gained widespread recognition with the publication of Eric Evans’ book in 2003. Since then, DDD has evolved, with various communities and practitioners contributing to its growth. Key influences and contributions include the patterns catalog, bounded context concept, event storming technique, and hexagonal architecture style. While DDD has faced challenges and criticisms, such as its applicability in legacy systems and the risk of over-engineering, its impact on software development cannot be denied.

Why Does Domain-Driven Design Force Us to Understand the Business Problem First?

One of the fundamental principles of DDD is to focus on understanding the business problem before diving into technical solutions. This approach ensures that the software remains relevant, valid, and aligned with the business needs. By using ubiquitous language, collaborating with domain experts, and discovering the core domain, DDD helps bridge the gap between the domain and the model. However, it is important to avoid common pitfalls like neglecting non-functional requirements and imposing a single model.

Strategic Design

Strategic design forms the high-level view of the domain and plays a vital role in DDD. It involves identifying the boundaries and relationships of subdomains, guiding resource allocation, and providing a roadmap for development efforts. Concepts like domain, subdomain, bounded context, and core domain are essential in strategic design. Techniques such as EventStorming and Domain Storytelling aid in the practical application of strategic design, and understanding best practices and common mistakes is crucial. Here are some more details on the Core Concepts of Strategic Design:

  • Domain: In software engineering and business analysis, a domain refers to the area of interest or the sphere of knowledge that the software solution is intended to address. For example, if you’re building a software application for online banking, the domain would be “banking”. This includes all the related concepts, rules, and behaviors associated with banking, such as accounts, transactions, loans, etc.
  • Sub Domain: A sub domain is essentially a subset of the main domain. It’s a specific area within the larger domain that may have its own unique set of concepts, rules, and behaviors. In the banking example, “accounts management” or “loan processing” could be considered sub domains. They are part of the overall banking domain, but they have specific functions that may differ from other areas of banking.
  • Bounded Context: This term comes from Domain-Driven Design (DDD), a software development approach that emphasizes modeling based on the reality of business as relevant to your use cases. A bounded context is a boundary within which a particular model is defined and applicable. It encapsulates entities, value objects, events, and other domain objects along with the rules that govern their interactions. The idea is to provide a context for these objects and rules so that they make sense and don’t conflict with other models within other contexts. For example, in the banking domain, the concept of “account” might mean different things in different contexts — a checking account in retail banking context, or an investment account in wealth management context.
  • Core (Sub) Domain: In DDD, the core domain refers to the most important, unique, or high-value area of your business domain that your software needs to address. This is the part of your software that provides the greatest competitive advantage and is key to the success of your business. Building on the banking example, if your software’s main differentiator is its revolutionary approach to managing accounts, then “accounts management” could be your core domain.
  • Supporting (Sub) Domain: Supporting domains are those areas of your business domain that are necessary for the operation of your software but are not the primary focus. They support the core domain but they do not provide a competitive advantage in and of themselves. In the banking software example, a supporting domain might be “customer support” or “reporting”. These areas are important, but they are not your software’s unique selling point.
  • Generic (Sub) Domain: A generic domain is a part of the business domain that is not unique to your business and doesn’t provide a competitive advantage. Generic domains are typically areas that can be handled by off-the-shelf software or third-party services. For example, authentication and user management could be considered a generic domain in many applications, as there are many pre-existing solutions available for these tasks.

Tactical Design

Tactical design complements strategic design by providing a low-level view of the domain. It involves implementing the domain model in code and ensuring the consistency and quality of the software. Key concepts like service, aggregate, value object, and repository are central to tactical design. By showcasing examples and code snippets, we can explore the practical application of tactical design, including trade-offs, alternatives, and best practices.

  • Entities: These are objects with a unique identity that persist over time. They have attributes that may change, but they are still the same object. For example, a customer or an account is an entity.
  • Value Objects: These are objects that have no identity and are immutable. They are defined only by the values of their attributes. For example, a color or a date is a value object.
  • Aggregates: These are clusters of one or more entities, and may also contain value objects. They define a consistency boundary around one entity, which is the root. For example, an order and its line items form an aggregate, where the order is the root.
  • Services: These are stateless objects that perform some logic that does not belong to an entity or a value object. They operate on domain objects and implement domain-specific operations. For example, a payment service or a shipping service is a service.
  • Repositories: These are objects that abstract the data storage and persistence of aggregates. They provide methods to store, retrieve, and update aggregates. For example, a customer repository or an order repository is a repository.
  • Factories: These are objects that provide an abstraction for creating other objects, such as aggregates, entities, or value objects. They encapsulate the complexity of object construction and validation. For example, a customer factory or an order factory is a factory.
  • Events: These are objects that represent significant occurrences that have happened in the domain and need to be communicated to other stakeholders. They capture the relevant data of the occurrence and are published by aggregates. For example, a payment received event or a shipment delivered event is an event.
  • Modules: These are logical units that group related concepts and follow the ubiquitous language. They can be implemented as packages or namespaces in code. For example, a billing module or a shipping module is a module.

Domain-Driven Design as a School of Thinking and Problem Understanding

DDD goes beyond being a set of tools and techniques; it is a mindset and philosophy for software development. By emphasizing the value of the domain, fostering a culture of learning and experimentation, and adopting a holistic and iterative approach, DDD helps us think deeply and understand the problem at hand. Through ubiquitous language, modeling business behavior, and capturing domain knowledge, DDD enables effective problem-solving.

Relevance for Modern Software Architecture and Development

DDD is highly relevant and compatible with modern software architecture and development practices. It aligns well with agile, microservices, cloud, DevOps, and event-driven architecture. By showcasing examples and cases, such as hexagonal architecture, designing microservices, deploying on the cloud, automating DevOps pipelines, and implementing event-driven systems, we can highlight the benefits and challenges of using DDD in modern software development.

Implementation Reference: DDD Modeling Starter Process

To facilitate the practical application of DDD, the DDD Starter Modelling Process provides a simple and practical guide. It covers essential steps and techniques, such as EventStorming, example mapping, domain modeling, and user story mapping. By following this process, engineers can deliver a minimum viable product based on the domain model. Examples, templates, and best practices can be explored to ensure successful implementation.

How does DDD support the DORA capabilities and improve your DORA KPIs?

Technical Capabilities

Code maintainability: The ability to make changes to the code easily and reliably, without introducing errors or breaking existing functionality. Factors include code quality, readability, consistency, modularity, and documentation.

DDD can improve code maintainability by organizing the code into meaningful and consistent modules that reflect the domain concepts and terminology, making the code easier to understand, modify, and reuse. For example the usage of Aggregates, Value Objects or Entities improve the consistency and encapsulation of the code.

Continuous delivery: Delivering software in small, frequent increments using automated pipelines. Reduces risks and costs of deployment.

DDD can support continuous delivery by enabling independent and frequent deployments of services aligned with domain boundaries, reducing dependencies and increasing agility.

Continuous integration: Merging code changes, running automated tests to verify integration. Ensures code is always in a working state and detects errors early.

DDD can facilitate continuous integration by promoting a test-driven development approach using the ubiquitous language of the domain.

Database change management: Managing changes to the database schema and data, ensuring consistency with application code.

DDD can simplify database change management by applying the principle of service autonomy, allowing each service to have its own optimized database. Aggregates are simplifying the database model of applications.

Deployment automation: Automating software deployment to different environments. Reduces manual intervention and increases deployment speed and consistency.

DDD can enable deployment automation by following microservices or cloud-native architectures, simplifying deployment processes.

Empowering teams to choose tools: Giving teams autonomy to select the best tools while adhering to the domain model and ubiquitous language.

DDD empowers teams to choose tools suited to their specific problems and contexts: Understand the problem first, before choosing a technology.

Flexible infrastructure: Adapting infrastructure to changing software system needs using modern platforms and tools.

DDD provides flexible infrastructure through micro-services or cloud-native architectures, adapting infrastructure to changing needs.

Loosely coupled architecture: Designing software systems of discrete, self-contained services that communicate without depending on others. Reduces complexity and increases flexibility.

DDD achieves loosely coupled architecture through service autonomy, reducing system complexity by modeling system boundaries along the business domain.

Test automation: Automating testing of software systems to improve quality and reliability.

DDD facilitates test automation through facilitating test-driven development. Using DDD to create an event-based architecture, every event is testable.

Test data management: Managing test data used for software system testing to ensure accuracy and consistency.

DDD simplifies test data management through service autonomy, avoiding issues of shared databases. Lean from BDD, example mapping can help to identify and create meaningful test data.

Process Capabilities

Customer feedback: Gathering and incorporating feedback from customers and users to inform and improve product and feature design. DDD can improve customer feedback by fostering a customer-centric, value-driven, and feedback-oriented approach, designing systems to deliver value and continuously improving based on customer feedback since development teams really understand the domain they are working in and collaborate frequently with their customers

Documentation quality: Quality of documentation describing software systems, including requirements, specifications, design, architecture, code, tests, deployment, operation, and usage. DDD can enhance documentation quality by using the ubiquitous language of the domain to ensure consistency, clarity, and understandability for technical and domain experts.

Streamlining change approval: Simplifying the change approval process for deploying software changes to production, moving from formal and centralized to more informal and decentralized approval processes. DDD can streamline change approval by enabling independent and frequent deployments aligned by domain services, which are reducing dependencies. This is allowing decentralized changes within each development team. Governance models can be created by using Context Mapping.

Team experimentation: Allowing teams to experiment with solutions and approaches for their specific problems and contexts and learn from successes and failures. DDD can foster team experimentation by giving teams autonomy and accountability to select the best tools and technologies that adhere to the domain model. Use a first set of bounded contexts from your first event stormings and create a prototype to validate if the bounded contexts cut is valid.

Visibility of work in the value stream: Making the work of teams and the value stream more visible and transparent, showing progress and status. DDD can improve visibility of work in the value stream by organizing code into meaningful modules reflecting domain concepts and making the work traceable.

Visual management: Using visual tools and techniques to represent and communicate information and data related to software systems. A model of your software is also visual. DDD can enhance visual management by using the ubiquitous language of the domain to describe the software systems, making them more visual and comprehensible. Tooling like EventStorming, Domain Storytelling or Domain Message Flow fosters quick and efficient knowledge exchange and joint learning.

Work in process limits: Limiting the amount of work in progress and focusing on completing started work. DDD can help enforce work in process limits by enabling independent and frequent deployments aligned with domain boundaries, reducing dependencies and work in progress since teams can focus by on bounded context ownership and process limits

Working in small batches: Breaking down work into small units and delivering it in small, frequent increments. DDD can help enforce work in small batches by forcing the teams to understand the business problems and decompose them into appropriate bounded contexts. Understanding the business problem enables teams to cut the solution into smaller features (e.g.; Use EventStorming to identify User Stories and Features). This enables Feature Driven Development.

Cultural capabilities

Generative organizational culture promotes collaborative and creative interaction between technical and domain experts to refine a conceptual model addressing domain problems. Encourages trust, learning, innovation, and excellence. DDD can foster a generative organizational culture by promoting collaboration and creative interaction between all stakeholders of the product to refine a conceptual model.

How to empower software delivery teams as a business leader: Empowers teams to make decisions aligned with the domain model and ubiquitous language, and holds them accountable for outcomes and impacts. Ensures alignment with business goals and fosters communication and collaboration. DDD can empower software delivery teams as business leaders, giving them autonomy, accountability, and alignment with domain modeling and language, business goals, and collaboration.

How to transform: The process of changing how software systems are designed and developed to match the domain according to input from domain experts. Transforms systems from being rigid and complex to agile and simple. Transforms organizations from being siloed and bureaucratic to collaborative and innovative. DDD can assist in the transformation by providing a framework and methodology for designing and developing software systems aligned with domain expertise, leading to agility and simplicity. It can also transform organizations into collaborative and innovative entities.

Job satisfaction: The degree of satisfaction and fulfillment that engineers experience from their work. Depends on factors such as motivation, engagement, recognition, reward, and growth. DDD can increase job satisfaction by providing meaningful and valuable problem solutions aligned with engineers’ skills and interests, enhancing motivation, engagement, and fulfillment.

Learning culture: Organizational culture encourages continuous exploration and refinement of the domain model and ubiquitous language. Requires and enables learning from domain experts, customers, feedback, and peers. DDD can create a learning culture by encouraging continuous exploration and refinement of the domain model and ubiquitous language, fostering learning from experts, customers, feedback, and peers, and sharing knowledge and experiences.

Transformational leadership: Leadership providing a vision and direction for designing and developing software systems aligned with domain expertise. Inspires and influences engineers to follow the vision, achieve high performance, and empowers them to grow and take ownership. DDD can support transformational leadership by providing a vision and direction for designing and developing software systems in alignment with domain expertise, inspiring high performance, and empowering development teams to grow and take ownership.

Well-being: The state of physical, mental, and emotional health and happiness that engineers and customers experience. Depends on factors such as stress, frustration, satisfaction, fulfillment, and quality. DDD can improve well-being by reducing stress and frustration, providing a clear understanding of the domain and software systems, and enabling engineers to work on relevant and meaningful problems. It also enhances customer well-being by delivering valuable and quality software and involving them in the design and development process.

Systematic view of DDD and DORA

Systemic view on “How DDD support DORA”
Systemic view on “How DDD support DORA”

Domain-Driven Design (DDD) offers a compelling argument in the context of the DORA framework, leveraging its principles to significantly enhance software development and delivery processes. Here’s how DDD aligns with DORA metrics and drives improvements:

1. Solving Business Problem First: DDD emphasizes understanding and solving business problems before diving into technical implementations. By prioritizing business needs, DDD ensures that development efforts are focused on delivering tangible value to the organization. This approach enables Feature Driven Development, where features are developed in small, iterative batches, reducing lead time to changes and change failure rate. By working on smaller, manageable increments, teams can iterate quickly, respond to feedback, and deliver changes more rapidly, ultimately improving deployment frequency.

2. Enforcing Conway’s Law: DDD embraces Conway’s Law by structuring software around business domains rather than technical layers. Through techniques like Context Mapping, DDD reduces friction between development teams by aligning software architecture with organizational communication structures. This alignment empowers independent product teams, enabling them to take ownership of specific business domains and make autonomous decisions. As a result, deployment frequency increases as teams can deploy changes independently, and lead time to changes decreases due to streamlined communication and decision-making processes.

3. Fostering Independent Service Paradigm: DDD promotes the decomposition of monolithic systems into smaller, independent services aligned with specific business capabilities. This adoption of an independent service paradigm enables the adoption of modern software architectures such as Microservices, Event-Driven Architecture (EDA), Command Query Responsibility Segregation (CQRS), and serverless computing (Lambda). These architectures contribute to lower Mean time to recovery by isolating failures to specific services, facilitating faster recovery and reducing service downtime. Additionally, the independent service paradigm supports higher deployment frequency by allowing teams to deploy changes to individual services without impacting the entire system. Furthermore, by breaking down complex systems into smaller, more manageable components, DDD reduces lead time to changes by enabling teams to make targeted updates to specific services, rather than waiting for large-scale system releases.

Conclusion

With this blog post, I hope it became now clear how DDD can contribute to each of DORA KPIs:

1. Deployment Frequency (DF): DDD can help increase DF by providing a clear understanding of the business domain and the requirements of the software. By focusing on the business problem being solved, engineers can make better decisions about what code changes are necessary and how they should be implemented. This can lead to more efficient development processes and faster deployment times.

2. Lead Time for Changes (LTC): DDD can help reduce LTC by providing a clear understanding of the business domain and the requirements of the software. By focusing on the business problem being solved, engineers can make better decisions about what code changes are necessary and how they should be implemented. This can lead to more efficient development processes and faster deployment times.

3. Mean Time to Restore (MTTR): DDD can help reduce MTTR by providing a clear understanding of the business domain and the requirements of the software. By focusing on the business problem being solved, engineers can make better decisions about how to design the software to be more resilient to service incidents. This can lead to faster recovery times and less downtime.

4. Change Failure Rate (CFR): DDD can help reduce CFR by providing a clear understanding of the business domain and the requirements of the software. By focusing on the business problem being solved, engineers can make better decisions about what code changes are necessary and how they should be implemented. This can lead to fewer bugs and service incidents.

In summary, Domain-Driven Design provides a systematic approach to software development that directly aligns with the objectives of the DORA framework. By prioritizing business needs, aligning software architecture with organizational communication structures, and fostering an independent service paradigm, DDD drives improvements in deployment frequency, lead time to changes, change failure rate, and mean time to restore, ultimately enhancing the overall effectiveness and efficiency of software delivery processes.

Resources

  1. DORA Metrics to Measure DevOps Performance | CloudBees: CloudBees discusses the importance of DORA metrics in measuring DevOps performance and explores their adoption in the industry.
  2. DORA metrics: 4 key metrics to measure your DevOps KPIs — Plandek: Plandek highlights four key DORA metrics for measuring DevOps Key Performance Indicators (KPIs) and explains their significance.
  3. Dora metrics — definition & overview | Sumo Logic: Sumo Logic provides a comprehensive definition and overview of DORA metrics, shedding light on their role in assessing DevOps practices.
  4. How To Measure DevOps Success: Why DORA Metrics Are Important: BlueOptima emphasizes the importance of DORA metrics in measuring DevOps success and driving continuous improvement.
  5. How DORA Metrics can improve DevOps performance | Opsera: Opsera delves into how DORA metrics can enhance DevOps performance, providing insights into their implementation and benefits.
  6. Best of 2022: How DORA Metrics Can Measure and Improve … — DevOps: DevOps.com explores how DORA metrics can measure and improve performance in DevOps practices, highlighting their effectiveness.
  7. DORA Metrics: The 4 Key Indicators of Elite DevOps Performance — Waydev: Waydev outlines the four key indicators of elite DevOps performance measured by DORA metrics and offers guidance on their application.
  8. The Ultimate Guide to DORA Metrics — DevCycle: DevCycle provides the ultimate guide to DORA metrics, covering their definition, significance, and practical implementation.
  9. What Is DORA and Why Should You Care? — DevOps.com: DevOps.com explains what DORA is and why it’s essential to care about these metrics, emphasizing their role in driving organizational success.
  10. DORA: Visit the official website for DORA to access comprehensive information about the DevOps Research and Assessment (DORA) organization, its mission, and resources for understanding and implementing DORA metrics.
  11. Free Domain-Driven Design Learning Resources — GitHub: GitHub repository offering free resources for learning Domain-Driven Design (DDD), providing valuable educational materials.
  12. Curated Resources for Domain-Driven Design (DDD) — GitHub: GitHub repository curated by SAP containing resources for Domain-Driven Design (DDD), offering a selection of high-quality learning materials.
  13. Where can I find good Domain Driven Design resources? — Stack Overflow: Stack Overflow thread discussing where to find good resources for Domain-Driven Design (DDD), providing insights from the community.
  14. DORA | DevOps Research and Assessment: Explore the official website of DORA to learn more about DevOps Research and Assessment, including information about DORA metrics and their role in assessing DevOps success.
  15. DORA Metrics: How to measure Open DevOps Success | Atlassian: Atlassian explains how to measure Open DevOps success using DORA metrics, providing guidance on their implementation and interpretation.

--

--