48
Closing the Gap Danish Agile User Group – 3. March 2011 Jeppe Cramon

Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Embed Size (px)

DESCRIPTION

How do we close the gap between developers, management and the business experts. After introducing typical management thinking and the problems this presents, I will introduce how I believe we can try to immunize ourselves from the things that are bound to change during a project. This includes Agile & Lean practices, Domain Driven Design (DDD), Model Driven Development (MDD) and Data Context Interaction (DCI).

Citation preview

Page 1: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Closing the Gap

Danish Agile User Group – 3. March 2011

Jeppe Cramon

Page 2: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

WHAT’S THE CURRENT STATUS IN OUR WORK ENVIRONMENT?

Page 3: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Overheard in real projects• “We freeze the database design 3 months before go-live”• “The customer can’t get that, because then we’ll have to rewrite

too much”• “Why isn’t the documentation updated?”• “Who can work this weekend? We need to rewrite History on all

Entities”• “We’ll do like this now, and then change when we have more

time”• “We just need more people!”

Page 4: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

What about management?

Page 5: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Typical management thinking• We pick the tools and architecture that

Gartner recommends• More people working on a project = The faster

it gets finished• 100 foreign developers are better than 10

local, if the price is the same

Page 6: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration
Page 7: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

The problem with AMAG*• Management picks what Gartner recommends

and feel justified (CMA**) – Don’t have to understand anything related to

development– Too many silver bullets and magic formulas

• Developers gets a tool, but not necessarily the right tool for the job

AMAG* Architecture by Management, Approved by GartnerCMA** Cover my Ass

Page 8: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

9 women can deliver a baby in 1 month

• Increasing the number of developers on a project, decreases developer efficiency – Communication overhead– More ceremony (Documents and Processes)

• Writing code typically only amounts to 25-30% of the total project time

Page 9: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Closing the GapWe need:• Smaller teams (5-10 people)

– What if instead of "what languages work for large teams" we looked for "what languages prevent the need for large teams?” – Greg Young

• More skilled developers and managers• Close contact to Product owner and Business Experts• Higher level of Abstraction• High degree of Automation• Shorter feedback cycles• Make it cheaper to make mistakes and learn from it

Page 10: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

What’s this talk about?

I will give my experience of how to close the gap as a developer & architect

Page 11: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

We can’t control everything

But we can try to immunize ourselves from changes that we know will occur

Page 12: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Combine Lean & Agile

Page 13: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Lean• A little thinking ahead can save you a lot of pain down the road

– Architectural refactoring is expensive• Understand the nature of your domain

– To pick the right abstractions• Discover patterns & variations

– Do enough upfront – but not too much!• Focus on learning and improving

– Reducing waste– Why do most projects always start from scratch?

Page 14: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

ExampleWHEN BUILDING

A LIFE INSURANCE APPLICATION

DEAL WITH TEMPORAL DESIGN

UPFRONT

Page 15: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Agile• Apply your learning's iteratively – It’s the least

expensive way• Pick the right tools for the right job• Use proper test approaches to ensure quality.– This helps you discover when new learning’s break old

assumptions• Focus on importance and criticality

Page 16: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

WHERE DO WE START?

Page 17: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

How to get a grasp of the unknownTalk the talk – learn the language of the domain experts

Draw a lot of paper sketches

Forming our Ubiquitous Language

Domain Entities (Models), Processes, UI’s

Page 18: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Models -the backbone of Domain Driven Design (DDD)

They give us our common language – the ubiquitous language

Are a great tool for communication

Clearly defines boundaries and help us grasp a complex world

Page 19: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Core Principles of DDD1. The Model and the Design shape each other2. The binding between Model and implementation, makes the model

relevant3. The analysis that went into the Model applies to the final product the

running program4. The Model is the backbone of the Ubiquitous language – used by all team

members. 5. Closing the Gap – developers talk to business experts without translation6. The Model is distilled knowledge – Captures how we choose to think about

the domain in form of: terms, concepts and the relationship between them7. The Model isn’t about realism – “Even in a domain of real-world things, our

domain model is artificial creation, like movie making…”

Page 20: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Core patterns

ENTITIES

VALUE OBJECTS

AGGREGATES

Modu

les

Layere

d A

rch

itect

ure

Fact

ori

es

Rep

osi

tori

es

Serv

ices

Page 21: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Entities

Motivators: Objects are defined by identity and not by their attributes. May have lifecycle, can change form by time and context (A Person that becomes a father, which becomes a grand father, etc.)

Focus is on Who and not on what!

Page 22: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Value Objects

Motivators:Objects which describe things and are defined by their attributes (not by their identity) and doesn’t have a lifecycle.

Focus is on What and not on who!

Page 23: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Aggregates

What:• Cluster coherent Entities and Value Objects, with

complex associations, in to aggregates with well defined boundaries.

• Choose one entity to be root and control access to objects inside the boundary through the root.

• External objects hold references to the root

Motivation:Control invariants and consistency through the aggregate root.Enables: Loading schemes, coarse grained locking, consistency boundaries for DDDD

Page 24: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

So now that we have a model sketch – what’s next?

Page 25: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Same procedure as last year?

We write our ORM classes and mapping by hand

Page 26: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

So we go from

Page 27: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

package dk.tigerteam.mdsd.demo.model.internal;

