SlideShare a Scribd company logo
Refactoring legacy code
True story
Juha.aaltonen@ambientia.fi
Aki Salmi
@rinkkasatiainen
• Hiking guide
• Supervisor
• Programmer
• Blipper – but no pics today.
Refactoring legacy code
True story
My goals for the talk
• Show how what I have learned at coderetreats
have been taken into production use
• GOAL 1: Encourage us to practice the craft
• Show what I’ve done – Test Driving my design
• Show steps rather than finished ‘product’
• GOAL 2: initiate discussions on what I’ve done
• Learn
• GOAL 3: reflect on my work and decisions and how
they actually seem now.
Tips for listeners
• There’s going to be a lot of code
• Rather than reading the code, try to smell it.
• How clean the code seems to be?
What I’ve done – what I believe in
• Is not either good or bad.
• It has bugs (I’ve seen those)
• It provides value to the customer every day
What is valuable (for someone)
• Client
• clients of the Client
• Myself & fellow ambientians
• How likely this code is going to change?
• How likely the change I make is going to introduce
bugs in future additions to this feature
Key process decisions
• TDD as design tool.
• Unit tests for changes
• Practice TDD in real environment. Try to get feedback
• Refactor often
• Keep tests clean
• ”if it is not important for the test, it is important not to
be in the test!”
• Note: Builder pattern
Key process decisions
• Use proper tools
• GIT, IntelliJ IDEA, VIM
• Hamcrest, mockito, various other open-source
components
4 elements of simple design
1. Passes its tests
2. Minimizes duplication
3. Maximizes clarity
4. Has fewer elements
Coderetreat
• 1 day of coding
• Pair programming, 6 different pairing partner
• Learn through pairing
• Deliberate practice
• experiment
Key takeaways from coderetreats
• Baby steps – commit to git often. Rebase to
keep git log clean
• TDD-as-if-you-meant-it
• Avoid conditionals, switches, try/catch
• Only 4 lines per method
• Avoid naked primitives
• Only one assert/behavior per test
• Sapir-Whorf hypothesis
• Tell – Don’t ask: no getters/setters for objects
Object calisthenics
1. One level of indentation per method
2. Don’t use the ELSE keyword
3. Wrap all primitives and Strings
4. First class collections
5. One dot per line
6. Don’t abbreviate
7. Keep all entities small
8. No classes with more than two instance
variables
9. No getters / setters / properties
Background of the system
Domain logic
POJO, Spring, Hibernate
UI (Grails)
Controllers + Views
Database
A live service since 2008
Providing value to Client and end-users every day
since
Case 1: adding a search
parameter
Search for a product
The method had 21 parameters and 200LOC
And there’s more
..and more
..you see the pattern.
What to do
add yet another parameter?
What I did was a brief study
• How the methods are used in the service?
• Grails-based service (200LOC) uses it
• Determine the current responsibilities
• Service builds valid parameters, DAO consumes it.
• Where the changes could be made?
• Both the service & DAO
• Is the method likely to change later?
• YES
Step 1
An integration test, See the builder-pattern
If it’s not important for the test, it is important not to be on the test
I changed the signature
The first model
And part of the service
Key decisions
• Factory to hide implementation details
• Sometimes Criteria handled Date, sometimes
Calendar
• Make it first to work, refactor then.
• Create a ProductSearchCriteria per type –
think about the name of the object
• There were no tests before – try to make
minimal impact on code.
Test on localhost.
• The context is a bit more complex than I
originally thought:
• In one case, it was not enough to limit on
Date/Calendar
• Thus, the original factory-idea would turn into a
bit more complicated problem
Step 2
Firstly: factory into builder
• Build what you need – add items to
CompositeSearchCriteria as need arises
• Again – do the minimal changes to the grails-
service in order to minimize errors
Second try
Second try
Tests for builder
Builder
maybe too many responsibilities?
Key decisions
• Do the smallest amount that is needed
• Builder to support only those methods that are used.
Step 3
Minor changes to fix a bug
Bug # 2
Minor changes to fix a bug
Bug # 3
Sometimes maths just is too much
Bug # 4
Minor changes to fix a bug
Learnings
• Fast to refactor
• Next time: start from integration test
• But one cannot integration test the whole – too many
parameters
• Minor changes somewhere in the controller code
caused it to fail on other places.
• Later, a colleague joined me. His first task was
to add a new concept to domain.
• Also for search
Case 2: Attachment handling
Targets
• System used to have ~ 20 different attachment
types.
• Only 5 were needed.
• Earlier supported only 1 attachment / type /
product. Now should support more.
AttachmentService(Dump?)
Decision to be made
• Where to start?
• The only (business) knowledge came from the
previous changes
• I decided to tackle the switch-case structure
• It was spread 4 times throughout the code
• To ease the change from 20 to 5
A story of FileType
AttachmentFileType–
RepositoryTest
AttachmentFileTypeRepos…
FileType
Step 2
Get rid of
switch-case
From …
… to
Or in picture
Data-driven tests
ProductService from…
… to
• Private method, thus no tests for this.
• How am I sure this works?
• I am not. Now. I was pretty sure. I think. Hope.
AttachmentService from…
… to
Step 3
Work with
attachment directory/name
Things not to do
• Have a constructor to throw an Exception.
• How would I change this now:
• Factory to create the directory
• Create AttachmentDirectory only if dir exists
• ready?
AttachmentDirectory
AttachmentDirFactory
AttDirFactoryTest
AttachmentFile(Factory)
• Similar concept with AttachmentFile and
AttachmentFileFactory
• With one difference
• AttachmentFile is interface and has two concrete
classes PlainAttachmentFile and
WebImageAttachmentFile
• Use of Template-pattern (which changed a lot
later)
AttachmentFileTemplTest
AttachmentFileTemplate
starting to get messy
verify: AttachmentService
Step 4
do similar changes to
AttachmentService#
moveToAttachmentDir
AttachmentFile
AttachmentFile
• Too many responsibilities.
• Would turn up with lot of methods. I needed to
do something.
• Did try to not to repeat myself (not shown – ask
for more info later)
The first draft
Step 5
Copying and moving files
>150 LOC @ AttachmentService
… to 4*4
The classes within the process
Steps
• Factory to create an AttachmentFile
• Factory creates a AttachmentFileProcess –
process to move/copy/clone/delete the
AttachmentFile
• For specific AttachmentFileType, it does
different things
• The execute method takes one argument,
AttachmentFileAction, which either is
move/copy/clone/delete/rename
Some steps
AttchmntFileProcessFactory
PlainAttachmentFileProcess
ASpecificImageProcess
ASpecificImageProcess
FileCopyAction
FileDeleteAction
A mysterious test
Later steps
• Renaming classes, reordering packages
• Using template
One last thing – listen the tests
The difference:
And that led to
• New class: AttachmentFileName
• A domain logic for handling name of the Attachment
• I’m working with this. Now.
Learnings
• Slow to refactor
• Test-Driven design can work even in brown-field
projects
• Integration to old system required integration tests
• How valuable the changes were to the customer
• With my current understanding:
• Split the changes to two – deploy both separately.
Tests
0
50
100
150
200
250
alkuT1
Commit1-id:…
pre-step2-id:…
Commit2-id…
Commit3-id:…
Commit4-bugfix-id:…
Commit5-bugfix-id:…
Attachment-commit1-id:…
Attachment-commit2-id:…
Attachment-commit3-id:…
Attachment-commit4-id:…
Attachment-commit5-id:…
Searchbugfix#3-id:…
Search-bugfix#4-id:…
pre-attachmetnt6-id:…
Attachment-commit6-id:…
Integrationtest-id:…
Attachmentcommit7-id:…
Attachmentcommit8-id:…
Attachmentcommit8-id:…
Attachmentcommit9-id:…
Attachmentcommit10-id:…
pre-attachment11-id:…
Attachmentcommit11-id:…
Attachmentcommit12-id:…
Attachmentcommit13-id:…
Attachmentcommit14-id:…
Attachmentcommit15-id:…
Attachmentcommit16-id:…
Attachmentcommit17,integrationtest…
Attachmentcommit18,changesto…
Attachmentcommit19-attachment…
Attachmentcommit20,fixingabug:…
Attachmentcommit21,UI
Attachmentcommit22:…
Attachmentcommit23,changesto…
Attachmentcommit24,filename:…
Attachmentcommit25,massimport:…
Attachmentcommit26,integ.test…
Attachmentcommit27,filetype.equals…
Attachmentcommit28,…
Attachmentcommit29,errorhandling…
Attachmentcommit30,Filterstowork…
Attachmentcommit31:…
Attachmentcommit32,uifix:…
Passed
Failed
Questions?
Puhelin: +358 50 341 5620
email: aki.salmi@iki.fi / aki.salmi@ambientia.fi
Twitter: @rinkkasatiainen
Aki Salmi

