SlideShare a Scribd company logo
1 of 99
Clean Architecture:
A Guided Tour
Yossi Segev
Tech Lead @ Kin Ecosystem
@yossisegev
yossisegev.com
Clean Architecture:
A Guided Tour
Yossi Segev
Tech Lead @ Kin Ecosystem
@yossisegev
yossisegev.com
Why are we obsessed
with architecture?
We want to be able to
REACT TO CHANGES
quickly & efficiently
Good architecture is
•Easy to maintain / expand upon
•Easy to test
•Easy to understand
Keep in mind
•Architecture is dynamic and ever-evolving
•There are always several solutions to every problem
•Every architecture decision is a trade-off
•There is no such thing as “the perfect
architecture”
Clean Architecture
The Layers Principle
Layer C
Layer B
Layer A
DependenciesFlow
<< Detailed
<< Generic
Movie Night app layers
Presentation
Data
Domain
DependenciesFlow
Movie Night app layers
Presentation
Data
Domain
•UI
•Presenters
•Dependency Injection
•Web API
•Storage (DB/In-Mem)
•Use cases
•Interfaces
•Domain Entities
DependenciesFlow
Modules as layers
*Not by dependency flow order
build.gradle
dependencies {
implementation project(':domain')
// ...
}
Movie Night app layers
Presentation
Data
Domain
•UI
•Presenters
•Dependency Injection
•Web API
•Storage (DB/In-Mem)
•Use cases
•Interfaces
•Domain Entities
DependenciesFlow
The Domain Layer
•The baseline of the application
•Describes what the application is / what it can do
•Generic code
• Domain Entities
• Use cases
• Interfaces
The Domain Layer
Domain Entities
• Simple data containers
• The basic building blocks of our application
• Acts as common language across the
application
MovieNight’s
Domain Entities
MovieEntity.kt
data class MovieEntity(
var id: Int = 0,
var title: String,
var overview: String? = null,
var voteCount: Int = 0
// ...
)
• Domain Entities
• Use cases
• Interfaces
The Domain Layer
Use Case
Encapsulates a single,
very specific task
to be performed
MovieNight’s Use Cases
UseCase.kt
abstract class UseCase<T>() {
abstract fun create(): Observable<T>
fun observable(): Observable<T> {
return create().compose(t)
}
}
UseCase.kt
abstract class UseCase<T>() {
abstract fun create(): Observable<T>
fun observable(): Observable<T> {
return create().compose(t)
}
}
UseCase.kt
abstract class UseCase<T>(t: ObservableTransformer) {
abstract fun create(): Observable<T>
fun observable(): Observable<T> {
return create().compose(t)
}
}
UseCase.kt
abstract class UseCase<T>(t: ObservableTransformer) {
abstract fun create(): Observable<T>
fun observable(): Observable<T> {
return create().compose(t)
}
}
UseCase.kt
abstract class UseCase<T>(t: ObservableTransformer) {
abstract fun create(): Observable<T>
fun observable(): Observable<T> {
return create().compose(t)
}
}
Using a UseCase
Using a UseCase
myUseCase
.observable()
.subscribe(
{ data ->
// Do something with the data
},
{ throwable ->
// Handle errors
}
)
Using a UseCase
myUseCase
.observable()
.subscribe(
{ data ->
// Do something with the data
},
{ throwable ->
// Handle errors
}
)
Using a UseCase
myUseCase
.observable()
.subscribe(
{ data ->
// Do something with the data
},
{ throwable ->
// Handle errors
}
)
Using a UseCase
myUseCase
.observable()
.subscribe(
{ data ->
// Do something with the data
},
{ throwable ->
// Handle errors
}
)
GetPopularMovies
UseCase
GetPopularMovies.kt
class GetPopularMovies(t: Transformer,
repo: MoviesRepo)
:UseCase<List<MovieEntity>>(t) {
override fun create(): Observable<List<MovieEntity>> {
return repo.getMovies()
}
}
GetPopularMovies.kt
class GetPopularMovies(t: Transformer,
repo: MoviesRepo)
:UseCase<List<MovieEntity>>(t) {
override fun create(): Observable<List<MovieEntity>> {
return repo.getMovies()
}
}
GetPopularMovies.kt
class GetPopularMovies(t: Transformer,
repo: MoviesRepo)
:UseCase<List<MovieEntity>>(t) {
override fun create(): Observable<List<MovieEntity>> {
return repo.getMovies()
}
}
MoviesRepo.kt
interface MoviesRepo {
fun getMovies(): Observable<List<MovieEntity>>
// . . .
}
• Domain Entities
• Use cases
• Interfaces
The Domain Layer
Interfaces
• Dictates the contract the upper layers must
follow
• Ensures the application core functionality will
hold true, regardless implementation details
changes
Moving up!
The Data Layer
Movie Night app layers
Data
Domain
•Web API
•Storage (DB/In-Mem)
•Domain Entities
•Interfaces
•Use cases
The Data Layer
•Caching mechanism
•Database
•Networking
•Mappers
The Data Layer
Encapsulates any knowledge regarding where the
application data is coming from and how it is stored
In-Mem
StorageAPIDB
Data Layer
Application
The Data Layer
•Caching mechanism
•Database
•Networking
•Mappers
Mappers
Maps Class A to Class B
Mapper.kt
abstract class Mapper<in E, T> {
abstract fun mapFrom(from: E): T
// ...
}
MyMapper.kt
class MyMapper: Mapper<MovieEntity, MovieData>() {
override fun mapFrom(from: MovieEntity): MovieData {
return MovieData(
id = from.id,
originalTitle = from.originalTitle,
releaseDate = from.releaseDate,
overview = from.overview
// ...
)
}
}
MyMapper.kt
class MyMapper: Mapper<MovieEntity, MovieData>() {
override fun mapFrom(from: MovieEntity): MovieData {
return MovieData(
id = from.id,
originalTitle = from.originalTitle,
releaseDate = from.releaseDate,
overview = from.overview
// ...
)
}
}
MyMapper.kt
class MyMapper: Mapper<MovieEntity, MovieData>() {
override fun mapFrom(from: MovieEntity): MovieData {
return MovieData(
id = from.id,
originalTitle = from.originalTitle,
releaseDate = from.releaseDate,
overview = from.overview
// ...
)
}
}
Why do we need Mappers?
import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey
import com.google.gson.annotations.SerializedName
@Entity(tableName = "movies")
data class MovieData(
@PrimaryKey
var id: Int = -1,
@SerializedName("original_title")
var originalTitle: String
// ...
)
MovieData.kt
Why do we need Mappers?
The Data layer contains details
we want to hide.
Data Layer
Mapper
DBApplication
Mapper
Data Layer
Mapper
DBApplication
Mapper
Data Layer
Mapper
DBApplication
Mapper
Data Layer
Mapper
DBApplication
Mapper
Data Layer
Mapper
DBApplication
Mapper
Summarising the
Data Layer
•Contains concrete implementations of data providers
•Act as a boundary, encapsulates data providers details
and hide them from the “outside world”.
Movie Night app layers
Presentation
Data
Domain
•UI
•Presenters
•Dependency Injection
•Web API
•Storage (DB/In-Mem)
•Use cases
•Interfaces
•Domain Entities
DependenciesFlow
The Presentation Layer
The Presentation Layer
Connects all the different pieces into a
single, functioning unit that is the
application
The Presentation Layer
•Activities, Fragments
•View States
•Presenters
•Mappers
•Dependency Injection
Presentation Layer
Architecture
Fragment
ViewModel
LiveData
Use Case
Notify
Observes
Why ViewModel & LiveData?
Lifecycle awareness.
ViewModel 101
class MainActivity : AppCompatActivity() {
val vm = ViewModelProviders
.of(lifecycleOwner)
.get(MyViewModel::class.java)
}
ViewModel 101
class MainActivity : AppCompatActivity() {
// Creation
val vm = ViewModelProviders
.of(lifecycleOwner)
.get(MyViewModel::class.java)
}
ViewModel 101
class MainActivity : AppCompatActivity() {
// Creation
val vm = ViewModelProviders
.of(lifecycleOwner)
.get(MyViewModel::class.java)
}
ViewModel 101
class MainActivity : AppCompatActivity() {
// Creation
val vm = ViewModelProviders
.of(lifecycleOwner)
.get(MyViewModel::class.java)
}
ViewModel 101
class MyViewModel: ViewModel() {
// ...
override fun onCleared() {
super.onCleared()
// Clear resources etc...
}
}
LiveData 101
LiveData 101
// Creating
val liveData = MutableLiveData<String>()
// Observing
liveData.observe(lifecycleOwner, Observer { data ->
// do something with data…
})
// Updating value
liveData.value = "Hello world!"
LiveData 101
// Creating
val liveData = MutableLiveData<String>()
// Observing
liveData.observe(lifecycleOwner, Observer { data ->
// do something with data…
})
// Updating value
liveData.value = "Hello world!"
LiveData 101
// Creating
val liveData = MutableLiveData<String>()
// Observing
liveData.observe(lifecycleOwner, Observer { data ->
// do something with data…
})
// Updating value
liveData.value = "Hello world!"
Fragment
ViewModel
LiveData
Presentation Layer
Architecture
Use Case
Notify
Observes
The Presentation Layer
•Activities, Fragments
•View States
•Presenters
•Mappers
•Dependency Injection
ViewModel
LiveData
Presentation Layer
Architecture
Fragment
Observes
Use Case
Notify
ViewState
Represents the state of a view
PopularViewState.kt
data class PopularViewState(
var loading: Boolean = true,
var movies: List<MovieEntity>? = null
)
ViewModel
LiveData
Presentation Layer
Architecture
Fragment
Subscribes
Use Case
Notify
ViewModel
LiveData
Presentation Layer
Architecture
Fragment
Subscribes
Use Case
Notify
PopularViewModel
class PopularViewModel(val useCase: GetPopularMovies)
: BaseViewModel() {
var viewState: MutableLiveData<PopularViewState>
init {
viewState.value = PopularViewState()
}
PopularViewModel.kt
class PopularViewModel(val useCase: GetPopularMovies)
: BaseViewModel() {
var viewState: MutableLiveData<PopularViewState>
init {
viewState.value = PopularViewState()
}
PopularViewModel.kt
class PopularViewModel(val useCase: GetPopularMovies)
: BaseViewModel() {
var viewState: MutableLiveData<PopularViewState>
init {
// Sets the initial view state
viewState.value = PopularViewState()
}
// ...
PopularViewModel.kt
getPopularMovies
.observable()
.subscribe({ movies ->
val newState = viewState.value
.copy(loading = false,
movies = movies)
this.viewState.value = newState
}, { throwable ->
// Handle errors
}))
PopularViewModel.kt
getPopularMovies
.observable()
.subscribe({ movies ->
}, { throwable ->
// Handle errors
}))
PopularViewModel.kt
getPopularMovies
.observable()
.subscribe({ movies ->
val newState = viewState.value
.copy(loading = false,
movies = movies)
}, { throwable ->
// Handle errors
}))
PopularViewModel.kt
getPopularMovies
.observable()
.subscribe({ movies ->
val newState = viewState.value
.copy(loading = false,
movies = movies)
viewState.value = newState
}, { throwable ->
// Handle errors
}))
PopularViewModel.kt
PopularViewModel.kt
val disposable = getPopularMovies
.observable()
.subscribe( /* ... */ )
addDisposable(disposable)
ViewModel
LiveData
Presentation Layer
Architecture
Fragment
Subscribes
Use Case
Notify
ViewModel
LiveData
Presentation Layer
Architecture
Fragment
Subscribes
Use Case
Notify
PopularMoviesFragment.kt
val viewModel = ViewModelProviders
.of(this, factory)
.get(PopularViewModel::class.java)
// ...
viewModel.viewState
.observe(this, Observer { state ->
handleViewState(state)
})
PopularMoviesFragment.kt
val viewModel = ViewModelProviders
.of(this, factory)
.get(PopularViewModel::class.java)
// ...
viewModel.viewState
.observe(this, Observer { state ->
handleViewState(state)
})
PopularMoviesFragment.kt
fun handleViewState(state: PopularViewState) {
if (state.loading) {
// Show or hide the progressBar
}
state.movies?.let {
// Show movies
}
}
The Presentation Layer
•Activities, Fragments
•View States
•Presenters
•Mappers
•Dependency Injection
Dependency Injection
• Wires everything across the application
• Providing concrete implementations
Summary
Thank you
https://github.com/mrsegev/MovieNight

