SlideShare a Scribd company logo
1 of 68
Download to read offline
JakubPilimon
Refactor And Do It
Safely
Jakub Pilimon
JakubPilimon
SZCZEBRZESZYN
CHRZĄSZCZYRZEWOSZYCE
JakubPilimon
JakubPilimon
Jakub Pilimon
Principal Technologist @Pivotal
ā€¢Domain-Driven Design
ā€¢Test-Driven Development
ā€¢Architecture
ā€¢Spring
pillopl.github.io
#dddbyexamples
https://github.com/ddd-by-examples
JakubPilimon
JakubPilimon
WHAT THIS TALK IS
NOT ABOUT
JakubPilimon
JakubPilimon
JakubPilimon
BIG BALL OF MUD
JakubPilimon
NO STRUCTURE
SLOPPY
DUCT-TYPE STYLE
JakubPilimon
COUPLING
JakubPilimon
HARD TO
UNDERSTAND
MAINTAIN
DELIVER VALUE
JakubPilimon
TIME TO
REFACTOR?
JakubPilimon
IS THERE ANY
BUSINESS VALUE
LOST?
JakubPilimon
OUR JOB AS ENGINEERS
IS BRINGING VALUE,
NOT JUST SATISFYING
OUR AESTHETICS
NEEDS
JakubPilimon
WHAT IS
REFACTORING
ANYWAYS?
JakubPilimon
ā€“Michael C. Feathers
ā€œCode refactoring is the process of
restructuring existing computer code
ā€”changing the factoringā€”
without changing its observable
behavior. (!!!)ā€
JakubPilimon
NOBODY IS GOING
TO PAY FOR THAT
JakubPilimon
DONā€™T SAY
ā€œREFACTORINGā€
JakubPilimon
CREATE COMMON
UNDERSTANDING
ā€œIntroducing Event
Stormingā€ by Alberto
Brandolini
JakubPilimon
USE MEASURABLE DATA
ā€œIntroducing Event Stormingā€ by Alberto
Brandolini
JakubPilimon
USE MAGIC*
*MAGIC = ENGINEERING
JakubPilimonJakubPilimon
JakubPilimon
TREAT REFACTORING
AS A FEATURE
THAT ENABLES YOU TO
DELIVER FEATURES
QUICKER
JakubPilimonJakubPilimon
ā€¢Desirable observable
behavior of šŸ¦„ is the
same as šŸ’© - it is
refactoring
ā€¢ šŸ¦„ is clean and ready
for new requirements
How it works
JakubPilimon
HOW TO REFACTOR?
JakubPilimon
HOW TO REFACTOR
WITHOUT TESTS?
ā€œā€¦without changing its observable behaviorā€¦ā€
JakubPilimon
OBSERVABLE BEHAVIORS
CAN BE EXPRESSED AS
AUTOMATED TEST SCENARIOS
*ALMOST ALWAYS
JakubPilimon
UNIT
INTEGRATION
E2E
JakubPilimon
JakubPilimon
JakubPilimon
JakubPilimon
IF IT WAS EASY TO ADD
UNIT TESTS IT WOULD
NOT BE A BIG BALL OF
MUD
JakubPilimon
UNIT
INTEGRATION
E2EE2E
INTEGRATION
UNIT
JakubPilimon
HOW TO FIND
SCENARIOS TO
TEST?
JakubPilimon
LOOK AT THE WALL
Place
Book On
CollectOnly if
books on
Placed Book
Hold
Hold
Collected
Books
Placed on
Hold
Books
JakubPilimonJakubPilimon
Place
Book On
Hold
Only if
books on
hold < 5
HoldExpire
d
4. Rule
2. Command
Placed
On Hold 1. Domain Event
Collected
Books View
View
3. Query
JakubPilimonJakubPilimon
Black-box testing of observable behaviors
Collect
Book
Collected
Books View
Command
API call
queue listener
db script
executedā€¦
Query
API call
Excel sheet
DB query
Place
Book On
Hold
Collected
Books View
Collect
Book
Placed on
Hold Books
View
JakubPilimonJakubPilimon
Black-box testing of observable behaviors
@Test
public void patronCanHoldABook() {
//given
BookEntity book = fixtures.aCirculatingBookAvailableForLending();
//and
BookHolderEntity patron = fixtures.aRegularPatron();
//when
patronWantsToHoldBook(patron, book);
//then
assertThat(placedOnHoldsBooksBy(patron)).containsExactlyInAnyOrder(book);
}
Hold
Book
Books on
Hold View
Observable Behaviors!!!
JakubPilimonJakubPilimon
Exploratory testing against present data sets
Place
Book On
Hold
Collected
Books View
Collect
Book
Placed on
Hold Books
View
Production copy/Staging
Amy John
JakubPilimonJakubPilimon
Reverse engineering from tests to business rules
@Test
public void patronCanHoldABook() {
//given
BookEntity book = bookFromDb(ā€œDomain-Driven Designā€);
//and
BookHolderEntity john = fromDb(ā€œJohnā€);
//and
BookHolderEntity amy = fromDb(ā€œAmyā€);
//when
assertThatExceptionIsThrown(()-> patronWantsToHoldBook(john, book)); //exception
patronWantsToHoldBook(amy, book); //success
//then
assertThat(placedOnHoldsBooksBy(amy)).containsExactlyInAnyOrder(book);
}
Heuristics about rules
5 holds
rule?
Researcher
can book
Restricted
books?
John has
overdue
books?
DDD
Book is
special?
Why
exception?
Why
success?
JakubPilimon
How to make the transition?
JakubPilimon
Option #1: Climbing step by step (šŸ’© slowly becomes šŸ¦„)
Option #2: Blue/Green refactoring (šŸ¦„ side by side with šŸ’©)
JakubPilimonJakubPilimon
ā€¢ šŸ’© slowly becomes šŸ¦„
ā€¢Observable effects of šŸ’©
kept
ā€¢Cannot easily rollback to
šŸ’© from šŸ¦„
ā€¢Need to dig in šŸ’©
ā€¢Need to maintain one
model
Step by Step Refactoring
JakubPilimon
JakubPilimonJakubPilimon
ā€¢ šŸ’© remains untouched
ā€¢Observable behavior of šŸ’©
kept
ā€¢Easy to rollback to šŸ’© from
šŸ¦„
ā€¢ šŸ¦„ feels a bit like a green
ļ¬eld in šŸ’©
ā€¢Need to maintain both šŸ’© šŸ¦„
ā€¢Need to somehow plugin šŸ¦„
to the observable behaviors
Blue/Green Refactoring
JakubPilimon
JakubPilimon
Place
Book On
Hold
Collected
Books View
How it works
Collect
Book
Placed on
Hold Books
View
JakubPilimon
How to plug in new model to
observable behaviors?
JakubPilimon
ā€“Michael C. Feathers
ā€œA seam is a place where you can alter behaviour
in your program without editing in that placeā€
JakubPilimon
HOW TO LOOK FOR
SEEMS?
Collected
Books View
Place
Book On
Hold
JakubPilimon
public List<BookDto> booksPlacedOnHoldBy(UUID patronId, List<BookDto> oldModel) {
if (NewModelToggles.USE_NEW_MODEL.isActive()) {
List<BookDto> newModel = newLendingModel.booksOnHoldBy(patronId));
reconciliation.compare(oldModel, newModel);
return newModel;
}
return oldModel;
}
Anti-Corruption Layer
@GetMapping("/holds/{holderId}")
public ResponseEntity<List<BookDto>> getPlacedOnHoldBooks(UUID holderId) {
List<BookDto> oldModel = bookHolderService.getBooks(holderId);
return ResponseEntity.ok(lendingACL.booksPlacedOnHoldBy(holderId, oldModel));
}
Collected
Books View
JakubPilimon
Switch between models while querying
Collected
Books View
OR
Uses Feature Toggles for Querying
Query
JakubPilimon
Anti-Corruption Layer
@PostMapping("/books/collections")
public ResponseEntity collect(BookRequest bookRequest) {
oldModel.createCollectedBook(bookRequest.getBookId(),
bookRequest.getDays());
lendingACL.collect(bookRequest);
return ResponseEntity.ok().build();
}
Place
Book On
Hold
JakubPilimon
Parallel Operations For Commands
Collect
AND
Command
JakubPilimon
New model command failure cannot affect old
model result!
try/catch/log - might be your friend
JakubPilimon
JakubPilimon
Dependencies between packages
Old Lending Model New Lending Model
JakubPilimon
public List<BookDto> booksPlacedOnHoldBy(UUID patronId, List<BookDto> oldModel) {
if (NewModelToggles.RECONCILE_NEW_MODEL.isActive()) {
List<BookDto> newModel = newLendingModel.booksOnHoldBy(patronId));
reconciliation.compare(oldModel, newModel);
return oldModel;
}
if (NewModelToggles.RECONCILE_AND_USE_NEW_MODEL.isActive()) {
List<BookDto> newModel = newLendingModel.booksOnHoldBy(patronId));
reconciliation.compare(oldModel, newModel);
return newModel;
}
return oldModel;
}
Reconciliation in the ACL
JakubPilimon
Reconciliation
class Reconciliation<T> {
private final Reaction reaction;
public Diff<T> compare(Set<T> oldOne, Set<T> newOne) {
Diff<T> difference = new Diff<>(oldOne, newOne);
if (difference.exists()) {
reaction.reactTo(difference);
}
return difference;
}
}
interface Reaction {
void reactTo(Diff diff);
static Reaction logAndThanDisableToggle() {
return new CompositeReaction(justLog(), diff -> disableToggle());
}
static Reaction justLog() {
return System.out::println;
}
}
JakubPilimon
Add new model
to a next seam
Go to prod
Switch toggle to old model
Reconcile
Gather feedback
Switch toggle to new model
JakubPilimon
Place
Book On
Hold
Collected
Books View
Collect
Book
Placed on
Hold Books
View
Place
Book On
Hold
Collected
Books View
Collect
Book
Placed on
Hold Books
View
Black-box testing of observable behaviors should
pass against two models!
JakubPilimon
Black-box testing of observable behaviors should
pass against two models!
@Test
public void patronCanHoldABook() {
//given
BookEntity book = fixtures.aCirculatingBookAvailableForLending();
//and
BookHolderEntity patron = fixtures.aRegularPatron();
//when
patronWantsToHoldBookInNewModel(patron, book);
//then
assertThat(newModelPlacedOnHoldsBooksBy(patron)).containsExactlyInAnyOrder(book);
}
@Rule
public TogglzRule togglzRule = TogglzRule.allDisabled(NewModelToggles.class);
List<UUID> newModelPlacedOnHoldsBooksBy(BookHolderEntity aRegularPatron) {
togglzRule.enable(NewModelToggles.RECONCILE_AND_USE_NEW_MODEL);
//..
}
JakubPilimon
Place
Book On
Hold
Collected
Books View
Collect
Book
Placed on
Hold Books
View
Automated veriļ¬cation of two models
@Test
public void researcherCanPlaceOpenEndedHolds() {
//given
BookHolderEntity aResearcherPatron = fixtures.aResearcherPatron();
//when
patronWantsToHoldBookForOpenEndedHold(aResearcherPatron, aCirculatingBook);
//and
List<UUID> oldModel = oldModelPlacedOnHoldsBooksBy(aResearcherPatron);
List<UUID> newModel = newModelPlacedOnHoldsBooksBy(aResearcherPatron);
//then
assertThat(oldModel).containsExactlyInAnyOrderElementsOf(newModel);
}
JakubPilimon
Place
Book On
Hold
Collected
Books
View
Collect
Book
Placed on
Hold Books
View
Production copy/Staging
Amy John
JakubPilimon
Exploratory testing against present data set after data
migration from šŸ’© to šŸ¦„
Place
Book On
Hold
Collected
Books
View
Collect
Book
Placed on
Hold Books
View
Production copy/Staging
Amy John
JakubPilimon
UNIT
INTEGRATION
E2EE2E
INTEGRATION
UNIT
JakubPilimon
When we are sureā€¦
Collected
Books View
3
JakubPilimon
Dependencies between packages
Old Lending Model New Lending Model
BBOM
JakubPilimon
JakubPilimon
Modular monolith
Is the system modular?
Isthesystemdistributed?
Big Ball Of Mud
Distributed
Big Ball Of Mud
Modular Monolith
Microservices
JakubPilimon
ā€¢ Always, ALWAYS! Test if ACL works correctly (returning
correct models depending on the toggle settings)
ā€¢ Always test if ACL does reconciliation correctly!
ā€¢ Add test that checks that your feature toggle is disabled/
enabled by default
ā€¢ Go to production and reconcile very quickly (after 1st
seam)
ā€¢ Make sure new model failures do not affect old model
ā€¢ With B/G Refactoring you are limited to programming
language and database of BBOM
JakubPilimon
Lessons Learned
JakubPilimon
https://github.com/pilloPl/bigballofmud
THANK YOU!