More Related Content

What's hot

Introduction to TDD
Introduction to TDDIntroduction to TDD
Introduction to TDD
Ahmed Misbah
 
Improving the Quality of Incoming Code
Improving the Quality of Incoming CodeImproving the Quality of Incoming Code
Improving the Quality of Incoming Code
Naresh Jain
 
Introduction to Scrum - 1 day workshop
Introduction to Scrum - 1 day workshopIntroduction to Scrum - 1 day workshop
Introduction to Scrum - 1 day workshop
Evan Leybourn
 
Creating a successful continuous testing environment by Eran Kinsbruner
Creating a successful continuous testing environment by Eran KinsbrunerCreating a successful continuous testing environment by Eran Kinsbruner
Creating a successful continuous testing environment by Eran Kinsbruner
QA or the Highway
 
Nf final chef-lisa-metrics-2015-ss
Nf final chef-lisa-metrics-2015-ssNf final chef-lisa-metrics-2015-ss
Nf final chef-lisa-metrics-2015-ss
Nicole Forsgren
 
DevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOps
DevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOpsDevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOps
DevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOps
Sailaja Tennati
 
Testing and DevOps Culture: Lessons Learned
Testing and DevOps Culture: Lessons LearnedTesting and DevOps Culture: Lessons Learned
Testing and DevOps Culture: Lessons Learned
LB Denker
 
