+ All Categories
Home > Documents > Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical...

Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical...

Date post: 28-Jun-2020
Category:
Upload: others
View: 1 times
Download: 0 times
Share this document with a friend
128
Business Pressure Stop Getting CRUSHED by Janelle Klein [email protected] @janellekz
Transcript
Page 1: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Business Pressure

Stop Getting CRUSHED by

Janelle [email protected] @janellekz

Page 2: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

How do we break down the wall of ignorance?

This is a HARD Problem.

Focus of this Talk:

Page 3: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

My Goals:

How do we repair our relationship with management?

How do we convince management to give us time to work on improvements?

How do we get our team on board with measuring their PAIN?

Page 4: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

We Start with the Best of Intentions

High Quality Code

Low Technical Debt

Easy to Maintain

Good Code Coverage

Page 5: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Then This Happens!

Page 6: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Driving to the Edge of Chaos

Difficulty of Work Increases

Edge of Chaos Human

Limitations

PAIN

Page 7: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Product Owner: “We’ve got more important things to do.”

Deferring Problems

Driving to the Edge of Chaos

Edge of Chaos Human

Limitations

Difficulty of Work Increases

PAIN

Page 8: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Manager: “Good job everyone! Keep up that great work ethic!”

Driving to the Edge of Chaos

Painful Releases

Edge of Chaos Human

Limitations

Difficulty of Work Increases

PAIN

Page 9: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Manager: “We need to go faster! Let’s hire more developers.”

Driving to the Edge of Chaos

Thrashing

Edge of Chaos Human

Limitations

Difficulty of Work Increases

PAIN

Page 10: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Developer: “I give up. I don’t care anymore if the project fails.”

Project Meltdown

Driving to the Edge of Chaos

Edge of Chaos Human

Limitations

Difficulty of Work Increases

PAIN

Page 11: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Across Our Industry

Every few years we rewrite our software…

Start%Over%

Unmaintainable%So0ware%

Page 12: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Our “Solution”

Culture of Hopelessness

Page 13: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Biggest Cause of FAILURE

Across our Industry

No VisibilityControl

Visibility No Control

Page 14: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

RESET

“A description of the goal is not a strategy.”

-- Richard P. Rumelt

What’s wrong with our current strategy?

Page 15: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Our “Strategy” for Success

High Quality Code

Low Technical Debt

Easy to Maintain

Good Code Coverage

Page 16: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

RESET“A good strategy is a specific and coherent response to—and approach for overcoming—the obstacles to progress.”

-- Richard P. Rumelt

The problem is we don’t have a strategy...

Page 17: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 1: Management doesn’t care about interest payments.

Obstacle 2: Management would rather you shut up and do your job.

Obstacle 3: The Problem is outside anyone’s control.

Page 18: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 1: Your manager doesn’t care about interest payments.

Obstacle 2: Management would rather you shut up and do your job.

Obstacle 3: The Problem is outside anyone’s control.

Page 19: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“Let’s rewrite the software!”

My new project: “Awesome in Disguise”

I had full control.

Page 20: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Continuous Delivery from day 1.

Page 21: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Then they announced “the plan”

Page 22: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

My project was moved under different management…

Page 23: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Crazy Deadlines

Page 24: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific
Page 25: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Constant Urgency

Compromise Safety for Speed

Page 26: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

Cycle of Chaos High-Risk Decision Habits

Page 27: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

Cycle of Chaos High-Risk Decision Habits

Page 28: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

Cycle of Chaos High-Risk Decision Habits

Page 29: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

Cycle of Chaos High-Risk Decision Habits

Page 30: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

Cycle of Chaos High-Risk Decision Habits

Page 31: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

I Tried to Explain “Technical Debt”

Page 32: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“The project is already behind schedule!!”

Manager said:

“How can you possibly justify working on anything other than the deliverables?!”

So we did what we were told.

Page 33: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Our Solution…

Page 34: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Until we couldn’t take it anymore.

Page 35: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Explained the problem of Technical Debt

Business Coaching

“That doesn’t sound so bad.”

The Response:

??

??

WHAT?!

Page 36: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Loans are a Predictable Financial Tool

Revenue

- Cost

Profit + 10%

Increase Price?

Increase Sales?

Reduce Cost?

What makes investment decisions harder isn’t higher costs, it’s lower predictability.

Investment Strategy

Page 37: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Obstacle 1: Your manager doesn’t care about interest payments.

But… Managers care A LOT about RISK.

The gradual loss of predictability is much scarier than the gradual increase in cost.

Page 38: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 1: Your manager doesn’t care about interest payments.

