103
Legacy Code Evolve or Rewrite ? A retrospective Cyrille Martraire - @cyriux -

Legacy Code: Evolve or Rewrite?

Embed Size (px)

DESCRIPTION

You have to deliver ambitious new features but your codebase is a huge mess of legacy technologies, with no test? It is very tempting to throw it all away and rewrite everything from scratch, but is it wise when you consider the associated cost, risk and delayed time-to-market? Through an experience report, we'll show a "Strangler Application" strategy where only carefully selected areas of legacy code are rewritten. Agile development techniques like BDD or TDD remain necessary, with some adjustments. We'll also describe step by step the overall thinking process you can use to deal with large legacy code bases efficiently. First presented at Agile France 2013, and in countless Brown Bag Lunches since, a best-seller! Video (In French) here: http://www.infoq.com/fr/presentations/code-legacy

Citation preview

Page 1: Legacy Code: Evolve or Rewrite?

Legacy CodeEvolve or Rewrite ?

A retrospective

Cyrille Martraire - @cyriux -

Page 2: Legacy Code: Evolve or Rewrite?

http://1.bp.blogspot.com/_SOzNIrpkT7M/TIhYjDKKz-I/AAAAAAAABjo/NCPSaVmZn0w/s1600/100_2824.jpg

Page 3: Legacy Code: Evolve or Rewrite?

Passionate developer

PARIS Since 1999

!@cyriux

Page 4: Legacy Code: Evolve or Rewrite?

Paris Software Craftsmanship Community

http://www.meetup.com/paris-software-craftsmanship/

Page 5: Legacy Code: Evolve or Rewrite?

TDDBDDDDDLegacy

Page 6: Legacy Code: Evolve or Rewrite?
Page 7: Legacy Code: Evolve or Rewrite?

LEGACY

Page 8: Legacy Code: Evolve or Rewrite?

Legacy:Evolve or rewrite?

Page 9: Legacy Code: Evolve or Rewrite?

Actual Example

Page 10: Legacy Code: Evolve or Rewrite?

Once upon a time…

Page 11: Legacy Code: Evolve or Rewrite?

There was a frustrated ambition

Page 12: Legacy Code: Evolve or Rewrite?

We Want:

Page 13: Legacy Code: Evolve or Rewrite?

Large Ambition

Page 14: Legacy Code: Evolve or Rewrite?

Asset Management

Page 15: Legacy Code: Evolve or Rewrite?
Page 16: Legacy Code: Evolve or Rewrite?

wanna do big things stuck with a legacy

Page 17: Legacy Code: Evolve or Rewrite?

So what do we do?

Page 18: Legacy Code: Evolve or Rewrite?

REWRITE

Page 19: Legacy Code: Evolve or Rewrite?

STOP!

Page 20: Legacy Code: Evolve or Rewrite?

We all want to rewrite

Page 21: Legacy Code: Evolve or Rewrite?
Page 22: Legacy Code: Evolve or Rewrite?

hard to release regressions

Page 23: Legacy Code: Evolve or Rewrite?

Legacy

Page 24: Legacy Code: Evolve or Rewrite?

Legacy

No Test& Technical Debt too

Page 25: Legacy Code: Evolve or Rewrite?

http://skillsmatter.com/podcast/design-architecture/talk-from-eric-evans

Page 26: Legacy Code: Evolve or Rewrite?

Plenty of Legacy code working since 1993

Redoing = Waste + Risk

Page 27: Legacy Code: Evolve or Rewrite?

Poorly designed codeWorking wellNever changed

Is OK

Page 28: Legacy Code: Evolve or Rewrite?

KEEP iT

Page 29: Legacy Code: Evolve or Rewrite?

KEEP GUI

, DB,

APP Ser

ver,

middleware

Page 30: Legacy Code: Evolve or Rewrite?

We Want NEW FEATURES!CHA

NGE

SOMETH

ING

Page 31: Legacy Code: Evolve or Rewrite?

Haz Change?

Page 32: Legacy Code: Evolve or Rewrite?

JUSTDO IT!

Page 33: Legacy Code: Evolve or Rewrite?

