SlideShare a Scribd company logo
1 of 54
Refactoring Legacy Code
By:
Adam Culp
Twitter: @adamculp
https://joind.in/talk/a3ecc
2
Refactoring Legacy Code
●
About me
– PHP 5.3 Certified
– Consultant at Zend Technologies
– Zend Certification Advisory Board
– Organizer SoFloPHP (South Florida)
– Organized SunshinePHP (Miami)
– Long distance (ultra) runner
– Judo Black Belt Instructor
3
Refactoring Legacy Code
●
Fan of iteration
– Pretty much everything requires iteration to do well:
● Long distance running
●
Judo
●
Development
●
Evading project managers
●
Refactoring!
6
Refactoring Legacy Code
●
Modernizing
– “Modernizing Legacy Applications in PHP” on LeanPub – by Paul M. Jones
– http://mlaphp.com
7
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
8
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
– Is code using OOP?
9
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
– Is code using OOP?
– Is Composer used in your project?
10
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
– Is code using OOP?
– Is Composer used in your project?
– Is the project using a framework?
11
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
– Is code using OOP?
– Is Composer used in your project?
– Is the project using a framework?
– Are you unit testing?
12
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
– Is code using OOP?
– Is Composer used in your project?
– Is the project using a framework?
– Are you unit testing?
– Does your project avoid NIH?
13
Refactoring Legacy Code
●
What is “Legacy Code”
– Is there a coding standard for your project?
– Is code using OOP?
– Is Composer used in your project?
– Is the project using a framework?
– Are you unit testing?
– Does your project avoid NIH?
If you can answer “No” to any of these,
you may be creating “Legacy Code”!!!
14
Refactoring Legacy Code
●
What is “refactoring”?
– “...process of changing a computer program's source code without
modifying its external functional behavior...” en.wikipedia.org/wiki/Refactoring
– No functionality added
– Code quality
15
Refactoring Legacy Code
●
Two hats
– Adding Functionality Hat
– Refactoring Hat
– We add functionality, then refactor, then add more functionality ...
16
Refactoring Legacy Code
●
Then optimize
– Do not optimize while refactoring.
– Separate step.
– Refactoring is NOT optimizing.
17
Refactoring Legacy Code
●
Source Control
– Refactor in branch
– Allows rollback
18
Refactoring Legacy Code
●
Editor/IDE
– Makes searching easier
– Search within project
19
Refactoring Legacy Code
●
Style Guide
– Framework Interop Group
●
http://php-fig.org
●
PSR
– Faster reading
– United team
20
Refactoring Legacy Code
●
Testing
– Consistent results
– Prevents breaks
– Speeds up development
21
Refactoring Legacy Code
●
Modernizing Steps
– Autoloading
– Consolidate Classes
– Cleanup Globals
– Replace “new” (instantiation)
– Create Tests
– Extract SQL
– Extract Logic
– Replace Remaining “Includes”
22
Refactoring Legacy Code
●
Autoloading
– Namespaces
– PSR-0
●
Legacy code typically used long class names
– Usage = My_Long_Class_Name
– Translates to “/My/Long/Class/Name.php”
– Class = My_Long_Class_Name
●
If not, then PSR-4
– Use MyGreatNamespaceName
– Translates to /My/Great/Namespace/Name.php
– Class = Name
23
Refactoring Legacy Code
●
Autoloading Approaches
– Approaches
●
Global function
●
Closure
●
Static or Instance Method (preferred, if possible)
●
__autoload() - PHP v 5.0
– Need a central place for classes
24
Refactoring Legacy Code
●
Consolidate Classes
– Move to one location
●
Could be named “includes”, “classes”, “src”, “lib”, etc.
25
Refactoring Legacy Code
●
Consolidate Classes Step 1
– Search for include statements
●
(include, include_once, require, require_once)
26
Refactoring Legacy Code
●
Consolidate Classes Step 2
27
Refactoring Legacy Code
●
Consolidate Classes Step 3
– User class is now autoloaded, no more require_once.
28
Refactoring Legacy Code
●
Consolidate Classes Repeat
– Search for more instances
29
Refactoring Legacy Code
●
Cleanup “Global” Dependencies Steps
1 Search for global reference
2 Move global calls to constructor
3 Convert global call to a constructor parameter
4 Update global call to a class
5 Instantiate new class and pass as parameter (DI)
6 Repeat
30
Refactoring Legacy Code
●
Global Cleanup Step 1
– Search for global reference
31
Refactoring Legacy Code
●
Global Cleanup Step 2 & 3
– Move global call to constructor
– Pass values as properties
32
Refactoring Legacy Code
●
Global Cleanup Step 4
– Convert call to a constructor parameter
33
Refactoring Legacy Code
●
Global Cleanup Step 5
– Instantiate new class
– Inject as parameter (DI)
34
Refactoring Legacy Code
●
Global Cleanup Repeat
– Look for more instances to clean up
35
Refactoring Legacy Code
●
Steps to Replacing “new”
1 Search for “new”
2 Extract instantiation to constructor parameter. (if one time)
●
Or extract block of creation code to new Factory class. (if repeated)
3 Update instantiation calls
4 Repeat
36
Refactoring Legacy Code
●
Replacing “new” Step 1 (Single)
– Before
37
Refactoring Legacy Code
●
Replacing “new” Step 2 (Single)
– Inject Db object into class constructor. (DI)
– No longer instantiating within class
38
Refactoring Legacy Code
●
Replacing “new” (Multiple)
39
Refactoring Legacy Code
●
Replacing “new” Step 3 (Multiple)
– Create factory
– Extract “new” call to new factory
40
Refactoring Legacy Code
●
Replacing “new” Step 4 (Multiple)
– Update instantiation calls
41
Refactoring Legacy Code
●
Replacing “new” Step 4 (Multiple)
– Call to factory
42
Refactoring Legacy Code
●
Replacing “new” Repeat
43
Refactoring Legacy Code
●
Write Tests
– Code is fairly clean
– Write tests for entire application
– If not testable, refactor
●
Extract method
●
Replace temp with query
●
Etc.
44
Refactoring Legacy Code
●
Extract SQL
1 Search for SQL
2 Move statement and relevant logic to Gateway class
3 Create test for new class
4 Alter code to use new method
5 Repeat
45
Refactoring Legacy Code
●
Extract Logic
1 Search for uses of Gateway class outside of Transaction classes
2 Extract logic to Transaction classes
3 Test
4 Write new tests where needed
5 Repeat
46
Refactoring Legacy Code
●
Replace “includes”
– Search for left over includes
– If in current class
1 Copy contents into file directly
2 Refactor for: no globals, no 'new', DI, return instead of output, no includes
– More often
1 Copy contents of include as-is to new class method
2 Replace with in-line instantiation
3 Search for other uses of same, and update them as well
4 Delete original include file, regression test
– Test, create new tests if needed
– Repeat
47
Refactoring Legacy Code
●
Additional Possibilities
– Can now implement framework
– Leverage services
– Leverage events
– Use Composer
48
Refactoring Legacy Code
●
Why refactor
– Less bugs
– Faster development
– More stable
– Easier onboarding
– Save $$$
49
Refactoring Legacy Code
●
When/How to refactor
– Ask boss for time
– “Leave it cleaner than you found it”
– Do it on your own, it makes YOUR life easier
50
Refactoring Legacy Code
●
Challenges
– Manager Buy In
– Technical Challenge
– Social Challenge
51
Refactoring Legacy Code
●
Convince the boss
– Three kinds of managers:
●
Tech Savvy
●
Quality Centric
●
Time Driven
Right...
52
Refactoring Legacy Code
●
Tech Savvy boss
– Lower cyclomatic complexity
– SOLID
– Separation of concerns
– MVC/Framework
– Less bugs
– Easier onboarding
53
Refactoring Legacy Code
●
Quality Centric boss
– Code quality
– Tests
– Happier customers
– Less bugs
54
Refactoring Legacy Code
●
Time driven boss
– Faster feature delivery
– Higher productivity - less time reading
– Faster onboarding
– Less testing time
– Less debugging
55
Refactoring Legacy Code
●
Concluding Thoughts
– Do not refactor a broken application
– Have tests in place prior to refactor
●
Unit tests or
●
Functional tests or
●
Manual tests
– Do things in small steps
– Love iteration!
●
Thank you!
– Please rate at: https://joind.in/talk/a3ecc
Adam Culp
http://www.geekyboy.com
http://RunGeekRadio.com
Twitter @adamculp
Questions?

