SlideShare a Scribd company logo
David Gómez G.
Developer Advocate .
Building monolith applications that can scale to
micro services
(only if they need to)
@AXONIQ @DGOMEZG
Don’t let the microservices hype
ruin your project
@AXONIQ @DGOMEZG
David Gómez G.
Developer Advocate .
An Exciting New Project Starts
@DGOMEZG
Or you may need to add
a new module/feature to
an existing project
@DGOMEZG
But this time,
you are going to get it right!
@DGOMEZG
We need to scale!
We need to go to the cloud(s)!
@DGOMEZG
How others solved
similar problems?
@DGOMEZG
@DGOMEZG
Microservices
architecture
@DGOMEZG
Microservices
architecture
Building modular monoliths that could scale to microservices (only if they need to) .jax munich-21
You will probably be missing
all of these
@DGOMEZG
@DGOMEZG
Hype Driven Development
HDD
Problems seem easier to
solve when you have
enough context
@DGOMEZG
we don’t usually know enough
@DGOMEZG
@DGOMEZG
we don’t usually know enough
@DGOMEZG
@DGOMEZG
What you need
(Your steps)
• Separate your different tasks by type
• Focus on understanding the problem(s) you need to solve,
• Model each problem independently
• Be prepared to grow & scale (both in features and in
performance)
• Don’t couple to other components
@DGOMEZG
Our example:
A Conference Management Tool.
@DGOMEZG
Our example:
A Conference Management Tool.
Dates, Sponsors,
Call For Papers, Proposals, Agenda
T
alks, Tickets, Attendees…
Call For Papers,
Agenda, Questions, Forums,
Tickets,
Agenda, speakers, …
@DGOMEZG
@DGOMEZG
Event Storming
@DGOMEZG
Command Query Responsibility Separation
CQRS
@DGOMEZG
COMMANDS QUERIES
CQRS
Separate Queries from Commands
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
COMMANDS
What actions do require
changes in the state of the
application?
What other changes will be
necessary to notify/propagate?
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
COMMANDS
Define Edition (Dates)
Accept/Reject Talk Proposal
Open Ticket sales
Open Call For Papers
Add/Remove Track
Define Q&A Channel
Submit Proposal
Withdraw Proposal
Confirm Proposal
Join Q&A Channel
Buy Ticket
Add Talk To My Agenda
Ask Questions in Q&A.
Rate Talk
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
QUERIES
What information do the users
require?
@DGOMEZG
@DGOMEZG
CQRS
Separate Queries from Commands
QUERIES
List Proposals
Get Talk Popularity
Get Talks Rating
Get Questions
Get Talk Feedback
My Talk Info
Conference Agenda
My Agenda
Q&A Messages
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
@DGOMEZG
@DGOMEZG
Model with Boundaries
DDD
https://www.flickr.com/photos/xwl/4936781806/
@DGOMEZG
Which map would you prefer?
It depends!
@DGOMEZG
@DGOMEZG
COMMANDS QUERIES
Focus on modelling within the
boundaries of each element
Command model Projections
Keep only
relevant information
for the action in each model
@DGOMEZG
@DGOMEZG
JoinRoom
JoinRoom
Send Message
Command model
CreateChatRoom
NAME, DESCRIPTION
USER, ROOMID, MSG
JoinRoom
USERID, ROOMID
@DGOMEZG
@DGOMEZG
Projections
Projections maintain the structure of information
close to how it is needed by the client/user
ListRooms
ROOM,
DESCRIPTION,
NUM_OF_MEMBERS
GetRoomMessages
DATE, USER, MSG
DATE, USER, MSG
DATE, USER, MSG
@DGOMEZG
@DGOMEZG
Aggregate
A set of objects, relationship and invariants that are
considered as one unit with regard to data changes.
Define the boundaries in which some invariants are kept.
They are a model of part of the domain.
@DGOMEZG
@DGOMEZG
Aggregate
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
Command Model Projections
?
@DGOMEZG
@DGOMEZG
Notify that something has happened
Events
Remember our micro services
architecture?
@DGOMEZG
Remember our micro services
architecture?
@DGOMEZG
Remember our micro services
architecture?
@DGOMEZG
Remember our micro services
architecture?
@DGOMEZG
Remember our micro services
architecture?
Event
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
Command Model
Projections
?
@DGOMEZG
@DGOMEZG
Queries
UI / API
Commands
Command Model
Projections
Events
@DGOMEZG
@DGOMEZG
@DGOMEZG
Event Modeling
http://eventmodeling.org
@DGOMEZG
Event-Streaming
vs
Event-Sourcing
Event-Sourcing
@DGOMEZG
Why Event-Sourcing?
@DGOMEZG
With state store
id: 123.
Author: John Doe
Title:
What’s new in Java 17
status: Withdrawn
What we store
@DGOMEZG
Why Event-Sourcing?
ProposalUpdated (id: 123, title, Smith)
SpeakerChanged (id:123, jDoe)
ProposalSubmitted
ProposalAccepted
ProposalWithdrawn
ProposalDraftSent (id: 123) id: 123.
Author: John Doe
Title:
What’s new in Java 17
status: Withdrawn
What happened What we store
@DGOMEZG
Why Event-Sourcing?
Business Reasons Technical reasons
• Reliability of decisions
• Auditing / compliance /
transparency
• Data mining, analytics: value for
data
• Historic data useful for new
features
• Guaranteed completeness of event stream
• Single point of truth
• Concurrency / conflict resolution
• Facilitates debugging / forensic analysis
• Replay into new read models (scalability with
CQRS)
@DGOMEZG
Location
Transparency
(Enabled by
Commands, Queries & Events)
Location Transparency
@DGOMEZG
Location Transparency
A component should neither be aware of nor make any assumptions about
the location of other components
Furthermore, it should not even know which components it interacts with
@DGOMEZG
@DGOMEZG
@DGOMEZG
1. Keep the independent models
@DGOMEZG
1. Keep the independent models
@DGOMEZG
1. Keep the independent models
@DGOMEZG
1. Keep the independent models
CQRS + DDD
@DGOMEZG
Event Sourcing (sync modules)
+ Message
Bus
Event
store
@DGOMEZG
Putting it
together
@DGOMEZG
Command Model
data class CreateRoomCommand(
@TargetAggregateIdentifier val roomId: String,
val name: String)
data class JoinRoomCommand(
@TargetAggregateIdentifier val roomId: String,
val participant: String)
data class PostMessageCommand(
@TargetAggregateIdentifier val roomId: String,
val participant: String,
val message: String)
data class LeaveRoomCommand(
@TargetAggregateIdentifier val roomId: String,
val participant: String)
@DGOMEZG
Event Model
data class RoomCreatedEvent(
val roomId: String,
val name: String)
data class ParticipantJoinedRoomEvent(
val roomId: String,
val participant: String)
data class MessagePostedEvent(
val roomId: String,
val participant: String,
val message: String)
data class ParticipantLeftRoomEvent(
val roomId: String,
val participant: String)
@DGOMEZG
Aggregate
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
public ChatRoom() {
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public ChatRoom() {
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public ChatRoom(CreateRoomCommand command) {
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public ChatRoom(CreateRoomCommand command) {
apply(new RoomCreatedEvent(command.getRoomId(), command.getName()));
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public ChatRoom(CreateRoomCommand command) {
apply(new RoomCreatedEvent(command.getRoomId(), command.getName()));
}
@CommandHandler
public void handle(JoinRoomCommand command) {
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public ChatRoom(CreateRoomCommand command) {
apply(new RoomCreatedEvent(command.getRoomId(), command.getName()));
}
@CommandHandler
public void handle(JoinRoomCommand command) {
apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public void handle(JoinRoomCommand command) {
apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public void handle(JoinRoomCommand command) {
apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));
}
@EventSourcingHandler
public void on() {
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public void handle(JoinRoomCommand command) {
apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));
}
@EventSourcingHandler
public void on(ParticipantJoinedRoomEvent event) {
}
}
@DGOMEZG
Aggregate: Handling a Command
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public void handle(JoinRoomCommand command) {
apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));
}
@EventSourcingHandler
public void on(ParticipantJoinedRoomEvent event) {
this.participants.add(event.getParticipant());
}
}
@DGOMEZG
Aggregate: Command Validation
@Aggregate
public class ChatRoom {
@AggregateIdentifier
private String roomId;
private Set<String> participants;
@CommandHandler
public void handle(JoinRoomCommand command) {
if (…) {
apply(new ParticipantJoinedRoomEvent(command.getRoomId(), command.getParticipant()));
}
}
@EventSourcingHandler
public void on(ParticipantJoinedRoomEvent event) {
this.participants.add(event.getParticipant());
}
}
@DGOMEZG
Location Transparency. Sync other components
@Component
public class RoomSummaryProjection {
private final RoomSummaryRepository roomSummaryRepository;
@EventHandler
public void on(RoomCreatedEvent event) {
roomSummaryRepository.save(new RoomSummary(event.getRoomId(), event.getName()));
}
@EventHandler
public void on(ParticipantJoinedRoomEvent event) {
roomSummaryRepository.findById(event.getRoomId())
.ifPresent(RoomSummary::addParticipant);
}
}
@DGOMEZG
Handling Queries
@Component
public class RoomSummaryProjection {
private final RoomSummaryRepository roomSummaryRepository;
@QueryHandler
public List<String> handle(RoomParticipantsQuery query) {
return roomSumaryRepository.findRoomParticipants(query.getRoomId())
.stream()
.map(RoomParticipant::getParticipant).sorted()
.collect(toList())event.getName()));
}
}
@DGOMEZG
In summary
@DGOMEZG
Hype Driven Development
HDD
@DGOMEZG
Hype Driven Development
HDD
@DGOMEZG
HDD
CQRS
DDD
Event-
Sourcing
@DGOMEZG
Useful Resources
https://lp.axoniq.io/w-jax-munich-2021
The slides Code-sample &
tutorial repo
Free DDD, CQRS & ES
courses
eventmodeling.org
Domain-Driven
Design
lp.axoniq.io/w-jax-munich-2021
Axon OS tools