Obstacle 2: Management would rather you shut up and do your job.

Obstacle 3: The Problem is outside anyone’s control.

Page 39: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 1: Your Manager doesn’t care about interest payments.

Obstacle 2: Your manager would rather you shut up and do your job.

Obstacle 3: The System is setup to fail.

Page 40: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Another new project…

“Don’t ask for permission, ask for forgiveness.”

Page 41: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“Don’t ask for permission, ask for forgiveness.”

Another new project…

Page 42: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Then We Got New Management!

I put together “a plan”…

Page 43: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“What is Janelle trying to pull?! Who does she think she is?!”

Management said (behind my back):

Get Back Inside Your Box! (or else)

Severe Violation of SOCIAL PROTOCOL

Page 44: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

SOCIAL PROTOCOL

Never talk to your manager’s boss about a problem.

Never try to convince your manager to take a different path by getting others to gang up

to override their decisions

If you want to convince your manager to change decisions, it is your responsibility to BRING DATA.

Page 45: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Developers: “We’re going to hit the wall!”

Managers: “I have no choice but to keep going!”

Then I got into Consulting…

Page 46: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Developers

Manager

Consultant

“We’re going to hit the wall!”

Keynote

“We better invest money in this!”

The Consulting World

Page 47: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Job of a Consultant

Why do they need my help?!

Page 48: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

RESET

Consultants Bridge the Divide

Consultant

Keynote

Page 49: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Obstacle 2: Your manager would rather you shut up and do your job.

Follow SOCIAL PROTOCOL

Stay (Mostly) Inside Developer Box

Communicate in Manager-Speak +

Page 50: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 2: Your manager would rather you follow social protocol.

Lesson 3: The system is setup to fail.

Obstacle 1: Your manager doesn’t care about interest payments.

Page 51: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 1: Your manager doesn’t care about interest payments.

Obstacle 2: Your manager would rather you follow social protocol.

Obstacle 3: The system is setup to fail.

Page 52: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Software Development is a Discovery Process

Learn & Adapt

If we don’t have a feedback loop to respond to problems

We will CRASH.

Page 53: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Component

Component

Hub

Hub

Hub

“Human Systems Architecture” is a design problem

Ignorant Leader

The Challenge: Decision-Making is Distributed.

Page 54: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What if our organization was a robot?

Fire x1

Dev Team

Management

Nothing’s happening…

Page 55: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What if our organization was a robot?

Fire x1

Dev Team

Management

Fire x10

Page 56: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Management

Dev Team

Fire x10

What if our organization was a robot?

If the feedback loop is broken, we burn.

Page 57: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Learn & Adapt

Role