More Related Content

What's hot

JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 

What's hot (20)

Getting started with ReactJS
Getting started with ReactJSGetting started with ReactJS
Getting started with ReactJS
 
Deployment of WebObjects applications on FreeBSD
Deployment of WebObjects applications on FreeBSDDeployment of WebObjects applications on FreeBSD
Deployment of WebObjects applications on FreeBSD
 
React && React Native workshop
React && React Native workshopReact && React Native workshop
React && React Native workshop
 
Paging Like A Pro
Paging Like A ProPaging Like A Pro
Paging Like A Pro
 
Academy PRO: React JS
Academy PRO: React JSAcademy PRO: React JS
Academy PRO: React JS
 
Reactive state management with Jetpack Components
Reactive state management with Jetpack ComponentsReactive state management with Jetpack Components
Reactive state management with Jetpack Components
 
20171108 PDN HOL React Basics
20171108 PDN HOL React Basics20171108 PDN HOL React Basics
20171108 PDN HOL React Basics
 
State management in android applications
State management in android applicationsState management in android applications
State management in android applications
 
Developing Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJSDeveloping Modern Java Web Applications with Java EE 7 and AngularJS
Developing Modern Java Web Applications with Java EE 7 and AngularJS
 
Serverless functions with Micronaut
Serverless functions with MicronautServerless functions with Micronaut
Serverless functions with Micronaut
 