More Related Content

What's hot (19)

PDF
Frank Mantek Google G Data
deimos
 
PPTX
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB
 
PPT
Google Web Toolkit Introduction - eXo Platform SEA
nerazz08
 
PDF
Udi Dahan Intentions And Interfaces
deimos
 
PPTX
Introduction to Google Guice
Knoldus Inc.
 
PDF
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
Vladimir Dejanovic
 
PDF
Managing user's data with Spring Session
David Gómez García
 
PDF
Vaadin 8 with Spring Framework
Peter Lehto
 
PPT
Rob Tweed :: Ajax and the Impact on Caché and Similar Technologies
george.james
 
PDF
Html5 with Vaadin and Scala
Joonas Lehtinen
 
PPT
Google Guice
Andriy Andrunevchyn
 
PDF
Android development
Gregoire BARRET
 
PDF
Serverless: The Good, the Bad and the Ugly (2019-11-19)
Paco de la Cruz
 
PDF
Autodiscover flow in an exchange on premises environment non-active director...
Eyal Doron
 
PDF
Web polyglot programming
Dmitry Buzdin
 
PDF
Orchestraing the Blockchain Using Containers
Andrew Kennedy
 
PDF
Techlunch - Dependency Injection with Vaadin
Peter Lehto
 
PDF
Custom Distributed Tracing in Azure Functions (2021-02-27)
Paco de la Cruz
 
