habitual thinking - patterns for it disappointment and failure

70
Habitual thinking Patterns for IT disappointment and failure enrik Wivel & Jeppe Cram

Upload: jeppe-cramon

Post on 15-Jan-2015

2.102 views

Category:

Technology


2 download

DESCRIPTION

Presentation in 3 parts that uncovers the problems with conventional thinking in IT solutions and how to break the habit and thereby creating the foundation IT-driven growth. Finally, we share lessons learned from implementation of our suggestions in connection with the Danish Electronic Land Registration project.

TRANSCRIPT

Page 1: Habitual thinking - Patterns for IT disappointment and failure

Habitual thinkingPatterns for IT disappointment and failure

Henrik Wivel & Jeppe Cramon

Page 2: Habitual thinking - Patterns for IT disappointment and failure
Page 3: Habitual thinking - Patterns for IT disappointment and failure

Corporate growth slowed dueto lack of funding

Berlingske Finans

6 out of 10 public projects going over time and budget

Version2

Page 4: Habitual thinking - Patterns for IT disappointment and failure

How well is your company doing?

• Are your IT projects delivered on time, on budget and with the right functionality?

• Are your IT systems running smoothly and stable?

• Does your system landscape contain more applications performing the same or similar tasks?

• Do you Outsource / Offshore the right tasks (or are you doing the right tasks in-house)?

Page 5: Habitual thinking - Patterns for IT disappointment and failure

How well is your company doing?

• Are your IT projects aligned with business needs?

• Is the business actively involved in IT projects and investments?

• Do you balance the entire organization's needs with the individual business needs in terms of architecture and infrastructure?

Page 6: Habitual thinking - Patterns for IT disappointment and failure

Does this seem familiar?

Page 7: Habitual thinking - Patterns for IT disappointment and failure

Each new project starts from scratch

Page 8: Habitual thinking - Patterns for IT disappointment and failure

PRODUCT VIEW

We need a combined customer view

Implement Siebel CRM in the Call center

We need to better manage our requirements

Buy and install HP Quality Center

We need a Service Orienteret Architecture

Build a solution using Web services in Oracle Service Bus / SeeBeyond / ...

Page 9: Habitual thinking - Patterns for IT disappointment and failure

SOA

Web Services

Requirement Management tools

BPM

N

Layere

d A

rch

itect

ure

Web

Sp

here

Work

flow

syst

em

Sh

are

Poin

t

Oracle Service bus

Team Foundation

Server

Sub

Vers

ion

Documentum

Portal

Ora

cle

DB

MS

SQ

L S

erv

er

NoS

QL

Policy Manager

WebLogic

.NET

JAVA

Ruby on Rails

iOS

Android

XML

JavaScript

Flash

BlackBerryGit

Hg

Dart

Cloud

Spring

Biz

Talk

Gro

ovy

Sca

la

F#C

#V

B.N

ET

REST

Page 10: Habitual thinking - Patterns for IT disappointment and failure

Typical management thinking

• We choose the tools and architecture that Gartner recommends

• More resources on a project = The sooner we will be finished

• 100 foreign developers are better than 10 local, even if the total price is the same

Page 11: Habitual thinking - Patterns for IT disappointment and failure

The Silver Bullet

Page 12: Habitual thinking - Patterns for IT disappointment and failure

All this leads to

• High complexity and a fragmented system landscape

• Strong need for product specialists who can not always participate across projects

• Danger of hiring habitual thinkers rather than technical domain experts

This creates the need for many resources on projects and therefore result in high costs

Page 13: Habitual thinking - Patterns for IT disappointment and failure

Same procedure as last year?

Same procedure as every year!!!

Page 14: Habitual thinking - Patterns for IT disappointment and failure

Because!!!

• “We haven’t got time to look at new technologies”

• “It requires more money and time”• “We have tried it before and failed”• “We realize we have challenges”• ”We _______________________________”

(Insert an excuse)

Page 15: Habitual thinking - Patterns for IT disappointment and failure

Open for new ideas?

Poul, you idiot, what's that!?You should only bring things we

can eat!

Page 16: Habitual thinking - Patterns for IT disappointment and failure

If it takes 1 man 10 days to dig atelephone cable , how many men do I needif I want it done in 2 days?

5 men in Denmark

10 men in Indien. Half time and even half price

How about using: Wireless network?

