DEVELOPER
How great teams get s%*t done
@svenpet
Sven Peters
DevOps Advocate
JOY
The last
10
years
The Cloud
Container
Microservices
Security &
Governance
You build it,
you run it.
DEVELOPER
COGNITIVE
LOAD
BACK<
Productivity
to
Bethlehem Steel
1898
Bethlehem Steel
Frederick
Winslow Taylor
Bethlehem Steel
Bethlehem Steel
Bethlehem Steel
400%
increase
Workers
only doing repetitive task
Productivity New roles
Managers
doing the thinking
years ago
125
Productivity
T-shirt
sizes
Story
points
Developer
Lines of
code
Issues to
done
Cycle
time
Deployment
frequency
Developer
10% more story points
20% faster pull request reviews
Thank you Taylor
DEVELOPER EXPERIENCE
BACK<
DevJ
to
oy
DEVELOPER JOY
Dev
Progress
Dev
Quality
Dev
Value
TECHNICAL
DEBT
of dev time used for
10%
of dev teams manage
42% TECHNICAL
DEBT
of dev time used for
10%
of dev teams manage
42% TECHNICAL
DEBT
It all starts out
nicely
package com.miguelcatalan.materialsearchview;
import android.app.Activity;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.lang.re
fl
ect.Field;
import java.util.List;
/**
* @author Sven Peters
*/
public class MaterialSearchView extends FrameLayout implements Filter.FilterListener {
private MenuItem mMenuItem;
private boolean mIsSearchOpen = false;
public MaterialSearchView(Context context) {
this(context, null);
}
public MaterialSearchView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mUserQuery = s;
startFilter(s);
MaterialSearchView.this.onTextChanged(s);
}
}
It all starts out
nicely
/**
* Return true if search is open
*
* @return
*/
public boolean isSearchOpen() {
return mIsSearchOpen;
}
/**
* Open Search View. This will animate the showing of the view.
*/
public void showSearch() {
showSearch(true);
}
/**
* Open Search View. if animate is true, Animate the showing of the view.
*
* @param animate
*/
public void showSearch(boolean animate) {
if (isSearchOpen()) {
return;
}
//Request Focus
mSearchSrcTextView.setText(null);
mSearchSrcTextView.requestFocus();
if (animate) {
AnimationUtil.fadeInView(mSearchLayout, AnimationUtil.ANIMATION_DURATION_MEDIUM
@Override
public boolean onAnimationStart(View view) {
return false;
}
/**
* Return true if search is open
*
* @return
*/
public boolean isSearchOpen() {
return mIsSearchOpen;
}
/**
* Open Search View. This will animate the showing of the view.
*/
public void showSearch() {
showSearch(true);
}
/**
* Open Search View. if animate is true, Animate the showing of the view.
*
* @param animate
*/
public void showSearch(boolean animate) {
if (isSearchOpen()) {
return;
}
//Request Focus
mSearchSrcTextView.setText(null);
mSearchSrcTextView.requestFocus();
if (animate) {
AnimationUtil.fadeInView(mSearchLayout, AnimationUtil.ANIMATION_DURATION_MEDIUM
@Override
public boolean onAnimationStart(View view) {
return false;
}
Sometimes it
ends in a mess
}
Your coding guidelines
caught this.
Your coding guidelines
caught this, right?
Team
Class names
Are CamelCase
Prefix private variables with underscore
Private variables
Single Responsibility Principal
A class should have one and only one job
Don’t assemble String with +
Use either .format or % instead
No line longer than 120 characters
Line length
Don’t use line continuations
Break up long lines using parentheses ()
No Tabs
4 spaces are for indention
Are lowercase. The can contain underscores
Variables and function name
Python Coding Guidelines
You’re doing
code reviews.
You’re doing
code reviews, right?
export default function DateTimeSlider({ onChangeCallback, timeZone,
time_min, time_max, autoUpdateSlider }: DateTimeSliderProps) {
const [timeWindow, setTimeWindow] = React.useState<number>(30 * 60)
const [value, setValue] = React.useState<number[]>(
[time_min, time_min + timeWindow],
);
const handleSliderChange = useCallback((
event: Event,
newValue: number | number[],
activeThumb: number) => {
if (!Array.isArray(newValue)) {
return;
}
+ var counter = 5;
+ var factorial = 1;
+ while (counter > 1)
+ factorial *= counter—;
+ const clamped = Math.min(newValue[0], time_max - timeWindow);
+ setValue([clamped, clamped + timeWindow]);
+ }
}, [timeWindow, time_min, time_max]);
const throttledValue = useThrottle<number[]>(value, 200)
WTF @sven?
export default function DateTimeSlider({ onChangeCallback, timeZone,
time_min, time_max, autoUpdateSlider }: DateTimeSliderProps) {
const [timeWindow, setTimeWindow] = React.useState<number>(30 * 60)
const [value, setValue] = React.useState<number[]>(
[time_min, time_min + timeWindow],
);
const handleSliderChange = useCallback((
event: Event,
newValue: number | number[],
activeThumb: number) => {
if (!Array.isArray(newValue)) {
return;
}
+ var counter = 5;
+ var factorial = 1;
+ while (counter > 1)
+ factorial *= counter—;
+ const clamped = Math.min(newValue[0], time_max - timeWindow);
+ setValue([clamped, clamped + timeWindow]);
+ }
}, [timeWindow, time_min, time_max]);
const throttledValue = useThrottle<number[]>(value, 200)
This code is ugly
export default function DateTimeSlider({ onChangeCallback, timeZone,
time_min, time_max, autoUpdateSlider }: DateTimeSliderProps) {
const [timeWindow, setTimeWindow] = React.useState<number>(30 * 60)
const [value, setValue] = React.useState<number[]>(
[time_min, time_min + timeWindow],
);
const handleSliderChange = useCallback((
event: Event,
newValue: number | number[],
activeThumb: number) => {
if (!Array.isArray(newValue)) {
return;
}
+ var counter = 5;
+ var factorial = 1;
+ while (counter > 1)
+ factorial *= counter—;
+ const clamped = Math.min(newValue[0], time_max - timeWindow);
+ setValue([clamped, clamped + timeWindow]);
+ }
}, [timeWindow, time_min, time_max]);
const throttledValue = useThrottle<number[]>(value, 200)
It would be nicer if
you’d use a for loop
Don’t be a jerk.
Who has been bullied by a jerk?
Jerks are the reason
people hate code reviews.
Team
Reviewer Author
ASSUME COMPETENCE
EXPLAIN REASONING
BE CONSTRUCTIVE
NO
BULLYING
DEVELOPER
JOY
Better Reviews
Team
Test
Test
Build & Test
TEST FAILED
Re-run Test
TEST PASSES
Create PR
.skip test
Add comment to PR
Flaky Test
Detector
Flaky Test
FlakeOff
Houston, we have a flaky test
DEBUG
FRUSTRATION
DEVELOPER
JOY
Better Tooling
Dev Flow
Code
Dev Flow
Code Build & Test Deploy
hours to minutes minutes to seconds
Review
Dev Flow
Code Build & Test Deploy
hours to minutes minutes to seconds
Review
days
Team
3 days
average from opening to merge a pull request
3 days
working on something else
and go back.
Open Pull Request
Fixing height of the screen
Open Pull Request
Adding user setting functionality
Open Pull Request
Optimising performance for chrome
@alice
@tom
@alice
@tanja
@mark
Puneet Arora
Team lead
Open Pull Request
Fixing height of the screen
Open Pull Request
Adding user setting functionality
Open Pull Request
Optimising performance for chrome
@alice
@tom
@alice
@tanja
@mark
Puneet Bot
3 days
From
To
1.2 days
WAIT
TIME
DEVELOPER
JOY
Faster Reviews
Flow
Traffic Flow: 191 (vehicles per minute)
Traffic Flow: 235
Traffic Flow: 360
Traffic Flow: 1099
Autonomous
Teams
Feature A
Platform
Feature C
Feature B
Testing
Autonomous Teams Highly Aligned
Designer
Tester
Ops
Developer
Autonomous Teams Highly Aligned
Designer
Tester
Ops
Developer
Developer
Developer
Developer
Team
Devs Exploratory Test
Automated Test A
Q
Devs Exploratory Test
Automated Test A
Q 🍹
Devs
Exploratory Test
Automated Test
Quality
Assistance
A
Q
Feature Test
Strategy
QA Engineer
Test Automation
Platform
Software Engineer on Test
DEVELOPER
COGNITIVE
LOAD
DEVELOPER
JOY
Quality Assistance
What users imagine
What users imagine
User stories
Running
software
Product Developers
Interviews
Research
Measurements
Experiments
Prototypes
Team
Make
Create
Make
Create
Wonder
Problem
Wonder
Problem
Explore
Solution
Make
Create
Impact
Measure
Wonder
Problem
Explore
Solution
Make
Create
Impact
Measure
Developer
Product
Goals, Signals,
Measures
Demos
Prototypes
Project kick off
Wonder Explore Make Impact
Demos
DEMO
OPEN
Everyone can join
OUTCOME
Show customer
value
CELEBRATE
Recognise great
work
GROUP
THINKING
Challenge the
solution
SESSION
REWORK
FRUSTRATION
DEVELOPER
JOY
Involve Everyone
What would
Taylor say?
If you can’t measure it,
you can’t improve it.
Peter Drucker
Time To Restore
Change Failure Rate
Start with DORA
Lead time for changes
Deployment Frequency
Ticket Cycle Time
From idea to deployment
How often do we deploy code to production
Deployment Frequency
Wait Time
Total of build time, deploy time, etc..
Keeping the lights on
Time spend on bugs, infra, etc.
Ratio between successful and failed deploys
Change Failure Rate
Bug resolutions
Critical bugs fixed
Incident Response Time
How fast are we reacting?
What’s the time to bring a service up again
Time to Restore
Important for the team?
Ask your developers
Measurements
& Baselines
The Wallboard
The Wallboard problem
QUALITY
METRICS
Check
Ops
Weekly team ritual
Ask your developers CheckOps
GitHub
Good Day Project
M T T
W F M T T
W F
Activities / day
How good was your day?
Review Deploy
Idea Code
3 days 1 day 3 days 2 days
12 days
Plan
Software development is not a production line
Measure what is important,
don’t make important what
you can measure.
Robert McNamara
Measure & Baseline
Ask your developers
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Measuring
Developer Joy
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Satisfaction
Speed to ship quality code
Waiting time
Execution independence
Access to tools, processes, and practices
Effort managing external standards
Managing code, pipeline, infrastructure
Ramp up time
Developer satisfaction
Importance Satisfaction
Satisfaction
Importance
Ramp up time
Wait time
Speed to ship
Managing code,
tools , pipelines
Access to tools
Execution independence
Managing external standards
Developer satisfaction
How is your
DEVELOPER JOY
bit.ly/developerjoy
?
Try to fix
things
DevEx
hack
20%
time
DevJoy
week
Include in
sprint
Try to fix
things
Spread
learnings
+
Measurements
Survey results
Survey results
Measurements
AUTONOMOUS
TEAMS
AUTONOMOUS
TEAMS
Fix things
AUTONOMOUS
TEAMS
Fix things
Dev
Progress
Dev
Quality
Dev
Value
Fix things
Dev
Progress
Dev
Quality
Dev
Value
DEVELOPER
JOY
Thank
you
DEVELOPER
Don’t forget to have fun.
JOY
Thank
you
bit.ly/developerjoy
@svenpet
DEVELOPER JOY

Developer Joy - How great teams get s%*t done