Extreme Collaboration Johannes Brodwall Exilesoft Chief scientist @jhannes TODO: Good pairings:...

Post on 01-Apr-2015

214 views 0 download

transcript

Extreme Collaboration

Johannes BrodwallExilesoft Chief scientist

@jhannes

TODO: Good pairings:

Senior/senior: Ping-pongRespectful senior/senior: Stategist/tacticianJunior/junior: TimerJunior/senior: Driver/trainer – optimize learningJunior/senior: Co-pilot/pilot – optimize progress

How can a team collaborate well?

This talk is for you if you…

You work in a team, but...

Your team doesn’t feel like a team

XP:Collective code ownership

Pair programmingWhole team

Sustainable pace

Defining pair programming

Two people working on the same files

Who has tried pair programming?

Positive experiences

Negative experiences

Why no more?

After this talk

Commit to try

1. A sad team2. A super team3. Getting to great

Part I

The sad team

Planning

The sad team

JohannesJohannes

Backend dev

“Scrum” “Master”

Johannes: You’ll create CRUD SOAP service for projects

with applications

Okay

Planning

The sad team

JohannesJohannes

Backend dev

“Scrum” “Master”

How long will it take?

Um…

Planning

Backend dev 2

The sad team

JohannesJohannes

Backend dev

“Scrum” “Master”

It’s pretty easy with Hibernate

Okay, 8 hours for each of Create…

then

!

Stand-up

The sad team

Designer

Frontend devDatabase dev

Today, I will work on Create Project

JohannesJohannes

Backend dev

Scrum master

Stand-up

The sad team

Designer

Frontend devDatabase dev

No impediments

JohannesJohannes

Backend dev

Scrum master

Behold – the uber coder

The sad team

Exception!

The sad team

org.hibernate.PropertyValueException: not-null property references a null or transient value: ....common.entities.Application._applicationsBackref org.hibernate.engine.Nullability.checkNullability(Nullability.java:95) org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313) org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

Stand-up

The sad team

Designer

Frontend devDatabase dev

Yesterday, I worked on Create Project

JohannesJohannes

Backend dev

Scrum master

Stand-up

The sad team

Today, I will hopefully fix the

exception and also do Delete Project

JohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

Stand-up

The sad team

No impediments

JohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

Stand-up

The sad teamJohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

How could they help anway

The sad team

Behold – the uber coder

The sad team

The sad team

Stand-up

The sad teamJohannesJohannesScrum master

Yesterday, I finally finished Delete after 3 days of «coding»

Designer

Frontend devDatabase dev

Backend dev

I didn’t need the Delete service

Stand-up

The sad teamJohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

I didn’t need the Delete service

Yesterday, I finally finished Delete after 3 days of «coding»

The sad team

STOP

Imagine you should carry 10 wooden beams

Each is 3 meters and 30 kg

Part II

The fun team

Stand-up

The fun team

I’m ready for a new task.What’s on the board..

JohannesJohannes

Johannes

Stand-up

«Basic submit leave request»

JohannesJohannes

Johannes

The fun team

Stand-up

Hiran

Johannes We haven’t worked together yet this week

The fun team

The fun team

Exception!

The sad team

org.hibernate.PropertyValueException: not-null property references a null or transient value: ....common.entities.Application._applicationsBackref org.hibernate.engine.Nullability.checkNullability(Nullability.java:95) org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:313) org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)

That link doesn’t really seem relevant. Are we getting anywhere?

Time to ask for help?

I think Manoj has worked on this sort of thing before

The fun team

Manoj

Yeah, just look at the Person mapping file

The fun team

That’s it!High five!

The fun team

The difference

Everyone works everywhere

Everyone works everywhere

You get help with tech you don’t know

Everyone works everywhereYou’re not blocked

Everyone works everywhere

Integration becomes easier

Knowledge spreads

You don’t get stuck

You don’t get stuckWrong path is stopped by pair