Dietmar Strasser - Traditional QA meets Agile Development
Dietmar Strasser -  Traditional QA meets Agile DevelopmentDietmar Strasser -  Traditional QA meets Agile Development
Dietmar Strasser - Traditional QA meets Agile Development
TEST Huddle
 
Panoramic Quality: The Fellowship of Testing in DevOps
Panoramic Quality: The Fellowship of Testing in DevOpsPanoramic Quality: The Fellowship of Testing in DevOps
Panoramic Quality: The Fellowship of Testing in DevOps
Brendan Connolly
 
Why Automated Testing Matters To DevOps
Why Automated Testing Matters To DevOpsWhy Automated Testing Matters To DevOps
Why Automated Testing Matters To DevOps
dpaulmerrill
 
I Don't Test Often ...
I Don't Test Often ...I Don't Test Often ...
I Don't Test Often ...
Gareth Bowles
 
Continuous Deployment and Testing Workshop from Better Software West
Continuous Deployment and Testing Workshop from Better Software WestContinuous Deployment and Testing Workshop from Better Software West
Continuous Deployment and Testing Workshop from Better Software West
Cory Foy
 
Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)
Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)
Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)
Maaret Pyhäjärvi
 
Test Estimation Hacks: Tips, Tricks and Tools Webinar
Test Estimation Hacks: Tips, Tricks and Tools WebinarTest Estimation Hacks: Tips, Tricks and Tools Webinar
Test Estimation Hacks: Tips, Tricks and Tools Webinar
QASymphony
 