Page 17: Habitual thinking - Patterns for IT disappointment and failure

Do you still beat up your wife?

Page 18: Habitual thinking - Patterns for IT disappointment and failure

This is how we often ask

• Where can I get 200 developers for my project?• Where can I get them cheapest?• How do I scale my technical platform to 200

developers?• How do I manage large teams over a long

project cycle?

Page 19: Habitual thinking - Patterns for IT disappointment and failure
Page 20: Habitual thinking - Patterns for IT disappointment and failure

This is how we should ask

• Why do I need 200 developers?• How would I do if I "only" had:– 30 developers– 3 months and not 3 years for the project

• Do I need distributed teams?

Page 21: Habitual thinking - Patterns for IT disappointment and failure

How?What?

Why?

Page 22: Habitual thinking - Patterns for IT disappointment and failure

Is the solution Offshoring?

• 10 techinical domain experts in Denmark at $150 an hour = $1500 an hour

• 100 developer in China/India at $30 an hour = $3000 an hour

It’s a bit like bying app on the Apple AppStoreThey only cost $1

Page 23: Habitual thinking - Patterns for IT disappointment and failure

Project Economy

Productivity

Administrative overhead

Productivity

Administrative overhead

10 technical domain experts100 developers

Page 24: Habitual thinking - Patterns for IT disappointment and failure

Desperation

Inspiration

Desperation

Page 25: Habitual thinking - Patterns for IT disappointment and failure

SolutionsPattern for IT disappointment and failures

Page 26: Habitual thinking - Patterns for IT disappointment and failure

Here are the solutions!

SCRUMXP

LEANAgile

Outsourcing

What was it exactly we were trying to solve?

Getting closer to the business

Page 27: Habitual thinking - Patterns for IT disappointment and failure

Status Quo

Page 28: Habitual thinking - Patterns for IT disappointment and failure

We need a strong foundation for developmentAl

ignm

ent

Hig

hly

alig

ned

Less

alig

ned

EffciencyLess effective Highly effective

”Maintenance Zone” ”Well-Oiled IT”

”Alignment Trap”

11%

74%

7%

8%

% of the 504 respondents

+13

-14

-2 -15

+11

-6

+35

”IT enabled Growth”

% difference compared to the overall averages IT spendingCombined yearly growth-rate over a 3 year period

Sour

ce: B

ain

Anal

ysis

+0

Page 29: Habitual thinking - Patterns for IT disappointment and failure

A strong foundation is!

• Simple architecture• Assignments and data owned by one system• Automation• Tests

Page 30: Habitual thinking - Patterns for IT disappointment and failure

NOT a Simple architectureClient

Remote Facade

Application Service

Data Access Layer

Data Storage

Domain Object

DomainObject

Data Storage

Data Storage

Data Storage

DataService

DataService

DataService

ActivityService

ActivityService

Proces Service Proces Service

Client Client

Client

DataService

Page 31: Habitual thinking - Patterns for IT disappointment and failure

This does’t help either

Page 32: Habitual thinking - Patterns for IT disappointment and failure

A big unified model is every architects pibe dream

But as they say

Page 33: Habitual thinking - Patterns for IT disappointment and failure

ONE MODEL TO RULE THEM ALL

ONE MODEL TO FIND THEM

ONE MODEL TO BRING THEM ALL

AND IN THE DARKNESS BIND THEM

Page 34: Habitual thinking - Patterns for IT disappointment and failure

Still too big a model

Customer

Online Ordering System

Pricing

Inventory

Sales

Product

Unit PricePromotional PricePromotion End Date

Stock Keeping Unit (SKU)Quantity On Hand (QOH)Location Code

PriceQuantity Ordered

Description

Page 35: Habitual thinking - Patterns for IT disappointment and failure

There’s always more than one model at play in any big project

But when code based on multiple models is combined

Page 36: Habitual thinking - Patterns for IT disappointment and failure

… then the code becomes filled with errors, unreliable and difficult to understand

Communication between team members becomes confusing.

It is often unclear in what context a model should NOT be used!

Page 37: Habitual thinking - Patterns for IT disappointment and failure

Context is lacking

Page 38: Habitual thinking - Patterns for IT disappointment and failure

Smaller models and ”service reuse”Enterprise

Web ShopProduct

SKUDescriptionPriceQuantity Ordered… Inventory Service (SAP)

