I have two kids and nowadays they cannot stop running, jumping, and spreading energy all around. A few years ago the running and jumping skills weren't part of their toolbox, they crawled and step by step they learned to walk. Do you have kids? Do you have nephews or kids in your neighborhood? Have you stopped for a second and think thought carefully about how what the process of learning to walk is?
Let’s imagine for a second your baby is crawling. Don’t be scared if you are not a parent, just bear with me and imagine you are sitting on your couch in the living room, your baby stops crawling just in front of you. She looks at you, sits down and from there tries to stand up and poooom, she is pushed back by her own body and gets to sit down again. She tries without success multiple times but never gives up until fatigue overcomes her.
The next day she doesn’t feel defeated at all, she is fully energized to try again to stand up on her feet. After 5 minutes you see yourself holding her and helping her stand up, after 3 days she is capable of doing it on her own and you are crouching down and spreading your hands without touching her because it gives you security. She is able to stand up and, in parallel, you are still protecting her from an unexpected scenario; you aren’t contracting your hands until you are convinced she is fully acquiring the new skill.
In software design, we are often in the situation of adding breaking changes to one piece of the architecture puzzle. For example, when breaking the compatibility of one API, exploring multiple technologies to replace a legacy component, or completely changing a paradigm on how you are processing your big data pipeline. When you are in this situation remember how that little baby learns to walk, remember to take baby steps, and with safety for everyone involved ( the baby and the parent ). One of the techniques used in these scenarios is the expand-contract ( AKA parallel-change ) pattern where the parent expands the contract by holding the kid to walk with her and later contracting the help because she was totally able to walk alone. Taking these back to the scenario of an API:
- We can expand the contract of your API by having a second version with the breaking changes by keeping the former version up and running
- Migrate all consumers to use the new version of the API.
- Contract: Remove the former version of the API.
Any new process requires courage and determination. We see this in a baby taking their first steps, in the determination with which they return again and again. Software development is no different: we also need the same determination to see change flourish.
Some resources on the topic:
- Recently, the expand-contract pattern was added to the Technology Radar of Thoughtworks and got some inspiration from Edu Ferro’s post.
- Bliki: ParallelChange
- Small Safe Steps 3s workshop
- GitHub: Move Fast and Fix Things