High-Performance Agile Testing in Software Development
High-Performance Agile Testing in Software DevelopmentHigh-Performance Agile Testing in Software Development
High-Performance Agile Testing in Software Development
TechWell
 
Continuous Automated Regression Testing to the Rescue
Continuous Automated Regression Testing to the RescueContinuous Automated Regression Testing to the Rescue
Continuous Automated Regression Testing to the Rescue
TechWell
 
How testers add value to the organization appium conf
How testers add value to the organization  appium confHow testers add value to the organization  appium conf
How testers add value to the organization appium conf
Corina Pip
 
Key Measurements For Testers
Key Measurements For TestersKey Measurements For Testers
Key Measurements For Testers
Gopi Raghavendra
 
Design for Testability in Practice
Design for Testability in PracticeDesign for Testability in Practice
Design for Testability in Practice
TechWell
 
JavaLand 2022 - Debugging distributed systems
JavaLand 2022 - Debugging distributed systemsJavaLand 2022 - Debugging distributed systems
JavaLand 2022 - Debugging distributed systems
Bert Jan Schrijver
 

What's hot (20)

Introduction to TDD
Introduction to TDDIntroduction to TDD
Introduction to TDD
 
Improving the Quality of Incoming Code
Improving the Quality of Incoming CodeImproving the Quality of Incoming Code
Improving the Quality of Incoming Code
 
Introduction to Scrum - 1 day workshop
Introduction to Scrum - 1 day workshopIntroduction to Scrum - 1 day workshop
Introduction to Scrum - 1 day workshop
 
Creating a successful continuous testing environment by Eran Kinsbruner
Creating a successful continuous testing environment by Eran KinsbrunerCreating a successful continuous testing environment by Eran Kinsbruner
Creating a successful continuous testing environment by Eran Kinsbruner
 
Nf final chef-lisa-metrics-2015-ss
Nf final chef-lisa-metrics-2015-ssNf final chef-lisa-metrics-2015-ss
Nf final chef-lisa-metrics-2015-ss
 
DevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOps
DevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOpsDevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOps
DevOps Summit 2015 Presentation: Continuous Testing At the Speed of DevOps
 
Testing and DevOps Culture: Lessons Learned
Testing and DevOps Culture: Lessons LearnedTesting and DevOps Culture: Lessons Learned
Testing and DevOps Culture: Lessons Learned
 
Dietmar Strasser - Traditional QA meets Agile Development
Dietmar Strasser -  Traditional QA meets Agile DevelopmentDietmar Strasser -  Traditional QA meets Agile Development
Dietmar Strasser - Traditional QA meets Agile Development
 
Panoramic Quality: The Fellowship of Testing in DevOps
Panoramic Quality: The Fellowship of Testing in DevOpsPanoramic Quality: The Fellowship of Testing in DevOps
Panoramic Quality: The Fellowship of Testing in DevOps
 
Why Automated Testing Matters To DevOps
Why Automated Testing Matters To DevOpsWhy Automated Testing Matters To DevOps
Why Automated Testing Matters To DevOps
 
I Don't Test Often ...
I Don't Test Often ...I Don't Test Often ...
I Don't Test Often ...
 
Continuous Deployment and Testing Workshop from Better Software West
Continuous Deployment and Testing Workshop from Better Software WestContinuous Deployment and Testing Workshop from Better Software West
Continuous Deployment and Testing Workshop from Better Software West
 
Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)
Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)
Agile San Diego: Testing as Exploration (Continuous Delivery w/o Automation)
 
Test Estimation Hacks: Tips, Tricks and Tools Webinar
Test Estimation Hacks: Tips, Tricks and Tools WebinarTest Estimation Hacks: Tips, Tricks and Tools Webinar
Test Estimation Hacks: Tips, Tricks and Tools Webinar
 
