Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Remote Pair
Programming
Agile India 2014
Johannes Brodwall
Exilesoft Chief scientist
@jhannes
How can a distributed team
still collaborate

closely?
team
collaborate well?
How can a
But first
But first – a
competition:
Competition:
Find the blue sentence
This talk is a talk
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 you
will…
Be motivated to start using pair
programming, possibly remotely
Have seen remote pair
programming
Know how to get started
Who is using pair
programming as their
preferred approach?
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
“Mast...
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...
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.entiti...
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
Joha...
Stand-up

No impediments
Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Stand-up
How could
they help
anyway

Backend dev

Database dev

Scrum master
Johannes

Designer

Frontend dev
Behold – the uber
coder
Exception!
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is
org.hiberna...
Stand-up
Yesterday, I finally
finished Delete after
3 days of «coding»

I didn’t need the
Delete service

Backend dev

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

I didn’t need the
Delete service

Backend dev

Dat...
STOP
Imagine you should carry
10 pieces of timber
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 tog...
Exception!
org.hibernate.PropertyValueException: not-null property references a null or transient value:
....common.entiti...
That link doesn’t really
seem relevant.

Are we getting anywhere?
Time to ask for help?
I think Niluka has worked
on this sort of thing before
Yeah, just look at the
Person HasMany Roles
mapping

Niluka
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
Niruka Ruhunage)
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...
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

✓

✓

✓

Authen...
Arunas

Add new company

✓

Display contacts on
map

✓

Dileepa

✓

Chinthaka

✓

Store password
securely

✓

✓

✓

Authen...
Arunas

Add new company

✓

Display contacts on
map

✓

Dileepa

✓

Chinthaka

✓

Store password
securely

✓

✓

✓

Authen...
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
•
•
•

See each other
Share what we see
Share our work
•
•
•

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?”
Expect exhaustion
When
Bug fix
Training event
Practice with kata
1.
2.
3.
4.

Create a dropbox account
Share a folder with a friend
Put a coding project there
Create a screen share
sessio...
Failing test
Write code
Refactor code
and tests

Failing test
Write code
Refactor code
and tests
Failing test
Set a time per week
Don’t wait to find
the perfect tool
Just do it
Conclusion
What
•
•
•

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