More Related Content

More from VMware Tanzu

Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfVMware Tanzu
Ā 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023VMware Tanzu
Ā 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023VMware Tanzu
Ā 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptxVMware Tanzu
Ā 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchVMware Tanzu
Ā 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishVMware Tanzu
Ā 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVMware Tanzu
Ā 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - FrenchVMware Tanzu
Ā 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023VMware Tanzu
Ā 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootVMware Tanzu
Ā 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerVMware Tanzu
Ā 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeVMware Tanzu
Ā 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsVMware Tanzu
Ā 
SpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamSpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamVMware Tanzu
Ā 
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...VMware Tanzu
Ā 
SpringOne Tour: An Introduction to Azure Spring Apps Enterprise
SpringOne Tour: An Introduction to Azure Spring Apps EnterpriseSpringOne Tour: An Introduction to Azure Spring Apps Enterprise
SpringOne Tour: An Introduction to Azure Spring Apps EnterpriseVMware Tanzu
Ā 
SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...
SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...
SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...VMware Tanzu
Ā 
SpringOne Tour: Spring Boot 3 and Beyond
SpringOne Tour: Spring Boot 3 and BeyondSpringOne Tour: Spring Boot 3 and Beyond
SpringOne Tour: Spring Boot 3 and BeyondVMware Tanzu
Ā 
SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...
SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...
SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...VMware Tanzu
Ā 
Tanzu Developer Connect | Public Sector | March 29, 2023.pdf
Tanzu Developer Connect | Public Sector | March 29, 2023.pdfTanzu Developer Connect | Public Sector | March 29, 2023.pdf
Tanzu Developer Connect | Public Sector | March 29, 2023.pdfVMware Tanzu
Ā 

