Remote Pair Programming (Agile India)

988 views
914 views

Published on

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

Published in: Technology
1 Comment
1 Like
Statistics
Notes
No Downloads
Views
Total views
988
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
12
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

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

×