More Related Content

What's hot

Tdd in php a brief example
Tdd in php   a brief exampleTdd in php   a brief example
Tdd in php a brief example
Jeremy Kendall
 

What's hot (20)

PHPUnit - Unit testing
PHPUnit - Unit testingPHPUnit - Unit testing
PHPUnit - Unit testing
 
Test driven development and unit testing with examples in C++
Test driven development and unit testing with examples in C++Test driven development and unit testing with examples in C++
Test driven development and unit testing with examples in C++
 
Working with Legacy Code
Working with Legacy CodeWorking with Legacy Code
Working with Legacy Code
 
Working Effectively with Legacy Code: Lessons in Practice
Working Effectively with Legacy Code: Lessons in PracticeWorking Effectively with Legacy Code: Lessons in Practice
Working Effectively with Legacy Code: Lessons in Practice
 
Introduction to TDD (Test Driven development) - Ahmed Shreef
Introduction to TDD (Test Driven development) - Ahmed ShreefIntroduction to TDD (Test Driven development) - Ahmed Shreef
Introduction to TDD (Test Driven development) - Ahmed Shreef
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
TDD reloaded - JUGTAA 24 Ottobre 2012
TDD reloaded - JUGTAA 24 Ottobre 2012TDD reloaded - JUGTAA 24 Ottobre 2012
TDD reloaded - JUGTAA 24 Ottobre 2012
 