Less Overproduction (unused functions in API)
Less Waiting (for the only person who knows X)
Less Motion (a...
How
•

•
•

Ask for help – don’t work
alone
Play with 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
Next week: Commit
to two hours of
working together
Thank you
jbr@exilesoft.com
nru@exilesoft.com

http://JohannesBrodwall.com
http://exilesoft.com
http://twitter.com/jhannes
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Remote Pair Programming (Agile India)
Upcoming SlideShare
Loading in …5
×

Remote Pair Programming (Agile India)

1,212 views

Published on

My talk on Superfying your team with (remote) pair programming at #AgileIndia2014 with Niruka Ruhunage

Published in: Technology

Remote Pair Programming (Agile India)

  1. 1. Remote Pair Programming Agile India 2014 Johannes Brodwall Exilesoft Chief scientist @jhannes
  2. 2. How can a distributed team still collaborate closely?
  3. 3. team collaborate well? How can a
  4. 4. But first
  5. 5. But first – a competition:
  6. 6. Competition: Find the blue sentence
  7. 7. This talk is a talk for you if you…
  8. 8. You work in a team, but...
  9. 9. Your team doesn’t feel like a team
  10. 10. Your distributed team doesn’t feel like a team
  11. 11. After this talk you will…
  12. 12. Be motivated to start using pair programming, possibly remotely
  13. 13. Have seen remote pair programming
  14. 14. Know how to get started
  15. 15. Who is using pair programming as their preferred approach?
  16. 16. 1. What is a super team 2. Building a super team with pairing 3. Getting the benefits 4. Summary
  17. 17. Part I
  18. 18. What is a super team?
  19. 19. Sharing the burden
  20. 20. Rabbit hole!
  21. 21. Shared context
  22. 22. Sharing experience
  23. 23. Whops! No!
  24. 24. Working baseline
  25. 25. “That’s strange…”
  26. 26. “Eureka!”
  27. 27. 20 minutes fix (where 10 was waiting)
  28. 28. Problem solved
  29. 29. The sad team
  30. 30. Planning Johannes: You’ll create CRUD SOAP service for projects with applications Okay Backend dev “Scrum” Johannes “Master”
  31. 31. Planning How long will it take? Um… Backend dev “Scrum” Johannes “Master”
  32. 32. Planning Backend dev 2 Backend dev “Scrum” Johannes “Master” It’s pretty easy with Hibernate Okay, 8 hours for each of Create… then !
  33. 33. Stand-up Today, I will work on Create Project Backend dev Database dev Scrum master Johannes Designer Frontend dev
  34. 34. Stand-up No impediments Backend dev Database dev Scrum master Johannes Designer Frontend dev
  35. 35. Behold – the uber coder
  36. 36. 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)
  37. 37. Exception Poke Google Deploy Stack overflow Tweak
  38. 38. Exception Poke Google Deploy Stack overflow Tweak
  39. 39. Exception Poke Google Deploy Stack overflow Tweak
  40. 40. Exception Poke Google Deploy Stack overflow Tweak
  41. 41. Stand-up Yesterday, I worked on Create Project Backend dev Database dev Scrum master Johannes Designer Frontend dev
  42. 42. Stand-up Today, I will hopefully fix the exception and also do Delete Project Backend dev Database dev Scrum master Johannes Designer Frontend dev
  43. 43. Stand-up No impediments Backend dev Database dev Scrum master Johannes Designer Frontend dev
  44. 44. Stand-up How could they help anyway Backend dev Database dev Scrum master Johannes Designer Frontend dev
  45. 45. Behold – the uber coder
  46. 46. Exception! org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [Person[id=22]] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:927) at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:844) at javax.servlet.http.HttpServlet.service(HttpServlet.java:653) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:796) at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:152) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:119) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) at filter.NoCacheFilter.doFilter(NoCacheFilter.java:102) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  47. 47. 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
  48. 48. 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
  49. 49. STOP
  50. 50. Imagine you should carry 10 pieces of timber Each is 3 meters and 30 kg
  51. 51. The fun team
  52. 52. Stand-up I’m ready for a new task. What’s on the board.. Johannes Scrum master Johannes
  53. 53. Stand-up «Let’s users administrate their projects» Johannes Scrum master Johannes
  54. 54. 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
  55. 55. 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)
  56. 56. That link doesn’t really seem relevant. Are we getting anywhere? Time to ask for help?
  57. 57. I think Niluka has worked on this sort of thing before
  58. 58. Yeah, just look at the Person HasMany Roles mapping Niluka
  59. 59. That’s it! High five!
  60. 60. The difference
  61. 61. Everyone works everywhere Knowledge is disseminated You’re never alone
  62. 62. Part II
  63. 63. Superfying with Pair programming
  64. 64. Pair programming styles
  65. 65. Debate club “No, this variable should be called fooNumber, not fooNum”, “But it’s a common abbreviation”
  66. 66. Dedicated driver “I’ll write the parser” “I’ll design the algorithm”
  67. 67. Driver-navigator “I don’t know how to solve this, so I’ll sit at the keyboard”
  68. 68. Ping-pong
  69. 69. Ingredient #1: Pair programming
  70. 70. Ingredient #2: Test driven development
  71. 71. Failing test Write code Failing test Write code Failing test
  72. 72. Ingredient #3: Refactoring
  73. 73. Failing test Write code Refactor code and tests Failing test Write code Refactor code and tests Failing test
  74. 74. Put together
  75. 75. Failing test Write code Failing test Write code Failing test
  76. 76. Failing test Write code Refactor code and tests Failing test Write code Refactor code and tests Failing test
  77. 77. Failing test Write code Refactor code and tests Failing test Write code Refactor code and tests Failing test
  78. 78. Demonstration (Guest starring Niruka Ruhunage)
  79. 79. Kata: Number to text
  80. 80. Kata: Number to text 8192 => eight thousand one hundred and ninety two 125,017 => one hundred and twenty five thousand and seventeen
  81. 81. What does it feel like?
  82. 82. Part III
  83. 83. From here to there
  84. 84. Make sharing into a goal
  85. 85. Johannes Thomas Chintaka Arunas Dileepa Sergey
  86. 86. Johannes Thomas Chintaka Arunas Dileepa Sergey
  87. 87. 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 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
  88. 88. 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 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
  89. 89. 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 ✓ ✓ ✓ ✓ ✓ ✓ ✓ ✓
  90. 90. Overcoming obstacles
  91. 91. JIRA
  92. 92. With a true team, no member owns more than their current task
  93. 93. TODO DOING WAITING AWAY DONE
  94. 94. You will get more done (But not in the first or second sprint)
  95. 95. Distance
  96. 96. • • • See each other Share what we see Share our work
  97. 97. • • • Skype (or any voice sharing) GoToMeeting (or flexible screen sharing) Dropbox (or any file sharing)
  98. 98. Skill and tact
  99. 99. • Experiment with switching patterns • Try out ping-pong • “Could we try it this way first?”
  100. 100. Expect exhaustion
  101. 101. When
  102. 102. Bug fix
  103. 103. Training event
  104. 104. Practice with kata
  105. 105. 1. 2. 3. 4. Create a dropbox account Share a folder with a friend Put a coding project there Create a screen share session 5. Call up your friend
  106. 106. Failing test Write code Refactor code and tests Failing test Write code Refactor code and tests Failing test
  107. 107. Set a time per week
  108. 108. Don’t wait to find the perfect tool
  109. 109. Just do it
  110. 110. Conclusion
  111. 111. What
  112. 112. • • • Two people at one codebase No member owns a task beyond the day Team rotates pairing
  113. 113. Why
  114. 114. • • • • • • • 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)
  115. 115. How
  116. 116. • • • Ask for help – don’t work alone Play with ping pong programming for two hours Be open, share and listen
  117. 117. Competition: What was the blue sentence?
  118. 118. A team creates together what no member could do alone
  119. 119. Next week: Commit to two hours of working together
  120. 120. Thank you jbr@exilesoft.com nru@exilesoft.com http://JohannesBrodwall.com http://exilesoft.com http://twitter.com/jhannes

×