@Entity@Table(name = "Customer")public class Customer extends AbstractEntity { private static final long serialVersionUID = 2098912667L;

@Basic @Column(name = "name", nullable = false) private String name;

@OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.LAZY) @JoinColumn(name = "addressId") @NotNull private dk.tigerteam.mdsd.demo.model.internal.Address address;

@OneToMany(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, targetEntity = Booking.class, mappedBy = "customer", fetch = FetchType.LAZY) private Set<Booking> bookingCollection = new java.util.HashSet<Booking>();

public String getName() { return name; }

public void setName(String name) { this.name = name; } … … … … … … … … … …

}

package dk.tigerteam.mdsd.demo.mode.internal; @Entity@Table(name = "Booking")public class Booking extends AbstractEntity { private static final long serialVersionUID = 170080605L;

@Basic @Column(name = "comment", nullable = false) private String comment;

@Basic @Temporal(TemporalType.TIMESTAMP) @Column(name = "time", nullable = false) private java.util.Date time;

@Basic @Column(name = "timeslot", nullable = false) private int timeslot;

@ManyToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.LAZY) @JoinColumn(nullable = false, name = "customerId") private Customer customer;

public String getComment() { return comment; }

public void setComment(String parameter) { this.comment = parameter; }

public java.util.Date getTime() { return time; } … … … … … … …

}

@Entity@Table(name = "Address")public class Address extends AbstractEntity { private static final long serialVersionUID = 1697028161L;

@Basic @Column(name = "street", nullable = false) private String street;

@Basic @Column(name = "zipCode", nullable = false) private String zipCode;

@Basic @Column(name = "city", nullable = false) private String city;

public String getStreet() { return street; }

public void setStreet(String parameter) { this.street = parameter; } … … …}

To…By writing

Page 28: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

This works fairly well, until…

• We get tired of writing the same tedious code by hand• We suddenly realize that:

• Our assumptions didn’t hold up and we need to change many of our mappings

• We need to write a lot of test code to ensure that our mappings are correct

• We’re writing a lot of similar technical code and very little business code (DRY)

Page 29: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

STOOOOOOOOOP !!!!!!!• We’re painting ourselves into a corner!• We don’t update the models or the

documentation• We code from exceptions and not rules• We tend to forget the customer and their needs• We handle symptoms, rather than doing the right

thing

Page 30: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

So what is the solution?A “radical” shift – to a larger degree of automation

Model Driven Development

Page 31: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Get rid of tedious repetitive code

Frameworks

(Hibernate/JPA, Entity

Framework)

Libraries (e.g. Java/.NET)

Schematic code

Interesting code(Hand written)

Hand written

Model Generator

Page 32: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Let’s get cranking with UMLand TigerMDSD

Page 33: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

The process

Java/C# codeJPA / Entity FrameworkDB schemasWSDLXML SchemaIntegration tests

TigerMDSD

MODEL is KING

Page 34: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

What’s possible with the Meta Model

Just about everything - Set your mind free

Page 35: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

What about Domain Logic?

• It’s important to separate Entity Logic and Use Case Logic

• Use Case Logic doesn’t belong in Entities (violates coherence)

Page 36: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Domain Modeling

Domain Object design should focus on WHAT the SYSTEM IS

NOT on what the system DOESJames Coplien – DCI Talk at Öredev 2009

Page 37: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Entity LogicWe have several options with regards to Entity Logic

What we model

Partial classes3 level inheritance

Alternatives:• Mixins / Traits• Extension Methods• Priviledged Aspects• Protected Regions

Optional

Page 38: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

DCI• Allows us to separate Form – What the System IS – AKA. The domain mode

• from Structure – What the System DOES

• Identifying that Form changes much slower than the Structure

Page 39: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Use Case Logic

• This type of logic spans Domain Objects.• Data Context Interaction (DCI) offers a very

flexible way of handling this complexity, by allowing Domain Objects to play different Roles within different Contexts (Use cases)

Page 40: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

DCI• Separating Structure from Form is done using

Roles, which are (typically) played by Domain Objects

• Mixins/Traits/Partial Classes/Extension Methods are used to enhance Domain Objects with extra functionality (Role Methods) within a Context

Page 41: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

DCIMarriage Context

PersonID: 3

PersonID: 1

PersonID: 2

Role Object

Father Object ID: 1

Mother Object ID: 2

Son Object ID: 3Mother

SonFather

Role Map

Interaction

Page 42: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Higher abstraction levelBi-temporal history

At any time

Over a long period

What we model

<<History>>

Gives us the freedomto chose the right implementationwithout revealing it in the model

Page 43: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Generating WebServices

Page 44: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

A little statistics

Source: http://modelseverywhere.wordpress.com/2010/12/20/more-technology-adoption-curves/

Page 45: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Positive Side-effects of MDD• Better and more coherent quality• Model Documentation is always up-to-date• Closer to the customer – speak the same language• Fewer resources – better economy• Removes focus from technical mumbo-jumbo• Automation of tests• Easier to follow progress

Page 46: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

Challenges with MDD• New way of thinking and working• This is NOT Case Tools re-invented!• Parallel development (Branching & Merging requires

proper tool support)• Handling new production releases requires tool support for

updating databases, etc.• The Ketchup effect – Don’t forget it’s iterative• Model is KING

Page 47: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

References• BEC Pension• Letpension• Elektronisk Tinglysning (CSC)• Miracle A/S• PFA Pension• …

Page 48: Closing the Gap - Project manager version - DDD, MDD, DCI and Codegeneration

ThanksFor more information

[email protected]

or

@jeppec on Twitter