PPT
Google Web Toolkits
Yiguang Hu
 
Frank Mantek Google G Data
deimos
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB
 
Google Web Toolkit Introduction - eXo Platform SEA
nerazz08
 
Udi Dahan Intentions And Interfaces
deimos
 
Introduction to Google Guice
Knoldus Inc.
 
REST API vs gRPC, which one should you use in breaking a monolith [Dev conf 2...
Vladimir Dejanovic
 
Managing user's data with Spring Session
David Gómez García
 
Vaadin 8 with Spring Framework
Peter Lehto
 
Rob Tweed :: Ajax and the Impact on Caché and Similar Technologies
george.james
 
Html5 with Vaadin and Scala
Joonas Lehtinen
 
Google Guice
Andriy Andrunevchyn
 
Android development
Gregoire BARRET
 
Serverless: The Good, the Bad and the Ugly (2019-11-19)
Paco de la Cruz
 
Autodiscover flow in an exchange on premises environment non-active director...
Eyal Doron
 
Web polyglot programming
Dmitry Buzdin
 
Orchestraing the Blockchain Using Containers
Andrew Kennedy
 
Techlunch - Dependency Injection with Vaadin
Peter Lehto
 
Custom Distributed Tracing in Azure Functions (2021-02-27)
Paco de la Cruz
 
Google Web Toolkits
Yiguang Hu
 

Similar to Building modular monoliths that could scale to microservices (only if they need to) .jax munich-21 (20)

PDF
Building Modular monliths that could scale to microservices (only if they nee...
David Gómez García
 
PPTX
Seminar - Scalable Enterprise Application Development Using DDD and CQRS
Mizanur Sarker
 
PPTX
Lets focus on business value
Einar Ingebrigtsen
 
PPTX
Lets focus on business value
Einar Ingebrigtsen
 
PPTX
Patterns of Distributed Application Design
Orkhan Gasimov
 
PDF
DDD - 2 - Domain Driven Design: Tactical design.pdf
Eleonora Ciceri
 
PPT
Domain Driven Design (DDD)
Tom Kocjan
 
PDF
Domain Driven Design Tactical Patterns
Robert Alexe
 
PDF
Domain driven design: a gentle introduction
Asher Sterkin
 
PDF
Epic.NET: Processes, patterns and architectures
Giacomo Tesio
 
PDF
Uml3
Majong DevJfu
 
PPTX
Architecting Microservices in .Net
Richard Banks
 
PDF
The Wix Microservice Stack
Tomer Gabel
 
PDF
Half way to clean architecture - Dmytro Voronkevych - Droidcon Berlin
Badoo
 
PPTX
Introduction to Microservices Patterns
arconsis
 
PPTX
Introduction to Microservices Patterns
Dimosthenis Botsaris
 
PPTX
Lets focus on business value
Einar Ingebrigtsen
 
PPTX
Message passing & NoSQL (in English)
Tuomas Hietanen
 
PDF
Patterns of Distributed Application Design
GlobalLogic Ukraine
 
PPT
UnifedModeeqwewqeqweqwewqewqelingLanguage.ppt
FaisalTiftaZany1
 
Building Modular monliths that could scale to microservices (only if they nee...
David Gómez García
 
Seminar - Scalable Enterprise Application Development Using DDD and CQRS
Mizanur Sarker
 
Lets focus on business value
Einar Ingebrigtsen
 
Lets focus on business value
Einar Ingebrigtsen
 
Patterns of Distributed Application Design
Orkhan Gasimov
 
DDD - 2 - Domain Driven Design: Tactical design.pdf
Eleonora Ciceri
 
Domain Driven Design (DDD)
Tom Kocjan
 
Domain Driven Design Tactical Patterns
Robert Alexe
 
Domain driven design: a gentle introduction
Asher Sterkin
 
Epic.NET: Processes, patterns and architectures
Giacomo Tesio
 
Architecting Microservices in .Net
Richard Banks
 
The Wix Microservice Stack
Tomer Gabel
 
Half way to clean architecture - Dmytro Voronkevych - Droidcon Berlin
Badoo
 
Introduction to Microservices Patterns
arconsis
 
Introduction to Microservices Patterns
Dimosthenis Botsaris
 
Lets focus on business value
Einar Ingebrigtsen
 
Message passing & NoSQL (in English)
Tuomas Hietanen
 
Patterns of Distributed Application Design
GlobalLogic Ukraine
 
UnifedModeeqwewqeqweqwewqewqelingLanguage.ppt
FaisalTiftaZany1
 
Ad

More from David Gómez García (20)

PDF
Leverage CompletableFutures to handle async queries. DevNexus 2022
David Gómez García
 
PDF
Leveraging Completable Futures to handle your query results Asynchrhonously
David Gómez García
 
PDF
What's in a community like Liferay's
David Gómez García
 
PDF
Java9 Beyond Modularity - Java 9 más allá de la modularidad
David Gómez García
 
PDF
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
David Gómez García
 
PDF
Parallel streams in java 8
David Gómez García
 
PDF
Construccion de proyectos con gradle
David Gómez García
 
PDF
Java 8 Stream API. A different way to process collections.
David Gómez García
 
PDF
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
David Gómez García
 
PDF
Measuring Code Quality in WTF/min.
David Gómez García
 
PDF
Spring4 whats up doc?
David Gómez García
 
PDF
Gradle como alternativa a maven
David Gómez García
 
PDF
El poder del creador de Software. Entre la ingeniería y la artesanía
David Gómez García
 
PDF
Geo-SentimentZ
David Gómez García
 
PDF
HDTR images with Photoshop Javascript Scripting
David Gómez García
 
PDF
Wtf per lineofcode
David Gómez García
 
PDF
A real systemwithjms-rest-protobuf-mongodb
David Gómez García
 
PDF
Spring Data y Mongo DB en un proyecto Real
David Gómez García
 
PDF
NoSql y MongoDB
David Gómez García
 
KEY
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
David Gómez García
 
Leverage CompletableFutures to handle async queries. DevNexus 2022
David Gómez García
 
Leveraging Completable Futures to handle your query results Asynchrhonously
David Gómez García
 
What's in a community like Liferay's
David Gómez García
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
David Gómez García
 
T3chFest2016 - Uso del API JavaScript de Photoshop para obtener fotos HDTR
David Gómez García
 
Parallel streams in java 8
David Gómez García
 
Construccion de proyectos con gradle
David Gómez García
 
Java 8 Stream API. A different way to process collections.
David Gómez García
 
Midiendo la calidad de código en WTF/Min (Revisado EUI Abril 2014)
David Gómez García
 
Measuring Code Quality in WTF/min.
David Gómez García
 
Spring4 whats up doc?
David Gómez García
 
Gradle como alternativa a maven
David Gómez García
 
El poder del creador de Software. Entre la ingeniería y la artesanía
David Gómez García
 
Geo-SentimentZ
David Gómez García
 
HDTR images with Photoshop Javascript Scripting
David Gómez García
 
Wtf per lineofcode
David Gómez García
 
A real systemwithjms-rest-protobuf-mongodb
David Gómez García
 
Spring Data y Mongo DB en un proyecto Real
David Gómez García
 
NoSql y MongoDB
David Gómez García
 
Prueba De Aplicaciones Web con Selenium 2 y WebDriver
David Gómez García
 
Ad

Recently uploaded (20)

PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
Python basic programing language for automation
DanialHabibi2
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PPTX
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PPT
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
July Patch Tuesday
Ivanti
 
PPTX
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
The Builder’s Playbook - 2025 State of AI Report.pdf
jeroen339954
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
Python basic programing language for automation
DanialHabibi2
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
Interview paper part 3, It is based on Interview Prep
SoumyadeepGhosh39
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
July Patch Tuesday
Ivanti
 
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 

Building modular monoliths that could scale to microservices (only if they need to) .jax munich-21