High-Performance Agile Testing in Software Development
High-Performance Agile Testing in Software DevelopmentHigh-Performance Agile Testing in Software Development
High-Performance Agile Testing in Software Development
 
Continuous Automated Regression Testing to the Rescue
Continuous Automated Regression Testing to the RescueContinuous Automated Regression Testing to the Rescue
Continuous Automated Regression Testing to the Rescue
 
How testers add value to the organization appium conf
How testers add value to the organization  appium confHow testers add value to the organization  appium conf
How testers add value to the organization appium conf
 
Key Measurements For Testers
Key Measurements For TestersKey Measurements For Testers
Key Measurements For Testers
 
Design for Testability in Practice
Design for Testability in PracticeDesign for Testability in Practice
Design for Testability in Practice
 
JavaLand 2022 - Debugging distributed systems
JavaLand 2022 - Debugging distributed systemsJavaLand 2022 - Debugging distributed systems
JavaLand 2022 - Debugging distributed systems
 

Viewers also liked

Putting the science in computer science
Putting the science in computer sciencePutting the science in computer science
Putting the science in computer science
Felienne Hermans
 
Leading Tech Teams
Leading Tech TeamsLeading Tech Teams
Leading Tech Teams
Flavius Stef
 
Cqrs in babysteps
Cqrs in babystepsCqrs in babysteps
Cqrs in babysteps
Erik Talboom
 
BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014
BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014
BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014
TSundberg
 
Hands on continouous delivery, I TAKE 2014
Hands on continouous delivery, I TAKE 2014Hands on continouous delivery, I TAKE 2014
Hands on continouous delivery, I TAKE 2014
Ioan Eugen Stan
 
Crafted Design - ITAKE 2014
Crafted Design - ITAKE 2014Crafted Design - ITAKE 2014
Crafted Design - ITAKE 2014
Sandro Mancuso
 
Sandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, Bucharest
Sandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, BucharestSandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, Bucharest
Sandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, Bucharest
Mozaic Works
 
Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...
Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...
Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...
Mozaic Works
 
Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...
Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...
Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...
Mozaic Works
 
Simplifying your design with higher-order functions
Simplifying your design with higher-order functionsSimplifying your design with higher-order functions
Simplifying your design with higher-order functions
Samir Talwar
 
I T.A.K.E. talk: "When DDD meets FP, good things happen"
I T.A.K.E. talk: "When DDD meets FP, good things happen"I T.A.K.E. talk: "When DDD meets FP, good things happen"
I T.A.K.E. talk: "When DDD meets FP, good things happen"
Cyrille Martraire
 

Viewers also liked (11)

Putting the science in computer science
Putting the science in computer sciencePutting the science in computer science
Putting the science in computer science
 
Leading Tech Teams
Leading Tech TeamsLeading Tech Teams
Leading Tech Teams
 
Cqrs in babysteps
Cqrs in babystepsCqrs in babysteps
Cqrs in babysteps
 
BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014
BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014
BDD with Cucumber-JVM as presented at I T.A.K.E. Unconference in Bucharest 2014
 
Hands on continouous delivery, I TAKE 2014
Hands on continouous delivery, I TAKE 2014Hands on continouous delivery, I TAKE 2014
Hands on continouous delivery, I TAKE 2014
 
Crafted Design - ITAKE 2014
Crafted Design - ITAKE 2014Crafted Design - ITAKE 2014
Crafted Design - ITAKE 2014
 
Sandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, Bucharest
Sandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, BucharestSandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, Bucharest
Sandro Mancuso - Software Craftmanship @ I T.A.K.E. Unconference 2013, Bucharest
 
Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...
Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...
Erik talboom - TDD as if The Baby Meant it @I T.A.K.E. Unconference 2013, Buc...
 
Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...
Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...
Sandro Mancuso – Testing and refactoring legacy code @ I T.A.K.E. Unconferenc...
 