ProductSKUDescriptionQOHLocation Code…

Pricing ServiceProduct

SKUUnit PricePromotional Price…

Inventory

Pricing

Sales

Customers

Page 39: Habitual thinking - Patterns for IT disappointment and failure

Now even better – with an ESBEnterprise

Web ShopProduct

SKUDescriptionPriceQuantity Ordered… Inventory Service (SAP)

ProductSKUDescriptionQOHLocation Code…

Pricing ServiceProduct

SKUUnit PricePromotional Price…

Inventory

Pricing

Sales

Customers

Enterprise Service Bus

New and

”improved”

recipyWatch out!It's so easy to see a

product as the solution to all your

problems!

Before we had 1 problem.With the ESB we now have 2 problemes

Page 40: Habitual thinking - Patterns for IT disappointment and failure

Business focus is still lacking

Processes and state changes are important components

Page 41: Habitual thinking - Patterns for IT disappointment and failure

A much better recipyEnterprise

Web ShopProduct

SKUDescriptionPriceQuantity Ordered… Inventory Service (SAP)

ProductSKUDescriptionQOHLocation Code…

Pricing ServiceProduct

SKUUnit PricePromotional Price…

Inventory

Pricing

Sales

Customers

New SKU Event

New SKU Event

New SKU Event

New SKU Price EventNew SKU

Price Event

Mes

sage

Bus

Page 42: Habitual thinking - Patterns for IT disappointment and failure

What is a strong foundation?

• Simple architecture• Assignments and data owned by one system• Automation• Tests

Page 43: Habitual thinking - Patterns for IT disappointment and failure

In brief…

• Clean up the system landscape ...• Remove redundant systems• Remove systems that no longer have a reasonable

cost-benefit• Modernize systems which can still be make a

difference• Build new systems that can differentiate you from the

rest• ... And do it based on Neil Nickolaisen's Purpose

Alignment Model

Page 44: Habitual thinking - Patterns for IT disappointment and failure

Neil Nickolaisen’s Purpose Alignment Model

CriticalityLow High

Who cares? Keep on a par withcompetitors

PartnershipInvest

andDifferentiate

Market Differentiation

Grade

High

Low

Page 45: Habitual thinking - Patterns for IT disappointment and failure

What is a strong foundation?

• Simple architecture• Assignments and data owned by one system• Automation• Tests

Page 46: Habitual thinking - Patterns for IT disappointment and failure

Automation

• Continuous Integration– The code is automatically built and necessary tests

are conducted for verification• Setting up environments– Server setup, firewalls, deployment

• Integration testing• there is much more to get here ...

Page 47: Habitual thinking - Patterns for IT disappointment and failure

The solution in ETL

Page 48: Habitual thinking - Patterns for IT disappointment and failure

Electronic Landregistration

Background Information on Electronic Landregistration for those who have not heard about it ...

Page 49: Habitual thinking - Patterns for IT disappointment and failure

ETL – Suggested Architecture

Database

DataService

DataService

DataService

ActivityService

ActivityService

Proces Service Proces Service

Internal Portal External Portal

Integrations Service

IntegrationsService

Ora

cle

Serv

ice

Bus

WebLogic Portal

Page 50: Habitual thinking - Patterns for IT disappointment and failure

Suggested ETL Architecture

• Advantages– Logically a reasonable decoupiling (Single Responsibility

Principle)– Oracle makes good money on it

• Disadvantages– Logical layers are turned into physical layer– High complexity– Difficult to find resources that can work with the OSB– Stability– Performance (both runtime and for developers)– Deployment

Page 51: Habitual thinking - Patterns for IT disappointment and failure

ETL – Simplified Architecture

Database

Internal Portal External Portal

Integrations Service

IntegrationsService

Web

Logi

c Se

rver

Data Access Layer

Rich domain object Rich domain object

Business Service Business Service

Portal Facade

Java applications

Page 52: Habitual thinking - Patterns for IT disappointment and failure

Simplified ETL Architecture

• Advantages– Physical and logical architecture are closer to each other– Low complexity– Stability– Easier to find resources that can code Java– Performance (both runtime and for developers)– Deployment

• Disadvantages– The CV will not be boosted with Enterprise Service Bus– Oracle do not earn nearly as well ...

Page 53: Habitual thinking - Patterns for IT disappointment and failure

