Retrofitting Architecture - Oredev 2012

110
Retrofitting Architecture (video) Chris Chedgey Structure101 @chedgey Oredev November 9 th 2012, Malmo

description

There's a video of me presenting this here: http://oredev.org/2012/sessions/retrofitting-a-software-architecture-to-an-existing-code-base

Transcript of Retrofitting Architecture - Oredev 2012

Page 1: Retrofitting Architecture - Oredev 2012

Retrofitting Architecture (video) Chris Chedgey Structure101 @chedgey Oredev November 9th 2012, Malmo

Page 2: Retrofitting Architecture - Oredev 2012

Architecture

Modularity

Structure

Mud

• defined, communicated, enforced

• interfaces, responsibility

• encapsulation, coupling

Page 3: Retrofitting Architecture - Oredev 2012

Modularity Manage complexity

by

Encapsulation

Page 4: Retrofitting Architecture - Oredev 2012

Information hiding

Modularity Manage complexity

by

Encapsulation

Page 5: Retrofitting Architecture - Oredev 2012

Defined interface

Information hiding

Modularity Manage complexity

by

Encapsulation

Page 6: Retrofitting Architecture - Oredev 2012

Defined interface

Information hiding

Clear responsibility

Modularity Manage complexity

by

Encapsulation

Page 7: Retrofitting Architecture - Oredev 2012

Defined interface

Information hiding

Cohesion

Clear responsibility

Modularity Manage complexity

by

Encapsulation

Page 8: Retrofitting Architecture - Oredev 2012

Defined interface

Information hiding

Cohesion Coupling

Clear responsibility

Modularity Manage complexity

by

Encapsulation

Page 9: Retrofitting Architecture - Oredev 2012

Abstraction

Defined interface

Information hiding

Cohesion Coupling

Clear responsibility

Modularity Manage complexity

by

Encapsulation

Page 10: Retrofitting Architecture - Oredev 2012
Page 11: Retrofitting Architecture - Oredev 2012
Page 12: Retrofitting Architecture - Oredev 2012

Encapsulation Abstraction

Defined interface

Information hiding

Cohesion

Coupling

Clear responsibility

Page 13: Retrofitting Architecture - Oredev 2012

Encapsulation Abstraction

Defined interface

Information hiding

Cohesion

Coupling

Clear responsibility

Modularity

Page 14: Retrofitting Architecture - Oredev 2012

Composition

Complexity

Page 15: Retrofitting Architecture - Oredev 2012

Composition

Complexity

Cyclomatic

Complexity

(CC)

Page 16: Retrofitting Architecture - Oredev 2012
Page 17: Retrofitting Architecture - Oredev 2012
Page 18: Retrofitting Architecture - Oredev 2012
Page 19: Retrofitting Architecture - Oredev 2012
Page 20: Retrofitting Architecture - Oredev 2012

(same problem)

Page 21: Retrofitting Architecture - Oredev 2012
Page 22: Retrofitting Architecture - Oredev 2012

Encapsulation Abstraction

Defined interface

Information hiding

Cohesion

Coupling

Clear responsibility

Modularity

Page 23: Retrofitting Architecture - Oredev 2012
Page 24: Retrofitting Architecture - Oredev 2012

Composition

Complexity

Cyclomatic

Complexity

(CC)

Page 25: Retrofitting Architecture - Oredev 2012

Composition

Complexity

Compositional

Complexity

(CC)

Page 26: Retrofitting Architecture - Oredev 2012
Page 27: Retrofitting Architecture - Oredev 2012
Page 28: Retrofitting Architecture - Oredev 2012

Classes

Namespaces

Page 29: Retrofitting Architecture - Oredev 2012

Encapsulation Abstraction

Defined interface?

Information hiding?

Cohesion

Coupling?

Clear responsibility

Modularity?

Page 30: Retrofitting Architecture - Oredev 2012

Composition

Complexity

Compositional

Complexity

(CC)

Page 31: Retrofitting Architecture - Oredev 2012

Composition

Complexity

Compositional

Complexity

(CC)

+Hierarchical

=> Scalable