Simplifying your design with higher-order functions
Simplifying your design with higher-order functionsSimplifying your design with higher-order functions
Simplifying your design with higher-order functions
 
I T.A.K.E. talk: "When DDD meets FP, good things happen"
I T.A.K.E. talk: "When DDD meets FP, good things happen"I T.A.K.E. talk: "When DDD meets FP, good things happen"
I T.A.K.E. talk: "When DDD meets FP, good things happen"
 

Similar to Refactoring Legacy Code - true story

Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Mozaic Works
 
An Introduction To Software Development - Final Review
An Introduction To Software Development - Final ReviewAn Introduction To Software Development - Final Review
An Introduction To Software Development - Final Review
Blue Elephant Consulting
 
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)
Peter Kofler
 
Agile Israel 2017 bugs zero by Arlo Belshee
Agile Israel 2017 bugs zero by Arlo BelsheeAgile Israel 2017 bugs zero by Arlo Belshee
Agile Israel 2017 bugs zero by Arlo Belshee
AgileSparks
 
TDD — Are you sure you properly test code?
TDD — Are you sure you properly test code?TDD — Are you sure you properly test code?
TDD — Are you sure you properly test code?
Dmitriy Nesteryuk
 
Driving application development through behavior driven development
Driving application development through behavior driven developmentDriving application development through behavior driven development
Driving application development through behavior driven development
Einar Ingebrigtsen
 
Unit Testing Best Practices
Unit Testing Best PracticesUnit Testing Best Practices
Unit Testing Best Practices
Tomaš Maconko
 
Get lean tutorial
Get lean tutorialGet lean tutorial
Get lean tutorial
Marty Haught
 
Clean code presentation
Clean code presentationClean code presentation
Clean code presentation
Bhavin Gandhi
 
Performant Django - Ara Anjargolian
Performant Django - Ara AnjargolianPerformant Django - Ara Anjargolian
Performant Django - Ara Anjargolian
Hakka Labs
 
Clean Code
Clean CodeClean Code
Clean Code
swaraj Patil
 
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald BelchamGetting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
.NET Conf UY
 
Testing for Logic App Solutions | Integration Monday
Testing for Logic App Solutions | Integration MondayTesting for Logic App Solutions | Integration Monday
Testing for Logic App Solutions | Integration Monday
BizTalk360
 
Design p atterns
Design p atternsDesign p atterns
Design p atterns
Amr Abd El Latief
 
Episode 3 – Classes, Inheritance, Abstract Class, and Interfaces
Episode 3 – Classes, Inheritance, Abstract Class, and InterfacesEpisode 3 – Classes, Inheritance, Abstract Class, and Interfaces
Episode 3 – Classes, Inheritance, Abstract Class, and Interfaces
Jitendra Zaa
 
Art of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices AntipatternsArt of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices Antipatterns
El Mahdi Benzekri
 
Bigger Unit Test Are Better
Bigger Unit Test Are BetterBigger Unit Test Are Better
Bigger Unit Test Are Better
Peter Schuler
 
Agile Experiments in Machine Learning
Agile Experiments in Machine LearningAgile Experiments in Machine Learning
Agile Experiments in Machine Learning
mathias-brandewinder
 
Test-Driven Sitecore
Test-Driven SitecoreTest-Driven Sitecore
Test-Driven Sitecore
Caitlin Portrie
 
Automated Acceptance Testing from Scratch
Automated Acceptance Testing from ScratchAutomated Acceptance Testing from Scratch
Automated Acceptance Testing from Scratch
Excella
 

Similar to Refactoring Legacy Code - true story (20)

Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
Aki Salmi - Refactoring legacy code: a true story @ I T.A.K.E. Unconference 2...
 
An Introduction To Software Development - Final Review
An Introduction To Software Development - Final ReviewAn Introduction To Software Development - Final Review
An Introduction To Software Development - Final Review
 
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)
 