ETL - Automation

• Extremely complex domain area• The rules are determined by Law (not logic)• Covering registrations there are several

hundred years old• Complex logic required to automate law• Very short deadline for the third attempt to

build ETL

Context

Page 54: Habitual thinking - Patterns for IT disappointment and failure

Electronic Landregistration

• Technical choices– Programming language: Java– Database: Oracle

• First challenge– How do we integrate Java and Oracle database?

Page 55: Habitual thinking - Patterns for IT disappointment and failure

How it’s usually done

Java code

SQL

Page 56: Habitual thinking - Patterns for IT disappointment and failure

Means we go from this…

Page 57: Habitual thinking - Patterns for IT disappointment and failure

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 this…

Page 58: Habitual thinking - Patterns for IT disappointment and failure

The line between modeling og muddling in hand written code is very thin

Page 59: Habitual thinking - Patterns for IT disappointment and failure

Can’t see the shoe for the toes?package dk.tigerteam.mddexample.model.customer;

@javax.persistence.Entitypublic class Customer extends dk.tigerteam.mddexample.model.user.User { private static final long serialVersionUID = 1328488396L;

@javax.persistence.Lob @javax.persistence.Basic @javax.persistence.Column(name = "comment") private String comment;

@javax.persistence.Embedded @javax.persistence.AttributeOverrides({@javax.persistence.AttributeOverride(name = "firstName",column = @javax.persistence.Column(name = "name_firstName") ) , @javax.persistence.AttributeOverride(name = "lastName",column = @javax.persistence.Column(name = "name_lastName") ) }) private dk.tigerteam.mddexample.model.customer.Name name;

@javax.persistence.Embedded @javax.persistence.AttributeOverrides({@javax.persistence.AttributeOverride(name = "street", column = @javax.persistence.Column(name = "address_street") ) , @javax.persistence.AttributeOverride(name = "state",column = @javax.persistence.Column(name = "address_state") ) , @javax.persistence.AttributeOverride(name = "zipCode",column = @javax.persistence.Column(name = "address_zipCode") ) , @javax.persistence.AttributeOverride(name = "city",column = @javax.persistence.Column(name = "address_city") ) , @javax.persistence.AttributeOverride(name = "country",column = @javax.persistence.Column(name = "address_country") ) }) private dk.tigerteam.mddexample.model.customer.Address address;

@javax.persistence.OneToMany(cascade = { javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.REFRESH} , targetEntity = dk.tigerteam.mddexample.model.customer.Pet.class, mappedBy = "customer", fetch = javax.persistence.FetchType.LAZY) private java.util.Set<dk.tigerteam.mddexample.model.customer.Pet> petCollection = new java.util.HashSet<dk.tigerteam.mddexample.model.customer.Pet>();

@javax.persistence.OneToMany(cascade = { javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.REFRESH} , fetch = javax.persistence.FetchType.LAZY) @javax.persistence.JoinTable(name = "Customer_invoice", joinColumns = @javax.persistence.JoinColumn(name = "CustomerId") , inverseJoinColumns = @javax.persistence.JoinColumn(name = "invoiceId") ) private java.util.Set<dk.tigerteam.mddexample.model.invoice.Invoice> invoiceCollection = new java.util.HashSet<dk.tigerteam.mddexample.model.invoice.Invoice>();

@javax.persistence.OneToMany(cascade = { javax.persistence.CascadeType.MERGE, javax.persistence.CascadeType.PERSIST, javax.persistence.CascadeType.REFRESH} , fetch = javax.persistence.FetchType.LAZY) @javax.persistence.JoinTable(name = "Customer_appointment", joinColumns = @javax.persistence.JoinColumn(name = "CustomerId") , inverseJoinColumns = @javax.persistence.JoinColumn(name = "appointmentId") ) private java.util.Set<dk.tigerteam.mddexample.model.customer.Appointment> appointmentCollection = new java.util.HashSet<dk.tigerteam.mddexample.model.customer.Appointment> ();

public String getComment() { return comment; }

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

public dk.tigerteam.mddexample.model.customer.Name getName() { return name; }

public void setName(dk.tigerteam.mddexample.model.customer.Name parameter) { this.name = parameter; }

public dk.tigerteam.mddexample.model.customer.Address getAddress() { return address; }

public void setAddress( dk.tigerteam.mddexample.model.customer.Address parameter) { this.address = parameter; }

public java.util.Set<dk.tigerteam.mddexample.model.customer.Pet> getPetCollection() { return petCollection; }

public java.util.Set<dk.tigerteam.mddexample.model.invoice.Invoice> getInvoiceCollection() { return invoiceCollection; }

public void setInvoiceCollection( java.util.Set<dk.tigerteam.mddexample.model.invoice.Invoice> parameter) { this.invoiceCollection = parameter; }

public java.util.Set<dk.tigerteam.mddexample.model.customer.Appointment> getAppointmentCollection() { return appointmentCollection; }

public void setAppointmentCollection( java.util.Set<dk.tigerteam.mddexample.model.customer.Appointment> parameter) { this.appointmentCollection = parameter; }}