Decision(Type(

Required(Knowledge(

Visibility and Decisions Coupled

Visibility and Decisions De-coupled

Role A

Required(Knowledge(

Role B

Decision(Type(

Broken Feedback Loop is Baked into the Design

Page 58: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Manager

Alloca&on(Decisions(

Knowledge(of(Risks(

Risk(Mgmt(Decisions(

Developer

Communication Breakdown

Broken Feedback Loop (Manager Role)

Page 59: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Developer Product Owner

Actual'Risks'

interacts''with'

Actual'Customers'

interacts''with'

Knowledge'of'Customers'

Trade9off'Decisions'

depend'on'depend'on'Knowledge'of'Risks'

Communication Breakdown

Broken Feedback Loop (Product Owner Role)

Page 60: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Now we can steer!!

So#ware(Task(

Mi.gate(the(Risks(

Product(Development(

Product(Work(Queue(

Risk(Mgmt(Work(Queue(

Product(Owner(

Product(Decisions(

Knowledge(of(Customers(

Technical(Risk(Manager(

Risk(Mgmt(Decisions(

Knowledge(of(Risks(

Dev$Team$Capacity$

Manager

Alloca.on(Decisions(

Fix: Refactor the Organizational Architecture

Page 61: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

This is the design that typically emerges when we have:

Trust.

Page 62: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Role

Decision(Type(

Required(Knowledge(

Visibility and Decisions Coupled

Visibility and Decisions De-coupled

Role A

Required(Knowledge(

Role B

Decision(Type(

Obstacle 3: The system is set up to fail.

We’ve got to fix the machine(even though it’s not our responsibility)

Page 63: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What are the obstacles?

Obstacle 1: Management doesn’t care about interest payments.

Obstacle 2: Management would rather you follow social protocol.

Obstacle 3: The system is setup to fail.

Page 64: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

RESET“A good strategy is a specific and coherent response to—and approach for overcoming—the obstacles to progress.”

-- Richard P. Rumelt

Page 65: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Obstacle 1: Management doesn’t care about interest payments.

Obstacle 2: Management would rather you follow social protocol.

Obstacle 3: The system is setup to fail.

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 66: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 67: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

How to Measure the PAIN in Software Development

Janelle Klein

leanpub.com/ideaflow

Open Standard for Measuring “PAIN”

Page 68: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

PAIN occurs during the process of understanding and extending the software

Complex(So*ware(

PAIN

Not the Code.

Optimize “Idea Flow”

Page 69: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Unexpected Behavior

Problem Resolved

Measure Painful Experience with the Code

Troubleshooting

Progress

5 hours and 18 minutes of troubleshooting...

PAINFUL

Page 70: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“What caused the pain in this case?”

Categorize the Problems with #HashTags

#ReportingEngine

#Hibernate

#MergeHell

Page 71: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

1. Problem A

2. Problem B

3. Problem C

Add up the Pain by Category

What’s the biggest problem to solve?

Page 72: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

OSS “Idea Flow Mapping” Tools

github.com/openmastery/tools

Subtask

Page 73: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Troubleshooting

Progress

Learning

7:070:00

0:00 19:52

12 year old project after all original developers left.

Case Study: Huge Mess with Great Team

70-90% of dev capacity on “friction”

Page 74: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Team’s Improvement Focus: Increasing unit test coverage by 5%

Case Study: Huge Mess with Great Team

“What are the specific problems that are causing the team’s pain?”

Page 75: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Add up the Pain by Category

1. Test Data Generation

2. Merging Problems

3. Repairing Tests

1000 hours/month

The Biggest Problem: ~700 hours/month generating test data

Page 76: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

This is SURPRISINGLY EASY to do:

Spend tons of time working on improvements, but our improvements don’t make much difference.How to Avoid This @5pm:

Top 5 Reasons Why Improvement Efforts FAIL

Page 77: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

18 months after a Micro-Services/Continuous Delivery rewrite.

Troubleshooting

Progress

Learning40-60% of dev capacity on “friction”

0:00 28:15

12:230:00

Case Study: From Monolith to Microservices

Page 78: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Architecture Looks SOOO Good on Paper!

Team A Team B Team C

Complexity Moved HereWTF?! WTF?!

Page 79: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

They had this problem:

Page 80: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

Which led to this problem…

Page 81: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Edge of Chaos Human

Limitations

Deferring Problems

Painful Releases

Thrashing

Project Meltdown

Driving to the Edge of Chaos

Difficulty of Work Increases

PAIN

Page 82: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Long-Term Costs of Chaos

0%

100%

Release 1 Release 2 Release 3

Troubleshooting

Progress

Learning

Percentage Capacity spent on Troubleshooting (red) and Learning (blue)

(extrapolated from samples)

Page 83: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

0%

100%

Release 1 Release 2 Release 3

Percentage Capacity spent on Troubleshooting (red) and Learning (blue)

Figure out what to do Learning is front-loaded

Troubleshooting

Progress

Learning

The Long-Term Costs of Chaos

Page 84: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

0%

100%

Release 1 Release 2 Release 3

Percentage Capacity spent on Troubleshooting (red) and Learning (blue)

Rush Before the Deadline Validation is Deferred

Troubleshooting

Progress

Learning

The Long-Term Costs of Chaos

Page 85: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

0%

100%

Release 1 Release 2 Release 3

Percentage Capacity spent on Troubleshooting (red) and Learning (blue)

Pain Builds Baseline friction keeps rising

Troubleshooting

Progress

Learning

The Long-Term Costs of Chaos

Page 86: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

0%

100%

Release 1 Release 2 Release 3

Percentage Capacity spent on Troubleshooting (red) and Learning (blue)

Chaos Reigns Unpredictable work stops

fitting in the timebox

Troubleshooting

Progress

Learning

The Long-Term Costs of Chaos

Page 87: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The cost of bad architecture decisions in the microservices world are EXTREMELY HIGH.

Visibility gives us a way to make the case for architecture changes

Page 88: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Challenge:

How do I get my team to collect data??

Page 89: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Would you be willing to collect data if you knew your management would give you

dedicated time to work on the biggest problems?

Page 90: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

1. Don’t ask for Permission

2. State your Goal "I want to make the business case to management for fixing things around here. No more chaos and working on weekends, this needs to stop. But I need data to make the case so I need everyone's help."

3. State the Plan "Here's what I'm thinking. I want to run an experiment to record data for one month on all the time we spend troubleshooting. We can look at the data together and identify our biggest problems, then I’ll write it up and present the case to management to get things fixed.”

4. Enlist the Team “Will you guys help me make this happen?”

Here’s What You Do:

Page 91: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

1. Don’t ask for Permission

2. Make the Goal Clear to Your Team "I want to make the business case to management for fixing things around here. No more chaos and working on weekends, this needs to stop. But I need data to make the case so I need everyone's help."

3. State the Plan "Here's what I'm thinking. I want to run an experiment to record data for one month on all the time we spend troubleshooting. We can look at the data together and identify our biggest problems, then I’ll write it up and present the case to management to get things fixed.”

4. Enlist the Team “Will you guys help me make this happen?”

Here’s What You Do:

Page 92: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

1. Don’t ask for Permission

2. Make the Goal Clear to Your Team "I want to make the business case to management for fixing things around here. No more chaos and working on weekends, this needs to stop. But I need data to make the case so I need everyone's help."

3. Take Responsibility "Here's what I'm thinking. I want to run an experiment to record data for one month on all the time we spend troubleshooting. We can look at the data together and identify our biggest problems, then I’ll write it up and present the case to management to get things fixed.”

4. Enlist the Team “Will you guys help me make this happen?”

Here’s What You Do:

Page 93: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

1. Don’t ask for Permission

2. Make the Goal Clear to Your Team "I want to make the business case to management for fixing things around here. No more chaos and working on weekends, this needs to stop. But I need data to make the case so I need everyone's help."

3. Take Responsibility "Here's what I'm thinking. I want to run an experiment to record data for one month on all the time we spend troubleshooting. We can look at the data together and identify our biggest problems, then I’ll write it up and present the case to management to get things fixed.”

4. Enlist the Team “Will you guys help me make this happen?”

Here’s What You Do:

Page 94: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 95: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 96: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

The Constraints

Stay (Mostly) Inside Developer Box

Communicate in Manager-Speak +

Page 97: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Manager

Alloca&on(Decisions(

Knowledge(of(Risks(

Risk(Mgmt(Decisions(

Developer

RiskTranslator

Risk(Summary(

Risk Translator Role

Fits Within Developer Box

Page 98: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Your Job is to Repair the Broken Feedback Loop

Risk Translator

Engineering(Execution)

Management(Coordination)

Risk is the bridge language.

Page 99: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Quality Risk (Troubleshooting)

Likelihood)of))Unexpected)Behavior)

Cost)to)Troubleshoot)and)Repair)

High)Frequency)Low)Impact)

Low)Frequency)Low)Impact)

Low)Frequency)High)Impact)

PAIN)

Page 100: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Familiarity Risk (Learning)

Likelihood)of))working)with)Unfamiliar)

Code)

Cost)to)Learn)

High)Frequency)Easy)to)Learn)

Low)Frequency)Easy)to)Learn)

Low)Frequency)Hard)to)Learn)

PAIN)

Page 101: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Assumption Risk (Rework)

Likelihood)of))making)a))

Bad)Assump4on)

Cost)to)Correct)Decisions)

High)Uncertainty)Low)Delay)

Low)Uncertainty)Low)Delay)

