14
1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3 Agenda • Agenda – Agile and Legacy Code – Approach – Summary • Goals: – Concepts – Strategy © 2008 Steve Berczuk 4 Agile • Principles • Practices • Feedback Pragmatic Approach • Why?

About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

1

Getting Agile with Legacy

Code

Steve Berczuk

© 2008 Steve Berczuk

© 2008 Steve Berczuk 2

About Me

© 2008 Steve Berczuk 3

Agenda

• Agenda

– Agile and Legacy Code

– Approach

– Summary

• Goals:

– Concepts

– Strategy

© 2008 Steve Berczuk 4

Agile

• Principles

• Practices

• Feedback

• Pragmatic Approach

• Why?

Page 2: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

2

© 2008 Steve Berczuk 5

The Agile Manifesto

• Individuals and interactions over processes and tools

• Working software over comprehensive

documentation

• Customer collaboration over contract negotiation

• Responding to change over following a plan

© 2008 Steve Berczuk 6

What is Legacy Code?

• Hard to understand

• Hard to change

• Slow to build

• “Big Ball of Mud”

• No Feedback

• Age doesn’t matter!

© 2008 Steve Berczuk 7

…Legacy Code

• Source Code

• DDL/SQL

• Build Scripts

• Installation Scripts

© 2008 Steve Berczuk 8

Common Legacy Code Issues

• Fear of change

• Difficult to write tests

• Difficult to verify

• Dependencies

• “Broken Windows”

• Challenge: In

production

Page 3: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

3

© 2008 Steve Berczuk 9

Agile Code Qualities

• Unit Testable

• Low-coupling

• Easy to Refactor

• Quick to build & test

• “Safe” to Change

• Feedback Mechanisms

© 2008 Steve Berczuk 10

Goal

• Transform Legacy Code to make itmore robust to change

– Build and test in a repeatable fashion.

– Enable validation

– Enable incremental change

• How?– Enable Feedback

– Testing

© 2008 Steve Berczuk 11

The Legacy Code Dilemma

Test Change

© 2008 Steve Berczuk 12

The Art of the Possible

• Teamwork

• Common Goal

• Small Steps

• Basic Principles

• Discipline

Page 4: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

4

© 2008 Steve Berczuk 13

Project Ecosystem & Success

© 2008 Steve Berczuk 14

Organization Issues

• Organization

– Agile Means Feedback

– Agile Exposes Problems

– Organization influences Architecture

• Conway’s Law

– Customer Collaboration…

© 2008 Steve Berczuk 15

Any organization that designs a system

(defined broadly) will produce a design whose

structure is a copy of the organization's

communication structure.-Mel Conway

-"How Do Committees Invent?"

-Datamation, April 1968

Conway’s Law

© 2008 Steve Berczuk 16

Ecosystem: The Team

• Pair Programming /

Commit Buddy

• Continuous

Integration

• Individuals and

Interactions…

Page 5: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

5

© 2008 Steve Berczuk 17

Architectural Issues

• Coupling / Modularity / Dependencies

• Testability enables stability

• Testability encourages modularity

• Influences Build and release strategy

© 2008 Steve Berczuk 18

Build, Release, Test

• Testing enables single code line

– Establish a policy requiring testing

• Build enables automated integration

– Quick builds enable rapid feedback

– Responding to change…

• Release enables feedback

• Working software…

© 2008 Steve Berczuk 19

Agile Development Lifecycle

© 2008 Steve Berczuk 20

Ecosystem

• Not Just Code

Changes

• Code “lives” in a

context

• Agile practices

reflect this

Page 6: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

6

© 2008 Steve Berczuk 21

Enable Change: Feedback

• Working Software– Build-able (repeatable)

– Tests define “done”

• Iterations– (Small steps, incremental change)

– Feedback at each step

• Levels of Scale– Workspace

– Integration

• Empower Team© 2008 Steve Berczuk 22

Feedback

• Feedback enables

change

• Tests provide

feedback

• Build enables testing

• Confident change

enables agility

© 2008 Steve Berczuk 23

Repeatable Build

• Build = Component

Architecture

• Repeatable =

Testable

• Dependencies =

Difficult to Test

• The Build Scripts

are Code

© 2008 Steve Berczuk 24

Common Build Problems

• Build too slow

• Can’t create a workspace without

manual steps

• Don’t know your dependencies

• Don’t have Continuous Integration

• Hard coded paths

Page 7: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

7

© 2008 Steve Berczuk 25

Build Speed

• Slow builds slow cycle & disrupt flow

• Module architecture

© 2008 Steve Berczuk 26

Build Speed

• Modules

– Build and test at component level

• Hierarchy of tests

– Balance completeness and time

• Fix Tests (& Build)

– Tests are code too

© 2008 Steve Berczuk 27