TDD and Simple Design Workshop - Session 1 - March 2019
TDD and Simple Design Workshop - Session 1 - March 2019TDD and Simple Design Workshop - Session 1 - March 2019
TDD and Simple Design Workshop - Session 1 - March 2019
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
TDD & BDD
TDD & BDDTDD & BDD
TDD & BDD
 
Behavior Driven Development with SpecFlow
Behavior Driven Development with SpecFlowBehavior Driven Development with SpecFlow
Behavior Driven Development with SpecFlow
 
An Introduction to Test Driven Development
An Introduction to Test Driven Development An Introduction to Test Driven Development
An Introduction to Test Driven Development
 
TDD - Agile
TDD - Agile TDD - Agile
TDD - Agile
 
Tdd in php a brief example
Tdd in php   a brief exampleTdd in php   a brief example
Tdd in php a brief example
 
DDD with Behat
DDD with BehatDDD with Behat
DDD with Behat
 
TDD and the Legacy Code Black Hole
TDD and the Legacy Code Black HoleTDD and the Legacy Code Black Hole
TDD and the Legacy Code Black Hole
 
Test Driven Development Methodology and Philosophy
Test Driven Development Methodology and Philosophy Test Driven Development Methodology and Philosophy
Test Driven Development Methodology and Philosophy
 
TDD Flow: The Mantra in Action
TDD Flow: The Mantra in ActionTDD Flow: The Mantra in Action
TDD Flow: The Mantra in Action
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
TDD (Test Driven Design)
TDD (Test Driven Design)TDD (Test Driven Design)
TDD (Test Driven Design)
 

Viewers also liked

Web UI performance tuning
Web UI performance tuningWeb UI performance tuning
Web UI performance tuning
Andy Pemberton
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
Damien Seguy
 

Viewers also liked (20)

Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Code
 
Accidental professional
Accidental professionalAccidental professional
Accidental professional
 
Zend expressive workshop
Zend expressive workshopZend expressive workshop
Zend expressive workshop
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
 
Dip Your Toes in the Sea of Security (PHP MiNDS January Meetup 2016)
Dip Your Toes in the Sea of Security (PHP MiNDS January Meetup 2016)Dip Your Toes in the Sea of Security (PHP MiNDS January Meetup 2016)
Dip Your Toes in the Sea of Security (PHP MiNDS January Meetup 2016)
 
The journey to become a solid developer
The journey to become a solid developer The journey to become a solid developer
The journey to become a solid developer
 
Como programar melhor jogando game boy
Como programar melhor jogando game boyComo programar melhor jogando game boy
Como programar melhor jogando game boy
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 
Adding Unit Test To Legacy Code
Adding Unit Test To Legacy CodeAdding Unit Test To Legacy Code
Adding Unit Test To Legacy Code
 
Virtualizing Development
Virtualizing DevelopmentVirtualizing Development
Virtualizing Development
 
Build great products
Build great productsBuild great products
Build great products
 
Does Your Code Measure Up?
Does Your Code Measure Up?Does Your Code Measure Up?
Does Your Code Measure Up?
 
Foundations of Zend Framework
Foundations of Zend FrameworkFoundations of Zend Framework
Foundations of Zend Framework
 
Last Month in PHP - February 2017
Last Month in PHP - February 2017Last Month in PHP - February 2017
Last Month in PHP - February 2017
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code Review
 
Coding standards php
Coding standards phpCoding standards php
Coding standards php
 
Web UI performance tuning
Web UI performance tuningWeb UI performance tuning
Web UI performance tuning
 
Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)Php Code Audits (PHP UK 2010)
Php Code Audits (PHP UK 2010)
 
Functions - complex first class citizen
Functions - complex first class citizenFunctions - complex first class citizen
Functions - complex first class citizen
 
Coding Best practices (PHP)
Coding Best practices (PHP)Coding Best practices (PHP)
Coding Best practices (PHP)
 

Similar to Refactoring Legacy Code

Clean code, Feb 2012
Clean code, Feb 2012Clean code, Feb 2012
Clean code, Feb 2012
cobyst
 

Similar to Refactoring Legacy Code (20)

Refactoring workshop
Refactoring workshop Refactoring workshop
Refactoring workshop
 
Code refactoring
Code refactoringCode refactoring
Code refactoring
 