QUICK

Page 34: Legacy Code: Evolve or Rewrite?

Did we break something?

Page 35: Legacy Code: Evolve or Rewrite?

http://martinezglass.com

No Test

Page 36: Legacy Code: Evolve or Rewrite?

Takes a lot of time

No Test+ Debug!

Page 37: Legacy Code: Evolve or Rewrite?

Just Do It: Not that quick

Again and again

Page 38: Legacy Code: Evolve or Rewrite?

Could we do better?

Page 39: Legacy Code: Evolve or Rewrite?

EVOLVE

Page 40: Legacy Code: Evolve or Rewrite?

Surround with tests FIRST

Page 41: Legacy Code: Evolve or Rewrite?

Surround with tests!

Page 42: Legacy Code: Evolve or Rewrite?
Page 43: Legacy Code: Evolve or Rewrite?

Testing legacy code is hard & slow

Page 44: Legacy Code: Evolve or Rewrite?

Testing is an investment

Page 45: Legacy Code: Evolve or Rewrite?

Driver = Cost of testing

Page 46: Legacy Code: Evolve or Rewrite?

A matter of velocity

Page 47: Legacy Code: Evolve or Rewrite?

Legacy testing effort Vs.

All new tested code?

Is it worth it?

Page 48: Legacy Code: Evolve or Rewrite?

1:4(Ok, I totally made it up)

ratio

Page 49: Legacy Code: Evolve or Rewrite?

REDO

Page 50: Legacy Code: Evolve or Rewrite?

Differentiating to the business?

Page 51: Legacy Code: Evolve or Rewrite?

The CEO will tell you

Page 52: Legacy Code: Evolve or Rewrite?

Not differentiating?

Page 53: Legacy Code: Evolve or Rewrite?

BUY

Page 54: Legacy Code: Evolve or Rewrite?

&ADA

PT

your

proc

ess

Page 55: Legacy Code: Evolve or Rewrite?

Differentiating!

Page 56: Legacy Code: Evolve or Rewrite?

REWRITE

Page 57: Legacy Code: Evolve or Rewrite?

• Why not, but not now • Don't get lost redoing everything forever

"What if we also rewrote this crappy part?"

Page 58: Legacy Code: Evolve or Rewrite?

...

Page 59: Legacy Code: Evolve or Rewrite?

JUSTENOUGH

Page 60: Legacy Code: Evolve or Rewrite?

You cannotrewrite all

You can rewrite

Page 61: Legacy Code: Evolve or Rewrite?

Where to stop?

What to rewrite?

Page 62: Legacy Code: Evolve or Rewrite?
Page 63: Legacy Code: Evolve or Rewrite?

Find boundaries

What to rewrite?

Page 64: Legacy Code: Evolve or Rewrite?

Discover the app

!!

Read the documents

Interview people

Use the application

Read the code

Fix bugs

Page 65: Legacy Code: Evolve or Rewrite?

Visualize[primary flow & support features]

http://www.fimarkets.com/pagesen/back-middle-front-office.php

Page 66: Legacy Code: Evolve or Rewrite?

Visualize[primary flow & support features]

http://www.fimarkets.com/pagesen/back-middle-front-office.php

Page 67: Legacy Code: Evolve or Rewrite?

Visualize[primary flow & support features]

http://www.fimarkets.com/pagesen/back-middle-front-office.php

Page 68: Legacy Code: Evolve or Rewrite?

http://staff.bath.ac.uk/enssa/LPDev.htm

Asset Inventory

Page 69: Legacy Code: Evolve or Rewrite?

Asset Capture

http://martinfowler.com/bliki/AssetCapture.html

Engine

Exhaust

Transmission

Page 70: Legacy Code: Evolve or Rewrite?

Asset Capture

Focus on one single asset : the engine

http://martinfowler.com/bliki/AssetCapture.html

Engine

Exhaust

Transmission

Page 71: Legacy Code: Evolve or Rewrite?

Main concepts[in selling-something business]

Trading

Financial Instruments

Page 72: Legacy Code: Evolve or Rewrite?

