Extreme Collaboration TODO Good pairings Johannes Brodwall Seniorsenior
Extreme Collaboration TODO: Good pairings: Johannes Brodwall Senior/senior: Ping-pong Respectful senior/senior: Stategist/tactician Exilesoft Chief scientist Junior/junior: Timer Junior/senior: Driver/trainer – optimize @jhannes learning Junior/senior: Co-pilot/pilot – optimize progress
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
XP: Collective code ownership Pair programming Whole 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 team 2. A super team 3. Getting to great
Part I
The sad team
Planning Johannes: You’ll create CRUD SOAP service for projects with applications Okay Backend dev “Scrum” Johannes “Master” m a e t d a s e Th
Planning How long will it take? Um… Backend dev “Scrum” Johannes “Master” m a e t d a s e Th
Planning Backend dev 2 It’s pretty easy with Hibernate Backend dev “Scrum” Johannes “Master” Okay, 8 hours for each of Create… then ! m a e t d a s e Th
Stand-up Today, I will work on Create Project Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
Stand-up No impediments Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
Behold – the uber coder m a e t d a s e Th
Exception! org. hibernate. Property. Value. Exception: not-null property references a null or transient value: . . common. entities. Application. _applications. Backref org. hibernate. engine. Nullability. check. Nullability(Nullability. java: 95) org. hibernate. event. def. Abstract. Save. Event. Listener. perform. Save. Or. Replicate(Abstract. Save. Event. Listener. java: 313) org. hibernate. event. def. Abstract. Save. Event. Listener. perform. Save(Abstract. Save. Event. Listener. java: 204) org. hibernate. event. def. Abstract. Save. Event. Listener. save. With. Generated. Id(Abstract. Save. Event. Listener. java: 130) org. hibernate. event. def. Default. Save. Or. Update. Event. Listener. save. With. Generated. Or. Requested. Id(Default. Save. Or. Update. Event Listener. java: 210) org. hibernate. event. def. Default. Save. Event. Listener. save. With. Generated. Or. Requested. Id(Default. Save. Event. Listener. java: 56) org. hibernate. event. def. Default. Save. Or. Update. Event. Listener. entity. Is. Transient(Default. Save. Or. Update. Event. Listener. java: 195) org. hibernate. event. def. Default. Save. Event. Listener. perform. Save. Or. Update(Default. Save. Event. Listener. java: 50) org. hibernate. event. def. Default. Save. Or. Update. Event. Listener. on. Save. Or. Update(Default. Save. Or. Update. Event. Listener. java: 93) m a e t d a s e Th
Exception Poke Google Deploy Stack overflow Tweak m a e t d a s e Th
Exception Poke Google Deploy Stack overflow Tweak m a e t d a s e Th
Exception Poke Google Deploy Stack overflow Tweak m a e t d a s e Th
Exception Poke Google Deploy Stack overflow Tweak m a e t d a s e Th
Stand-up Yesterday, I worked on Create Project Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
Stand-up Today, I will hopefully fix the exception and also do Delete Project Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
Stand-up No impediments Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
Stand-up How could they help anway Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
m a e t d a s e Th
Behold – the uber coder m a e t d a s e Th
m a e t d a s e Th
Stand-up Yesterday, I finally finished Delete after 3 days of «coding» I didn’t need the Delete service Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
Stand-up Yesterday, I finally finished Delete after 3 days of «coding» I didn’t need the Delete service Backend dev Database dev Designer Frontend dev m a e t d a s e Th Scrum Johannes master
STOP m a e t d a s e Th
Imagine you should carry 10 wooden beams Each is 3 meters and 30 kg
Part II
The fun team
Stand-up I’m ready for a new task. What’s on the board. . Johannes
Stand-up «Basic submit leave request» Johannes
Stand-up Johannes Hiran We haven’t worked together yet this week
Exception! org. hibernate. Property. Value. Exception: not-null property references a null or transient value: . . common. entities. Application. _applications. Backref org. hibernate. engine. Nullability. check. Nullability(Nullability. java: 95) org. hibernate. event. def. Abstract. Save. Event. Listener. perform. Save. Or. Replicate(Abstract. Save. Event. Listener. java: 313) org. hibernate. event. def. Abstract. Save. Event. Listener. perform. Save(Abstract. Save. Event. Listener. java: 204) org. hibernate. event. def. Abstract. Save. Event. Listener. save. With. Generated. Id(Abstract. Save. Event. Listener. java: 130) org. hibernate. event. def. Default. Save. Or. Update. Event. Listener. save. With. Generated. Or. Requested. Id(Default. Save. Or. Update. Event Listener. java: 210) org. hibernate. event. def. Default. Save. Event. Listener. save. With. Generated. Or. Requested. Id(Default. Save. Event. Listener. java: 56) org. hibernate. event. def. Default. Save. Or. Update. Event. Listener. entity. Is. Transient(Default. Save. Or. Update. Event. Listener. java: 195) org. hibernate. event. def. Default. Save. Event. Listener. perform. Save. Or. Update(Default. Save. Event. Listener. java: 50) org. hibernate. event. def. Default. Save. Or. Update. Event. Listener. on. Save. Or. Update(Default. Save. Or. Update. Event. Listener. java: 93) m a e t d a s e Th
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
Yeah, just look at the Person mapping file Manoj
That’s it! High five!
The difference
Everyone works everywhere
Everyone works everywhere You get help with tech you don’t know
Everyone works everywhere You’re not blocked
Everyone works everywhere Integration becomes easier
Knowledge spreads
You don’t get stuck
You don’t get stuck Wrong path is stopped by pair
You don’t get stuck Silly mistakes spotted by pair
You don’t get stuck Silly 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
Superfying with Pair programming
Make sharing into a goal
Johannes Thomas Chintaka Arunas Dileepa Sergey ? t s r o w g n i t Who is ac
Johannes Arunas Dileepa Thomas Chintaka Wh Sergey ? t s e b g n i t c a o is
Johannes Thomas Chintaka Arunas Dileepa Sergey
Arunas Add new company ✓ Display contacts on map Filter contacts in list Authenticate user by company ✓ Store password securely ✓ Usernames with Norwegian letters are rejected Johannes ✓ Dileepa ✓ Chinthaka Sergey ✓ ✓ ✓ s i k s a t h c ? i s h u W o i c i p s u s Thomas ✓ ✓ ✓
Arunas Add new company ✓ Display contacts on map Filter contacts in list Authenticate user by company ✓ Johannes ✓ Dileepa Chinthaka ✓ ✓ ✓ ✓ Sergey ✓ ✓ ✓ s i r e ✓ b m e m m ? Usernames with a t e s t o h Norwegian letters are m c i rejected Wh elping h Store password securely Thomas ✓ ✓ ✓
Arunas Add new company ✓ Display contacts on map Filter contacts in list Authenticate user by company ✓ Store password securely ✓ Usernames with Norwegian letters are rejected Johannes ✓ Dileepa ✓ Chinthaka ✓ ✓ ✓ Sergey Thomas ✓ ✓ ✓
Task assignment
TODO Hiran DOING Johannes Hiran DONE Hiran Johannes Sankalpa Waruni Sankalpa Waruni Milina Waruni Sankalpa Milina Hiran
TODO DOING WAITING AWAY DONE
TODO DOING WAITING AWAY DONE
TODO DOING WAITING AWAY DONE
TODO DOING WAITING AWAY DONE
TODO DOING WAITING AWAY DONE
TODO DOING WAITING A r e p R I k n s i J a a t r d b d e r n e n g p i i r s a s AWAY t a a m v e r in O Onne a. Nevbera DONE
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 Refactor code and tests Failing test
Ping-pong
Fun events
Try an experiment
Try an experiment Pair 2 hours per day for a week
Expect exhaustion
Expect exhaustion For 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
Thank you jbr@exilesoft. com http: //Johannes. Brodwall. com http: //exilesoft. com http: //twitter. com/jhannes
I want your feedback: How likely are you to recommend this session to a coworker on a scale from 1 (lowest) to 10 (highest)? Optional: What's the reason for your number?
- Slides: 107