KEMBAR78
Remote pair programming (BuildStuffLt) | PPTX
Remote Pair
Programming
BuildStuff.lt
Johannes Brodwall
Exilesoft Chief scientist
@jhannes
How can a distributed team
still collaborate

closely?
team
collaborate well?
How can a
This talk is for you if
you…
You work in a team, but...
Your team doesn’t
feel like a team
Your distributed team doesn’t
feel like a team
After this talk
Three things to become a super
productive team
But first
But first – a
competition:
Competition:
Find the blue sentence
1. What is a super team
2. Building a super
team with pairing
3. Getting the benefits
4. Summary
Part I
What is a super
team?
Sharing the burden
Rabbit
hole!
Shared
context
Sharing
experience
Whops!
No!
Working
baseline
“That’s
strange…”
“Eureka!”
20 minutes fix
(where 10 was
waiting)
Problem
solved
The sad team
Planning
Johannes: You’ll
create CRUD SOAP
service for projects
with applications
Okay
Backend dev

“Scrum”
Johannes
“Master”
Planning
How long will it take?

Um…
Backend dev

“Scrum”
Johannes
“Master”
Planning
Backend dev
2

Backend dev

“Scrum”
Johannes
“Master”

It’s pretty
easy with
Hibernate

Okay, 8 hours for
each of Create…
then

!
Stand-up
Today, I will work on
Create Project

Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Stand-up

No impediments
Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Behold – the uber
coder
Exception!
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(DefaultSaveOrUpdateEvent
Listener.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)
Exception
Poke

Google

Deploy

Stack
overflow
Tweak
Exception
Poke

Google

Deploy

Stack
overflow
Tweak
Exception
Poke

Google

Deploy

Stack
overflow
Tweak
Exception
Poke

Google

Deploy

Stack
overflow
Tweak
Stand-up
Yesterday, I worked
on Create Project

Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Stand-up
Today, I will
hopefully fix the
exception and also
do Delete Project
Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Stand-up

No impediments
Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Stand-up
How could
they help
anway

Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Behold – the uber
coder
Stand-up
Yesterday, I finally
finished Delete after
3 days of «coding»

I didn’t need the
Delete service

Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Stand-up
Yesterday, I finally
finished Delete after
3 days of «coding»

I didn’t need the
Delete service

Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
STOP
Imagine you should
carry 10 wooden beams
Each is 3 meters and 30
kg
The fun team
Stand-up
I’m ready for a new task.
What’s on the board..

Johannes

Scrum master
Johannes
Stand-up

«Let’s users administrate
their projects»
Johannes

Scrum master
Johannes
Stand-up

I haven’t done any
Hibernate tasks before.
Who can I pair with?

Scrum master
Johannes

Johannes

I can work together
with you
Exception!
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(DefaultSaveOrUpdateEvent
Listener.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 Dileepa has
worked on this sort of
thing before
Yeah, just look at the
Person HasMany Roles
mapping

Dileepa
That’s it!
High five!
The difference
Everyone works everywhere
Knowledge is disseminated
You’re never alone
Part II
Superfying
with
Pair programming
Pair programming
styles
Debate club
“No, this variable should be called
fooNumber, not fooNum”,
“But it’s a common abbreviation”
Dedicated driver
“I’ll write the parser”
“I’ll design the algorithm”
Driver-navigator
“I don’t know how to solve this, so
I’ll sit at the keyboard”
Ping-pong
Ingredient #1:
Pair programming
Ingredient #2:
Test driven
development
Failing test
Write code

Failing test
Write code
Failing test
Ingredient #3:
Refactoring
Failing test
Write code
Refactor code
and tests
Failing test
Write code
Refactor code
and tests
Failing test
Put together
Failing test
Write code
Failing test
Write code

Failing test
Failing test
Write code
Refactor code
and tests

Failing test
Write code
Refactor code
and tests
Failing test
Failing test
Write code
Refactor code
and tests

Failing test
Write code
Refactor code
and tests
Failing test
Demonstration
(Guest starring
Dileepa Jayasuriya)
Kata: Number to text
Kata: Number to text
8192 => eight thousand one hundred and ninety two
125,017 =>
one hundred and twenty five thousand and seventeen
What does it feel
like?
Part III
From here to there
Make sharing into a
goal
Johannes

Thomas
Chintaka

Arunas
Dileepa
Sergey
Johannes

Thomas
Chintaka

Arunas
Dileepa
Sergey
Arunas

Add new company

✓

Display contacts on
map

✓

Dileepa

✓

Chinthaka

✓

Store password
securely

✓

✓

✓

Authenticate user by
company

Sergey

✓

✓

Filter contacts in list

Usernames with
Norwegian letters are
rejected

Johannes

Thomas

✓

✓
✓

✓

✓

✓
✓

✓
Arunas

Add new company

✓

Display contacts on
map

✓

Dileepa

✓

Chinthaka

✓

Store password
securely

✓

✓

✓

Authenticate user by
company

Sergey

✓

✓

Filter contacts in list

Usernames with
Norwegian letters are
rejected

Johannes

Thomas

✓

✓
✓

✓

✓

✓
✓

✓
Arunas

Add new company

✓

Display contacts on
map

✓

Dileepa

✓

Chinthaka

✓

Store password
securely

✓

✓

✓

Authenticate user by
company

Sergey

✓

✓

Filter contacts in list

Usernames with
Norwegian letters are
rejected

Johannes

Thomas

✓

✓
✓

✓

✓

✓
✓

✓
Overcoming
obstacles
JIRA
With a true team, no
member owns more
than their current task
TODO

DOING

WAITING

AWAY

DONE
You will get more done
(But not in the first or
second sprint)
Distance
•
•
•

Skype (or any voice sharing)
GoToMeeting (or flexible screen
sharing)
Dropbox (or any file sharing)
Skill and tact
• Experiment with switching
patterns
• Try out ping-pong
• “Could we try it this way
first?”
Building your skills
Fun events
Expect exhaustion
Just do it
• Ask for help
• Don’t wait for
•
•

Perfect tool
Perfect oppunity
Conclusion
What
•
•
•

Two people at one codebase
No member owns a task
beyond the day
Team rotates pairing
Why
•

“Rockstar programmer”
model doesn’t scale
•
•
•
•
•
•
•

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
•

•
•

Ask for help – don’t work
alone
Try ping pong programming
for two hours
Be open, share and listen
Competition:
What was the blue sentence?
A team creates
together what no
member could do
alone
You can start as
soon as you get
back to work
Thank you
jbr@exilesoft.com
djy@exilesoft.com

http://JohannesBrodwall.com
http://exilesoft.com
http://twitter.com/jhannes

Remote pair programming (BuildStuffLt)