Navigating a Large Scale Modernization With DDD

Rate this content
Bookmark

Which technology stack to choose? What to do to get rid of legacy applications? And how the heck can we structure our teams to support our efforts? Let's talk about the big problems that can arise during a large-scale modernization effort, offering solutions and preventative measures to ensure a successful migration.


We delve into the intricacies of transitioning from a hodgepodge of diverse projects and technologies to a more streamlined architecture. Let's explore leveraging Domain-Driven Design (DDD) to structure teams, their responsibilities, and project boundaries, creating a more efficient and effective tech environment.

This talk has been presented at JSNation 2024, check out the latest edition of this JavaScript Conference.

FAQ

The primary goal was to implement domain-driven design and team topologies to restructure the organization and create a more uniform tech stack.

Domain-driven design is about building software along the lines of your business domain, ensuring that the software design is in line with what the business is doing.

The team planned to use domain-driven design to restructure the organization by identifying bounded contexts and organizing product teams accordingly.

Team topologies is about four fundamental types of teams: stream aligned teams, enabling teams, complicated subsystem teams, and platform teams. The approach was combined with domain-driven design to create streamlined teams ready to work on specific bounded contexts.

Challenges included company politics, resistance from existing team leaders, and the complexities of the current tech stack which was organized around technical projects.

The lesson learned is to ensure that everybody has the same goals and understanding of the current problems, and that there is buy-in for the vision of the restructuring.

The issue was that not everyone understood the importance of the decisions made in the RFC process, leading to a perception that the future tech stack was being dictated rather than collaboratively decided.

It is crucial to involve people in decision-making to ensure they feel heard and invested in the solution. Even if they disagree, they need to commit to making the project succeed.

Stakeholder buy-in is important because it ensures that everyone understands the value and necessity of the changes, leading to better support and investment in the project.

The third lesson learned was the importance of convincing all stakeholders with a compelling story and gaining their continuous support, especially from the leadership team.

Markus Oberlehner
Markus Oberlehner
11 min
17 Jun, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Approximately one year ago, we started a modernization effort, but faced challenges with company politics and the reality of our tech stack. Lesson one is the importance of aligning goals and understanding current problems. Lesson two is the importance of getting everyone on board and committed to the project's success. Lesson three is repeatedly telling stakeholders why big technological changes are worth the investment.

1. Lessons Learned from Modernization Effort

Short description:

Approximately one year ago, we started a modernization effort. Unfortunately, things didn't go as planned. Our goal was to use domain-driven design and team topologies to restructure our organization and have streamlined teams aligned with our business domain. However, we faced challenges with company politics and the reality of our tech stack. The first lesson learned is the importance of aligning everyone's goals and understanding the current problems and technological realities.

Approximately one year ago, we started a modernization effort. So we had big plans and when we started out and I submitted this talk, I dreamed of talking about the success story. But unfortunately, it came differently. Just a couple of weeks ago, my employer and I decided to part ways. Not only because of what I'm telling here, but it still played a role. So all I can tell you about is about the lessons learned and what not to do.

So what was the plan? Our plan was to start with domain driven design, a domain driven design approach, and also being inspired by team topologies. And one important piece was also that we wanted to have a unified or a more uniform tech stack. In short, what is domain driven design and what did we try to do with it? So because we don't have much time, in very short domain driven design is about building software along the lines of your business domain. So designing your software so that it is in line with your business domain, with what your business is doing. What we did in the first step is we wanted to use domain driven design to restructure our organization, to find the bounded contexts within our organization and then plan our teams, our product teams along those lines. So we use something like big picture event storming to find all the bounded contexts and all in all, this process was relatively smooth sailing. So in the end, we had a couple of bounded contexts and we had a plan how to reorganize our organization and how to structure our teams. And for this, we also took a look at team topologies. And again, in short, team topologies is about four fundamental types of teams. First of all, we have stream aligned teams, what you probably know as product teams or cross-functional teams, and then there are other types like enabling teams and complicated subsystem teams and also a platform team. But for us, it was important to find the stream aligned teams and there you can see another slide in the team topologies approach. There are also different ways how those teams can interact with each other. But as I said, for us, it was important to find what to use domain-driven design to find the bounded contexts within our business and then apply the rules of team topologies or combine those two things and have teams that have streamlined teams that are ready to work on a given bounded context. So much for the theory, but in theory, in practice, things weren't as smooth sailing as we hoped for. So first thing that came into our way was company politics, because we wanted to restructure our organization along those bounded contexts. But of course, there were already people leading certain teams, and maybe some teams would not exist anymore after this or be in a completely different shape. And of course, not all people were happy about this. And then there is also the reality of today's tech stack, which we didn't give enough thought. So our goal was to restructure our product teams. But we had to keep in mind that the current team structure was organized around projects, around technical projects. So other teams in our new structure, or our new way of structuring our company, didn't exactly know how to deal with all the technologies involved in those other projects. So the first big lesson learned here is that we have to make sure that everybody has the same goals. So at least that everybody is aware and buys into the vision of the goals, of the restructuring, for example, and that all the people also have the same understanding of the current problems. If there are technological realities, you can't just reorganize your whole company and change all the teams without taking into consideration the current technology you are using.