Main concepts[in selling-something business]

Trading

Financial Instruments

DON’t

TOUCH

REWRITE

Page 73: Legacy Code: Evolve or Rewrite?

DOMAIN FTW!

Page 74: Legacy Code: Evolve or Rewrite?

BOUNDARIES& STRUCTURE

Page 75: Legacy Code: Evolve or Rewrite?

Agree on maxims [communicate the plan]

• “Only one work site at a time: instruments” !

• “When in Rome, do as Romans do”

Page 76: Legacy Code: Evolve or Rewrite?

"The code says it all"

Page 77: Legacy Code: Evolve or Rewrite?

Legacy: Fossilized Domain Expertise

http://newspaper.li/fossil/

•inspiration

•obfuscated

Page 78: Legacy Code: Evolve or Rewrite?

Rewrite:!

because of CHANGES (or it’s a bad idea)

Page 79: Legacy Code: Evolve or Rewrite?

needs

Page 80: Legacy Code: Evolve or Rewrite?

Rewrite:!

must inject NEW knowledge

Page 81: Legacy Code: Evolve or Rewrite?

Rewrite:!

need business ANALYSIS

Page 82: Legacy Code: Evolve or Rewrite?

WHOLETEAM

Page 83: Legacy Code: Evolve or Rewrite?

Like a new project from

scratch!

Page 84: Legacy Code: Evolve or Rewrite?

So how do we

integrate?

Page 85: Legacy Code: Evolve or Rewrite?

STRANGLE

Page 86: Legacy Code: Evolve or Rewrite?

Strangler application

A new module will progressively strangle the

former one, for one single asset

only

http://www.flickr.com/photos/louisfoecy/4114597043http://martinfowler.com/bliki/StranglerApplication.html

Page 87: Legacy Code: Evolve or Rewrite?

Feature Toggles

!

Progressively turn off legacy functionalities & turn on the new ones

NEWOLD

Page 88: Legacy Code: Evolve or Rewrite?

if(c == category1) {legacy.compute(...)} else if(c == category2) {strangler.compute(...)} //...

Page 89: Legacy Code: Evolve or Rewrite?

Grow a Bubble Context

Page 90: Legacy Code: Evolve or Rewrite?

!

Listen to domain experts High hygiene standards

Pair-programming TDD, BDD, DDD

Page 91: Legacy Code: Evolve or Rewrite?

Invest in domain knowledge

• Bi-weekly 30mn training sessions

Page 92: Legacy Code: Evolve or Rewrite?

Dream model must pass every scenario

Bespoke custom DREAM MODEL

Given a floating rate bond on EURIBOR 3M And a nominal of 15M EUR And an issue date of 2011/06/15 And an end date of 2012/06/14 And an SEMI_ANNUAL calculation period !When the EURIBOR 3M evolves:

| 2011/09/15 | 3.5% | | 2012/03/15 | 4.0% | !

Then the cash-flows are: | 2011/12/13 | 23000 | | 2012/06/14 | 25500 |

Page 93: Legacy Code: Evolve or Rewrite?

Anti-corruption layer

Page 94: Legacy Code: Evolve or Rewrite?

Adapter

Page 95: Legacy Code: Evolve or Rewrite?

API

SPI

Page 96: Legacy Code: Evolve or Rewrite?

Easier to integrate by construction

bespoke lib

Page 97: Legacy Code: Evolve or Rewrite?

Old code: Freeze it

Page 98: Legacy Code: Evolve or Rewrite?

Rewrite=

clear boundaries +

new strangler application +

minimal integration

Page 99: Legacy Code: Evolve or Rewrite?

Deliver Value

Quickly

Page 100: Legacy Code: Evolve or Rewrite?
Page 101: Legacy Code: Evolve or Rewrite?

Questions? Did you try similar things too?

Let’s discuss!

@cyriux

Page 102: Legacy Code: Evolve or Rewrite?

Follow me @cyriux !

Slides: slideshare.net/cyriux Blog: cyrille.martraire.com

!

In Paris? Join !

Page 103: Legacy Code: Evolve or Rewrite?

Merci