Once or twice a season we’ll have our distance runners run a time trial on a well known trail in town. Joan hardly ever repeats the same workout, but there are a handful of important ones that we keep track of over time. We can go back and see over time how kids improve on specific workouts throughout their high school careers. This is really important to kids – they can see just how much they’re improving over time – a very motivating thing to do.
Of course for most races and workouts you start everyone at the same time and the finish times end up being naturally staggered. There are plenty of times where runners very quickly get segmented (through ability, current fitness level, pecking order, etc.) – sometimes lots of runners spend the entire workout running alone.
Having done the Medoc Trail Race which staggers start times based on age and gender, I thought a similar approach would be good for the XC team. Instead of using age and gender to stagger the start times, we used a recent mile time trial on the track to determine how to time advantage each runner received.
I ended up creating a spreadsheet to translate the mile time into the predicted time for our 2.4 mile time trial loop. I then figured out the how much of a head start each runner should receive compared to the fastest runner on the team. I printed out the spreadsheet with runner and time advantage. The slowest runner on the team ended up with a 7 minute head start on the fastest runner.
We had never tried anything like this and I was really hoping I did the math right and made good estimations about fitness levels. It would be pretty embarrassing for me to have the fastest runners finish minutes ahead or minutes behind the eventual winner!
What ended up happening was pretty cool. The slowest girls on the team were still leading the race with about a quarter mile to go! The slowest girl ended up in 7th place in the “race.” What really surprised me though was how much faster almost everyone ran! Our top boys beat the all time record for this loop by about 20 seconds – a huge improvement. Up and down the line people had significant course PRs!
It’s easy to see how there would be this kind of improvement. Imagine you’re the fastest guy on a team. In every normal workout you pretty much run alone – nobody passes you and you don’t pass anyone the entire time. Now imagine the “chase race” – the pressure is on the entire time to pass almost 80 people! It’s similar for the slowest runner – every step you feel like you’re getting ready to get passed by 80 kids, but you also feel like there’s a definite chance you can win the time trial!
Here’s some videos of the start and finish of the chase race as well as the top 11 finishers.
I’ve always thought that we could do a lot better displaying XC race team results. The cold, dry text format that we’re all used to is nice for a quick score, but pretty bad for most anything else. Just how did our fifth runner stack up against everyone else’s? Sure, you can scan the column and compare a couple teams at a time, but there should be a better way.
Another thing that should be easily visualized is the differences in the scores. Let’s say we were behind a team by 10 points. Is that a lot? In a dual meet it’s not really that close but in the state meet or a big invitational that’s a razor thin margin!
Here’s my attempt at making cross country team results way more fun to look at. These are the results from the North Carolina XC State meets from November 3rd, 2018. Each column represents a team. Each colored section in the column represents the points for one of the five scoring runners. The total column height is the team score for the team. Hover your mouse over the columns to see a popup that shows the runner’s name, place, and time.
Take a look and let me know what you think. How would you improve it? Any reason Milesplit shouldn’t do this? If you like this, follow me on Twitter.
My wife Joan is the head coach of Chapel Hill High (I’m the assistant). Although I’m the “data guy,” Joan is simply amazing at remembering all the PRs and times of the entirety of both the boy’s and girl’s teams. As soon as the runners finish a race she instantly knows if they ran well or not with high accuracy. I quickly realized that there was no way I could remember the PRs for 80 kids each season. I knew I needed a technological solution.
Here’s a list of things that I wanted to be able to do:
Be able to record the finishing times of each runner on the team as they cross the line without having to write anything down on a clipboard.
Easily keep track of mile splits during a XC race for each runner on the team.
Tell me at a glance how well the runner ran compared to their personal best and their season best.
Keep track of the big, notable workouts we do each year to be able to compare runners’ progress across years against themselves and against runners that graduated seasons ago.
The Web Site
I created a web site using PHP and a database that can store times, splits, and rosters from races and workouts. You can do all sorts of queries and reports to compare 5k results across the program’s history or see a particular workout report that shows athlete’s improvements over time.
This was quite an effort but not because of the coding as much as collecting as much race history as we could from Mile Split and our archives. Of course this is mostly a manual effort and Mile Split doesn’t make it easy since they only allow you to show one race at a time instead of being able to download your team’s entire history. I made this request to them but they were not interested in allowing this.
My Android Timing App
The web site is pretty nice, but by itself it’s not particularly unique. In my mind the real convenience is the Android app that I created to integrate with the web site for efficiently timing the actual races. I call it Coaching Timer (such an amazing name I realize!) and here’s some screenshots to show how it works.
Timing the Race
Here’s a screenshot of the main timer view. You start the timer with either volume up or down button. The 04:45 is the current elapsed race time.
As they come through the mile split, I press the button for that particular runner as they cross the mile mark. The runners are in descending order by their PR (more on how this happens later – it’s easy!) When I press a runner’s button, that button goes to the bottom of the list of buttons. See this screenshot that shows Ben Hawley and Owen Rogers having dropped to the bottom of the list. Why is this important? It minimizes the hunting I have to do to find the name as someone crosses the mile mark. It also allows me to quickly determine if every team member has crossed the mile mark. Also, if I end up having to click a button out of order that’s a mild indication that someone might be having a good day or a bad day.
As I click each button the timestamp is recorded along with the name in the left hand column.
As They Finish
I record the 2 mile splits similarly, but then for the finish the app sees that it’s within a normal range of a 5k finish and it adds some important details to the timestamp.
In the above screenshot, Amelia Maughan, Lilly Crook, and Sydney Runkle just crossed the finish line and I clicked their buttons (which moved to the bottom of the list, remember.) In this case, though, their PR and SB (season best) data was added to the timestamp. I can quickly see that Amelia tied her PR, Lilly was 20 seconds off a PR and 10 seconds off a season best, and Sydney beat her PR by 6 seconds.
Send the Results
In the 3 dot menu on the top right of the app, there are several options, two of which allow you to send results.
The Email Times and Text Times menu items let’s you send the results to another app for sending. Email Times brings up the following email message ready to send. Text Times let’s you send them via text message.
So How Does The App Know the PRs?
Here’s where some magic happens that I really like. You create groups in the app for each race that’s happening – for example, Boys Varsity, Boys JV, Boys JJV, etc. When you initially start a timer you choose the group to use for the race.
I initially created the groups by hand – typing in each runner’s name individually. I realized quickly how much better it could be, so I added an Import function for creating the groups.
The import function pulls a list of runners from the web site. It stores three pieces of data for each runner: their name, their PR, and their season best. The runners are listed in descending order by PR which lines them up just right for selecting varsity, JV, and JJV.
Just check the box for each runner to include in this group.
Then to start a timer for a race, just choose the appropriate group and click Start Timer:
Additional Nice Features that I’ve Added
Phone Sleep Prevention: As I’ve used the app over the years I’ve added some features to improve it. When waiting for the start, sometimes the phone would time out and I’d have to unlock it and, dang, I just missed the start of the race. So now there’s a feature implemented that prevents the phone from going to sleep with the Coaching Timer app is active.
Volume Buttons Start Timer: Also I realized it was hard to tap a button and look at the starter’s pistol in the distance across a field since there’s no tactile feedback from a virtual button on the screen. I added a way to start the timer via either volume control – problem solved and it’s much, much easier.
Disabled Phone Rotation: At first I thought it would be important to be able to rotate the phone and have the app switch from portrait to landscape since some names can be long and starting wrapping in portrait mode. This mostly ended up being disorienting when trying to get splits quickly and I disabled it.
Multiple Simultaneous Timers: Most races end up completing before subsequent race begin, but occasionally that’s not the case and they overlap. This is why it’s important to be able to keep multiple timers running simultaneously.
Adjust Start Time for Running Timer: Another critical feature that I added that has saved my behind multiple times is the ability to adjust the start time of an already started timer on the fly. Super useful! Let’s say you missed the start of the race. No more quick math to adjust each time after the fact – as long as anyone got the start of the race on their stopwatch, this function let’s you set the timer to any running time. This has been probably the most useful feature I added – it happens a lot and this is an awesome backup.
Adjustment Factor for Certain Race Venues: There’s an optional “adjustment factor” that you can apply on the web site for certain race venues/meets. Let’s say there’s a course one day that’s cold and muddy and the times are very slow compared to a “normal” course on a good day, or perhaps a course is short. You can apply an adjustment factor that provides an adjusted time for the purposes of the PR calculation. This prevents the PRs being skewed if we run a short course where true PRs shouldn’t really be valid.
The State of the App
The app is pretty stable right now and I’ve thought about releasing it to other coaches. But in order to do that I would have to put a good amount of work into generalizing it to work with other teams. Also, it’s highly dependent on the web site which is another layer of complication for someone to set up. To be honest I’ve always thought this would be a good thing for MileSplit to do since they have a good bit of the data required to make something like this work for any coach.
If you have any comments or suggestions I’d love to hear some feedback. Comment on this post and also follow me on Twitter while you’re at it.