Page 32: Retrofitting Architecture - Oredev 2012

Coupling

Page 33: Retrofitting Architecture - Oredev 2012

Dependencies

Page 35: Retrofitting Architecture - Oredev 2012
Page 36: Retrofitting Architecture - Oredev 2012
Page 37: Retrofitting Architecture - Oredev 2012

“Tangles”

Page 38: Retrofitting Architecture - Oredev 2012
Page 39: Retrofitting Architecture - Oredev 2012
Page 40: Retrofitting Architecture - Oredev 2012
Page 41: Retrofitting Architecture - Oredev 2012
Page 42: Retrofitting Architecture - Oredev 2012
Page 43: Retrofitting Architecture - Oredev 2012
Page 44: Retrofitting Architecture - Oredev 2012
Page 45: Retrofitting Architecture - Oredev 2012
Page 46: Retrofitting Architecture - Oredev 2012
Page 47: Retrofitting Architecture - Oredev 2012
Page 48: Retrofitting Architecture - Oredev 2012

=

Page 49: Retrofitting Architecture - Oredev 2012

=

Not scalable!!

Page 50: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Page 51: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Let suitable architecture emerge, without “baggage”

Page 52: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Let suitable architecture emerge, without “baggage”

At some point stronger, higher-level abstractions are needed

Page 53: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Let suitable architecture emerge, without “baggage”

At some point stronger, higher-level abstractions are needed

(~50Kloc – Martin, Foote)

Page 54: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Let suitable architecture emerge, without “baggage”

At some point stronger, higher-level abstractions are needed

(~50Kloc – Martin, Foote)

Restructure to defined architecture

Page 55: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Let suitable architecture emerge, without “baggage”

At some point stronger, higher-level abstractions are needed

(~50Kloc – Martin, Foote)

Restructure to defined architecture

Iterate with development

Page 56: Retrofitting Architecture - Oredev 2012

Ideally…

Start with a loose “architecture”

Let suitable architecture emerge, without “baggage”

At some point stronger, higher-level abstractions are needed

(~50Kloc – Martin, Foote)

Restructure to defined architecture

Iterate with development

Strengthen with growth

Page 57: Retrofitting Architecture - Oredev 2012

0.7.2

Mar „04

Page 58: Retrofitting Architecture - Oredev 2012

0.8.6

Oct „04

Page 59: Retrofitting Architecture - Oredev 2012

0.8.7

Apr „05

Page 60: Retrofitting Architecture - Oredev 2012

Erosion

“Sometimes the developers manage to maintain this purity of design through the initial development and into the first release. More often something goes wrong. The software starts to rot like a piece of bad

meat.”

Bob Martin, “Agile Software Development”

Page 61: Retrofitting Architecture - Oredev 2012

0.8.8

May „05

Page 62: Retrofitting Architecture - Oredev 2012

1.0.0

Jun „06

Page 63: Retrofitting Architecture - Oredev 2012

1.3.0

Nov „07

Page 64: Retrofitting Architecture - Oredev 2012

1.3.5

Sep „08

Page 65: Retrofitting Architecture - Oredev 2012

Cost…

Page 66: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Page 67: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Cost per feature increases

Page 68: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Cost per feature increases

Unexpected impacts of change

Page 69: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Cost per feature increases

Unexpected impacts of change

Unreliable schedules

Page 70: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Cost per feature increases

Unexpected impacts of change

Unreliable schedules

Test cycles increase

Page 71: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Cost per feature increases

Unexpected impacts of change

Unreliable schedules

Test cycles increase

Reuse less

Page 72: Retrofitting Architecture - Oredev 2012

Cost…

Miserable developers

Cost per feature increases

Unexpected impacts of change

Unreliable schedules

Test cycles increase

Reuse less

Value of your code base declines

Page 73: Retrofitting Architecture - Oredev 2012

Technical Debt

Page 74: Retrofitting Architecture - Oredev 2012

Technical Debt

Page 75: Retrofitting Architecture - Oredev 2012

Technical Debt

Page 76: Retrofitting Architecture - Oredev 2012

Technical Debt