Repeatable Process

© 2008 Steve Berczuk 28

Enable Agile Build

• Understand Dependencies– Explicit, not implicit

• Repeatable Structure– Create workspaces

• Metrics– Add tooling to build to measure coupling

• Testing (with each build)– Smoke Test

Page 8: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

8

© 2008 Steve Berczuk 29

Dependency Management

<property name=“lib.java” path=“WEB-INF/lib”/>

<path id="build.classpath"><fileset dir="${lib.java}" includes="*.jar"/>

</path>

© 2008 Steve Berczuk 30

Dependency Management

<artifact:dependencies pathId=”build.classpath”>

<dependency groupId="junit”

artifactId="junit" version="3.8.2”

scope="test"/>

<dependency groupId=”commons-collections”

artifactId=”commons-collections"

version="3.2” />

</artifact:dependencies>

© 2008 Steve Berczuk 31

Repeatable Workspaces

© 2008 Steve Berczuk 32

Continuous Integration

• Immediate

• Continuous

• Code Compiles

• Tests Pass

• Essential

Page 9: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

9

© 2008 Steve Berczuk 33

(In) Flexible Configuration

© 2008 Steve Berczuk 34

Flexible Configuration

© 2008 Steve Berczuk 35

Progress

• Can build and

deploy from a known

state

• Clear module

dependencies

• Identified incorrect &

inflexible

Configurations

© 2008 Steve Berczuk 36

Types of Tests

Page 10: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

10

© 2008 Steve Berczuk 37

Enable Test Execution

• Run existing tests

– Integration Tests

• Build

• Private Workspaces

– Database Test Environments

– App Servers

– Will find config dependencies

© 2008 Steve Berczuk 38

Testing Impediments

• Global Dependencies

– Singletons

• Coupling

– Creating rather than parameters

– Not Using Interfaces

© 2008 Steve Berczuk 39

Tools to Break Dependencies

• Dependency Injection

• Configuration

• Refactoring

• Fake Objects (For test)

© 2008 Steve Berczuk 40

Testing Risk Factors

• Multiple Tests for same thing

– Increase cost of change

• Overuse of Mocks to hide complexity

– Remove the complexity

• Excessive code changes enable tests

Page 11: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

11

© 2008 Steve Berczuk 41

Tools To Enable Change

• Define what you want to change

• Verify that your change did not break

anything

• Write new code to isolate

• Test Locally

• Test Globally

• Test Driven Development

© 2008 Steve Berczuk 42

Test Driven Development

• Write a Test

• Make it Compile

• Make it Pass

• Refactor

• (Repeat)

• Legacy Code Dilemma

© 2008 Steve Berczuk 43

Tests and Code Quality• Less coupling

• Verifiable

• Less Fragile

• But…– TDD Not a silver

bullet!

– Beware of “micro-optimizations”

© 2008 Steve Berczuk 44

Where to Start?

• Test when making changes

• Evaluate existing tests

• Run end to end tests

• Unit Test

• Repeat

Page 12: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

12

© 2008 Steve Berczuk 45

Build Time

• Slow Builds v Test Coverage

• Slow Builds v Modules

• Integration v Unit Tests

© 2008 Steve Berczuk 46

Progress

• Verify that system works as expected

• Infrastructure for new tests

© 2008 Steve Berczuk 47

Release Line

• Support existing customers

– Initial agile experiments are risky.

© 2008 Steve Berczuk 48

Isolate Less Agile Code

Page 13: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

13

© 2008 Steve Berczuk 49

Refactoring

Techniques/Patterns

• (From Michael Feathers Working

Effectively with Legacy Code)

• Replace Global Access with Getter

• Problem: Want to test a method that

references a Singleton.

© 2008 Steve Berczuk 50

Replace Global with Getter

Class Itinerary { public Duration calculateTripDuration(Flight flight, Date day) { FlightInfo info= Repository.getInstance().getFlightInfo(flight); if(isFriday(today)){ return info.getDuration() + asHours(3); } else { return info.getDuration() + asHours(1); } }}

© 2008 Steve Berczuk 51

Replace Global with Getter

© 2008 Steve Berczuk 52

Summary

• Enable Feedback

– Build

– Code

• Refactor

– Test

– Update

– Integrate

Page 14: About Me Getting Agile with Legacy Code - Berczuk · 1 Getting Agile with Legacy Code Steve Berczuk © 2008 Steve Berczuk © 2008 Steve Berczuk 2 About Me © 2008 Steve Berczuk 3

14

© 2008 Steve Berczuk 53

Agile Code

• Unit Testable

• Low-coupling

• Easy to Refactor

• Quick to build & test

• “Safe” to Change

• Feedback Mechanisms

© 2008 Steve Berczuk 54

Resources

© 2008 Steve Berczuk 55

Questions?