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 applicationsOkay
Planning
The sad team
JohannesJohannes
Backend dev
“Scrum” “Master”
How long will it take?
Um…
PlanningBackend 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
Stack overflow
Tweak
Deploy
Poke
The sad team
Exception
Stack overflow
Tweak
Deploy
Poke
The sad team
Exception
Stack overflow
Tweak
Deploy
Poke
The sad team
Exception
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 beamsEach 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
WaruniMilina
Sankalpa
Johannes
WaruniWaruni
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 testWrite 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
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?