Putting legacy to REST with middleware
Putting legacy to REST with middlewarePutting legacy to REST with middleware
Putting legacy to REST with middleware
 
TDD and Related Techniques for Non Developers (2012)
TDD and Related Techniques for Non Developers (2012)TDD and Related Techniques for Non Developers (2012)
TDD and Related Techniques for Non Developers (2012)
 
The Power Of Refactoring (php|tek 09)
The Power Of Refactoring (php|tek 09)The Power Of Refactoring (php|tek 09)
The Power Of Refactoring (php|tek 09)
 
Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...
Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...
Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...
 
Refactoring 101
Refactoring 101Refactoring 101
Refactoring 101
 
Kylin Engineering Principles
Kylin Engineering PrinciplesKylin Engineering Principles
Kylin Engineering Principles
 
Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...Symfony under control. Continuous Integration and Automated Deployments in Sy...
Symfony under control. Continuous Integration and Automated Deployments in Sy...
 
Symfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim RomanovskySymfony Under Control by Maxim Romanovsky
Symfony Under Control by Maxim Romanovsky
 
Moodle Development Best Pracitces
Moodle Development Best PracitcesMoodle Development Best Pracitces
Moodle Development Best Pracitces
 
Reduce Reuse Refactor
Reduce Reuse RefactorReduce Reuse Refactor
Reduce Reuse Refactor
 
They why behind php frameworks
They why behind php frameworksThey why behind php frameworks
They why behind php frameworks
 
TDC2018FLN | Trilha Java - Implementando design patterns clássicos no Java 8 ...
TDC2018FLN | Trilha Java - Implementando design patterns clássicos no Java 8 ...TDC2018FLN | Trilha Java - Implementando design patterns clássicos no Java 8 ...
TDC2018FLN | Trilha Java - Implementando design patterns clássicos no Java 8 ...
 
Clean code, Feb 2012
Clean code, Feb 2012Clean code, Feb 2012
Clean code, Feb 2012
 
Clean application development (talk)
Clean application development (talk)Clean application development (talk)
Clean application development (talk)
 
Continuous feature-development
Continuous feature-developmentContinuous feature-development
Continuous feature-development
 
Tech talks#6: Code Refactoring
Tech talks#6: Code RefactoringTech talks#6: Code Refactoring
Tech talks#6: Code Refactoring
 
Usable Software Design
Usable Software DesignUsable Software Design
Usable Software Design
 
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
Webinar: "DBMaestro: Database Enforced Change Management (DECM) tool"
 

More from Adam Culp

More from Adam Culp (20)

Hypermedia
HypermediaHypermedia
Hypermedia
 
php-1701-a
php-1701-aphp-1701-a
php-1701-a
 
Release your refactoring superpower
Release your refactoring superpowerRelease your refactoring superpower
Release your refactoring superpower
 
Managing Technical Debt
Managing Technical DebtManaging Technical Debt
Managing Technical Debt
 
Developing PHP Applications Faster
Developing PHP Applications FasterDeveloping PHP Applications Faster
Developing PHP Applications Faster
 
Containing Quality
Containing QualityContaining Quality
Containing Quality
 
Debugging elephpants
Debugging elephpantsDebugging elephpants
Debugging elephpants
 
Expressive Microservice Framework Blastoff
Expressive Microservice Framework BlastoffExpressive Microservice Framework Blastoff
Expressive Microservice Framework Blastoff
 
Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2Deprecated: Foundations of Zend Framework 2
Deprecated: Foundations of Zend Framework 2
 
Clean application development tutorial
Clean application development tutorialClean application development tutorial
Clean application development tutorial
 
Essential git for developers
Essential git for developersEssential git for developers
Essential git for developers
 
Vagrant for Virtualized Development
Vagrant for Virtualized DevelopmentVagrant for Virtualized Development
Vagrant for Virtualized Development
 
Using an API
Using an APIUsing an API
Using an API
 
Puppet and Vagrant in development
Puppet and Vagrant in developmentPuppet and Vagrant in development
Puppet and Vagrant in development
 
Refactoring PHP
Refactoring PHPRefactoring PHP
Refactoring PHP
 
Selenium testing IDE 101
Selenium testing IDE 101Selenium testing IDE 101
Selenium testing IDE 101
 
Intro to OOP and new features in PHP 5.3
Intro to OOP and new features in PHP 5.3Intro to OOP and new features in PHP 5.3
Intro to OOP and new features in PHP 5.3
 
Development Environment Tips
Development Environment TipsDevelopment Environment Tips
Development Environment Tips
 
Getting your project_started
Getting your project_startedGetting your project_started
Getting your project_started
 
PHP and PDFLib
PHP and PDFLibPHP and PDFLib
PHP and PDFLib
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Recently uploaded (20)

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 

Refactoring Legacy Code