Page 77: Retrofitting Architecture - Oredev 2012
Page 78: Retrofitting Architecture - Oredev 2012
Page 79: Retrofitting Architecture - Oredev 2012
Page 80: Retrofitting Architecture - Oredev 2012
Page 81: Retrofitting Architecture - Oredev 2012
Page 82: Retrofitting Architecture - Oredev 2012
Page 83: Retrofitting Architecture - Oredev 2012
Page 84: Retrofitting Architecture - Oredev 2012

Abstraction

Page 85: Retrofitting Architecture - Oredev 2012

Abstraction

Page 86: Retrofitting Architecture - Oredev 2012

Abstraction

Page 87: Retrofitting Architecture - Oredev 2012

Abstraction

Page 88: Retrofitting Architecture - Oredev 2012

Abstraction

Page 89: Retrofitting Architecture - Oredev 2012

Abstraction

Page 90: Retrofitting Architecture - Oredev 2012

Abstraction

Page 91: Retrofitting Architecture - Oredev 2012

Abstraction

Page 92: Retrofitting Architecture - Oredev 2012

Refactoring Restructuring

Page 93: Retrofitting Architecture - Oredev 2012

Refactoring

• “Changing code without

modifying behavior to

improve nonfunctional

attributes.”

Restructuring

• “Reorganizing a code-base

without modifying the code to

improve modularity”

Page 94: Retrofitting Architecture - Oredev 2012

Refactoring

• “Changing code without

modifying behavior to

improve nonfunctional

attributes.”

• Code is readable

Restructuring

• “Reorganizing a code-base

without modifying the code to

improve modularity”

• Code-base is understandable

Page 95: Retrofitting Architecture - Oredev 2012

Refactoring

• “Changing code without

modifying behavior to

improve nonfunctional

attributes.”

• Code is readable

• A lot of invasive code editing

Restructuring

• “Reorganizing a code-base

without modifying the code to

improve modularity”

• Code-base is understandable

• Minimal invasive code editing

Page 96: Retrofitting Architecture - Oredev 2012

Refactoring

• “Changing code without modifying behavior to improve nonfunctional attributes.”

• Code is readable

• A lot of invasive code editing

• Scope: small worlds of a few classes at a time; what you see in the IDE.

Restructuring

• “Reorganizing a code-base without modifying the code to improve modularity”

• Code-base is understandable

• Minimal invasive code editing

• Scope: whole code base; what you don‟t see in the IDE

Page 97: Retrofitting Architecture - Oredev 2012

Retrofitting…

Page 98: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Page 99: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Top-down or bottom-up?

Page 100: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Top-down or bottom-up?

Bust big class tangles

Page 101: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Top-down or bottom-up?

Bust big class tangles

Create a structured model (levelized+CC) (use strategies)

Page 102: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Top-down or bottom-up?

Bust big class tangles

Create a structured model (levelized+CC) (use strategies)

Adjust module boundaries (strengthen abstractions)

Page 103: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Top-down or bottom-up?

Bust big class tangles

Create a structured model (levelized+CC) (use strategies)

Adjust module boundaries (strengthen abstractions)

Define layers, visibility

Page 104: Retrofitting Architecture - Oredev 2012

Retrofitting…

Physical or virtual?

Top-down or bottom-up?

Bust big class tangles

Create a structured model (levelized+CC) (use strategies)

Adjust module boundaries (strengthen abstractions)

Define layers, visibility

Repair violations in the implementation levels

Page 105: Retrofitting Architecture - Oredev 2012
Page 106: Retrofitting Architecture - Oredev 2012

Structure101

Page 107: Retrofitting Architecture - Oredev 2012

Restructure101

Structure101

Page 108: Retrofitting Architecture - Oredev 2012

Restructure101

Structure101

Page 109: Retrofitting Architecture - Oredev 2012

Restructure101

Structure101

Page 110: Retrofitting Architecture - Oredev 2012

Architecture

Modularity

Structure

Mud

• defined, communicated, enforced

• interfaces, responsibility

• encapsulation, coupling

• Thank you! Chris Chedgey

Structure101

@chedgey

(video)