When all you wanted to convey was this

Page 60: Habitual thinking - Patterns for IT disappointment and failure

Hand held consistency…

@Entitypublic class Customer { @OneToMany( targetEntity = Pet.class, mappedBy = "customer” ) private Set<Pet> petCollection = new HashSet<Pet>();

public Set<Pet> getPetCollection() { return new OneToManySetWrapper<Customer, Pet>(this, petCollection) { @Override protected Customer getOneSideObjectInManySideObject(Pet manySideObject) { return manySideObject.getCustomer(); }

@Override protected void setOneSideObjectInManySideObject(Pet manySideObject, Customer oneSideObject) { manySideObject.setCustomer(oneSideObject); } }; }}

@Entitypublic class Pet { @ManyToOne private Customer customer;

public void setCustomer(Customer parameter) { new ManyToOneWrapper<Customer, Pet>(this) { @Override protected void addManySideObjectToOneSideCollection(Customer oneSide, Pet manySide) { ((WrappedSet<Pet>) oneSide.getPetCollection()).getWrappedCollection().add(manySide); } @Override protected void removeManySideObjectFromOneSideCollection(Customer oneSide, Pet manySide) { ((WrappedSet<Pet>) oneSide.getPetCollection()).getWrappedCollection().remove(manySide); }

@Override protected Customer getOneSideObjectInManySideObject(Pet manySide) { return manySide.customer; }

@Override protected void setOneSideObjectInManySideObject(Pet manySide,Customer oneSide) { manySide.customer = oneSide; } }.updateOneSideObject(parameter); }}

Page 61: Habitual thinking - Patterns for IT disappointment and failure

Automation

From sweatshops to automation

Page 62: Habitual thinking - Patterns for IT disappointment and failure

At ETL we introduced this processUML class diagrams

Java codeHibernate

SQL

WSDLTests

Agile process

Page 63: Habitual thinking - Patterns for IT disappointment and failure

Another possibility

Build your own language

Page 64: Habitual thinking - Patterns for IT disappointment and failure

Sounds hard, but it’s quite easy Ru

le L

angu

age

Met

a M

odel

Rule Grammar (using Xtext)

+

Dat

a La

ngua

ge M

eta

Mod

el

+

Editor & IDE

Text Editor

Page 65: Habitual thinking - Patterns for IT disappointment and failure

Point of No Return, traditionally

Time

Cost of Rework

V 1.0

Hacks!

Freeze

Page 66: Habitual thinking - Patterns for IT disappointment and failure

Point of No Return, Model Driven

Time

Cost of Rework

V 1.0

Hacks!

Freeze

Page 67: Habitual thinking - Patterns for IT disappointment and failure

The end of writing tedious code by hand

Frameworks

(Hibernate/JPA, Entity

Framework)

Libraries (f.eks. Java/.NET)

Schematic code

Interesting code

(Written by hand)

Written by hand

Model Generator

Page 68: Habitual thinking - Patterns for IT disappointment and failure

What do we get out of it?

• Higher level of abstraction• Technical decisions can be postponed• "Point of No Return" can be postponed• Documentation is always update to date• Higher Quality and Uniformity• Refactoring is both faster and cheaper• Short development cycle

Page 69: Habitual thinking - Patterns for IT disappointment and failure

The real short version

We can achieve the same with fewer resources

We can achieve the same in less time

We can achieve more with the the sameresources and at the same time

Page 70: Habitual thinking - Patterns for IT disappointment and failure

Electronic Land registration

Questions?@TigerTeamDK on Twitterhttp://tigerteam.dk