2. Challenges in Building the New Platform

Short description:

We decided to build a new platform for our web applications, aiming for a modern technology stack. However, the RFC process faced challenges, as not everyone felt involved in the decision-making. Lesson two is the importance of getting everyone on board and ensuring that even if people disagree, they commit to the project's success. The building process faced delays due to overpromising, lack of awareness, and lack of team investment.

So after that, we decided, now it's the time for building a new platform for our web applications, because this was also one aspect we want to improve. We want to move into the direction of a modern unified technology stack. And I set up an RFC process. So this is something we didn't have before. So I wrote a document and requested comments on this document. And in theory, this, I think, is a good idea. But in practice, as we will see, it didn't work as smoothly.

And in this document, I highlighted that we want to use a monorepo approach in the future and we want to use Next instead of Laravel. And then all people were invited to contribute to this document. And in theory, this is a good idea, but in practice, not everybody knew at this time how important the decisions will be that were made in this RFC process. And all in all, it still felt very much as me dictating the future of the platform of tomorrow. And this led to learning lesson two.

The people must feel involved in coming up with the solution for a new technology stack, for example, or anything you want to, or any larger effort within a company or a team. So we have to make sure that everybody gets on board. And because this is not always possible, for those people who are not happy with the solution, for those people who you can't convince that your idea is the best, they at least have to be aware that they need to disagree and commit. So you should make it a practice in your company that everybody feels heard and everybody is heard. But of course, you can't convince everybody, but still the people need to be aware that in the end, although they disagree, they have to commit and do their best to make the new project succeed.

Okay, so this was the RFC process for a new technology stack. And then it was time to build it. So let's build it, I thought. And there was another problem. I overpromised. And of course, then everything took a lot longer. So to find support for this RFC, I said, yeah, it won't be a big deal. I can do a lot of the work and we can do it on the side. So it won't be a big deal in the end and everything will be easy. But of course, it wasn't that way. Everything took a lot longer than anticipated. And the teams weren't aware that they also need to invest some time into it. So everybody was unhappy, basically, because there was no progress anymore.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Scaling Up with Remix and Micro Frontends
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Scaling Up with Remix and Micro Frontends
Top Content
This talk discusses the usage of Microfrontends in Remix and introduces the Tiny Frontend library. Kazoo, a used car buying platform, follows a domain-driven design approach and encountered issues with granular slicing. Tiny Frontend aims to solve the slicing problem and promotes type safety and compatibility of shared dependencies. The speaker demonstrates how Tiny Frontend works with server-side rendering and how Remix can consume and update components without redeploying the app. The talk also explores the usage of micro frontends and the future support for Webpack Module Federation in Remix.
Routing in React 18 and Beyond
React Summit 2022React Summit 2022
20 min
Routing in React 18 and Beyond
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Understanding React’s Fiber Architecture
React Advanced 2022React Advanced 2022
29 min
Understanding React’s Fiber Architecture
Top Content
This Talk explores React's internal jargon, specifically fiber, which is an internal unit of work for rendering and committing. Fibers facilitate efficient updates to elements and play a crucial role in the reconciliation process. The work loop, complete work, and commit phase are essential steps in the rendering process. Understanding React's internals can help with optimizing code and pull request reviews. React 18 introduces the work loop sync and async functions for concurrent features and prioritization. Fiber brings benefits like async rendering and the ability to discard work-in-progress trees, improving user experience.
Full Stack Components
Remix Conf Europe 2022Remix Conf Europe 2022
37 min
Full Stack Components
Top Content
RemixConf EU discussed full stack components and their benefits, such as marrying the backend and UI in the same file. The talk demonstrated the implementation of a combo box with search functionality using Remix and the Downshift library. It also highlighted the ease of creating resource routes in Remix and the importance of code organization and maintainability in full stack components. The speaker expressed gratitude towards the audience and discussed the future of Remix, including its acquisition by Shopify and the potential for collaboration with Hydrogen.
The Eternal Sunshine of the Zero Build Pipeline
React Finland 2021React Finland 2021
36 min
The Eternal Sunshine of the Zero Build Pipeline
For many years, we have migrated all our devtools to Node.js for the sake of simplicity: a common language (JS/TS), a large ecosystem (NPM), and a powerful engine. In the meantime, we moved a lot of computation tasks to the client-side thanks to PWA and JavaScript Hegemony.
So we made Webapps for years, developing with awesome reactive frameworks and bundling a lot of dependencies. We progressively moved from our simplicity to complex apps toolchains. We've become the new Java-like ecosystem. It sucks.
It's 2021, we've got a lot of new technologies to sustain our Users eXperience. It's time to have a break and rethink our tools rather than going faster and faster in the same direction. It's time to redesign the Developer eXperience. It's time for a bundle-free dev environment. It's time to embrace a new frontend building philosophy, still with our lovely JavaScript.
Introducing Snowpack, Vite, Astro, and other Bare Modules tools concepts!
Full-stack & typesafe React (+Native) apps with tRPC.io
React Advanced 2021React Advanced 2021
6 min
Full-stack & typesafe React (+Native) apps with tRPC.io
Top Content
Alex introduces tRPC, a toolkit for making end-to-end type-safe APIs easily, with auto-completion of API endpoints and inferred data from backend to frontend. tRPC works the same way in React Native and can be adopted incrementally. The example showcases backend communication with a database using queries and validators, with types inferred to the frontend and data retrieval done using Prisma ORM.