the Spring 4 update
the Spring 4 updatethe Spring 4 update
the Spring 4 update
 
Modular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJSModular Test-driven SPAs with Spring and AngularJS
Modular Test-driven SPAs with Spring and AngularJS
 
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter PilgrimJavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
JavaCro'14 - Scala and Java EE 7 Development Experiences – Peter Pilgrim
 
DataFX - JavaOne 2013
DataFX - JavaOne 2013DataFX - JavaOne 2013
DataFX - JavaOne 2013
 
Mastering the Sling Rewriter
Mastering the Sling RewriterMastering the Sling Rewriter
Mastering the Sling Rewriter
 
Using ReactJS in AngularJS
Using ReactJS in AngularJSUsing ReactJS in AngularJS
Using ReactJS in AngularJS
 
Introduction to React Native
Introduction to React NativeIntroduction to React Native
Introduction to React Native
 
Spring boot Introduction
Spring boot IntroductionSpring boot Introduction
Spring boot Introduction
 
Maven advanced
Maven advancedMaven advanced
Maven advanced
 
The Many Ways to Test Your React App
The Many Ways to Test Your React AppThe Many Ways to Test Your React App
The Many Ways to Test Your React App
 

Similar to Advanced #6 clean architecture

WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
catherinewall
 
Modeveast Appcelerator Presentation
Modeveast Appcelerator PresentationModeveast Appcelerator Presentation
Modeveast Appcelerator Presentation
Aaron Saunders
 
