Kickoff

I didn’t Mean to Break It!

Every time we make an intended change, we have a chance of also making an unintended change. The probability of that unintended change is its risk.

Because these changes are unintended, we often feel they are out of our control. After all, how could I possibly change my intention or be responsible for something I never intended in the first place?

How can I be responsible for something outside of my control?

We can’t control:

  • what we are trying to accomplish,
  • the many traps in the existing code we are trying to work with, or
  • how careful we are.

But we can control:

  • the details of how we change code.

And it turns out there are more risky and less risky ways to change code.

Risk doesn’t happen to us. We create or reduce risk by how we work.

TDD is compelling
  • Can verify my change
  • No regression of past work
  • Fast
  • Clear next change to make
…But
  • My function is 1,000 lines long.
  • My funciton calls a DB & a clock
  • I write SQL.
  • What about integration bugs?
  • What about the errors I didn’t think to test for?
  • Finding errors is OK, but it would be better to prevent them

Safer Ways to Change Code

Foundations

Work Tiny
Break changes into smaller steps
Call Your Shot
Precisely state your objective before you start
Automatic Changes
Automate changes; don’t edit code

Advanced

Data + Intuition
Make small intuitive leaps grounded in real-world data
Risk Less
Focus on risk over cost or value
Refactor to Isolate
Pull things apart gradually, using safe steps

Engagement Content

Foundations

Work Tiny
Succeeding with Smaller Chunks
Commit in Movements
Insight Loop
Easy Feature Flags
Call Your Shot
1: Testing Well
Stick-figure Testing
Human as Code
Automatic Changes
2: Naming as a Process
Refactoring Sequences
Whole Value, not Primitive Obsession
Automation as a Process

Advanced

Data + Intuition
Safeguarding 1: Prevent Problems
Avoid Rabbit Holes
Risk Less
Risk-aware Commit Notation
Safeguarding 2: Show ROI
Refactor to Isolate
Ports and Adapters
Simulators Replace Mocks
Unit Test Feature Flagged Code

Preliminaries (1 week)

Preliminary Phase — agree on purpose and timeline.
  1. Kickoff.
  2. Schedule sessions; start learning by doing.

Change (12 weeks)

The initial engagement includes 2 modules.

Testing Well
Write high quality tests with low effort.
Naming as a Process (NaaP)
Refactor to make code trivial ro read and test.

We learn each in 3 steps.

Expand
Introduce new behaviors
  • Concrete behavior change.
  • One change at a time.
  • Learn in real world, not lab.
  • Proficiency focus: improve behavior consistency and quality.
Master
Make behaviors habitual
  • Integrate all new behaviors.
  • Apply to novel situations.
  • Fluency focus: make behavior automatic and easy.
Leverage
Integrate into everything
  • Reduce other processes.
  • Reduce defect spend.
  • Pay down defect backlog.

In total, this takes 12 weeks.

Change Phase (12 weeks) — make a lasting change
WeekActivityCapability
Week 1ExpandWriting Tests First with Comments
Week 2ExpandTurning Comments to Code
Week 3ExpandDesigns Everybody Can Read
Week 4ExpandTesting Existing Code
Week 5MasteryTesting Well
Week 6Master & LeverageTesting Well; modify other processes
Week 7ExpandMake an Honest Name
Week 8ExpandUse Obvious Nonsense
Week 9ExpandAdd a Fact
Week 10ExpandRefine a Question
Week 11MasteryNaming as a Process (NaaP)
Week 12Master & LeverageNaming as a Process (NaaP); modify other processes

Calendaring

Daily activity schedule for the 12-week change phase

The team will participate in two kinds of activities.

Practice

Do your normal work, but integrate the recipe we are practicing.

This work will be accounted for as regular stories in the sprint. This is not in addition to your job; this is part of your job.

Meeting
Full team gets together and does something.
Week NumberMonTueWedThuFri
1
Show recipe
Writing Tests First with Comments
Practice recipe
Writing Tests First with Comments
Refine & expand
Writing Tests First with Comments
Practice variations
Writing Tests First with Comments
Share insights
Writing Tests First with Comments
2
Show recipe
Turning Comments to Code
Practice recipe
Turning Comments to Code
Refine & expand
Turning Comments to Code
Practice variations
Turning Comments to Code
Share insights
Turning Comments to Code
3
Show recipe
Designs Everybody Can Read
Practice recipe
Designs Everybody Can Read
Refine & expand
Designs Everybody Can Read
Practice variations
Designs Everybody Can Read
Share insights
Designs Everybody Can Read
4
Show recipe
Testing Existing Code
Practice recipe
Testing Existing Code
Refine & expand
Testing Existing Code
Practice variations
Testing Existing Code
Share insights
Testing Existing Code
5
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Guide mastery
Testing Well
6
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Execute
Testing Well (all 4)
Verify mastery
Testing Well
7
Show recipe
Make an Honest Name
Practice recipe
Make an Honest Name
Refine & expand
Make an Honest Name
Practice variations
Make an Honest Name
Share insights
Make an Honest Name
8
Show recipe
Use Obvious Nonsense
Practice recipe
Use Obvious Nonsense
Refine & expand
Use Obvious Nonsense
Practice variations
Use Obvious Nonsense
Share insights
Use Obvious Nonsense
9
Show recipe
Add a Fact
Practice recipe
Add a Fact
Refine & expand
Add a Fact
Practice variations
Add a Fact
Share insights
Add a Fact
10
Show recipe
Refine a Question
Practice recipe
Refine a Question
Refine & expand
Refine a Question
Practice variations
Refine a Question
Share insights
Refine a Question
11
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Guide mastery
Naming as a Process
12
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Execute
Naming as a Process (all 4)
Verify mastery
Naming as a Process