Agile Israel 2017 bugs zero by Arlo Belshee
Agile Israel 2017 bugs zero by Arlo BelsheeAgile Israel 2017 bugs zero by Arlo Belshee
Agile Israel 2017 bugs zero by Arlo Belshee
 
TDD — Are you sure you properly test code?
TDD — Are you sure you properly test code?TDD — Are you sure you properly test code?
TDD — Are you sure you properly test code?
 
Driving application development through behavior driven development
Driving application development through behavior driven developmentDriving application development through behavior driven development
Driving application development through behavior driven development
 
Unit Testing Best Practices
Unit Testing Best PracticesUnit Testing Best Practices
Unit Testing Best Practices
 
Get lean tutorial
Get lean tutorialGet lean tutorial
Get lean tutorial
 
Clean code presentation
Clean code presentationClean code presentation
Clean code presentation
 
Performant Django - Ara Anjargolian
Performant Django - Ara AnjargolianPerformant Django - Ara Anjargolian
Performant Django - Ara Anjargolian
 
Clean Code
Clean CodeClean Code
Clean Code
 
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald BelchamGetting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
Getting Ahead of Delivery Issues with Deep SDLC Analysis by Donald Belcham
 
Testing for Logic App Solutions | Integration Monday
Testing for Logic App Solutions | Integration MondayTesting for Logic App Solutions | Integration Monday
Testing for Logic App Solutions | Integration Monday
 
Design p atterns
Design p atternsDesign p atterns
Design p atterns
 
Episode 3 – Classes, Inheritance, Abstract Class, and Interfaces
Episode 3 – Classes, Inheritance, Abstract Class, and InterfacesEpisode 3 – Classes, Inheritance, Abstract Class, and Interfaces
Episode 3 – Classes, Inheritance, Abstract Class, and Interfaces
 
Art of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices AntipatternsArt of refactoring - Code Smells and Microservices Antipatterns
Art of refactoring - Code Smells and Microservices Antipatterns
 
Bigger Unit Test Are Better
Bigger Unit Test Are BetterBigger Unit Test Are Better
Bigger Unit Test Are Better
 
Agile Experiments in Machine Learning
Agile Experiments in Machine LearningAgile Experiments in Machine Learning
Agile Experiments in Machine Learning
 
Test-Driven Sitecore
Test-Driven SitecoreTest-Driven Sitecore
Test-Driven Sitecore
 
Automated Acceptance Testing from Scratch
Automated Acceptance Testing from ScratchAutomated Acceptance Testing from Scratch
Automated Acceptance Testing from Scratch
 

Recently uploaded

存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
fovkoyb
 
Azure EA Sponsorship - Customer Guide.pdf
Azure EA Sponsorship - Customer Guide.pdfAzure EA Sponsorship - Customer Guide.pdf
Azure EA Sponsorship - Customer Guide.pdf
AanSulistiyo
 
7 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 20247 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 2024
Danica Gill
 
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
vmemo1
 
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
cuobya
 
不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作
不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作
不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作
bseovas
 
Search Result Showing My Post is Now Buried
Search Result Showing My Post is Now BuriedSearch Result Showing My Post is Now Buried
Search Result Showing My Post is Now Buried
Trish Parr
 
Design Thinking NETFLIX using all techniques.pptx
Design Thinking NETFLIX using all techniques.pptxDesign Thinking NETFLIX using all techniques.pptx
Design Thinking NETFLIX using all techniques.pptx
saathvikreddy2003
 
Gen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needsGen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needs
Laura Szabó
 
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
cuobya
 
Ready to Unlock the Power of Blockchain!
Ready to Unlock the Power of Blockchain!Ready to Unlock the Power of Blockchain!
Ready to Unlock the Power of Blockchain!
Toptal Tech
 
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
ysasp1
 
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdfMeet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Florence Consulting
 
