Remote pair programming (BuildStuffLt)

Preview:

DESCRIPTION

Using pair programming can transform your team from a sad team to a fun team. It even works in a remote context.

Citation preview

Remote Pair Programming

BuildStuff.ltJohannes Brodwall

Exilesoft Chief scientist

@jhannesGuest starring:

Dileepa Jayasuriya

How can a distributed team

still collaborateclosely?

How can a team collaborate well?

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 team2. Building a super team

with pairing3. Getting the benefits4. Summary

Part I

What is a super team?

Sharing the burden

The fun remote team

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

The sad team

JohannesJohannes

Backend dev

“Scrum” “Master”

Johannes: You’ll create CRUD SOAP service for projects

with applications

Okay

Planning

The sad team

JohannesJohannes

Backend dev

“Scrum” “Master”

How long will it take?

Um…

Planning

Backend dev 2

The sad team

JohannesJohannes

Backend dev

“Scrum” “Master”

It’s pretty easy with Hibernate

Okay, 8 hours for each of Create…

then

!

Stand-up

The sad team

Designer

Frontend devDatabase dev

Today, I will work on Create Project

JohannesJohannes

Backend dev

Scrum master

Stand-up

The sad team

Designer

Frontend devDatabase dev

No impediments

JohannesJohannes

Backend dev

Scrum master

Behold – the uber coder

The sad team

Exception!

The sad team

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(DefaultSaveOrUpdateEventListener.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)

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

The sad team

Exception

Google

Stack overflow

Tweak

Deploy

Poke

Stand-up

The sad team

Designer

Frontend devDatabase dev

Yesterday, I worked on Create Project

JohannesJohannes

Backend dev

Scrum master

Stand-up

The sad team

Today, I will hopefully fix the

exception and also do Delete Project

JohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

Stand-up

The sad team

No impediments

JohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

Stand-up

The sad teamJohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

How could they help anway

The sad team

Behold – the uber coder

The sad team

The sad team

Stand-up

The sad teamJohannesJohannesScrum master

Yesterday, I finally finished Delete after 3 days of «coding»

Designer

Frontend devDatabase dev

Backend dev

I didn’t need the Delete service

Stand-up

The sad teamJohannesJohannesScrum master

Designer

Frontend devDatabase dev

Backend dev

I didn’t need the Delete service

Yesterday, I finally finished Delete after 3 days of «coding»

The sad team

STOP

Imagine you should carry 10 wooden beams

Each is 3 meters and 30 kg

The fun team

Stand-up

The sad team

I’m ready for a new task.What’s on the board..

JohannesJohannes

Johannes

Scrum master

Stand-up

The sad team

«Let’s users administrate their projects»

JohannesJohannes

Johannes

Scrum master

Stand-up

The sad team

I haven’t done any Hibernate tasks before.

Who can I pair with?

JohannesJohannes

Johannes

Scrum master

I can work together with you

Exception!

The sad team

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(DefaultSaveOrUpdateEventListener.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

Dileepa

Yeah, just look at the Person HasMany Roles

mapping

That’s it!High five!

The difference

Everyone works everywhere

Knowledge is disseminated

You’re never alone

Part II

Superfyingwith

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

Failing test

Write code

Failing test

Refactor code and tests

Refactor code and tests

Put together

Failing test

Write code

Failing test

Write code

Failing test

Failing test

Write code

Failing test

Write code

Failing test

Refactor code and tests

Refactor code and tests

Failing test

Write code

Failing test

Write code

Failing test

Refactor code and tests

Refactor code and tests

Demonstration(Guest starring

Dileepa Jayasuriya)

Kata: Number to text

Kata: Number to text8192 => 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

Dileepa

Johannes

Chintaka

Thomas

Sergey

Arunas

Dileepa

Johannes

Chintaka

Thomas

Sergey

Arunas

Arunas Johannes Dileepa Chinthaka Sergey Thomas

Add new company✓ ✓ ✓ ✓ ✓

Display contacts on map ✓ ✓ ✓

Filter contacts in list✓ ✓

Authenticate user by company ✓ ✓ ✓ ✓

Store password securely ✓ ✓

Usernames with Norwegian letters are rejected

Arunas Johannes Dileepa Chinthaka Sergey Thomas

Add new company✓ ✓ ✓ ✓ ✓

Display contacts on map ✓ ✓ ✓

Filter contacts in list✓ ✓

Authenticate user by company ✓ ✓ ✓ ✓

Store password securely ✓ ✓

Usernames with Norwegian letters are rejected

Arunas Johannes Dileepa Chinthaka Sergey Thomas

Add new company✓ ✓ ✓ ✓ ✓

Display contacts on map ✓ ✓ ✓

Filter contacts in list✓ ✓

Authenticate user by company ✓ ✓ ✓ ✓

Store password securely ✓ ✓

Usernames with Norwegian letters are rejected

Overcoming obstacles

JIRA

With a true team, no member owns more

than their current task

TODO DOING DONE

WAITING

AWAY

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

jbr@exilesoft.com

djy@exilesoft.com

http://JohannesBrodwall.comhttp://exilesoft.com

http://twitter.com/jhannes

Thank you

Recommended