What Triathlons Taught Me About Software Development
One day, as I was watching TV as a kid, I stumbled upon a show reporting on the Ironman World Championships in Hawaii. The Ironmen is the toughest discipline of the triathlon. In this race, every participant plans to swim for 3.8 kilometers, ride a bike for 180 kilometers, and, as if this wasn’t hard enough, run for 42 kilometers (that’s 2.4/112/26.2 miles for you who are still using the wrong system). I remember being glued to the TV and tried to imagine what it takes to be one of them.
In summer of 2015, I was standing on the beach in Nice, France with another 2700 people and waiting for the cannon to go off, and change my perception forever.
To get to the point where I was confident I could finish that kind of race, I had to overcome a lot of small bumps. Surprisingly, lessons learned in triathlon seamlessly moved to my other passion – software development. Here are the lessons I’ve learned.
#1: Have a plan
“A goal without a plan is just a wish.” — Antoine de Saint-Exupery
Finishing a race, delivering great software, or anything else a few months, or even years, down the road, requires a lot of planning. You need to invest some time into figuring out how to get from where you are now to where you want to be.
First thing I do, is break down my season into phases (base phase, build phase, peak phase) which are one to a few months long. Those pieces are broken down into smaller parts (3 to 4 weeks long) which in turn are composed of individual training sessions.
Developing software, we use the same approach. We split our year up into Release cycles with each of these cycles having two, two weeks long, sprints in which we break down the overall goal of the release into “bite-size” tasks one developer can finish within a certain timeframe.
The reason for this is simple. While working for your big goal can be fun, the motivation to do so, shrinks with every day you have trouble seeing differences between your current state, and the state one, three, or five days ago.
Having these small victories by finishing more trivial tasks keeps you focused on moving on and getting even more done. Once a task moves from the “to-do” column over to “In Progress” and later into “Done” it becomes a beacon guiding you to the end of the sprint.
The more tasks you finish, the more you are motivated and your “There is nothing I can’t do” mindset pushes you towards the finish line or a happy customer.
#2: Measure your performance
“Let your performance do the thinking.”
— H. Jackson Brown, Jr.
I am sorry to inform you, but your plan isn’t perfect (and it doesn’t have to be). Once you define the contours of your season, you have to assign individual training sessions or tasks to your days. In a regular training cycle of 4 weeks, each week is harder than the one before, and everything culminates with the last week, which serves as a recovery week allowing your body to absorb all the training and get stronger.
But how do you know how hard your training needs to be? At the start of every cycle, once you had a good week of lower intensity training you perform some tests. You do time trials for every sport, and measure your performance and compare it to the previous test. If the numbers get better, awesome, but if they are the same or even worse, you have to rethink your training. What maybe worked for a period doesn’t work anymore. Change your plan and see what happens.
The same thing applies to our two weeks sprints. We assign each task points and make sure to keep a balance for each developer in our team. At the end of the two weeks, we see how much each developer managed to finish and check if adjustments are needed.
By gaining insight into how our team works, we can plan our next sprints better and most importantly, deliver on our commitments. We can detect areas in our product that maybe grew too complicated and schedule some refactoring. Some developers might be more efficient with one part of the product than with another. Why not unleash his full potential by giving him the right tasks?
Finding metrics important to your team is hard, but you can always tweak it, and adjust it until you find the right combination. Once you are at this point, you will start getting quality data which will make your planning easier so you can spend more time training smarter and writing better code.
#3: Embrace failure
“Sometimes you win, sometimes you learn.”
— John C. Maxwell
There is nothing worse than training for weeks or months and seeing nothing improve. You agreed with your client on a feature set for the next release and halfway through you realize there is no way you can deliver. There are two things you can do, try to push harder, pile more resources on it and hope for the best, or you can take a step back, look at your data, and figure out what went wrong.
Three weeks before my first Ironman race, I went on a long ride of around 180 kilometers, and halfway through I started feeling weak. I looked at my bottles and saw I was drinking enough. Checked my pockets, found out I ate enough as well. I managed to get back home but instead of six and a half hours I planned for the ride; I arrived home after almost eight hours.
I was puzzled, and couldn’t figure out what went wrong. I concluded that it had something to do with the high temperatures that day. And then it hit me. I forgot to take my salt tablets. When you sweat, you lose a lot of salt which is responsible for transporting the impulses from your brain to your muscles. If no pulses arrive at your muscles, they will just stop working. Once I figured this out I never made the same mistake again.
If you fail at delivering a certain functionality, don’t look for the person who is responsible for it. Instead, try to find the problem in the process and avoid it from that point on. Explain to your team what went wrong and how you could have prevented it. Once you see every mistake you make as a learning opportunity, you will be able to handle these things quicker and more efficient, improving the overall efficiency of your team.
#4: Adapt to changes
“There is no perfect race, but you can execute a race perfectly.”
— Brett Sutton
I usually finish my tasks for the day, step out of the office, and head straight for the pool. I have it all planed out. 300 meters easy swim to warm up. 400 meters of a technique based swim. 5 x 400 meters at race pace with 30 seconds rest in between each set. 300 meters easy to cool down. Michael Phelps, watch your back!
Once I get to the pool, I realize there are a million people in the pool, and there is no way I am going to be able to do the planned session. But I have a simple solution to that as well.
I do the technical training I planned for two days later. I will be swimming slower and rest more so I won’t be bumping into other people or at least less than I would have while doing my 400 meters at full speed.
When working on a feature for a client, all sorts of things can come up. Some of the libraries you are using can have a security breach. The client might find a bug that stops him from working with the app, or they might change direction and prioritize another feature over the one you are working on, or it can be as mundane as having workers in the office installing the new air conditioning you were waiting for so long. All of this will drag you out of your current task and force you to work on something else.
The most important thing here is to accept it as soon as possible and switch to plan B and continue. Time is one of the most valuable resources today, and you don’t want to waste it too much by crying about your perfect plan and start making the best of it. The quicker you get back on track, the better for you and your clients.
#5: Surround yourself with good people
“Whatever you do in life, surround yourself with smart people who’ll argue with you.”
— John Wooden
Races I participate in are usually outside my hometown, so traveling is a good part of triathlon. Having friends who are willing to go with you on ten to fifteen-hour drives is awesome. Seeing them on the sides standing and waiting for me while I am racing keeps me going and I wouldn’t have made it without them and their support. When I joined Five, and started to get to know my team better, I was happy they were better than me in nearly every aspect. It might be intimidating at first, but if you look at this from a learning perspective, you can’t be anything but happy. Having bright minds, you can talk to when you get stuck gives you the confidence to try out new things knowing they will help you out when needed.
One lesson I learned early on is that once you get good at something to turn around and try to find someone you can help out. Once you reach out and bring them to your level, they will help you become better. Now they will be able to find flaws in your system, find ways to do something differently, or just be there so you can both enjoy the things you are doing together. If you do what you like and share it with people around you, your group as a whole will become more productive and happier.
Once you are at the finish line, you earn the rewards for all the hard work you have done. It can become hard to get back to planning your next season or release because it feels like you are starting from square one. A team of great people will keep you on track so make sure you choose them wisely.
Five and Shoutem Running Team grabbing a gold medal in B2B run Zagreb.
One more thing…
Everything we do should have a purpose, but there is one more thing you need to keep in mind. Have fun! If you take it all too seriously, you might get to the finish line, but if you didn’t enjoy the journey there, it would just become a partial victory. Try to enjoy every step of the way although it’s not always possible, having those small pieces of joy in your training or work can change everything and lift your experience to new heights.