Rp 6 session 2 naresh bhatia
Rp 6  session 2 naresh bhatiaRp 6  session 2 naresh bhatia
Rp 6 session 2 naresh bhatia
sapientindia
 

Similar to Advanced #6 clean architecture (20)

ZZ BC#7.5 asp.net mvc practice and guideline refresh!
ZZ BC#7.5 asp.net mvc practice  and guideline refresh! ZZ BC#7.5 asp.net mvc practice  and guideline refresh!
ZZ BC#7.5 asp.net mvc practice and guideline refresh!
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client TechnologyRed Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
Red Hat JBoss BRMS and BPMS Workbench and Rich Client Technology
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Introduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint WorkshopIntroduction to Client Side Dev in SharePoint Workshop
Introduction to Client Side Dev in SharePoint Workshop
 
Os Haase
Os HaaseOs Haase
Os Haase
 
Clean Architecture on Android
Clean Architecture on AndroidClean Architecture on Android
Clean Architecture on Android
 
Developing maintainable Cordova applications
Developing maintainable Cordova applicationsDeveloping maintainable Cordova applications
Developing maintainable Cordova applications
 
Jetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO ExtendedJetpack, with new features in 2021 GDG Georgetown IO Extended
Jetpack, with new features in 2021 GDG Georgetown IO Extended
 
Android Architecture Components
Android Architecture ComponentsAndroid Architecture Components
Android Architecture Components
 
Reactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDaysReactive Web-Applications @ LambdaDays
Reactive Web-Applications @ LambdaDays
 
Play Support in Cloud Foundry
Play Support in Cloud FoundryPlay Support in Cloud Foundry
Play Support in Cloud Foundry
 
Life outside WO
Life outside WOLife outside WO
Life outside WO
 
Docker presentasjon java bin
Docker presentasjon java binDocker presentasjon java bin
Docker presentasjon java bin
 
Refactor Large apps with Backbone
Refactor Large apps with BackboneRefactor Large apps with Backbone
Refactor Large apps with Backbone
 
Refactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.jsRefactoring Large Web Applications with Backbone.js
Refactoring Large Web Applications with Backbone.js
 