办理新西兰奥克兰大学毕业证学位证书范本原版一模一样
办理新西兰奥克兰大学毕业证学位证书范本原版一模一样办理新西兰奥克兰大学毕业证学位证书范本原版一模一样
办理新西兰奥克兰大学毕业证学位证书范本原版一模一样
xjq03c34
 
Discover the benefits of outsourcing SEO to India
Discover the benefits of outsourcing SEO to IndiaDiscover the benefits of outsourcing SEO to India
Discover the benefits of outsourcing SEO to India
davidjhones387
 
[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024
hackersuli
 
Should Repositories Participate in the Fediverse?
Should Repositories Participate in the Fediverse?Should Repositories Participate in the Fediverse?
Should Repositories Participate in the Fediverse?
Paul Walk
 
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
zyfovom
 
Understanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdfUnderstanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdf
SEO Article Boost
 
办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理
办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理
办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理
uehowe
 

Recently uploaded (20)

存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
存档可查的(USC毕业证)南加利福尼亚大学毕业证成绩单制做办理
 
Azure EA Sponsorship - Customer Guide.pdf
Azure EA Sponsorship - Customer Guide.pdfAzure EA Sponsorship - Customer Guide.pdf
Azure EA Sponsorship - Customer Guide.pdf
 
7 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 20247 Best Cloud Hosting Services to Try Out in 2024
7 Best Cloud Hosting Services to Try Out in 2024
 
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
重新申请毕业证书(RMIT毕业证)皇家墨尔本理工大学毕业证成绩单精仿办理
 
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
假文凭国外(Adelaide毕业证)澳大利亚国立大学毕业证成绩单办理
 
不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作
不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作
不能毕业如何获得(USYD毕业证)悉尼大学毕业证成绩单一比一原版制作
 
Search Result Showing My Post is Now Buried
Search Result Showing My Post is Now BuriedSearch Result Showing My Post is Now Buried
Search Result Showing My Post is Now Buried
 
Design Thinking NETFLIX using all techniques.pptx
Design Thinking NETFLIX using all techniques.pptxDesign Thinking NETFLIX using all techniques.pptx
Design Thinking NETFLIX using all techniques.pptx
 
Gen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needsGen Z and the marketplaces - let's translate their needs
Gen Z and the marketplaces - let's translate their needs
 
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
制作毕业证书(ANU毕业证)莫纳什大学毕业证成绩单官方原版办理
 
Ready to Unlock the Power of Blockchain!
Ready to Unlock the Power of Blockchain!Ready to Unlock the Power of Blockchain!
Ready to Unlock the Power of Blockchain!
 
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
成绩单ps(UST毕业证)圣托马斯大学毕业证成绩单快速办理
 
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdfMeet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
Meet up Milano 14 _ Axpo Italia_ Migration from Mule3 (On-prem) to.pdf
 
办理新西兰奥克兰大学毕业证学位证书范本原版一模一样
办理新西兰奥克兰大学毕业证学位证书范本原版一模一样办理新西兰奥克兰大学毕业证学位证书范本原版一模一样
办理新西兰奥克兰大学毕业证学位证书范本原版一模一样
 
Discover the benefits of outsourcing SEO to India
Discover the benefits of outsourcing SEO to IndiaDiscover the benefits of outsourcing SEO to India
Discover the benefits of outsourcing SEO to India
 
[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024[HUN][hackersuli] Red Teaming alapok 2024
[HUN][hackersuli] Red Teaming alapok 2024
 
Should Repositories Participate in the Fediverse?
Should Repositories Participate in the Fediverse?Should Repositories Participate in the Fediverse?
Should Repositories Participate in the Fediverse?
 
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
学位认证网(DU毕业证)迪肯大学毕业证成绩单一比一原版制作
 
Understanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdfUnderstanding User Behavior with Google Analytics.pdf
Understanding User Behavior with Google Analytics.pdf
 
办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理
办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理
办理毕业证(NYU毕业证)纽约大学毕业证成绩单官方原版办理
 

Refactoring Legacy Code - true story