You don’t get stuckSilly mistakes spotted by pair

You don’t get stuckSilly mistakes spotted by pair

Your job as a pair

“Are we focusing on the goal”

“Did you notice …?”

“Is there a better way?”

“Are we working as the team agreed?”

Part II

Superfyingwith

Pair programming

Make sharing into a goal

Dileepa

Johannes

Chintaka

Thomas

Sergey

Arunas

Who is acting worst?

Dileepa

Johannes

Chintaka Sergey

Arunas

Thomas

Who is acting best?

Dileepa

Johannes

Chintaka

Thomas

Sergey

Arunas

Arunas Johannes Dileepa Chinthaka Sergey Thomas

Add new company✓ ✓ ✓ ✓ ✓

Display contacts on map ✓ ✓ ✓

Filter contacts in list✓ ✓

Authenticate user by company ✓ ✓ ✓ ✓

Store password securely ✓ ✓

Usernames with Norwegian letters are rejected

✓Which task is

suspicious?

Arunas Johannes Dileepa Chinthaka Sergey Thomas

Add new company✓ ✓ ✓ ✓ ✓

Display contacts on map ✓ ✓ ✓

Filter contacts in list✓ ✓

Authenticate user by company ✓ ✓ ✓ ✓

Store password securely ✓ ✓

Usernames with Norwegian letters are rejected

Which team member is

helping most?

Arunas Johannes Dileepa Chinthaka Sergey Thomas

Add new company✓ ✓ ✓ ✓ ✓

Display contacts on map ✓ ✓ ✓

Filter contacts in list✓ ✓

Authenticate user by company ✓ ✓ ✓ ✓

Store password securely ✓ ✓

Usernames with Norwegian letters are rejected

Task assignment

TODO DOING DONE

Hiran Johannes

SankalpaWaruni

Milina

JohannesHiran

HiranHiran

Waruni

Johannes

Waruni

Milina

Sankalpa

Johannes

Waruni

Waruni

Milina

Sankalpa

Sankalpa

HiranHiran

Milina

Sankalpa

TODO DOING DONE

WAITING

AWAY

TODO DOING DONE

WAITING

AWAY

TODO DOING DONE

WAITING

AWAY

TODO DOING DONE

WAITING

AWAY

TODO DOING DONE

WAITING

AWAY

TODO DOING DONE

WAITING

AWAYOne avatar per brainOne assigned task per

brainNever mind JIRA

You will get more done

(But not next sprint)

PS: It’s not only for developers

Getting there

Practice with kata

Failing test

Write code

Failing test

Write code

Failing test

Refactor code and tests

Refactor code and tests

Ping-pong

Fun events

Try an experiment

Try an experimentPair 2 hours per day for a

week

Expect exhaustion

Expect exhaustionFor the first month

Conclusion

What

• Two people at one codebase• No member owns a task

beyond the day• Team rotates pairing

Why

• Working solo limits your vision of the code base and the problem

• Less Overproduction (unused functions in API)• Less Waiting (for the only person who knows X)• Less Motion (as everyone gets more skilled)• Fewer Defects (as two pair of eyes see better)• Less Over-processing (from double responsibility)• Less Inventory (as team works more focused)• Less Transportation (handoffs inside a story)

How

• Create a pair programming circle

• Practice pairing• Commit to pairing 2 hours

per day for a week

Do you accept the challenge?

Pair for 2 hours per day for a week

Your job as a pair

• “Are we focusing on the goal?”• “Did you notice …?”• “Is there a better way?”• “Are we working in the way the team

agreed?”

Tools and tricks

• Pair programming circle• Knowledge matrix• Floating assignments

• Expect exhaustion

jbr@exilesoft.com

http://JohannesBrodwall.comhttp://exilesoft.com

http://twitter.com/jhannes

Thank you

I want your feedback:

How likely are you to recommend this session to a co-worker on a scale from 1 (lowest) to 10 (highest)?

Optional: What's the reason for your number?