Refactor Large applications with Backbone
Refactor Large applications with BackboneRefactor Large applications with Backbone
Refactor Large applications with Backbone
 
Modeveast Appcelerator Presentation
Modeveast Appcelerator PresentationModeveast Appcelerator Presentation
Modeveast Appcelerator Presentation
 
Building Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture ComponentsBuilding Modern Apps using Android Architecture Components
Building Modern Apps using Android Architecture Components
 
Rp 6 session 2 naresh bhatia
Rp 6  session 2 naresh bhatiaRp 6  session 2 naresh bhatia
Rp 6 session 2 naresh bhatia
 

More from Vitali Pekelis

More from Vitali Pekelis (20)

Droidkaigi2019thagikura 190208135940
Droidkaigi2019thagikura 190208135940Droidkaigi2019thagikura 190208135940
Droidkaigi2019thagikura 190208135940
 
Droidkaigi 2019
Droidkaigi 2019Droidkaigi 2019
Droidkaigi 2019
 
Google i o &amp; android q changes 2019
Google i o &amp; android q changes 2019Google i o &amp; android q changes 2019
Google i o &amp; android q changes 2019
 
Android Q 2019
Android Q 2019Android Q 2019
Android Q 2019
 
Advanced #4 GPU & Animations
Advanced #4   GPU & AnimationsAdvanced #4   GPU & Animations
Advanced #4 GPU & Animations
 
Advanced #2 networking
Advanced #2   networkingAdvanced #2   networking
Advanced #2 networking
 
Advanced #2 threading
Advanced #2   threadingAdvanced #2   threading
Advanced #2 threading
 
Advanced #1 cpu, memory
Advanced #1   cpu, memoryAdvanced #1   cpu, memory
Advanced #1 cpu, memory
 
All the support you need. Support libs in Android
All the support you need. Support libs in AndroidAll the support you need. Support libs in Android
All the support you need. Support libs in Android
 
How to build Sdk? Best practices
How to build Sdk? Best practicesHow to build Sdk? Best practices
How to build Sdk? Best practices
 
Di &amp; dagger
Di &amp; daggerDi &amp; dagger
Di &amp; dagger
 
Android design patterns
Android design patternsAndroid design patterns
Android design patterns
 
Advanced #3 threading
Advanced #3  threading Advanced #3  threading
Advanced #3 threading
 
Mobile ui fruit or delicious sweets
Mobile ui  fruit or delicious sweetsMobile ui  fruit or delicious sweets
Mobile ui fruit or delicious sweets
 
Lecture #4 c loaders and co.
Lecture #4 c   loaders and co.Lecture #4 c   loaders and co.
Lecture #4 c loaders and co.
 
Session #4 b content providers
Session #4 b  content providersSession #4 b  content providers
Session #4 b content providers
 
Advanced #2 - ui perf
 Advanced #2 - ui perf Advanced #2 - ui perf
Advanced #2 - ui perf
 
Android meetup
Android meetupAndroid meetup
Android meetup
 
Android design lecture #3
Android design   lecture #3Android design   lecture #3
Android design lecture #3
 
From newbie to ...
From newbie to ...From newbie to ...
From newbie to ...
 

Recently uploaded

Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Medical / Health Care (+971588192166) Mifepristone and Misoprostol tablets 200mg
 

Recently uploaded (20)

Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Era
 
Artyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptxArtyushina_Guest lecture_YorkU CS May 2024.pptx
Artyushina_Guest lecture_YorkU CS May 2024.pptx
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
WSO2Con2024 - Simplified Integration: Unveiling the Latest Features in WSO2 L...
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?WSO2CON 2024 - Does Open Source Still Matter?
WSO2CON 2024 - Does Open Source Still Matter?
 
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAMWSO2Con2024 - Organization Management: The Revolution in B2B CIAM
WSO2Con2024 - Organization Management: The Revolution in B2B CIAM
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next IntegrationWSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
WSO2CON2024 - Why Should You Consider Ballerina for Your Next Integration
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
WSO2Con2024 - GitOps in Action: Navigating Application Deployment in the Plat...
 
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
WSO2Con2024 - Facilitating Broadband Switching Services for UK Telecoms Provi...
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
WSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid EnvironmentsWSO2Con2024 - Software Delivery in Hybrid Environments
WSO2Con2024 - Software Delivery in Hybrid Environments
 

Advanced #6 clean architecture