More from VMware Tanzu (20)

Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Ā 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Ā 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Ā 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptx
Ā 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - French
Ā 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - English
Ā 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
Ā 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - French
Ā 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Ā 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
Ā 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software Engineer
Ā 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs Practice
Ā 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
Ā 
SpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your TeamSpringOne Tour: Doing Progressive Delivery with your Team
SpringOne Tour: Doing Progressive Delivery with your Team
Ā 
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
SpringOne Tour: Make the Right Thing the Obvious Thing: The Journey to Intern...
Ā 
SpringOne Tour: An Introduction to Azure Spring Apps Enterprise
SpringOne Tour: An Introduction to Azure Spring Apps EnterpriseSpringOne Tour: An Introduction to Azure Spring Apps Enterprise
SpringOne Tour: An Introduction to Azure Spring Apps Enterprise
Ā 
SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...
SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...
SpringOne Tour: 10 Practical Tips for Building Native and Serverless Spring A...
Ā 
SpringOne Tour: Spring Boot 3 and Beyond
SpringOne Tour: Spring Boot 3 and BeyondSpringOne Tour: Spring Boot 3 and Beyond
SpringOne Tour: Spring Boot 3 and Beyond
Ā 
SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...
SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...
SpringOne Tour 2023: Let's Get Streaming! A Guide to Orchestrating Spring Clo...
Ā 
Tanzu Developer Connect | Public Sector | March 29, 2023.pdf
Tanzu Developer Connect | Public Sector | March 29, 2023.pdfTanzu Developer Connect | Public Sector | March 29, 2023.pdf
Tanzu Developer Connect | Public Sector | March 29, 2023.pdf
Ā 