Workshops on related topic

Master JavaScript Patterns
JSNation 2024JSNation 2024
145 min
Master JavaScript Patterns
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
During this workshop, participants will review the essential JavaScript patterns that every developer should know. Through hands-on exercises, real-world examples, and interactive discussions, attendees will deepen their understanding of best practices for organizing code, solving common challenges, and designing scalable architectures. By the end of the workshop, participants will gain newfound confidence in their ability to write high-quality JavaScript code that stands the test of time.
Points Covered:
1. Introduction to JavaScript Patterns2. Foundational Patterns3. Object Creation Patterns4. Behavioral Patterns5. Architectural Patterns6. Hands-On Exercises and Case Studies
How It Will Help Developers:
- Gain a deep understanding of JavaScript patterns and their applications in real-world scenarios- Learn best practices for organizing code, solving common challenges, and designing scalable architectures- Enhance problem-solving skills and code readability- Improve collaboration and communication within development teams- Accelerate career growth and opportunities for advancement in the software industry
AI on Demand: Serverless AI
DevOps.js Conf 2024DevOps.js Conf 2024
163 min
AI on Demand: Serverless AI
Top Content
Featured WorkshopFree
Nathan Disidore
Nathan Disidore
In this workshop, we discuss the merits of serverless architecture and how it can be applied to the AI space. We'll explore options around building serverless RAG applications for a more lambda-esque approach to AI. Next, we'll get hands on and build a sample CRUD app that allows you to store information and query it using an LLM with Workers AI, Vectorize, D1, and Cloudflare Workers.
High-performance Next.js
React Summit 2022React Summit 2022
50 min
High-performance Next.js
Workshop
Michele Riva
Michele Riva
Next.js is a compelling framework that makes many tasks effortless by providing many out-of-the-box solutions. But as soon as our app needs to scale, it is essential to maintain high performance without compromising maintenance and server costs. In this workshop, we will see how to analyze Next.js performances, resources usage, how to scale it, and how to make the right decisions while writing the application architecture.
Best Practices and Patterns for Managing API Requests and States
React Advanced 2022React Advanced 2022
206 min
Best Practices and Patterns for Managing API Requests and States
Workshop
Thomas Findlay
Thomas Findlay
With the rise of frameworks, such as React, Vue or Angular, the way websites are built changed over the years. Modern applications can be very dynamic and perform multiple API requests to populate a website with fresh content or submit new data to a server. However, this paradigm shift introduced new problems developers need to deal with. When an API request is pending, succeeds, or fails, a user should be presented with meaningful feedback. Other problems can comprise API data caching or syncing the client state with the server. All of these problems require solutions that need to be coded, but these can quickly get out of hand and result in a codebase that is hard to extend and maintain. In this workshop, we will cover how to handle API requests, API states and request cancellation by implementing an API Layer and combining it with React-Query.
Prerequisites: To make the most out of this workshop, you should be familiar with React and Hooks, such as useState, useEffect, etc. If you would like to code along, make sure you have Git, a code editor, Node, and npm installed on your machine.