Remote Pair Programming (Agile India)
Upcoming SlideShare
Loading in...5
×
 

Remote Pair Programming (Agile India)

on

  • 679 views

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

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

Statistics

Views

Total Views
679
Views on SlideShare
675
Embed Views
4

Actions

Likes
1
Downloads
10
Comments
1

2 Embeds 4

http://present.agileindia.org 3
http://www.linkedin.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Great presentation, Johannes!
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Remote Pair Programming (Agile India) Remote Pair Programming (Agile India) Presentation Transcript

    • 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 “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 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.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)
    • 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 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 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 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 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
    • • • • 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 session 5. Call up your friend
    • 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 (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 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