Low)Uncertainty)High)Delay)

PAIN)

Page 102: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Decisions that save a few hours

Side-effects that cost several hours

Save 40 hours in direct costs(leave the toy on the stairs)

Increase chances of losing 1000 hours by 20%(tripping and falling)

Explain Problems in Terms of Risk (Gambling)

Page 103: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Distribution of Development Capacity

Over the long-term, probability wins.

Page 104: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Send “Project Visibility Updates”

Hi Larry, I know it’s really hard to stay in the loop on all the different project risks, so I wanted to send you a summarized update of some of our recent findings.

Subject: Project Visibility Update

We started collecting data during development to track where all of our time was going, and made some pretty frightening discoveries.

See attached. Let me know if you’d like to talk.

Page 105: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Risk Translators build

Trustby making sense.

Page 106: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 107: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 108: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Manager

Alloca&on(Decisions(

Knowledge(of(Risks(

Risk(Mgmt(Decisions(

Developer

RiskTranslator

Risk(Summary(

Refactor Step 1: Risk Translator

Page 109: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

So#ware(Task(

Mi.gate(the(Risks(

Product(Development(

Product(Work(Queue(

Risk(Mgmt(Work(Queue(

Product(Owner(

Product(Decisions(

Knowledge(of(Customers(

Dev$Team$Capacity$

Alloca.on(Decisions(

Manager2Translator$Partnership$

Risk(Mgmt(Decisions(

Knowledge(of(Risks(

Refactor Step 2: Partnership

Page 110: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Now we can steer!!

So#ware(Task(

Mi.gate(the(Risks(

Product(Development(

Product(Work(Queue(

Risk(Mgmt(Work(Queue(

Product(Owner(

Product(Decisions(

Knowledge(of(Customers(

Technical(Risk(Manager(

Risk(Mgmt(Decisions(

Knowledge(of(Risks(

Dev$Team$Capacity$

Manager

Alloca.on(Decisions(

Refactor Step 3: Owner

Page 111: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Option 1 Option 2

Stay the Course Change

This is Safer (less risky)

or

Make the Case for Partnership

Page 112: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Keys to Success

Use specific examples then generalize effects.

Don’t negotiate time, explain the risks.

Use consultant +1 effect.

To create action, use lots of RED.

Page 113: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

1. Explain Why You Decided to Collect Data

Saw this talk/read this book about…

(Blame Me)

How to Measure the PAIN in Software Development

Janelle Klein

Page 114: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Time%Pressure%

Compromise%Safety%for%

Speed%

Increase%Number%&%Severity%of%Hazards%

%

More%Pain%and%Higher%Task%Effort%

Constant'Urgency'

“In the book, Janelle talks about this “Cycle of Chaos”…

Page 115: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“As the problems build, they introduce Quality Risk…

Likelihood)of))Unexpected)Behavior)

Cost)to)Troubleshoot)and)Repair)

High)Frequency)Low)Impact)

Low)Frequency)Low)Impact)

Low)Frequency)High)Impact)

PAIN)

Likelihood  of  Mistakes  

Cost  to  Recover  

Quality Risk

Our application is more likely to be in a BROKEN state.

Page 116: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“This can lead to developers spending 50, 70, even 90% of development capacity dealing with chaos.”

0%

100%

Release 1 Release 2 Release 3

Percentage Capacity spent on Troubleshooting (red) and Learning (blue)

Chaos Reigns Over 70% of development

capacity spent dealing with problems

Example Thrashing Project

Page 117: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“We’re measuring the time we spend resolving chaos while we work…

Problems Measured in HOURS.

Page 118: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

2. Here’s What We Found…

Pick your WORST offending examples.

Use lots of RED.

Page 119: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Save time by skipping diagnostic

tools (~80 hours)

Side-effects of Troubleshooting time (~700 hours/month)

36h 25m0:00

Troubleshooting

Progress11 hours and 15 minutes of troubleshooting...

Creating a New Customer Report

“This is a timeline that shows all the time we spend troubleshooting…

Page 120: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Save time by deferring architecture fixes

(~100 hours/month)

Side-effects of Environment Downtime

25% of capacity

“When the problems build up, they have a really big impact…

25 developers down for 2 days

Page 121: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“These are the top 3 problems consuming the majority of the team’s development capacity…

1000 hours/month

1. Test Data Generation

2. Merging Problems

3. Repairing False Alarms

Top Three Problems

Page 122: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“The deadline is coming either way…”

80% of features 100% done?100% of features 80% done?

Page 123: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

“Here’s what we were thinking…”

3-Month Improvement Trial

Dedicated resources (1 or 2 developers)

Dev team identifies highest-leverage improvement opportunities and prioritizes with management

Continue to share Project Visibility Updates each month

“Will you help us turn this project around?”

Page 124: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

So#ware(Task(

Mi.gate(the(Risks(

Product(Development(

Product(Work(Queue(

Risk(Mgmt(Work(Queue(

Product(Owner(

Product(Decisions(

Knowledge(of(Customers(

Technical(Risk(Manager(

Risk(Mgmt(Decisions(

Knowledge(of(Risks(

Dev$Team$Capacity$

Manager

Alloca.on(Decisions(

Refactor Step 3: Owner

Power Move: For a job well done, you get a promotion

Page 125: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Sometimes getting what you want is just a matter of taking responsibility.

Big Takeaway

Page 126: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What’s the Strategy?

Become a Risk Translator Make visibility part of your job.

Refactor the Organization From Translator, to Partner, to Owner.

Measure the Pain Explain the problems with data.

Page 127: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

What do you see as the biggest obstacle to success?

Discussion:

Page 128: Stop Getting CRUSHED - UberConf · Our “Strategy” for Success High Quality Code Low Technical Debt Easy to Maintain Good Code Coverage. RESET “A good strategy is a specific

Janelle Klein

@janellekz

Upcoming Talks:

Top 5 Reasons Why Improvement Efforts Fail

Keynote: A Programmer’s Guide to Humans

Automated Developer Insight — The Next Frontier

[email protected]


Recommended