SlideShare a Scribd company logo
HOW TO WORK WITH
LEGACY CODE
MICHAŁ SZCZUR
PHP Developer since 2010
bass guitarist and trumpeter
michalszczur.pl
Created by /Michał Szczur @partikus
AGENDA
Scope explanation
Dive into legacy mess
How to start and not die
Step by step to heaven
THANKS TO MAREK MATULKA
WHO INSPIRED ME!
WHAT IS LEGACY CODE?
CODE WRITTEN MANY YEARS AGO
BY MYSELF OR OTHER NINJAS
LOW QUALITY CODE
(PRE)HISTORICAL CODE USES NONEXISTING
FRAMEWORKS/LIBRARIES
NO ENVIRONMENT SEPARATION
NO TESTS !!!
WHEN CODE CAN BE CALLED
LEGACY ???
WHEN IT IS
UNMANAGED
WHEN IT IS
TOO BUGGY
WHEN IT IS
TOO HARD TO UNDERSTAND
WHEN IT IS
NONUPGRADABLE
WHEN IT IS
UNDEBUGGABLE
WHEN IT IS
UNREADABLE
WHEN IT IS
TOO COUPLED TO FRAMEWORK
WHEN IT IS
TOO HARD TO ADD NEW FEATURE
WHAT IS NEXT?
FIGHT OR DIE
NO !!!
WE'RE NINJA DEVS
WE LOVE CHALLENGES
LET'S DO IT!
TAKE NEW FRAMEWORK
AND START FROM THE BEGINNING
:(MAYBE SOME DAY IN THE FUTURE
WHAT IS NEXT?
LET'S REFACTOR
BUT WHY ???
EXTENDED LEGACY
CODE
WEB PHP APP
PREASUMPTIONS
YOU DON'T KNOW BUSINESS LOGIC
MOSTLY PROCEDURAL CODE
NO SEPARATION, JUST A FEW LARGE FILES
YOU NEED TO CHANGE STH
ANALYZE
COVER
IT MEANS WRITE TESTS
WHAT SHOULD WE
TEST?
WHY SHOULD WE WRITE TESTS?
LOW LEVEL DOCUMENTATION
FEATURES DESCRIBED BY SCENARIOS (E.G.
GHERKIN)
CLEAN CODE
EASY TO CHANGE (LESS PAIN)
EASY CONTINUOUS DEPLOYMENT
START REFACTORING
# Project structure
/404.php
/database.php
/functions.php
/index.php
/page.php
PROCEDURAL CODE
WRITTEN IN PHP
INLINE PHP FUNCTIONS MIXED WITH HTML,CSS,JS
#/functions.php
function show_all() {
$db = connect_to_db();
$sql = 'SELECT * FROM receivers';
$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
//echo 'ID: ' . $row['id'] . ', mail: ' . $row['mail'];
echo ''.$row['mail'].'';
echo '<form id="'.$row['id'].'" name="n_ID" method="POST" action=
<input type="hidden" name="id" value="'.$row['id'].'" />
<input type="submit" name="delete" value="Delete" />
</form>';
}
if (isset($_POST['delete'])) {
$n_ID = $_POST['id'];
$sql = "DELETE FROM receivers WHERE id = $n_ID";
mysql_query($sql) or die(mysql_error());
WRITE FUNCTIONAL
TEST
// show_all_receivers.js
casper.test.begin('List all receivers', 5, function suite(test) {
casper.start("http://myapp.dev/mailsender.php", function() {
test.assertHttpStatus(200);
test.assertTitle("Homepage | Mail Sender", "Homepage title is expecte
});
casper.thenClick('a#show-all', function() {
test.assertHttpStatus(200);
test.assertTitle(
"Receivers list | Mail Sender",
"Page title is correct"
);
});
casper.run(function() {
test.done();
});
});
PROCEDURAL CODE??
YOU NEED STH MORE
IOC
INVERSION OF CONTROL
DEPENDENCY
INJECTION
IOC IMPLEMENTATION
DON'T REINVENT THE
WHEEL
PACKAGE MANAGER
COMPOSER
RUBYGEMS
MAVEN
COMPONENTS
DEPENDENCY INJECTION
/ /SYMFONY DI PIMPLE AURA DI
WHY SYMFONY
COMPONENTS?
WELL TESTED
DECOUPLED
REUSABLE
WELL DOCUMENTED
AND KNOWN BY COMMUNITY
NEXT STEP IS...
MOVE APP TO /WEB/
# new project structure
/
/web/404.php
/web/database.php
/web/functions.php
/web/index.php
/web/page.php
INSTALL COMPOSER
php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
php -r "if (hash('SHA384', file_get_contents('composer-setup.php')) ===
php composer-setup.php
php -r "unlink('composer-setup.php');"
INIT COMPOSER CONFIG IN THE ROOT DIR
php composer.phar init
PROJECT STRUCTURE
ls -l
/
/composer.json
/web/
COMPOSER.JSON
{
"name": "michalszczur/legacy-demo",
"authors": [
{
"name": "Michal Szczur",
"email": "job@michalszczur.pl"
}
],
"require": {},
"autoload": {
"psr-4": {
"": "src/"
}
},
"description": "Legacy app demo",
"type": "project",
"license": "proprietary"
ADD DEPENDENCIES
php composer.phar require symfony/dependency-injection
php composer.phar require symfony/config
php composer.phar require symfony/yaml
<?php
# /web/container.php
use SymfonyComponentDependencyInjectionContainerBuilder;
use SymfonyComponentConfigFileLocator;
use SymfonyComponentDependencyInjectionLoaderYamlFileLoader;
require __DIR__.'/../vendor/autoload.php';
$container = new ContainerBuilder();
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../app/con
$loader->load('services.yml');
$container->compile();
WHICH SERVICES DO WE REALLY
NEED?
function show_all()
{
# Database connection needed
$db = connect_to_db();
$sql = 'SELECT * FROM mail_sender';
$result = mysql_query($sql) or die(mysql_error());
//...
CREATE SEVICES.YMLDEFINITION
SERVICES.YML
parameters:
db_host: localhost
db_port: 3306
db_name: legacyapp
db_user: myuser
db_pass: mypass
services:
db:
class: PDO
arguments: ['mysql:port=%db_port%;host=%db_host%;dbname=%db_name%'
receiver_repository:
class: PDOReceiverRepository
arguments: ['@db']
USE CONTAINER AND REPOSITORY
#index.php
...
require 'container.php';
...
function show_all()
{
# Database connection needed
$receiverRepository = $container->get('receiver_repository');
$result = $receiverRepository->findAll();
...
#index.php
...
$result = $receiverRepository->findAll();
foreach ($result as $row) {
echo ''.$row['mail'].'';
echo '<form id="'.$row['id'].'" name="n_ID" method="POST" action="mai
<input type="hidden" name="id" value="'.$row['id'].'" />
<input type="submit" name="delete" value="Usuń" />
</form>';
}
...
PHP ~ HTML
STILL MIXED TOGETHER
TWIG
TEMPLATE ENGINE FOR PHP
INSTALL TWIG USING COMPOSER
php composer.phar require twig/twig
SERVICES.YML
parameters:
...
twig_paths:
- app/Resources/views
services:
...
twig.loader:
class: Twig_Loader_Filesystem
arguments: ['%twig_paths%']
twig:
class: Twig_Environment
arguments: ['@twig.loader']
#index.php
...
$twig = $container->get('@twig');
$result = $receiverRepository->findAll();
echo $twig->render(
'receiver_list.html.twig',
['receivers' => $result]
);
...
{% for receiver in receivers %}
<form id="{{ receiver.id }}" name="n_ID" method="POST" action="mail_sender.ph
<input type="hidden" name="id" value="{{ receiver.id }}" />
<input type="submit" name="delete" value="Delete" />
</form>
{% endfor %}
BEFORE
function show_all()
{
$db = connect_to_db();
$sql = 'SELECT * FROM mail_sender';
$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_array($result)) {
//echo 'ID: ' . $row['id'] . ', mail: ' . $row['mail'];
echo ''.$row['mail'].'';
echo '<form id="'.$row['id'].'" name="n_ID" method="POST" action="mai
<input type="hidden" name="id" value="'.$row['id'].'" />
<input type="submit" name="delete" value="Usuń" />
</form>';
}
...
mysql_free_result($result);
mysql_close($db);
}
AFTER
function show_all() {
$receiverRepository = $container->get('receiver_repository');
$twig = $container->get('@twig');
$result = $receiverRepository->findAll();
echo $twig->render(
'receiver_list.html.twig',
['receivers' => $result]
...
);
LET'S SUM UP
COMMUNICATION
ANALYZE
TESTS
SMALL STEPS
NOT EVERYTHING SIMUNTANOUSLY
PACKAGE MANAGER
DEPENDENCY INJECTION
THIRD PARTY LIBRARIES
DESIGN PATTERNS
SOLID
DECOUPLE
TESTS
QUESTIONS?
SLIDES: SLIDESHARE.NET/MICHASZCZUR
FEEDBACK: JOIND.IN/EVENT/CODETECON-20161
TWITTER: @PARTIKUS
HOMEPAGE: MICHALSZCZUR.PL
THANKS!
LINKS
Marek Matulka - Modernising the Legacy
CasperJS
Symfony Components
Working Effectively with Legacy Code by Michael Feathers
Page Object Pattern (Martin Fowler)
Page Object Pattern (Selenium Docs)

More Related Content

What's hot

Karan chanana
Karan chananaKaran chanana
Karan chanana
karan chanana
 
Pemrograman Web 8 - MySQL
Pemrograman Web 8 - MySQLPemrograman Web 8 - MySQL
Pemrograman Web 8 - MySQL
Nur Fadli Utomo
 
Drush. Secrets come out.
Drush. Secrets come out.Drush. Secrets come out.
Drush. Secrets come out.
Alex S
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
Nate Abele
 
Introduction to ReasonML
Introduction to ReasonMLIntroduction to ReasonML
Introduction to ReasonML
Riza Fahmi
 
CakeFest 2013 keynote
CakeFest 2013 keynoteCakeFest 2013 keynote
CakeFest 2013 keynote
José Lorenzo Rodríguez Urdaneta
 
Perkenalan ReasonML
Perkenalan ReasonMLPerkenalan ReasonML
Perkenalan ReasonML
Riza Fahmi
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code Review
Damien Seguy
 
Keep It Simple Security (Symfony cafe 28-01-2016)
Keep It Simple Security (Symfony cafe 28-01-2016)Keep It Simple Security (Symfony cafe 28-01-2016)
Keep It Simple Security (Symfony cafe 28-01-2016)
Oleg Zinchenko
 
New in cakephp3
New in cakephp3New in cakephp3
New in cakephp3
markstory
 
Advanced Querying with CakePHP 3
Advanced Querying with CakePHP 3Advanced Querying with CakePHP 3
Advanced Querying with CakePHP 3
José Lorenzo Rodríguez Urdaneta
 
Future of HTTP in CakePHP
Future of HTTP in CakePHPFuture of HTTP in CakePHP
Future of HTTP in CakePHP
markstory
 
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
Darren Mothersele
 

What's hot (19)

Karan chanana
Karan chananaKaran chanana
Karan chanana
 
Pemrograman Web 8 - MySQL
Pemrograman Web 8 - MySQLPemrograman Web 8 - MySQL
Pemrograman Web 8 - MySQL
 
My shell
My shellMy shell
My shell
 
Drush. Secrets come out.
Drush. Secrets come out.Drush. Secrets come out.
Drush. Secrets come out.
 
The Origin of Lithium
The Origin of LithiumThe Origin of Lithium
The Origin of Lithium
 
Introduction to ReasonML
Introduction to ReasonMLIntroduction to ReasonML
Introduction to ReasonML
 
CakeFest 2013 keynote
CakeFest 2013 keynoteCakeFest 2013 keynote
CakeFest 2013 keynote
 
Perkenalan ReasonML
Perkenalan ReasonMLPerkenalan ReasonML
Perkenalan ReasonML
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code Review
 
Keep It Simple Security (Symfony cafe 28-01-2016)
Keep It Simple Security (Symfony cafe 28-01-2016)Keep It Simple Security (Symfony cafe 28-01-2016)
Keep It Simple Security (Symfony cafe 28-01-2016)
 
New in cakephp3
New in cakephp3New in cakephp3
New in cakephp3
 
Agile database access with CakePHP 3
Agile database access with CakePHP 3Agile database access with CakePHP 3
Agile database access with CakePHP 3
 
Bacbkone js
Bacbkone jsBacbkone js
Bacbkone js
 
Php 101: PDO
Php 101: PDOPhp 101: PDO
Php 101: PDO
 
Php if
Php ifPhp if
Php if
 
Php (1)
Php (1)Php (1)
Php (1)
 
Advanced Querying with CakePHP 3
Advanced Querying with CakePHP 3Advanced Querying with CakePHP 3
Advanced Querying with CakePHP 3
 
Future of HTTP in CakePHP
Future of HTTP in CakePHPFuture of HTTP in CakePHP
Future of HTTP in CakePHP
 
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 JavascriptjQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
jQuery UI Widgets, Drag and Drop, Drupal 7 Javascript
 

Viewers also liked

実物大立体モデルを用いた手術計画の有用性に関する検討
実物大立体モデルを用いた手術計画の有用性に関する検討実物大立体モデルを用いた手術計画の有用性に関する検討
実物大立体モデルを用いた手術計画の有用性に関する検討
日本顎顔面再建先進デジタルテクノロジー学会
 
Revolution essay actual
Revolution essay actual Revolution essay actual
Revolution essay actual Henry Palmer
 
DUO10M, MC PK196BE
DUO10M, MC PK196BEDUO10M, MC PK196BE
DUO10M, MC PK196BESongyang Han
 
DELIRIOUS Pitch
DELIRIOUS PitchDELIRIOUS Pitch
DELIRIOUS Pitch
LuKiGreen
 
脳磁図を用いた舌神経機能障害の客観的評価
脳磁図を用いた舌神経機能障害の客観的評価脳磁図を用いた舌神経機能障害の客観的評価
脳磁図を用いた舌神経機能障害の客観的評価
日本顎顔面再建先進デジタルテクノロジー学会
 
タスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システム
タスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システムタスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システム
タスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システム
日本顎顔面再建先進デジタルテクノロジー学会
 
ハプティックロボットによる口腔外科手術支援の試み
ハプティックロボットによる口腔外科手術支援の試みハプティックロボットによる口腔外科手術支援の試み
ハプティックロボットによる口腔外科手術支援の試み
日本顎顔面再建先進デジタルテクノロジー学会
 
Fillings-parasonymachinery.com
Fillings-parasonymachinery.comFillings-parasonymachinery.com
Fillings-parasonymachinery.com
Parason Machinery
 
Shilpa apt
Shilpa aptShilpa apt
Shilpa apt
Sairam Koganti
 
Mathematical formula handbook
Mathematical formula handbookMathematical formula handbook
Mathematical formula handbook
BRS ENGINEERING
 
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MITSUNARI Shigeo
 
Công ty TNHH Coca-cola Việt Nam
Công ty TNHH Coca-cola Việt NamCông ty TNHH Coca-cola Việt Nam
Công ty TNHH Coca-cola Việt Nam
tuoi phan
 
[Survey Report] Vietnam Youth Lifestyle
[Survey Report] Vietnam Youth Lifestyle[Survey Report] Vietnam Youth Lifestyle
[Survey Report] Vietnam Youth Lifestyle
Q&Me Vietnam Market Research
 
Drugs & Pharmaceuticals (PPT)
Drugs & Pharmaceuticals (PPT)Drugs & Pharmaceuticals (PPT)
Drugs & Pharmaceuticals (PPT)Dr. Vishal Gosavi
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
Keisuke Fukuda
 
On tap ngu phap tieng anh thi toefl
On tap ngu phap tieng anh thi toeflOn tap ngu phap tieng anh thi toefl
On tap ngu phap tieng anh thi toefl
DoKo.VN Channel
 
NMR Spectroscopy
NMR SpectroscopyNMR Spectroscopy
NMR Spectroscopy
tabirsir
 

Viewers also liked (17)

実物大立体モデルを用いた手術計画の有用性に関する検討
実物大立体モデルを用いた手術計画の有用性に関する検討実物大立体モデルを用いた手術計画の有用性に関する検討
実物大立体モデルを用いた手術計画の有用性に関する検討
 
Revolution essay actual
Revolution essay actual Revolution essay actual
Revolution essay actual
 
DUO10M, MC PK196BE
DUO10M, MC PK196BEDUO10M, MC PK196BE
DUO10M, MC PK196BE
 
DELIRIOUS Pitch
DELIRIOUS PitchDELIRIOUS Pitch
DELIRIOUS Pitch
 
脳磁図を用いた舌神経機能障害の客観的評価
脳磁図を用いた舌神経機能障害の客観的評価脳磁図を用いた舌神経機能障害の客観的評価
脳磁図を用いた舌神経機能障害の客観的評価
 
タスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システム
タスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システムタスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システム
タスクヒエラルキーによる位置制限を用いたハプティックインプラント手術支援システム
 
ハプティックロボットによる口腔外科手術支援の試み
ハプティックロボットによる口腔外科手術支援の試みハプティックロボットによる口腔外科手術支援の試み
ハプティックロボットによる口腔外科手術支援の試み
 
Fillings-parasonymachinery.com
Fillings-parasonymachinery.comFillings-parasonymachinery.com
Fillings-parasonymachinery.com
 
Shilpa apt
Shilpa aptShilpa apt
Shilpa apt
 
Mathematical formula handbook
Mathematical formula handbookMathematical formula handbook
Mathematical formula handbook
 
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
MS Officeファイル暗号化のマスター鍵を利用したバックドアとその対策
 
Công ty TNHH Coca-cola Việt Nam
Công ty TNHH Coca-cola Việt NamCông ty TNHH Coca-cola Việt Nam
Công ty TNHH Coca-cola Việt Nam
 
[Survey Report] Vietnam Youth Lifestyle
[Survey Report] Vietnam Youth Lifestyle[Survey Report] Vietnam Youth Lifestyle
[Survey Report] Vietnam Youth Lifestyle
 
Drugs & Pharmaceuticals (PPT)
Drugs & Pharmaceuticals (PPT)Drugs & Pharmaceuticals (PPT)
Drugs & Pharmaceuticals (PPT)
 
Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35Effective Modern C++ 読書会 Item 35
Effective Modern C++ 読書会 Item 35
 
On tap ngu phap tieng anh thi toefl
On tap ngu phap tieng anh thi toeflOn tap ngu phap tieng anh thi toefl
On tap ngu phap tieng anh thi toefl
 
NMR Spectroscopy
NMR SpectroscopyNMR Spectroscopy
NMR Spectroscopy
 

Similar to How to work with legacy code

How to work with legacy code PHPers Rzeszow #2
How to work with legacy code PHPers Rzeszow #2How to work with legacy code PHPers Rzeszow #2
How to work with legacy code PHPers Rzeszow #2
Michał Kruczek
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Masahiro Nagano
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
Hugo Hamon
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
Wim Godden
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applicationselliando dias
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
Jeremy Kendall
 
Redis for your boss
Redis for your bossRedis for your boss
Redis for your boss
Elena Kolevska
 
Smelling your code
Smelling your codeSmelling your code
Smelling your code
Raju Mazumder
 
PHP Tips & Tricks
PHP Tips & TricksPHP Tips & Tricks
PHP Tips & Tricks
Radek Benkel
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
Wim Godden
 
Practical MySQL.pptx
Practical MySQL.pptxPractical MySQL.pptx
Practical MySQL.pptx
HussainUsman4
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
Wim Godden
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
Wim Godden
 
How to write code you won't hate tomorrow
How to write code you won't hate tomorrowHow to write code you won't hate tomorrow
How to write code you won't hate tomorrow
Pete McFarlane
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Kang-min Liu
 

Similar to How to work with legacy code (20)

How to work with legacy code PHPers Rzeszow #2
How to work with legacy code PHPers Rzeszow #2How to work with legacy code PHPers Rzeszow #2
How to work with legacy code PHPers Rzeszow #2
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
Designing Opeation Oriented Web Applications / YAPC::Asia Tokyo 2011
 
The History of PHPersistence
The History of PHPersistenceThe History of PHPersistence
The History of PHPersistence
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
PHP and Rich Internet Applications
PHP and Rich Internet ApplicationsPHP and Rich Internet Applications
PHP and Rich Internet Applications
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
 
Redis for your boss
Redis for your bossRedis for your boss
Redis for your boss
 
Smelling your code
Smelling your codeSmelling your code
Smelling your code
 
veracruz
veracruzveracruz
veracruz
 
veracruz
veracruzveracruz
veracruz
 
veracruz
veracruzveracruz
veracruz
 
veracruz
veracruzveracruz
veracruz
 
PHP Tips & Tricks
PHP Tips & TricksPHP Tips & Tricks
PHP Tips & Tricks
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
Practical MySQL.pptx
Practical MySQL.pptxPractical MySQL.pptx
Practical MySQL.pptx
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
My app is secure... I think
My app is secure... I thinkMy app is secure... I think
My app is secure... I think
 
How to write code you won't hate tomorrow
How to write code you won't hate tomorrowHow to write code you won't hate tomorrow
How to write code you won't hate tomorrow
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 

Recently uploaded

Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Inflectra
 

Recently uploaded (20)

Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdfFIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
FIDO Alliance Osaka Seminar: Passkeys and the Road Ahead.pdf
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualitySoftware Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered Quality
 

How to work with legacy code