Recently uploaded

CHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICE9953056974 Low Rate Call Girls In Saket, Delhi NCR
Ā 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park masabamasaba
Ā 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
Ā 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
Ā 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024VictoriaMetrics
Ā 
call girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļø
call girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļøcall girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļø
call girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļøDelhi Call girls
Ā 
tonesoftg
tonesoftgtonesoftg
tonesoftglanshi9
Ā 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech studentsHimanshiGarg82
Ā 
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT  - Elevating Productivity in Today's Agile EnvironmentHarnessing ChatGPT  - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT - Elevating Productivity in Today's Agile EnvironmentVictorSzoltysek
Ā 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
Ā 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
Ā 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
Ā 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
Ā 
Introducing Microsoftā€™s new Enterprise Work Management (EWM) Solution
Introducing Microsoftā€™s new Enterprise Work Management (EWM) SolutionIntroducing Microsoftā€™s new Enterprise Work Management (EWM) Solution
Introducing Microsoftā€™s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
Ā 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
Ā 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfWilly Marroquin (WillyDevNET)
Ā 
Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...Steffen Staab
Ā 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...masabamasaba
Ā 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp KrisztiƔn
Ā 

Recently uploaded (20)

CHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )šŸ” 9953056974šŸ”(=)/CALL GIRLS SERVICE
Ā 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
Ā 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
Ā 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Ā 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Ā 
call girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļø
call girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļøcall girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļø
call girls in Vaishali (Ghaziabad) šŸ” >ą¼’8448380779 šŸ” genuine Escort Service šŸ”āœ”ļøāœ”ļø
Ā 
tonesoftg
tonesoftgtonesoftg
tonesoftg
Ā 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
Ā 
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT  - Elevating Productivity in Today's Agile EnvironmentHarnessing ChatGPT  - Elevating Productivity in Today's Agile Environment
Harnessing ChatGPT - Elevating Productivity in Today's Agile Environment
Ā 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Ā 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
Ā 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
Ā 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
Ā 
Introducing Microsoftā€™s new Enterprise Work Management (EWM) Solution
Introducing Microsoftā€™s new Enterprise Work Management (EWM) SolutionIntroducing Microsoftā€™s new Enterprise Work Management (EWM) Solution
Introducing Microsoftā€™s new Enterprise Work Management (EWM) Solution
Ā 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
Ā 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
Ā 
Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data SpacesĀ - and Epistemic Querying of RDF-...
Ā 
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...
Ā 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
Ā 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
Ā 

Refactor and Do It Safely - Jakub Pilimon